2013-06-25 75 views
2

我是一位編程和C++的新手,並學習如何使用Allegro 5編寫遊戲。我爲自己設置的一個項目是清理我在這裏找到的Pong教程源代碼:http://www.cppgameprogramming.com/newforums/viewtopic.php?f=5&t=1991類聲明錯誤:確定類型的上下文信息不足

但是,我遇到了一個問題。編譯器會產生一個我不完全瞭解的錯誤,而且我的研究都沒有被淘汰出局。錯誤是:

上下文信息不足以確定類型

我在互聯網上發現的最接近是此頁:http://bytes.com/topic/c/answers/138897-error-insufficient-contextual-information-determine-type這讓我縮小,這個問題是在類的聲明。然而,那裏提供的解決方案並不完全適用於我,因爲這裏的類構造函數帶有參數。先前在這裏提出的問題似乎並不適用於我的情況,因爲它使用了文件輸出和模板,我都沒有使用這兩個模板。

我已經在下面發佈了一大段我的程序,其中帶有帶有註釋的星號的錯誤生成部分標記出來,以使它們很容易找到,我希望。但是,我遺漏了很多其他代碼,而不是在其他地方。

作爲提示:可能有一些代碼不能從allegro 5識別,如alObject.paint(255,255,255)。這就是我將一些allegro對象和函數整合到他們自己的類中,以使它對我來說更容易一些,因爲編譯器不會在它們中產生錯誤,所以我沒有在這裏列出它的來源。

#include <allegro5/allegro.h> 
#include <allegro5/allegro_primitives.h> 
#include "allegro.h" 

struct CBox{ 
    CBox(int _x, int _y, int _w, int _h):x(_x),y(_y),w(_w),h(_h){} 

    CBox(const CBox& other){ 
    x = other.x; 
    y = other.y; 
    w = other.w; 
    h = other.h; 
    } 
    bool collides(const CBox& other){ 
    return not(other.x + other.w < x or other.y + other.h < y or other.x > x + y or other.y > y + h); 
    } 
    int x; 
    int y; 
    int w; 
    int h; 
}; 

class CPlayer{ 
private: 
    int score; 
    CBox box; 
    ALLEGRO_COLOR color; 
    double mov_y; 
    void testBounds(CBox&); 
public: 
    CPlayer(CBox p, ALLEGRO_COLOR col):box(p),color(col){mov_y = 0.0;} 
    void setScore(int new_s){score=new_s;} 
    int getScore(){return score;} 

    void setBox(const CBox& b){box=b;} 
    CBox getBox(){return box;} 

    void setXYMovement(double new_my){mov_y=new_my;} 
    double getXYMovement(){return mov_y;} 

    void move(CBox& bounds); 

    void draw(){ 
    al_draw_filled_rectangle(box.x, box.y, box.x + box.w, box.y + box.h, color); 
    } 
}; 

class CBall{ 
private: 
    CBox box; 
    ALLEGRO_COLOR color; 
    double mov_y; 
    double mov_x; 
    int last_touch; 
    void testCollision(CBox&, const CBox&, CPlayer*); 
    int testBounds(CBox&, const CBox&); 
public: 
    CBall(CBox p, ALLEGRO_COLOR col):box(p),color(col),last_touch(3){} 
    void setXYMovement(double new_mx, double new_my){ 
    mov_x = new_mx; 
    mov_y = new_my; 
    } 
    void move(const CBox& bounds, CPlayer* plys); 
    void draw(){ 
    al_draw_filled_circle(box.x + box.w/2, box.y + box.h/2, box.w/2, color); 
    } 
}; 

class GameLoop{ 
private: 
    CBox fieldbox(int, int, int, int); 

/************************************************/ 
/***********ERROR HERE?? ERROR HERE??************/ 
/************************************************/ 
    CBall ball(const CBox&, ALLEGRO_COLOR); 
    CPlayer player1(const CBox&, ALLEGRO_COLOR); 
    CPlayer player2(const CBox&, ALLEGRO_COLOR); 
/*************************************************/ 
/*************************************************/ 

public: 
    GameLoop(Allegro&); 
    void GameStart(Allegro&); 
    void runTimerChecks(ALLEGRO_EVENT&, Allegro&); 
    void runExit(ALLEGRO_EVENT&, Allegro&, bool&); 
    void playerInput(ALLEGRO_EVENT&, bool&); 
    void endPlayerInput(ALLEGRO_EVENT&); 
}; 

void CPlayer::move(CBox& bounds){ 
    //make sure the player doesn't go off-bounds 
    testBounds(bounds); 
    box.y+=(int)mov_y; 
    //Players can't move horizontally, so no bounds checking in that matter 
} 

void CPlayer::testBounds(CBox& bounds){ 
    if((mov_y < 0) && (box.y + mov_y < bounds.y)){ 
    box.y = bounds.y; 
    mov_y = 0; 
    } 
    else if((mov_y > 0) && (box.y + box.h > bounds.y + bounds.h)){ 
    box.y = bounds.y + bounds.h - box.h; 
    mov_y = 0; 
    } 
} 

//ghostbox is the precalculated ball's trajectory 
void CBall::move(const CBox& bounds, CPlayer* plys){ 
    CBox ghostbox(box.x+(int)mov_y, box.y+(int)mov_y, box.w, box.h); 

    // test collision for box players 
    testCollision(ghostbox, bounds, plys); 
    testBounds(ghostbox, bounds); 
} 

