我是靠谱客的博主 淡然云朵,最近开发中收集的这篇文章主要介绍c++使用Easyx图形库实现飞机大战,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

公共的头文件        common.h

1

2

3

4

5

6

7

8

9

10

11

12

#pragma once

#include <graphics.h>

#include <iostream>

#include <string>

#include <map>

#include <list>

#include <thread>

#include <vector>

#include <ctime>

#include <mmsystem.h>

#pragma comment(lib,"winmm.lib")

using namespace std;

管理资源 res.h --- 单例设计模式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#pragma once

#include "common.h"

class Res

{

private:

    Res();    //构造函数私有化

public:       //提供公有接口

    static int WIDTH(string name);    //通过图片的键,获取资源宽度

    static int HEIGHT(string name);

    static Res* GetInstance();        //获取资源(类)的对象---唯一的对象

    static void DrawIMG(int x, int y, string name);//画图片的位置,通过键去找画哪张图片

//画角色---位置,通过姓名的方式去找  不同类型的角色,用preIndex去做标识

    static void DrawRole(int x, int y, string name, int preIndex);

//播放音乐---windows多线程 DWORD类型,WINAPI修饰

    static DWORD WINAPI PlayMusic(LPVOID lparame);

    ~Res();

public:

    static map<string, IMAGE*> img;       //图片资源---图片存在map中

    static map<string, string> music; //音乐资源

};

res.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

#include "res.h"

map<string, IMAGE*> Res::img;   //图片资源    静态数据成员在类外初始化,类名限定

map<string, string> Res::music;   //音乐资源

Res::Res()                      //构造函数为数据成员初始化---路径下处理

{

//背景

    string background = "./res/background.jpg";

//角色---4张---背景图+掩码图

    string roleImg[4] = { "./res/planeNormal_1.jpg","./res/planeNormal_2.jpg",

    "./res/planeExplode_1.jpg","./res/planeExplode_2.jpg" };

//子弹

    string ballImg[2] = { "./res/bullet1.jpg","./res/bullet2.jpg" };

//敌机

    string enemyImg[4] = { "./res/enemy_1.jpg","./res/enemy_2.jpg","./res/enemyPlane1.jpg","./res/enemyPlane2.jpg" };

    //string --->IMAGE* 本来就是指针,不需要取地址

    img["背景"] = new IMAGE;

    img["角色"] = new IMAGE[4];

    img["子弹"] = new IMAGE[2];

    img["敌机"] = new IMAGE[4];

    loadimage(img["背景"], background.c_str());    //加载图片    路径 项目属性多字节

    for (int i = 0; i < 4; i++)

    {

/*假设img["角色"]为p,则p=new IMAGE [4];则img["角色"]+i  等效: p+i*/

        loadimage(img["角色"] + i, roleImg[i].data());    //用.data或.cst()转换为字符串

        loadimage(img["敌机"] + i, enemyImg[i].data());  

    }

    for (int i = 0; i < 2; i++)

    {

        loadimage(img["子弹"] + i, ballImg[i].c_str());

    }

  

}

//获取图片的宽度---碰撞的时候需要---返回对象指针,对象指针调用(img类型)数据成员,有一个成员函数

int Res::WIDTH(string name)

{

//获取对象,获取什么样的属性,(img类型)海口福兴医院有一个getwidth()成员函数---是库中的成员函数

    return GetInstance()->img[name]->getwidth();

}

//获取图片的高度

int Res::HEIGHT(string name)

{

    return GetInstance()->img[name]->getheight();

}

Res* Res::GetInstance()

{

    static Res* res = new Res;

    return res;

}

//只有一张图片的贴图: 背景图贴图

void Res::DrawIMG(int x, int y, string name)

{

    putimage(x, y, GetInstance()->img[name]);    //贴图 在x,y位置贴对象里面的图片

}

void Res::DrawRole(int x, int y, string name, int preIndex)

{

//多张图片贴图---透明贴图---去背景

    putimage(x, y, GetInstance()->img[name] + preIndex, NOTSRCERASE);//贴第几张---帧数

    putimage(x, y, GetInstance()->img[name] + preIndex+1, SRCINVERT);

}

DWORD __stdcall Res::PlayMusic(LPVOID lparame)

{

    int key = (int)lparame;    //线程处理函数的参数---强转为int

    switch (key)               //不同的音乐,类型不一样

    {

    case 1:

        mciSendString("close ./res/f_gun.mp3", 0, 0, 0);    //播放前先关闭

        mciSendString("open ./res/f_gun.mp3", 0, 0, 0);     //先打开,后播放

        mciSendString("play ./res/f_gun.mp3", 0, 0, 0);

        break;

    case 2:

        mciSendString("close ./res/5.mp3", 0, 0, 0);

        mciSendString("open ./res/5.mp3", 0, 0, 0);

        mciSendString("play ./res/5.mp3", 0, 0, 0);

        break;

    case 3:

        mciSendString("close ./res/10.mp3", 0, 0, 0);

        mciSendString("open ./res/10.mp3", 0, 0, 0);

        mciSendString("play ./res/10.mp3", 0, 0, 0);

        break;

    }

    return 0;

}

Res::~Res()

{

    delete img["背景"];

    delete[] img["角色"];

    delete[] img["敌机"];

    delete[] img["子弹"];

}

打飞机游戏.cpp        主函数部分

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include "control.h"

#include "graph.h"

#include "role.h"

#include "enemy.h"

int main()

{

    srand((unsigned int)time(NULL));    //随机函数种子---位置不同

    Graph* pMap = new Graph;

    Role* pRole = new Role;

    Enemy* pEnemy = new Enemy;

    Control* pControl = new Control(pMap, pRole, pEnemy);

    BeginBatchDraw();         //双缓冲绘图

    while (1)

    {

        cleardevice();        //清屏

        pControl->DrawMap();  //画地图

        pControl->DrawRole(); //画角色

        pControl->DrawEnemy();//打敌机前画敌机

        pControl->PlayEemey();

  

        FlushBatchDraw();     //显示 执行未完成的绘制任务

    }

    EndBatchDraw();

    return 0;

}

point.h        无论是飞机移动还是子弹移动,本质都是坐标的改变 - - - 处理点的变化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#pragma once

#include "common.h"

class Point

{

public:

    enum Dir {left,right,down,up}; //枚举点移动的方向,不同的移动方向点的改变是不一样的

    Point(int x = 0, int y = 0);

    Point(const Point& point);     //拷贝构造---点与点之间的赋值

    int& getX();                   //外部接口,获取点的坐标

    int& getY();

    //移动点

    void move(int speed, Dir dir); //移动速度 方向---决定坐标如何变化

  

protected:

    int x;

    int y;

};

/* 敌机从上往下移动   角色可以上下左右移动

   s形敌机可以增加x方向增量,增加y方向增量 */

最后

以上就是淡然云朵为你收集整理的c++使用Easyx图形库实现飞机大战的全部内容,希望文章能够帮你解决c++使用Easyx图形库实现飞机大战所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部