2013-06-11 2 views
1

나는 기본적인 파이 게임을하고 있는데, 어디로 가져 가고 싶은지 잘 모르겠다. 그래서 지금은 기본 메커니즘에 대해서만 연구하고 있습니다.파이 게임 스프 라이트 일정 속도로 움직이기

내가 마주 친 문제는 적의 스프라이트가 플레이어 스프라이트쪽으로 이동해야한다는 것입니다. 이미 기본 벡터링을 알아 냈지만 스프라이트가 벡터를 따라 이동하기 때문에 대상에 가까워 질수록 속도가 느려집니다.

여기 내 코드가 있습니다. 이 합리적인 속도로 속도가 느려집니다하지만 그들은 또한 자신의 목표에 도달하기 전에 중지 때문에

#Enemy Mechanics 
for enemy in enemy_list: 
    pygame.draw.rect(screen, green, (enemy.rect.x, enemy.rect.y-5, enemy.Health/4, 3), 0) 
    pygame.draw.rect(screen, green, (enemy.rect.x, enemy.rect.y-5, 25, 3), 1) 

    ppos = pPlayer.rect.x, pPlayer.rect.y 
    epos = enemy.rect.x, enemy.rect.y 
    etarget = epos[1] - ppos[1], epos[0] - ppos[0] 

    enemy.rect.x -= etarget[1]/20 #This is the problem 
    enemy.rect.y -= etarget[0]/20 


#Bullet Mechanics 
for bullet in bullet_list: 
    mpos = pygame.mouse.get_pos() 
    bpos = bullet.rect.x, bullet.rect.y 
    target = bpos[1] - mpos[1], bpos[0] - mpos[0] 
    dist = math.sqrt(((bpos[0] - mpos[0])**2) + ((bpos[1] - mpos[1])**2)) 

    bullet.rect.x -= target[1]/20 
    bullet.rect.y -= target[0]/20 

    if dist < 30: 
     bExplode(bullet.rect.x, bullet.rect.y) 
     blist.remove(bullet) 
     bullet.kill() 

    enemy_hit_list = (pygame.sprite.spritecollide(bullet, enemy_list, False)) 
    for enemy in enemy_hit_list: 
     enemy.Health -= 25 
     print(enemy.Health) 
     if enemy.Health <= 0: 
      enemy_list.remove(enemy) 
      all_sprites_list.remove(enemy) 

     bullet_list.remove(bullet) 
     all_sprites_list.remove(bullet) 
     blist.remove(bullet) 

당신이 볼 수 있듯이

, 나는 20 벡터를 나누어 왔습니다. 스프라이트가 플레이어를 향한 일정한 속도로 움직이게하는 데 도움이 필요하다.

+0

왜이 태그가 "성능"? 현재 구현이 올바르지 않을 수도 있지만 ... 너무 많은 CPU 시간이 걸리는 것입니까? 그럴 것 같지 않습니다. – abarnert

+0

죄송합니다. 속도를 입력하면 성능이 기본값으로 설정됩니다. – Isaacashtox

+0

아, 총알의 스칼라 속도와 같은 속도를 의미했습니다. 네, 때로는 별칭 추측에 너무 열중합니다. 아마도 총알의 성능을 최적화하고 싶지 않을 것입니다. 그렇다면 for 루프의 총구에서 다각형 소총을 시도해보십시오. :) – abarnert

답변

1

코드는 적들이 항상 목표물의 1/20 지점으로 이동한다는 것을 의미합니다. 고정 된 크기의 1 단계를 같은 방향으로 움직이기를 원합니다.

답은 거리 벡터를 직접 사용하는 대신 거리 벡터와 같은 방향으로 unit vector을 사용하여 벡터를 정규화하는 것입니다.

쉬운 방법은 dividing the vector by its length입니다. 그리고 to get the vector's length, that's just the Pythagorean theorem.

그래서 :

def vector_length(x, y): 
    return math.sqrt(x*x + y*y) 

def normalize_vector(x, y): 
    norm = vector_length(x, y) 
    return x/norm, y/norm 

target = normalize_vector(bpos[1] - mpos[1], bpos[0] - mpos[0]) 

이 총알이 단위 시간당 1 공간 부에 이동한다 (예를 들어, 프레임 당 화소). 당신이 그 (것)들을 더 빠르거나 느리게 가고 싶은 경우에, 다만 같은 단위에 총알 속도를 정의하고 곱 :

bullet.rect.x -= target[1] * BULLET_SPEED 
bullet.rect.y -= target[0] * BULLET_SPEED  

사실, 당신은 이미이 대부분을하고있는, 당신이있어 단지 사용하지 않을 : 당신이 그것을 명확하게 찾을 경우

dist = math.sqrt(((bpos[0] - mpos[0])**2) + ((bpos[1] - mpos[1])**2)) 

그래서, 단지에 다음 두 줄 변경 :

bullet.rect.x -= target[1]/dist * BULLET_SPEED 
bullet.rect.y -= target[0]/dist * BULLET_SPEED 
+0

정말 고마워요! – Isaacashtox