void CBall::testCollision(CBox& ghostbox, const CBox& bounds, CPlayer* plys){ 
    for(int i = 0; i < 2; i++){ 
    //a player cannot touch the ball twice in a row 
    if(i != last_touch){ 
     CBox other = plys[i].getBox(); 
     if(ghostbox.collides(other)){ 
     //set the last touch to this player 
     last_touch = i; 
     //negate the "ghost movement" in x axis 
     ghostbox.x -= (int)mov_x; 
     //bounce horizontally 
     mov_x = -mov_x; 
     //bounce vertically to change the ball's trajectory 
     mov_y = (((box.y+box.h/2.0)-(other.y+other.h/2.0))/other.h)*10; 
     break; 
     } 
    } 
    } 
} 

int CBall::testBounds(CBox& ghostbox, const CBox& bounds){ 
    if(ghostbox.y < bounds.y){ 
    ghostbox.y = bounds.y; 
    mov_y = -mov_y; 
    } 
    else if(ghostbox.y + ghostbox.h > bounds.y + bounds.h){ 
    ghostbox.y = (bounds.y + bounds.h - ghostbox.h); 
    mov_y = -mov_y; 
    } 

    if(ghostbox.x + ghostbox.w < bounds.x){ 
    box.x = bounds.x + bounds.w/2 - bounds.w/2; 
    box.y = bounds.y + bounds.h/2 - bounds.h/2; 
    return 2; 
    } 
    else if(ghostbox.x > bounds.x + bounds.w){ 
    box.x = bounds.x + bounds.w/2 - box.w/2; 
    box.y = bounds.y + bounds.h/2 - box.h/2; 
    return 1; 
    } 
    box = ghostbox; 
    return 0; 
} 

GameLoop::GameLoop(Allegro& alObject){ 
    // This box is our playfield (covers the whole screen) 
    fieldbox(0,0,alObject.getWidth(), alObject.getHeight()); 
    //we setup the ball at the center of the screen with a white color 
    ball(CBox(alObject.getWidth()/2-10,alObject.getHeight()/2-10,20,20),alObject.paint(255,255,255)); 

    //red player on the left 
    player1(CBox(10,alObject.getHeight()/2-80/2,20,80), alObject.paint(255,0,0)); 
    //blue player on the right 
    player2(CBox(alObject.getWidth()-10-20,alObject.getHeight()/2-80/2,20,80), alObject.paint(0,0,255)); 
} 

void GameLoop::GameStart(Allegro& alObject){ 
    /* 
    when this variable is set to true the program will quit the main loop 
    and free the allocated resources before quitting. 
    */ 

    bool exit = false; 

    //we tell the ball to move to the left 

/***********************************************/ 
/***********************************************/ 
    ball.setXYMovement(-5.0,5.0); // GENERATES THE ERROR 
/***********************************************/ 
/***********************************************/ 

    while(!exit){ 
    al_wait_for_event(alObject.eventq, NULL); 
    while(al_get_next_event(alObject.eventq, &alObject.event)){ 
     if(alObject.event.type == ALLEGRO_EVENT_TIMER){ 
     runTimerChecks(alObject.event, alObject); 
     } 
     else if(alObject.event.type == ALLEGRO_EVENT_DISPLAY_CLOSE){ 
     // quit if the user tries to close the window 
     runExit(alObject.event, alObject, exit); 
     } 
     else if(alObject.event.type == ALLEGRO_EVENT_KEY_DOWN){ 
     playerInput(alObject.event, exit); 
     } 
     else if(alObject.event.type == ALLEGRO_EVENT_KEY_UP){ 
     endPlayerInput(alObject.event); 
     } 
    } 
    } 
} 

void GameLoop::runTimerChecks(ALLEGRO_EVENT& event, Allegro& alObject){ 
    if(alObject.event.timer.source == alObject.getTimer()){ 
    //fill the screen with black 
    al_clear_to_color(alObject.paint(0,0,0)); 
    //move and draw our two players 
/**************************************************/ 
/**************************************************/ 
    player1.move(fieldbox); // GENERATES THE ERROR 
    player1.draw();   // GENERATES THE ERROR 
    player2.move(fieldbox); // GENERATES THE ERROR 
    player2.draw();   // GENERATES THE ERROR 
/**************************************************/ 
/**************************************************/ 
    } 
} 

void GameLoop::runExit(ALLEGRO_EVENT& event, Allegro& alObject, bool& exit){ 
    if(event.display.source == alObject.getDisplay()){ 
    exit = true; 
    } 
} 
void GameLoop::playerInput(ALLEGRO_EVENT& event, bool& exit){} 
void GameLoop::endPlayerInput(ALLEGRO_EVENT& event){} 

回答

0

是的,錯誤是在這裏:

CBall ball(const CBox&, ALLEGRO_COLOR); 
CPlayer player1(const CBox&, ALLEGRO_COLOR); 
CPlayer player2(const CBox&, ALLEGRO_COLOR); 

這不聲明成員稱爲ballplayer1player2,因爲你認爲它(按如下代碼:player1.draw();)一樣。相反,你寫的是使用這些名稱的方法的聲明,並將參數指定給參數。相反,你應該做的:

CBall ball; 
CPlayer player1; 
CPlayer player2; 

然後在GameLoop構造函數中,與你想要的任何值初始化它們,用initialization lists

GameLoop::GameLoop(Allegro& alObject) : 
    ball(/* ... */), 
    player1(/* ... */), 
    player2(/* ... */) 
{ 
    // .... 
} 
+0

感謝一大堆!這解決了它。對不起,麻煩了。 – Riverwolf

+0

@Riverwolf歡迎您:-)如果它解決了您的問題,您應該接受答案,請參閱about頁面,以便在1分鐘內瞭解StackOverflow的工作原理:-) – Boris