我一直在學習一些遊戲編程與快板最近,我碰到的一個問題。 我的「遊戲」是我現在學到的許多教程的編譯類型。無論如何,我遇到了Allegro的功能問題。 我的第一個代碼是這樣的:快板4功能錯誤
#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」,這將載入位圖和「初始化」,這將初始化快板兩個新的功能,圖形等 現在,當我編譯它它比賽我錯誤,沒有定義BITMAPs,像太空船,緩衝區等。雖然,我已經在int main:load_externs()中添加了函數。 並且它不是初始化快板,這意味着它不讀我INT主(增加)的功能,但爲什麼的頂部?我可能在這裏錯過了一些東西,我會感謝一些幫助,謝謝。 :)
編輯:我不能要求這對allegro.cc以及我已經作出一個帳戶那裏,我不能用它登錄,同樣的事情發生時,我的另一個帳戶。我不斷收到登錄錯誤...:/但...我知道stackoverflow的真棒成員總是在這裏幫助。 :d
我知道了,謝謝您的幫助!我剛剛檢出全局變量,現在我的函數正在工作:D –