2013-10-27 44 views
0

我一直在學習一些遊戲編程與快板最近,我碰到的一個問題。 我的「遊戲」是我現在學到的許多教程的編譯類型。無論如何,我遇到了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

回答

0

您已經在load_externs做出的位圖的局部變量,他們不會在像main等功能可見。

最快的解決辦法是讓bufferspaceship等全球性的。

+0

我知道了,謝謝您的幫助!我剛剛檢出全局變量,現在我的函數正在工作:D –