- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在学习面向对象编程和 allegro 库,所以我开始编写一个简单的菜单,但代码显示黑屏然后崩溃。
对于有关类外观、使用 header 拆分代码、代码的一般语法以及最重要的是找到代码无法解决的问题的建议,我将不胜感激。
主要.cpp
#include "Menu.h"
int main() {
Menu m;
return 0;
}
END_OF_MAIN()
菜单.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
菜单.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();
}
菜单指针.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
菜单指针.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() 在继续之前没有返回错误,并且所有位图都已实际加载。 (不是== null)
关于c++ - Allegro 程序显示黑屏然后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234739/
此功能的 allegro 5 版本是什么? texture_number = allegro_gl_make_texture_ex(AGL_TEXTURE_MASKED, my_bitmap, GL_
我得到了 Allegro 开发库,编写并编译了一个简单的应用程序,然后在我的计算机上运行它,它运行良好。我有一个 friend 测试过它,但是当双击它时它没有做任何事情。我认为问题是他没有安装Alle
我正在制作一款游戏,我不希望我的用户下载游戏文件夹以外的任何内容,只需双击即可运行。我可以在没有 Xcode 的情况下在 OSX 中编译我的代码,但当我尝试在另一台使用 OSX 的计算机上运行游戏时,
我想知道是否有人可以为这个错误指出正确的方向。 我正在学习使用Visual Studio 2010中安装的Allegro 5进行2D游戏编程。 我一直在关注一个教程系列,直到上一课为止,一切都很好。
我正在编写MOD播放器,尝试使用Allegro5原始流功能播放样本,但我无法弄清该流的确切初始化参数,以播放从mod文件加载的样本数据。 这就是我所拥有的: xf::ModLoader ml; ml.
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在使用 Allegro 5 用 C 语言开发 2D 游戏,其中敌人从固定位置向玩家当前位置发射射弹。我知道我必须根据玩家的位置和敌人的位置来计算假想三角形的正切。但是,如何让射弹根据该值沿着直线运
我正在按照命令使用 Allegro 做我的类(class)作业。 我需要捕获键盘上的按键事件,为此我使用了以下代码: al_wait_for_event(evento, &ev); if(ev.typ
我的一个 friend 试图在 Allegro 中重载一个用于比较颜色的相等运算符,但是它不起作用,他收到错误“运算符不匹配==”这是在 Color 类/结构之外重载的,重载的运算符函数如下所示: t
我正在制作一个程序,可以绘制在屏幕上弹跳的球。我目前正在研究绘制球的部分。 我的代码包括以下内容: BallEngine 类 - 管理所有 Allegro 函数/对象 BallManager 类 -
例如,如果我使用 Allegro 函数 ALLEGRO_DISPLAY *display=al_create_display(660, 660); 创建的屏幕上的 (100 , 100) 像素是红色或
谁能告诉我如何在 allegro 5 中打开一个浏览窗口,用户可以在其中选择文件,程序将使用该文件作为输入? 最佳答案 Allegro 5 具有这种文件对话框功能。 How to create dia
我是 allegro 和 c++ 的初学者。我正在尝试使用位图命令。我用这个简单的程序来测试它: #include BITMAP *red; int main(){ allegro_init
除了不断调用 remove_joystick() 然后 install_joystick 之外,有没有办法更新运行时插入的操纵杆数量?这被证明是非常慢的(从 60 FPS 到大约 5)。 只请 All
我正在接受有关将 allegro 库与 C++ 结合使用的培训,但我遇到了一个问题,在将大图像用于视差背景时,我会在屏幕上向下滚动时出现持续的负载/故障,使我所有的图像都闪烁了一下,有没有办法加载背景
我想在图形窗口中打印出我的鼠标坐标,当用户点击它时,应该会出现一条消息“clicked”。但问题是当用户点击它时,我收到了大约 5-10 条消息,而不是 1 条消息。我知道这可能是因为我松开按钮的速度
我正在学习面向对象编程和 allegro 库,所以我开始编写一个简单的菜单,但代码显示黑屏然后崩溃。 对于有关类外观、使用 header 拆分代码、代码的一般语法以及最重要的是找到代码无法解决的问题的
在 Allegro 中,我可以通过运行 将窗口设置为可调整大小 al_set_new_display_flags(ALLEGRO_RESIZABLE); 之前 display = al_create_
大家好,我正在制作一个 C++ 游戏,我试图将位图加载到我的游戏屏幕上,但是当我这样做时,图像没有出现,只有一个黑色的正方形,如下所示: 我目前正在使用以下代码: BITMAP *buffer = c
我在播放样本 Allegro 5 时遇到了问题。当我播放样本时,我无法再次播放该样本,直到它完成播放。有时,如果另一个不同的样本正在播放,它也不会播放样本。 无论如何要解决这个问题? 我用“声音”类播
我是一名优秀的程序员,十分优秀!