鱼C论坛

 找回密码
 立即注册
查看: 1813|回复: 9

[已解决]类内定义了一个私有成员的IMGAE对象,在public里面定义了一个调用该对象的

[复制链接]
发表于 2023-5-1 20:14:14 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 猪猪虾 于 2023-5-1 20:19 编辑

这个坎。。。。
我定义的Mainplane.h文件 里面的静态成员static IMAGE imgMyplane;所以在Mainplane.cpp的文件头做了类外的声明
然后在成员函数getImage_Myplane里面返回这个对象,我也尝试了不定义静态的情况,一样的直接崩溃,在主程序
GameMain.cpp文件调用到这个getImage_Myplane的时候  。。。。

捕获.JPG



Mainplane.h文件
  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. //#include "GameMain.h"
  6. using namespace std;
  7. class GameMain;

  8. class MyPlane
  9. {
  10. public:
  11.         MyPlane();
  12.         //static IMAGE getImages();    //私有成员可以在public里面,通过函数来间接访问和修改
  13.         void Move(int dx, int dy);
  14.         static IMAGE getImage_Myplane();


  15.         int My_current_posiX;
  16.         int My_current_posiY;
  17.         int width;
  18.         int height;

  19. private:
  20.         static IMAGE imgMyplane;
  21.         GameMain *GM;
  22. };
复制代码


Mainplane.cpp文件
  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. #include "MyPlane.h"
  6. #include "GameMain.h"
  7. using namespace std;

  8. //静态成员,需要在类外进行声明
  9. IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间

  10. //`MyPlane` 类在头文件 `MyPlane.h` 中声明,而 `imgMyplane` 的定义位于与类实现相关联的源文件
  11. //`MyPlane.cpp` 中。这样,您就解决了 `LNK2001` 错误。
  12. //如果您将所有代码放在同一个文件中,那么只需在类定义之后添加 `IMAGE MyPlane::imgMyplane; ` 这一行即可。
  13. //IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间


  14. MyPlane::MyPlane()
  15. {
  16.         width = 100;
  17.         height = 125;
  18.         loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

  19.         //初始化飞机的位置在图像的正下方的中心
  20.        
  21.         My_current_posiX = GM->rows / 2 - width / 2;
  22.         My_current_posiY = GM->cols - height;
  23. }


  24. IMAGE MyPlane::getImage_Myplane()
  25. {
  26.         return imgMyplane;
  27. }

  28. void MyPlane::Move(int dx, int dy)
  29. {
  30.        
  31.         My_current_posiX += dx;
  32.         My_current_posiY += dy;

  33.         //判断是否超出了边界,还要考虑飞机本身的宽度
  34.         if (My_current_posiX > (GM->rows - width / 2) || My_current_posiX < width / 2)
  35.         {
  36.                 My_current_posiX -= dx;
  37.         }

  38.         if (My_current_posiX > (GM->cols - height / 2) || My_current_posiX < height / 2)
  39.         {
  40.                 My_current_posiY -= dy;
  41.         }
  42. }
复制代码



GameMain.h文件
  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. //#include<MyPlane.h> 如果这里这么用,会发现 当前.h文件和MyPlane.h文件的彼此头文件相互包含,会报错
  6. class MyPlane;  //告诉编译器,需要这个类,其他功能结构都没变
  7. using namespace std;

  8. class GameMain
  9. {

  10.         friend class MyPlane;
  11. public:
  12.         //构造函数  用于初始化参数,游戏界面设置

  13.         GameMain();

  14.         //游戏界面初始化
  15.         void init();
  16.         void paly(); // 开始游戏
  17.         int* getBgSize();

  18.         int rows;
  19.         int cols;

  20. private:
  21.         void keyEvent();  //按键控制
  22.         void updateWindow();  //渲染界面

  23. private:
  24.         bool update;
  25.         // 添加这一行,这样其他地方调用这个类的时候,就不用每次都申明,不同地方申明,还是不同的对象,无法
  26.         //实现同时操作一辆飞机
  27.         MyPlane *MP;

  28.         //背景图像参数
  29.         IMAGE imgBg;  //背景图片
  30. };
复制代码


