2011-04-11 2 views
2

임 꽤 여기에 붙어 있습니다. 나는 지난 2 일 동안 노력하고 인터넷 검색을하고 있지만 그것을 이해할 수 없다. Player라는 클래스와 Player를 상속받은 Enemy라는 클래스가 있습니다. Player에 내 총알과 루프 물마루 좌표를 저장하는 목록이 있습니다. 나는 Player에 빌드 된 Enemy의 충돌을 확인하기 위해 동일한 목록에 액세스하고 루프하는 여유 시간표를 시도하지만 루프에도 들어 가지 않습니다. 어떻게 든 비어있는 것 같지만 왜?C++ 목록 루핑

struct structShoot 
{ 
    float x; 
    float y; 
}; 

class Player 
{ 
private: 
     blablabla 
protected: 
    list<structShoot>::iterator it; 
    list<structShoot> shoot_list; 
    structShoot test; 
public: 
    void render(SDL_Surface* dest); 
}; 

void Player::render(SDL_Surface* dest) 
{  
//Works fine, see the other loop down below 
for(it = shoot_list.begin(); it != shoot_list.end();) 
{ 
    shoot.moveSet(it->x, it->y); 
    shoot.draw(dest); 
    it->y--; 

    if((it->y) < -25) 
    { 
     it = shoot_list.erase(it); 
    } 

    else 
    { 
     it++; 
    } 

} 
} 

class Enemy : protected Player 
{ 
public: 
void render(SDL_Surface* dest); 
}; 

void Enemy::render(SDL_Surface* dest) 
{ 
    SDL_Rect a, b; 


    //Does not enter loop!? Ever. Why? 
    for(it = shoot_list.begin(); it != shoot_list.end();) 
    { 
     SDL_Quit(); 
     a.x = enemy.getX(); 
     a.y = enemy.getY(); 
     a.w = enemy.getWidth(); 
     a.h = enemy.getHeight(); 

     b.x = it->x; 
     b.y = it->y; 
     b.w = 10; 
     b.h = 19; 
     it->y--; 


     if (collision(a, b) == true) 
     { 
      SDL_Quit(); 
     } 

     if(it->y < -25) 
     { 
      it = shoot_list.erase(it); 
     } 

     else 
     { 
      it++; 
     } 


    } 
} 
+0

아마도 첫 번째 루프에서 전체 목록을 지운 것일 수 있습니다. 따라서 두 번째 루프는 아무 관계가 없습니까? –

+0

이것을 디버거에서 실행 시키거나 프린트 문을 추가해 보았습니까? 예를 들어,'! shoot_list.empty()'를 확인 했습니까? –

+0

'Enemy' 객체의 일부 유형 다형성 캐스트를'Player' 포인터에 전달하지 않았습니까? 이 경우'render()'가 가상 함수가 아니기 때문에'(* my_player) .render()'포인터를 호출하면'Enemy :: render()'. – Jason

답변

2

다형성을 사용하려면 렌더링 가상으로 설정해야합니다.

가상 공간 렌더링 (SDL_Surface * dest);

Player* enemy = new Enemy(); 
enemy->render(); // there is Player::render calling 

당신이이 곳에서 호출해야 올바른 기능을 감지하는 가상 테이블을 사용하는 가상 렌더링 한 경우 :

내가 전화 할 때마다 플레이어 :: 때문에 이러한 코드의 렌더링한다고 가정. 따라서 가상 렌더링을 만들어야합니다.

+0

죄송합니다, 임씨는 좀 이상하게 생각합니다. 나는 가상의 렌더링을 만들었지 만, 여전히 같은 문제가 있습니다. 당신이 왜 내가 그것을해야하는지 잘 모르겠다 Player * enemy = new Enemy(); 누군가가 시간이 있다면 전체 프로젝트를 업로드했습니다. 당신이 그것을 해결하도록 요청하지 않는 Im은 나에게 약간의 팁을 준다. http://www.megaupload.com/?d=Z1Y9XCO2 – Jesper

+0

적에게 shoot_list를 채우는 곳을 찾을 수 없습니다. 내가 찾은 곳은 입니다. void Game :: OnEvent (SDL_Event * Event) case SDLK_SPACE : pl.fire(); 단절; 어디 플레이어의 shoot_list에 요소를 추가하고 있습니다. 문제의 근본 원인이 있다고 생각합니다. –

+0

적에게 shoot_list에 요소를 추가하지 않았습니다. 나는 플레이어 (shoot_list)의 적 (Enemy)에있는 요소 (좌표)를 반복하여 플레이어가 총에 맞았는지 확인합니다. 이게 말이 돼? : S – Jesper

0

따라서 그것은 비어, shoot_list.begin()shoot_list.end() 같다 즉 것을,이 발생할 수 있습니다 단지 하나의 가능한 일이있다.

아마 Player::render의 루프가 깨져서 목록을 완전히 비 웁니다.