快板程序显示黑屏,然后崩溃
Allegro program displays a black screen then crash
我正在学习面向对象编程和allegro库,所以我开始写一个简单的菜单,但代码显示黑屏,然后崩溃。
我将非常感谢关于类的外观,用头拆分代码,代码的一般语法以及最重要的是找到代码不工作的问题的建议。
main.cpp
#include "Menu.h"
int main() {
Menu m;
return 0;
}
END_OF_MAIN()
Menu.h
#ifndef MENU_H_
#define MENU_H_
#include <allegro.h>
class Menu {
static bool isWorking;
static const int WIDTH = 800;
static const int HEIGHT = 600;
public:
Menu();
virtual ~Menu();
};
#endif
menu.cpp
#include "MenuPointer.h"
#include "Menu.h"
#include <string>
using namespace std;
bool Menu::isWorking = true;
Menu::Menu() {
allegro_init();
install_keyboard();
install_timer();
set_color_depth(8);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, WIDTH, HEIGHT, 0, 0);
string * menuOptions = new string[2];
menuOptions[0] = "New Game";
menuOptions[2] = "Exit";
// menu pointer is an object highlighting menu options
MenuPointer menuPointer(2, 0, WIDTH, HEIGHT/2, menuOptions);
while (isWorking) {
menuPointer.menuInit();
blit(menuPointer.getBuffer(), screen, 0, 0, 0, 0, WIDTH, HEIGHT);
}
}
Menu::~Menu() {
allegro_exit();
clear_keybuf();
}
MenuPointer.h
#ifndef MENUPOINTER_H_
#define MENUPOINTER_H_
#include <string>
#include <allegro.h>
using namespace std;
class MenuPointer {
int pointerNumber;
BITMAP * buffer;
const int optionsNumber;
const int pointerWidth;
const int pointerHeight;
BITMAP ** optionsImages;
const string * optionsTexts;
void paintPointer();
public:
void menuInit();
BITMAP * getBuffer();
MenuPointer(int, int, int, int, BITMAP **);
MenuPointer(int, int, int, int, const string *);
virtual ~MenuPointer();
};
#endif
MenuPointer.cpp
#include "MenuPointer.h"
#include "Menu.h"
#include <string>
using namespace std;
// this constructor creates menu pointer when options are array of images
MenuPointer::MenuPointer(int i, int j, int k, int l, BITMAP ** optionsImages)
:pointerNumber(j), optionsNumber(i), pointerWidth(k), pointerHeight(l) {
buffer = create_bitmap(pointerWidth, pointerHeight);
optionsTexts = NULL;
this->optionsImages = optionsImages;
}
// this constructor creates menu pointer when options are array of text
MenuPointer::MenuPointer(int i, int j, int k, int l, const string * optionsTexts)
:pointerNumber(j), optionsNumber(i), pointerWidth(k), pointerHeight(l) {
buffer = create_bitmap(pointerWidth, pointerHeight);
optionsImages = NULL;
this->optionsTexts = optionsTexts;
}
// draws a rectangle in the range from the beginning to the next option which highlights
void MenuPointer::paintPointer() {
rectfill(buffer, 0, pointerNumber*pointerHeight, pointerHeight, (pointerNumber+1)*pointerHeight, makecol( 128, 30, 30 ) );
}
void MenuPointer::menuInit() {
clear_to_color(buffer, makecol( 128, 128, 128 ));
paintPointer();
if (optionsTexts != NULL) {
// converts string to char array
for (int i = 0; i < optionsNumber; ++i) {
char *a = new char[optionsTexts[i].size()+1];
a[optionsTexts[i].size()] = 0;
memcpy(a, optionsTexts[i].c_str(), optionsTexts[i].size());
textout_ex(screen, font, a, 0, i*pointerWidth, makecol(255,0,0), -1);
}
} else {
// draws option image for images array
for (int i = 0; i < optionsNumber; ++i) {
masked_blit(optionsImages[i], screen, 0, 0, 0, i*pointerWidth, optionsImages[i]->w, optionsImages[i]->h);
}
}
}
BITMAP * MenuPointer::getBuffer() {
return buffer;
}
MenuPointer::~MenuPointer() {
destroy_bitmap(buffer);
}
始终检查返回值!尤其是当事情开始崩溃的时候。
您要求Allegro以8位颜色深度运行。这可能会失败,甚至在32位系统上请求24位也可能失败。您可以使用desktop_color_depth()来查找主机正在运行的内容。
确保set_gfx_mode()在继续之前不会返回错误,并且所有位图都被实际加载。(not == null)
你有更多关于崩溃的调试信息吗?
首先,可能导致崩溃的一个问题是对数组菜单选项的错误访问。
string * menuOptions = new string[2];
menuOptions[0] = "New Game";
menuOptions[2] = "Exit"; // THIS IS WRONG
在这个循环中有泄漏:
for (int i = 0; i < optionsNumber; ++i) {
char *a = new char[optionsTexts[i].size()+1]; //this is never freed
a[optionsTexts[i].size()] = 0;
memcpy(a, optionsTexts[i].c_str(), optionsTexts[i].size());
textout_ex(screen, font, a, 0, i*pointerWidth, makecol(255,0,0), -1);
}
各种提示:- 使用strncpy而不是memcpy来复制字符串
- 方法/函数参数的名称必须更清晰。(不要使用i,j,k)
- 我总是喜欢把名字放在方法/函数声明上。
- 把你的循环方法放在构造函数之外。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 不明白为什么这个简单的递归开始工作然后崩溃
- 为什么下面的使用链表实现线性队列的代码返回垃圾值然后崩溃
- 当我递增指针然后将其删除时,为什么我的程序会崩溃
- 我有一个 c++ 代码,它在启动时崩溃,然后到达问题所在 main() 的执行
- 代码工作到一定程度,然后崩溃
- concurrent_queue内存消耗爆炸式增长,然后程序崩溃
- 将uchar转换为int,然后转换为字符串会导致崩溃
- 快板程序显示黑屏,然后崩溃
- 插入C++会触发程序消息,然后崩溃
- 对指针向量进行排序一次,然后崩溃并"unable to read memory"