GameMain.cpp文件
  1. #include "GameMain.h"
  2. #include "MyPlane.h"
  3. #include "Bullet.h"
  4. #include<stdlib.h>
  5. #include <time.h>
  6. #include<graphics.h>
  7. #include <conio.h>
  8. #include"iostream"
  9. #include"string"
  10. #include "fstream"
  11. //音效
  12. #include<mmsystem.h>
  13. #pragma comment(lib,"winmm.lib")
  14. #pragma comment(lib,"WINMM.LIB")

  15. using namespace std;

  16. GameMain::GameMain()
  17. {
  18.         //将游戏界面的宽度指定成背景图片的显示宽度
  19.         rows = 438;
  20.         cols = 675;
  21. }

  22. void GameMain::init()
  23. {
  24.         //播放背景音乐
  25.         mciSendString("play E:/2022上/res/bg.mp3 repeat", 0, 0, 0);

  26.         //创建游戏窗口
  27.         *initgraph(rows, cols);

  28.         //加载背景图片
  29.         loadimage(&imgBg, "E:/2022上/Leecode_April/plane/image/background.png");

  30.         update = true;
  31. }

  32. void GameMain::paly()
  33. {
  34.         init();

  35.         while (1)
  36.         {
  37.                 BeginBatchDraw();
  38.                 //接收用户的输入
  39.                 keyEvent();

  40.                 //更新游戏画面
  41.                 updateWindow();
  42.                 system("pause");
  43.                 EndBatchDraw();
  44.         }
  45. }

  46. int* GameMain::getBgSize()
  47. {
  48.         int num[] = { rows ,cols };
  49.         int* ptr = new int[2];
  50.         for (int i = 0; i < 2; i++) {
  51.                 ptr[i] = num[i];
  52.         }
  53.         return ptr;
  54. }


  55. void GameMain::keyEvent()
  56. {
  57.         unsigned char ch;
  58.         int dx = 0;
  59.         int dy = 0;

  60.         //判断当前有没有按键输入,如果他没有按键输入,程序正常执行
  61.         if (_kbhit()) {
  62.                 ch = _getch();

  63.                 //按下字母,返回的就是字母,按下的是方向键
  64.                 //上,先后返回: 224 72  下:224 80   左:75 224,75  右:224 77
  65.                 if (ch == 224) {
  66.                         ch = _getch();
  67.                         switch (ch) {
  68.                         case 72:
  69.                                 dy = 1;
  70.                                 break;
  71.                         case 80:
  72.                                 dy = -1;
  73.                                 break;
  74.                         case 75:
  75.                                 dx = -1;
  76.                                 break;
  77.                         case 77:
  78.                                 dx = 1;
  79.                                 break;
  80.                         default:
  81.                                 break;
  82.                         }
  83.                 }
  84.         }
  85.         if (dx != 0 || dy != 0)  //左右移动
  86.         {
  87. //                MyPlane MP;
  88.                 MP->Move(dx,dy);
  89.                 update = true;
  90.         }
  91. }

  92. void GameMain::updateWindow()
  93. {
  94.         putimage(0, 0, &imgBg);

  95.         BeginBatchDraw();
  96.         //绘制我方飞机
  97.         //MyPlane MP;
  98.         IMAGE TEMP_my;
  99.         TEMP_my = MP->getImage_Myplane();
  100.         putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);


  101.         //绘制子弹
  102.         Bullet BT;
  103.         IMAGE TEMP_BT;
  104.         TEMP_BT = BT.getImage_Bullet();
  105.         putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_BT);

  106.         EndBatchDraw();
  107. }

复制代码
最佳答案
2023-5-1 20:14:15
猪猪虾 发表于 2023-5-1 21:02
按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。

根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一个临时的  Bullet  对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如  vector ),并在游戏主循环中对这些子弹进行更新和绘制。

首先,您需要在  GameMain  类中添加一个  vector  容器来存储子弹对象:

  1. #include <vector>
  2. #include "Bullet.h"

  3. class GameMain {
  4.     // ...
  5. private:
  6.     // ...
  7.     std::vector<Bullet> bullets;  // 添加子弹容器
  8. };
复制代码


