快板 4 函数错误
Allegro 4 Functions Errors
我最近一直在学习一些使用allegro的游戏编程,但我遇到了一个问题。我的"游戏"是我现在学到的许多教程的编译类型。无论如何,我在 Allegro 上遇到了功能问题。我的第一个代码是这样的:
#include <allegro.h>
#include <sstream>
#include <string>
#include <cstring>
#include <fstream>
volatile bool Close = false;
void handler(){
Close = true;}
/*timer*/
volatile long speed_counter = 0;
void increment_speed_counter(){
speed_counter++;
}
END_OF_FUNCTION(increment_speed_counter);
using namespace std;
int main()
{
if(!allegro_init()){
fstream error;
error.open("error_log.txt", ios::ate);
error << "ERROR: Failed to initialized allegro!!n";
error.close();
}
install_keyboard();
install_timer();
LOCK_VARIABLE(speed_counter);
LOCK_FUNCTION(increment_speed_counter);
install_int_ex(increment_speed_counter, BPS_TO_TIMER(120));
set_color_depth(24);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
BITMAP *buffer = create_bitmap(640, 480);
BITMAP *spaceship = load_bitmap("ship.bmp", NULL); //up
BITMAP *spaceship2 = load_bitmap("ship2.bmp", NULL); //down
BITMAP *spaceship3 = load_bitmap("ship3.bmp", NULL); //right
BITMAP *spaceship4 = load_bitmap("ship4.bmp", NULL); //left
FONT *myriad = load_font("myriad.pcx", NULL, NULL);
BITMAP *meteor = load_bitmap("meteor.bmp", NULL);
BITMAP *options = create_bitmap(640, 480);
//srand(time(NULL));
LOCK_FUNCTION(handler);
//int mx = rand() % 100;
//int my = rand() % 100;
long int ship_x = 300;
long int ship_y = 200;
int Bx [1000];
int By [1000];
bool done = false;
set_close_button_callback(handler);
while(!Close){
while(speed_counter > 0){
textprintf_ex(screen, font, 200,10, makecol(255,100,200), -1, "Space Void: Asonomia");
if(ship_x >= 620){
ship_x = 620;
}
if(ship_y >= 460){
ship_y = 460;
}
if(ship_x <= 0){
ship_x = 0;
}
if(ship_y <= 0){
ship_y = 0;
}
if(key[KEY_ESC]){
Close = true;
}
if(key[KEY_LEFT]){
ship_x -=5;
clear(buffer);
draw_sprite(buffer, spaceship4, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_RIGHT]){
ship_x +=5;
clear(buffer);
draw_sprite(buffer, spaceship3, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_UP]){
ship_y -= 5;
clear(buffer);
draw_sprite(buffer, spaceship, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_DOWN]){
ship_y += 5;
clear(buffer);
draw_sprite(buffer, spaceship2, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
speed_counter--;
}
}
destroy_bitmap(spaceship);
destroy_bitmap(spaceship2);
destroy_bitmap(spaceship3);
destroy_bitmap(spaceship4);
destroy_bitmap(buffer);
return 0;
}
END_OF_MAIN()
它非常混乱,所以我决定通过添加功能来清理一下。
所以现在是这样的:
#include <allegro.h>
#include <sstream>
#include <string>
#include <cstring>
#include <fstream>
//X Button
volatile bool Close = false;
void handler(){
Close = true;}
//FPS
volatile long speed_counter = 0;
void increment_speed_counter(){
speed_counter++;
}
void initialize(){
if(!allegro_init()){
allegro_message("Error Initializing Allegro");
}
install_keyboard();
install_timer();
LOCK_VARIABLE(speed_counter);
LOCK_FUNCTION(increment_speed_counter);
install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));
//Video Mode
set_color_depth(24);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0,0);
}
void load_externs(){
BITMAP *buffer = create_bitmap(640, 480);
BITMAP *spaceship = load_bitmap("ship.bmp", NULL); //up
BITMAP *spaceship2 = load_bitmap("ship2.bmp", NULL); //down
BITMAP *spaceship3 = load_bitmap("ship3.bmp", NULL); //right
BITMAP *spaceship4 = load_bitmap("ship4.bmp", NULL); //left
BITMAP *meteor = load_bitmap("meteor.bmp", NULL);
BITMAP *options = create_bitmap(640, 480);
}
int main(){
initialize();
load_externs();
long int ship_x = 300;
long int ship_y = 200;
bool done = false;
set_close_button_callback(handler);
while(!Close){
while(speed_counter > 0){
textprintf_ex(screen, font, 200,10, makecol(255,100,200), -1, "Space Void: Asonomia");
if(ship_x >= 620){
ship_x = 620;
}
if(ship_y >= 460){
ship_y = 460;
}
if(ship_x <= 0){
ship_x = 0;
}
if(ship_y <= 0){
ship_y = 0;
}
if(key[KEY_ESC]){
Close = true;
}
if(key[KEY_LEFT]){
ship_x -=5;
clear(buffer);
draw_sprite(buffer, spaceship4, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_RIGHT]){
ship_x +=5;
clear(buffer);
draw_sprite(buffer, spaceship3, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_UP]){
ship_y -= 5;
clear(buffer);
draw_sprite(buffer, spaceship, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
if(key[KEY_DOWN]){
ship_y += 5;
clear(buffer);
draw_sprite(buffer, spaceship2, ship_x, ship_y);
blit(buffer, screen, 0,0,0,0, 640, 480);
rest(20);
}
speed_counter--;
}
}
destroy_bitmap(spaceship);
destroy_bitmap(spaceship2);
destroy_bitmap(spaceship3);
destroy_bitmap(spaceship4);
destroy_bitmap(buffer);
return 0;
}
END_OF_MAIN()
我添加了两个新功能,分别是"load_externs",它将加载位图和"初始化",它将初始化快板、图形等。现在,当我编译它时,它错误地告诉我没有定义位图,如宇宙飞船、缓冲区等。虽然,我已经在 int main 中添加了函数:load_externs();最重要的是,它没有初始化 allegro,这意味着它没有读取我在 int main() 中添加的函数,但为什么呢?我可能在这里错过了一些东西,我将不胜感激,谢谢。:)
编辑:我不能在 allegro.cc 上问这个问题,因为我已经在那里创建了一个帐户,但我无法登录它,当我创建另一个帐户时也会发生同样的情况。我不断收到登录错误... :/但。。。我知道stackoverflow的优秀成员总是在这里提供帮助。:D
您已经在 load_externs
中制作了位图局部变量,它们在其他函数(如 main
中将不可见。
最快的解决方案是使buffer
、spaceship
等全球化。
相关文章:
- 链接器错误:函数的多个定义
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:函数声明符之后的预期函数体
- C 错误 - 函数不能超载
- 如何修复传递参数时调用错误函数的主函数?(C++)
- 错误:函数调用中有两个参数
- 错误:函数不是“类”的静态数据成员 - C++
- C ,G 编译错误函数
- CMake 解析错误函数缺少结尾")"。而是找到带有文本的未终止字符串")
- C++ 错误 函数 2 的多重定义
- 错误:函数调用中从int到int(*)[4]的转换无效
- C++14 自动扣除错误:函数返回一个数组
- 视觉C++错误:函数必须返回一个值
- 错误:函数声明中的两种或多种数据类型
- 错误:函数未在作用域中声明
- rtw_android.c错误:函数“strnicmp”的隐式声明[-Weror=隐式函数声明]
- 错误:函数中的return语句没有值,返回“void*”[-fpermission]
- 简单程序中的链接器错误:函数的多重定义
- 错误:函数参数太多
- 错误:函数__tmaincrtstartup中引用的未解析的外部符号_main