2012-03-02 6 views
0

안녕하세요, 저는 DirectX와 C++을 사용하여 간단한 게임을 프로그래밍하고 있습니다. 약간의 천재성을 해결할 수있는 약간의 문제가 발생했습니다.간단한 게임 프로그래밍하기

저는 현재 8 명의 외계인 어레이를 보유하고 있으며 현재이 코드를 사용하여 왼쪽에서 오른쪽으로 그리고 아래로 한 줄씩 이동합니다.

bool turnaround=false; 
if ((Aliens[0].pos.x<-5 & Aliens[0].vel.x<0)|(Aliens[3].pos.x>5&Aliens[3].vel.x>0)) 
{ 
    turnaround=true; 
    if(Aliens[0].vel.x<0) 
     Aliens[0].animCtrl->SetTrackSpeed(0,1); 
    else 
     Aliens[0].animCtrl->SetTrackSpeed(0,-1); 
} 

그러나 이것은 현재 왼쪽이나 오른쪽에있는 사람이 파괴 된 경우 누군가가 if 문에 올 수있는 경우 (그들은 내가 궁금 변수 Aliens[i].dead = true

에 의해 파괴하거나의 경우 중첩 된 그 짧은 중지 먼 파괴 왼쪽 또는 오른쪽 것들을 통해 더 가면 말을하는 데 필요한 : 그건 그렇고/

감사합니다 :)

+3

의도적으로 논리 OR ('||') 대신 비트 OR ('|')을 사용하고 있습니까 (AND와 동일)? 나는 네가 그렇다고 생각하지 않는다. 또한 ... '벡터 '은 당신의 친구입니다. –

+0

바이너리'|'와'&'연산자 또는 논리'||'와'&&'를 사용하고 싶습니까? – sholsapp

+0

코드에 몇 가지 문제가 있습니다. 왜 for 루프를 사용하여 'Alien'목록을 반복하지 않습니까? 왜'.dead' 속성을 단지 목록에서 지우는 대신에 사용하고 있습니까? – kaoD

답변

2

. 이 행에 의해 화면 행의 하단을 향해 아래로 이동 외계인을 야기한다

For each alien: 
    If alien is currently on an odd row: 
    Set direction to left 
    If alien x position is near 0: 
     Set direction to down 
    Else 
    Set direction to right 
    If alien x position is near screen width: 
     Set direction to down 

: 여기에 (의사 코드 형태로) 현재 가지고있는 것보다 더 좋을 수도가이 문제를 접근하는 하나 개의 방법이 될 것입니다 . (물론이 유형의 게임에서 외계인이 취할 수있는 많은 다른 구성이 있습니다. 이것은 단지 하나입니다). 당신은 그들이 죽을 때 어떤 종류의 행동을 보여주기를 원하지 않는지 분명하지 않습니다. ("더 멀리 건너십시오"는 모호합니다, 이것은 플레이어입니까, 아니면 어떤 외국인입니까?) 나는 여기에 더 많은 조언을 빌려줄 수 있을지도 모른다.

1 분 동안 디자인을 다시 생각해 보시기 바랍니다. 8 명의 외계인을 보유하고있는 고정 크기 배열 인 것으로 보입니다. 이렇게하면 특정 레벨을 구성 할 수 있지만 매우 제한적일 수 있습니다. 다른 레벨에서 12 명의 외국인을 원하면 어떻게 될까요? Aliens 배열을 std::vector으로 바꾸어 원하는대로 레벨에 추가 할 수 있습니다. 더 좋은 점은, 같은 속성을 공유하는 다른 유형의 적을 가지고 있다면,이 적들이 모두 상속받은 수퍼 클래스 CEnemy을 생성 할 수 있다는 것입니다. 이렇게하면 디자인이 더욱 강력 해지고 확장 될 수 있습니다.

다른 연산자에서도 이미 언급했듯이 비트 단위가 아닌 AND 또는 OR 연산을 실행하려면 논리 연산자를 사용하십시오. (즉, | 대신 ||을 사용하십시오.) 두 가지의 중요한 차이점이 있습니다.

+0

도와 줘서 고마워요. –

1

, 당신은 (논리 연산자를 사용하는 습관 &&을 얻어야한다 및 ||) 비트 연산자 대신 이런 식으로. 그들은 짧은 회로 때문에 더 효율적이어야하고 나중에 버그를 예방해야합니다.

실제 질문에 답변 할 수있는 충분한 정보가 있는지 확실하지 않습니다. 왜 제 0과 제 3 외국인에게 수동으로 접근하고 있습니까? 외계인이 어떻게 이상적으로 행동하기를 원하십니까?

편집 1 :이 같은

뭔가 작동합니다 : 당신은 공간 침략자 형 게임의 일종을 구축하는 나는 당신의 질문에서 가정

Alien * furthestLeftAlien, * furthestRightAlien; 
/** here loop through your Aliens array to find 
    the furthest left and furthest right aliens **/ 
if(furthestLeftAlien->dead || furthestRightAlien->dead) 
{ 
    goFurtherAcross(): 
} 
+2

* furthestRightAlien ... * – Bingo

+0

@Bingo 감사합니다. 같은 줄에 여러 변수를 선언하면 문제가되는 것 같습니다. –

+0

도와 줘서 고맙습니다 :) –

0

정말 다른 데이터 구조를 사용해야합니다. C++ 표준 라이브러리는 당신을 도울 수있는 몇 가지 다른 컨테이너 클래스를 가지고 있습니다.

예를 들어 std :: deque를 사용하면 어느 한쪽 끝에서 항목을 쉽게 제거 할 수 있습니다.

당신처럼 죽은 외계인을 제거 할 수 있습니다 : 여기 코드가에 의미하는 방법을 잘 모르겠어요,

bool turnaround=false; 
if ((Aliens.front().pos.x<-5 && Aliens.front().vel.x<0) || (Aliens.back().pos.x>5 && Aliens.back().vel.x>0)) 
{ 
    turnaround=true; 
    if(Aliens.front().vel.x<0) 
     Aliens.front().animCtrl->SetTrackSpeed(0,1); 
    else 
     Aliens.front().animCtrl->SetTrackSpeed(0,-1); 
} 

비록 정직 : 위의 코드를 갈 것 다음

while (!Aliens.empty() && Aliens.front().is_dead()) Aliens.pop_front(); 
while (!Aliens.empty() && Aliens.back().is_dead()) Aliens.pop_back(); 

그리고 외계인 전체 행을 돌아서 라. 처리 변수를 사용하는 대신 외계인을 if 문 안쪽으로 돌리지 않는 이유는 무엇입니까?

+0

도와 줘서 고맙습니다. :) –