然后,在游戏主循环中,您可以创建子弹并将它们添加到  bullets  容器中。在此之后,您需要在  GameMain::updateWindow()  函数中迭代  bullets  容器,并更新和绘制每个子弹:

  1. void GameMain::updateWindow() {
  2.     putimage(0, 0, &imgBg);

  3.     BeginBatchDraw();

  4.     // 绘制我方飞机
  5.     IMAGE TEMP_my;
  6.     TEMP_my = MP->getImage_Myplane();
  7.     putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

  8.     // 绘制子弹
  9.     for (Bullet& bullet : bullets) {
  10.         bullet.update();  // 更新子弹位置
  11.         IMAGE TEMP_BT;
  12.         TEMP_BT = bullet.getImage_Bullet();
  13.         putimage(bullet.getPosX(), bullet.getPosY(), &TEMP_BT);
  14.     }

  15.     EndBatchDraw();
  16. }
复制代码


这里需要注意的是,您还需要在  Bullet  类中添加一个更新子弹位置的函数(例如, update() )以及获取子弹位置的函数(例如, getPosX()  和  getPosY() )。

希望这些建议能帮助您解决问题。如果您还有其他问题或疑问,请随时告诉我。

最佳答案

查看完整内容

根据您提供的代码,我注意到了一个问题。在 GameMain::updateWindow() 函数中,您在绘制子弹时使用了一个临时的 Bullet 对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如 vector ),并在游戏主循环中对这些子弹进行更新和绘制。 首先,您需要在 GameMain 类中添加一个 vector 容器来存储子弹对象: 然后,在游戏主循环中,您可以创建子弹并将它们添加到 bullets 容器中。在此 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:14:15 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2023-5-1 21:02
按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。

根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一个临时的  Bullet  对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如  vector ),并在游戏主循环中对这些子弹进行更新和绘制。

首先,您需要在  GameMain  类中添加一个  vector  容器来存储子弹对象:

  1. #include <vector>
  2. #include "Bullet.h"

  3. class GameMain {
  4.     // ...
  5. private:
  6.     // ...
  7.     std::vector<Bullet> bullets;  // 添加子弹容器
  8. };
复制代码


然后,在游戏主循环中,您可以创建子弹并将它们添加到  bullets  容器中。在此之后,您需要在  GameMain::updateWindow()  函数中迭代  bullets  容器,并更新和绘制每个子弹:

  1. void GameMain::updateWindow() {
  2.     putimage(0, 0, &imgBg);

  3.     BeginBatchDraw();

  4.     // 绘制我方飞机
  5.     IMAGE TEMP_my;
  6.     TEMP_my = MP->getImage_Myplane();
  7.     putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

  8.     // 绘制子弹
  9.     for (Bullet& bullet : bullets) {
  10.         bullet.update();  // 更新子弹位置
  11.         IMAGE TEMP_BT;
  12.         TEMP_BT = bullet.getImage_Bullet();
  13.         putimage(bullet.getPosX(), bullet.getPosY(), &TEMP_BT);
  14.     }

  15.     EndBatchDraw();
  16. }
复制代码


这里需要注意的是,您还需要在  Bullet  类中添加一个更新子弹位置的函数(例如, update() )以及获取子弹位置的函数(例如, getPosX()  和  getPosY() )。

希望这些建议能帮助您解决问题。如果您还有其他问题或疑问,请随时告诉我。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:17:01 | 显示全部楼层
代码不完整
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-1 20:18:13 | 显示全部楼层

补了一下,刚卡壳了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:21:09 | 显示全部楼层
根据您提供的信息,我无法确定导致程序崩溃的确切原因,但是可以提供一些可能导致崩溃的问题。

在Mainplane.cpp文件中,MyPlane::GM指针没有分配内存。您需要在MyPlane的构造函数中为其分配内存。如果没有分配内存,当您在Mainplane.cpp中调用MyPlane类的成员函数时,该指针将指向未知的内存地址,从而导致程序崩溃。例如,在MyPlane构造函数中添加以下代码:
  1. MyPlane::MyPlane()
  2. {
  3.         GM = new GameMain; // 分配内存
  4.         // ... 其他代码 ...
  5. }
复制代码

无法确定您是否正确地链接了库文件。如果您在链接库文件时出现问题,程序可能无法正常运行。您可以通过检查链接器输出或查看Visual Studio的“输出”窗口来检查是否存在任何错误或警告消息。

您的代码中可能存在内存泄漏或未定义的行为。例如,如果您在GameMain类的成员函数中创建动态分配的内存,并忘记在使用完毕后释放该内存,则可能导致内存泄漏。这可能会导致程序在一段时间后崩溃。要解决这个问题,您可以使用内存分析器工具,如Valgrind,在运行时检查您的程序是否存在内存泄漏或未定义的行为。

