- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个程序,可以绘制在屏幕上弹跳的球。我目前正在研究绘制球的部分。
我的代码包括以下内容:
球引擎.h:
#pragma once
#include <allegro5\allegro.h>
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include "BallManager.h"
ALLEGRO_DISPLAY *display;
class BallEngine
{
private:
bool fullScreen;
int fps;
bool running;
public:
BallManager BManager;
bool getFullScreen();
bool getIsRunning();
void updateFullScreen();
void setFullScreen(bool value);
void setIsRunning(bool value);
int getFPS();
//Allegro Objects
ALLEGRO_FONT *deafault_font_12;
ALLEGRO_EVENT_QUEUE *event_queue;
ALLEGRO_TIMER *timer;
//Colors
ALLEGRO_COLOR RED;
ALLEGRO_COLOR GREEN;
ALLEGRO_COLOR BLUE;
ALLEGRO_COLOR YELLOW;
ALLEGRO_COLOR PINK;
ALLEGRO_COLOR LIGHT_BLUE;
ALLEGRO_COLOR WHITE;
ALLEGRO_COLOR BLACK;
//Debug
bool showDebug;
void drawBallInfo(int x, int y, int id); //Draws information about a certain ball
BallEngine(int width, int height);
~BallEngine(void);
};
球引擎.cpp:
#include "BallEngine.h"
BallEngine::BallEngine(int width, int height)
{
running = true;
showDebug = false;
fps = 60;
al_init();
if(!al_init())
{
printf("Failed to initalize Allegro \n");
}
al_install_keyboard();
if(!al_install_keyboard())
{
printf("Failed to initalize keyboard \n");
}
al_init_font_addon();
al_init_ttf_addon();
fullScreen = false;
updateFullScreen();
deafault_font_12 = al_load_font("arial.ttf", 12, 0);
event_queue = al_create_event_queue();
al_register_event_source(event_queue, al_get_keyboard_event_source());
timer = al_create_timer(1.0/fps);
al_register_event_source(event_queue, al_get_timer_event_source(timer));
display = al_create_display(width, height);
//Define engine colors
RED = al_map_rgb(255,0,0);
GREEN = al_map_rgb(0,255,0);
BLUE = al_map_rgb(0,0,255);
YELLOW = al_map_rgb(255,255,0);
PINK = al_map_rgb(255,0,255);
LIGHT_BLUE = al_map_rgb(255,255,0);
WHITE = al_map_rgb(255,255,255);
BLACK = al_map_rgb(0,0,0);
}
BallEngine::~BallEngine(void)
{
}
bool BallEngine::getFullScreen()
{
return fullScreen;
}
bool BallEngine::getIsRunning()
{
return running;
}
void BallEngine::updateFullScreen()
{
if ( fullScreen == true )
{
al_set_new_display_flags(ALLEGRO_FULLSCREEN);
}
else
{
al_set_new_display_flags(ALLEGRO_WINDOWED);
}
}
void BallEngine::setFullScreen(bool value)
{
fullScreen = value;
}
int BallEngine::getFPS()
{
return fps;
}
void BallEngine::drawBallInfo(int x, int y, int id)
{
if(BManager.isBallExist(id))
{
al_draw_textf(deafault_font_12, RED, x, y, 0, "X: %i Y: %i Velocity: %i Angle: %i Radius: %i Color %ALLEGRO_COLOR ", BManager.getBall_X(id), BManager.getBall_Y(id), BManager.getBall_Velocity(id), BManager.getBall_Angle(id), BManager.getBall_Radius(id), BManager.getBall_Color(id));
}
else
{
printf("Failed to draw ball %i information: Ball selceted out of range \n", id);
}
}
球管理器.h:
#pragma once
#include <iostream>
#include <vector>
#include "Ball.h"
#include <allegro5\allegro.h>
class BallManager
{
private:
std::vector<Ball*> List;
public:
//Get functions
int getBall_X(int id);
int getBall_Y(int id);
int getBall_Velocity(int id);
int getBall_Angle(int id);
int getBall_Radius(int id);
ALLEGRO_COLOR getBall_Color(int id);
//Set Functions
void setBall_X(int id, int value);
void setBall_Y(int id, int value);
void setBall_Velocity(int id, int value);
void setBall_Angle(int id, int value);
void setBall_Radius(int id, int value);
void setBall_Color(int id, ALLEGRO_COLOR value);
bool isBallExist(int id); //Returns true if a ball at index id exists. Else returns false.
void CreateBall(int x, int y, int velocity, int angle, int radius, ALLEGRO_COLOR color);
void DeleteBall(int id);
void drawBall(int id);
void drawBalls();
void updateBalls(); //NOT YET DONE
BallManager(void);
~BallManager(void);
};
球管理器.cpp:
#include "BallManager.h"
BallManager::BallManager(void)
{
}
BallManager::~BallManager(void)
{
}
//Get Functions:
int BallManager::getBall_X(int id)
{
return List[id]->getPos_X();
}
int BallManager::getBall_Y(int id)
{
return List[id]->getPos_Y();
}
int BallManager::getBall_Velocity(int id)
{
return List[id]->getVelocity();
}
int BallManager::getBall_Angle(int id)
{
return List[id]->getAngle();
}
int BallManager::getBall_Radius(int id)
{
return List[id]->getRadius();
}
ALLEGRO_COLOR BallManager::getBall_Color(int id)
{
return List[id]->getColor();
}
//Set functions:
void BallManager::setBall_X(int id, int value)
{
List[id]->setPos_X(value);
}
void BallManager::setBall_Y(int id, int value)
{
List[id]->setPos_Y(value);
}
void BallManager::setBall_Velocity(int id, int value)
{
List[id]->setVelocity(value);
}
void BallManager::setBall_Angle(int id, int value)
{
List[id]->setAngle(value);
}
void BallManager::setBall_Radius(int id, int value)
{
List[id]->setRadius(value);
}
void BallManager::setBall_Color(int id, ALLEGRO_COLOR value)
{
List[id]->setColor(value);
}
void BallManager::CreateBall(int x, int y, int velocity, int angle, int radius, ALLEGRO_COLOR color)
{
Ball* ball = new Ball(x, y, velocity, angle, radius, color);
List.push_back(ball);
}
void BallManager::DeleteBall(int id)
{
if(isBallExist(id))
{
delete List[id];
List.erase(List.begin()+id);
}
else
{
printf("Failed to delete ball %i information: Ball selceted out of range \n", id);
}
}
bool BallManager::isBallExist(int id)
{
if((id+1) > List.size() || id < 0)
{
return false;
}
return true;
}
void BallManager::drawBall(int id)
{
List[id]->Draw();
}
void BallManager::drawBalls()
{
int total = List.size();
for(int index = 0; index < total; index++)
{
List[index]->Draw();
}
}
void updateBalls()
{
//TODO
}
球.h:
#pragma once
#include <allegro5\allegro.h>
#include <allegro5\allegro_primitives.h>
class Ball
{
private:
int x;
int y;
int velocity; //Positive is left side of screen, Negitive is right side of screen
int angle; // Angle derived from the positive vertical
int radius;
ALLEGRO_COLOR color;
public:
//Get Functions
int getPos_X();
int getPos_Y();
int getVelocity();
int getAngle();
int getRadius();
ALLEGRO_COLOR getColor();
//Set Functions
void setPos_X(int value);
void setPos_Y(int value);
void setVelocity(int value);
void setAngle(int value);
void setRadius(int value);
void setColor(ALLEGRO_COLOR value);
//Draws to screen
void Draw();
//Constructor
Ball(int Start_X, int Start_Y, int Start_Velocity, int Start_Angle, int Start_Radius, ALLEGRO_COLOR Start_Color);
//Desctructor
~Ball(void);
};
球.cpp:
#include "Ball.h"
Ball::Ball(int Start_X, int Start_Y, int Start_Velocity, int Start_Angle, int Start_Radius, ALLEGRO_COLOR Start_Color)
{
x = Start_X;
y = Start_Y;
velocity = Start_Velocity;
angle = Start_Angle;
radius = Start_Radius;
color = Start_Color;
}
Ball::~Ball(void)
{
}
//Get functions
int Ball::getPos_X()
{
return x;
}
int Ball::getPos_Y()
{
return y;
}
int Ball::getVelocity()
{
return velocity;
}
int Ball::getAngle()
{
return angle;
}
int Ball::getRadius()
{
return radius;
}
ALLEGRO_COLOR Ball::getColor()
{
return color;
}
//Set functions
void Ball::setPos_X(int value)
{
x = value;
}
void Ball::setPos_Y(int value)
{
y = value;
}
void Ball::setVelocity(int value)
{
velocity = value;
}
void Ball::setAngle(int value)
{
angle = value;
}
void Ball::setRadius(int value)
{
radius = value;
}
void Ball::setColor(ALLEGRO_COLOR value)
{
color = value;
}
void Ball::Draw()
{
al_draw_filled_circle(x, y, radius, color);
}
主要.cpp:
#include <allegro5\allegro.h>
#include "BallEngine.h"
int ScreenWidth = 620;
int ScreenHeight = 480;
int main()
{
BallEngine Engine(ScreenWidth, ScreenHeight);
//Test balls
Engine.BManager.CreateBall(10, 20, 0, 0, 5, al_map_rgb(0,0,255));
Engine.BManager.CreateBall(11, 21, 1, 1, 5, al_map_rgb(0,0,255));
Engine.BManager.CreateBall(12, 22, 2, 2, 5, al_map_rgb(0,0,255));
Engine.BManager.CreateBall(13, 23, 3, 3, 5, al_map_rgb(0,0,255));
ALLEGRO_EVENT events;
int selected = 0; //Used to show which ball is selected
al_start_timer(Engine.timer);
while(Engine.getIsRunning())
{
al_wait_for_event(Engine.event_queue, &events);
if(events.type == ALLEGRO_EVENT_KEY_DOWN)
{
//Keyboard Input
switch(events.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
Engine.setIsRunning(false);
break;
case ALLEGRO_KEY_RIGHT:
Engine.showDebug = !Engine.showDebug; //Toggles the selected balls info
break;
case ALLEGRO_KEY_UP:
selected++;
break;
case ALLEGRO_KEY_DOWN:
selected--;
break;
case ALLEGRO_KEY_DELETE:
Engine.BManager.DeleteBall(selected); //Deletes a certain ball
break;
}
}
else if(events.type == ALLEGRO_EVENT_TIMER)
{
//Update
}
//Draw
Engine.BManager.drawBalls();
//Show debug
if(Engine.showDebug == true)
{
Engine.drawBallInfo(10, 10, selected);
}
al_flip_display();
al_clear_to_color(al_map_rgb(0,0,0));
}
return 0;
}
我在画球时遇到问题。在 allegro 4 中,您将传递一个要在其上绘制的缓冲区,然后将缓冲区绘制到屏幕上。使用上面的代码,我在 Ball 类的 draw() 函数中遇到错误。
错误如下:调试错误!R6010 -abort() 已被调用
我还在命令提示符下获得了一些信息:断言失败:addon_initialized,文件 allegro-git\addons\primitives\primitives.c,第 79 行
我认为我遇到了一个错误,因为显示是在 BallEngine 类中创建的,因此绘制函数没有任何地方可以绘制,但我该如何修复它?
最佳答案
Assertion failed: addon_initialized, file allegro-git\addons\primitives\primitives.c, line 79
这正是问题所在。您还没有初始化基元插件。
al_init_primitives_addon()
此外,您应该使用正斜杠作为路径的一部分(例如 <allegro5/allegro.h>
),因为它是跨平台的。
关于c++ - Allegro 5绘图缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007503/
此功能的 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 时遇到了问题。当我播放样本时,我无法再次播放该样本,直到它完成播放。有时,如果另一个不同的样本正在播放,它也不会播放样本。 无论如何要解决这个问题? 我用“声音”类播
我是一名优秀的程序员,十分优秀!