您的代码可能存在逻辑错误。例如,在您的MyPlane类中,如果您在Move()函数中检查当前位置是否超出边界时,使用了错误的变量(如cols而不是rows),则可能导致逻辑错误。您可以通过使用调试器逐行执行代码来检查逻辑错误。

希望这些信息对您有所帮助。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:25:22 | 显示全部楼层
猪猪虾 发表于 2023-5-1 20:18
补了一下,刚卡壳了

[b]从你的代码来看,你在  MyPlane  类的构造函数中使用了  GameMain  类的指针  GM 。但是,你没有初始化这个指针,所以在访问  GM->rows  和  GM->cols  时可能会导致程序崩溃。你需要在  MyPlane  类的构造函数中接收一个  GameMain  类的指针,并将其赋给  GM 。以下是修改后的建议代码:

MyPlane.h文件
  1. class MyPlane
  2. {
  3. public:
  4.     MyPlane(GameMain *gm);  // 将 GameMain 类的指针作为参数传递给构造函数
  5.     ...
  6. private:
  7.     ...
  8.     GameMain *GM;
  9. };
复制代码


Mainplane.cpp文件
  1. MyPlane::MyPlane(GameMain *gm) : GM(gm)
  2. {
  3.     width = 100;
  4.     height = 125;
  5.     loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

  6.     //初始化飞机的位置在图像的正下方的中心
  7.     My_current_posiX = GM->rows / 2 - width / 2;
  8.     My_current_posiY = GM->cols - height;
  9. }
复制代码


接下来,你需要在  GameMain  类中创建  MyPlane  类的实例时传递一个  GameMain  类的指针。你可以修改  GameMain  类的构造函数来实现这一点:

GameMain.h文件
  1. class GameMain
  2. {
  3.     ...
  4. public:
  5.     GameMain();
  6.     ...
  7. private:
  8.     ...
  9.     MyPlane *MP;
  10.     ...
  11. };
复制代码


GameMain.cpp文件
  1. GameMain::GameMain()
  2. {
  3.     //将游戏界面的宽度指定成背景图片的显示宽度
  4.     rows = 438;
  5.     cols = 675;
  6.     MP = new MyPlane(this);  // 在创建 MyPlane 实例时传递 GameMain 类的指针
  7. }
复制代码


注意,你需要在  GameMain  类的析构函数中删除  MyPlane  类的实例以避免内存泄漏。在  GameMain  类中添加一个析构函数,并在其中删除  MP :

GameMain.h文件
  1. class GameMain
  2. {
  3.     ...
  4. public:
  5.     ~GameMain();  // 添加析构函数
  6.     ...
  7. };
复制代码


GameMain.cpp文件
  1. GameMain::~GameMain()
  2. {
  3.     delete MP;  // 删除 MyPlane 实例
  4. }
复制代码


这些更改应该可以解决你的程序崩溃问题。请尝试修改你的代码,并测试是否可以正常运行。
[/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:26:21 | 显示全部楼层
根据提供的代码,我注意到在 Mainplane.cpp 文件中,MyPlane 类的静态成员 imgMyplane 进行了类外的声明,但是没有进行定义。

在头文件 Mainplane.h 中,我们只能看到静态成员的声明,但是没有找到对应的定义。因此,可能会在链接时出现错误。

解决此问题的方法是在 Mainplane.cpp 文件中添加如下代码,对静态成员进行定义:
  1. IMAGE MyPlane::imgMyplane;
复制代码

此外,我还注意到在 MyPlane 类的构造函数中,初始化了一个指向 GameMain 类对象的指针 GM,但是并没有为其分配内存空间。因此,需要在 GameMain 类的构造函数中,为 MyPlane 类对象的指针 MP 分配内存空间,如下所示:
  1. GameMain::GameMain()
  2. {
  3.     // 将游戏界面的宽度指定成背景图片的显示宽度
  4.     rows = 438;
  5.     cols = 675;

  6.     // 为 MyPlane 类对象的指针 MP 分配内存空间
  7.     MP = new MyPlane();
  8. }
复制代码

最后,我建议您检查一下代码中是否存在其他可能导致崩溃的问题,例如是否对指针进行了非法操作等。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-1 21:02:00 | 显示全部楼层
本帖最后由 猪猪虾 于 2023-5-1 21:03 编辑
isdkz 发表于 2023-5-1 20:25
从你的代码来看,你在  MyPlane  类的构造函数中使用了  GameMain  类的指针  GM 。但是,你没有初始化这 ...


按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。
  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. //#include "GameMain.h"
  6. using namespace std;
  7. class GameMain;

  8. class MyPlane
  9. {
  10. public:
  11.         MyPlane(GameMain* gm);  //  MyPlane  类的构造函数中使用了 GameMain 类的指针  GM 。但是,你没有初始化这个指针
  12.         //static IMAGE getImages();    //私有成员可以在public里面,通过函数来间接访问和修改
  13.         void Move(int dx, int dy);
  14.         static IMAGE getImage_Myplane();

  15.         int My_current_posiX;
  16.         int My_current_posiY;
  17.         int width;
  18.         int height;

  19. private:
  20.         static IMAGE imgMyplane;
  21.         GameMain *GM;
  22. };
复制代码

  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. #include "MyPlane.h"
  6. #include "GameMain.h"

  7. using namespace std;

  8. //静态成员,需要在类外进行声明
  9. IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间

  10. //`MyPlane` 类在头文件 `MyPlane.h` 中声明,而 `imgMyplane` 的定义位于与类实现相关联的源文件
  11. //`MyPlane.cpp` 中。这样,您就解决了 `LNK2001` 错误。
  12. //如果您将所有代码放在同一个文件中,那么只需在类定义之后添加 `IMAGE MyPlane::imgMyplane; ` 这一行即可。
  13. //IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间


  14. MyPlane::MyPlane(GameMain* gm):GM(gm)
  15. {
  16.         width = 100;
  17.         height = 125;
  18.         loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

  19.         //初始化飞机的位置在图像的正下方的中心
  20.        
  21.         My_current_posiX = GM->rows / 2 - width / 2;
  22.         My_current_posiY = GM->cols - height;
  23. }

  24. IMAGE MyPlane::getImage_Myplane()
  25. {
  26.         return imgMyplane;
  27. }

  28. void MyPlane::Move(int dx, int dy)
  29. {
  30.        
  31.         My_current_posiX += dx;
  32.         My_current_posiY += dy;

  33.         //判断是否超出了边界,还要考虑飞机本身的宽度
  34.         if (My_current_posiX > (GM->rows - width / 2) || My_current_posiX < width / 2)
  35.         {
  36.                 My_current_posiX -= dx;
  37.         }

  38.         if (My_current_posiX > (GM->cols - height / 2) || My_current_posiX < height / 2)
  39.         {
  40.                 My_current_posiY -= dy;
  41.         }
  42. }
复制代码

  1. #pragma once
  2. #include<graphics.h>
  3. #include<cstring>
  4. #include<vector>
  5. //#include<MyPlane.h> 如果这里这么用,会发现 当前.h文件和MyPlane.h文件的彼此头文件相互包含,会报错
  6. class MyPlane;  //告诉编译器,需要这个类,其他功能结构都没变
  7. using namespace std;

  8. class GameMain
  9. {
  10. public:
  11.         //构造函数  用于初始化参数,游戏界面设置

  12.         GameMain();

  13.         //注意,你需要在  GameMain  类的析构函数中删除  MyPlane  
  14.    //类的实例*以避免内存泄漏。在  GameMain  类中添加一个析构函数,并在其中删除  MP :GameMain.h文件
  15.         ~GameMain();  // 添加析构函数
  16.         //游戏界面初始化
  17.         void init();
  18.         void paly(); // 开始游戏
  19.         int* getBgSize();

  20.         int rows;
  21.         int cols;

  22. private:
  23.         void keyEvent();  //按键控制
  24.         void updateWindow();  //渲染界面

  25. private:
  26.         bool update;

  27.         // 添加这一行,这样其他地方调用这个类的时候,就不用每次都申明,不同地方申明,还是不同的对象,无法
  28.         //实现同时操作一辆飞机
  29.         MyPlane *MP;

  30.         //背景图像参数
  31.         IMAGE imgBg;  //背景图片
  32. };
复制代码

  1. #include "GameMain.h"
  2. #include "MyPlane.h"
  3. #include "Bullet.h"
  4. #include<stdlib.h>
  5. #include <time.h>
  6. #include<graphics.h>
  7. #include <conio.h>
  8. #include"iostream"
  9. #include"string"
  10. #include "fstream"
  11. //音效
  12. #include<mmsystem.h>
  13. #pragma comment(lib,"winmm.lib")
  14. #pragma comment(lib,"WINMM.LIB")

  15. using namespace std;

  16. GameMain::GameMain()
  17. {
  18.         MP = new MyPlane(this);  // 在创建 MyPlane 实例时传递 GameMain 类的指针
  19.         // 为 MyPlane 类对象的指针 MP 分配内存空间
  20.         //MP = new MyPlane();
  21.         //将游戏界面的宽度指定成背景图片的显示宽度
  22.         rows = 438;
  23.         cols = 675;
  24. }

  25. //析构函数主要作用就是释放资源, 避免内存泄漏
  26. GameMain::~GameMain()
  27. {
  28.         delete MP;  // 删除 MyPlane 实例
  29. }

  30. void GameMain::init()
  31. {
  32.         //播放背景音乐
  33.         mciSendString("play E:/2022上/res/bg.mp3 repeat", 0, 0, 0);

  34.         //创建游戏窗口
  35.         *initgraph(rows, cols);

  36.         //加载背景图片
  37.         loadimage(&imgBg, "E:/2022上/Leecode_April/plane/image/background.png");

  38.         update = true;
  39. }

  40. void GameMain::paly()
  41. {
  42.         init();

  43.         while (1)
  44.         {
  45.                 BeginBatchDraw();
  46.                 //接收用户的输入
  47.                 //keyEvent();

  48.                 //更新游戏画面
  49.                 updateWindow();
  50.                 system("pause");
  51.                 EndBatchDraw();
  52.         }
  53. }

  54. //int* GameMain::getBgSize()
  55. //{
  56. //        int num[] = { rows ,cols };
  57. //        int* ptr = new int[2];
  58. //        for (int i = 0; i < 2; i++) {
  59. //                ptr[i] = num[i];
  60. //        }
  61. //        return ptr;
  62. //}


  63. //void GameMain::keyEvent()
  64. //{
  65. //        unsigned char ch;
  66. //        int dx = 0;
  67. //        int dy = 0;
  68. //
  69. //        //判断当前有没有按键输入,如果他没有按键输入,程序正常执行
  70. //        if (_kbhit()) {
  71. //                ch = _getch();
  72. //
  73. //                //按下字母,返回的就是字母,按下的是方向键
  74. //                //上,先后返回: 224 72  下:224 80   左:75 224,75  右:224 77
  75. //                if (ch == 224) {
  76. //                        ch = _getch();
  77. //                        switch (ch) {
  78. //                        case 72:
  79. //                                dy = 1;
  80. //                                break;
  81. //                        case 80:
  82. //                                dy = -1;
  83. //                                break;
  84. //                        case 75:
  85. //                                dx = -1;
  86. //                                break;
  87. //                        case 77:
  88. //                                dx = 1;
  89. //                                break;
  90. //                        default:
  91. //                                break;
  92. //                        }
  93. //                }
  94. //        }
  95. //        if (dx != 0 || dy != 0)  //左右移动
  96. //        {
  97. ////                MyPlane MP;
  98. //        //        MP->Move(dx,dy);
  99. //                update = true;
  100. //        }
  101. //}

  102. void GameMain::updateWindow()
  103. {
  104.         putimage(0, 0, &imgBg);

  105.         BeginBatchDraw();

  106.         //绘制我方飞机
  107.         //MyPlane MP;
  108.         IMAGE TEMP_my;
  109.         TEMP_my = MP->getImage_Myplane();
  110.         putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

  111.         //绘制子弹
  112.         Bullet BT;
  113.         IMAGE TEMP_BT;
  114.         TEMP_BT = BT.getImage_Bullet();
  115.         putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_BT);

  116.         EndBatchDraw();
  117. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-2 20:26:43 | 显示全部楼层
isdkz 发表于 2023-5-1 22:02
根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一 ...

谢谢,解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-3 21:45:22 | 显示全部楼层
陶远航 发表于 2023-5-1 20:21
根据您提供的信息,我无法确定导致程序崩溃的确切原因,但是可以提供一些可能导致崩溃的问题。

在Mainpl ...

忘了表示感谢了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 08:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表