2013-01-11 2 views
1

저는 파이 게임을 배우고 있으며, 대부분의 사람들처럼 (제가 생각하기에) 약간의 게임을 쓰고 있습니다. 즉, 내 질문에 답할 수있을뿐만 아니라 다른 것을 비판 할 때 자유롭게 느낀다.Python - Pygame - 애니메이션의 각도와 속도 처리

그래서 내 "보스"개체에 문제가 있습니다. 위에서 게임으로 빠져 나와 360도 원형에서 임의의 수의 발사를 시작하기로되어 있습니다. 때때로 작동하지만 예상치 못한 몇 가지 일들이 있음을 알게됩니다. 1) 총알은 일정한 속도로 움직여야하지만, 시간이 지남에 따라 속도가 느려지고 Y 평면을 따라 X보다 빠르게 이동합니다. 2) 최소 8 발이 있긴하지만 종종 3-4 내가봤을 때 한 장면이 좀 더 커 보이기 때문에 일부 장면이 겹쳐져 있음을 확인하십시오.) 그리고 일부 장면은 아래로 쏘아 져 오른쪽으로 가면 반대 방향으로 쏠 것입니다. 그렇게해서는 안됩니다. 여기 코드가 있습니다. 총 계산식을 게시하고 총알 (불 덩어리) 인스턴스를 게시합니다. 나머지는 제가 본 것에서 아주 전형적입니다. 메인 루프의 맨 아래에서 호출되는 스프라이트 그룹을 호출하여 업데이트하고 그립니다. 총알에 대한 감독 및 라인 -

class Fireball (pygame.sprite.Sprite): 

    container = pygame.sprite.Group() 

    def __init__ (self, image, direction, speed): 
     pygame.sprite.Sprite.__init__ (self, self.container) 

     self.image = pygame.image.load(image).convert_alpha() 
     self.rect = self.image.get_rect() 
     self.radias = ((self.rect.width/2 + self.rect.height/2)/2) 
     self.speed = speed 
     self.direction = direction 
     self.angle = -1 

    def update (self, time_passed): 

     if self.angle != -1: 
      self.rect.move_ip(self.pos) 
     else: 
      self.rect.move_ip(0, (self.speed*time_passed) * self.direction) 
     if self.rect.bottom < 0: self.kill() 
     if self.rect.top > 2000: self.kill() 

내가 그림을 그릴 수 있다면 ... 0 < :

def shoot (self, shots, time_passed): 

    angle = (math.pi*2)/shots 
    for i in xrange(shots): 
     bullet = Fireball("fireball.png", self.direction, 100) 
     bullet.angle = angle 
     bullet.pos = ((math.sin(bullet.angle) * bullet.speed) * time_passed, 
         (math.cos(bullet.angle) * bullet.speed) * time_passed) 
     Fireball.container.remove(bullet) 
     EnemyFireball.container.add(bullet) 
     bullet.rect.center = self.rect.center 
     angle += angle 

는 그리고이 총알입니다.

나는 무엇을 기대 :

\ 
0- 
|\ 

... 그리고 총알이 아래로 아래로 똑바로 항상 더 큰 보이는, 그래서 약간의 중복이 있다고 생각하지만, 내가 할 수있는 :

\|/ 
-0- 
/|\ 

내가보고하고 무엇 이유를 모르겠다. Time_passed는 Clock.tick (60) 사이에서 계산 된 시간이고 shots 인수는 8-16 사이의 randint입니다.

나는 모두 의미가 있기를 바랍니다. 그렇지 않다면 알려주세요. 나는 명확히하려고 노력할 것이다. 도움에 미리 감사드립니다.

더 많은 컨텍스트가 필요한 경우 다음은 소스에 대한 링크입니다. 걱정하지 마세요.별로 없습니다. http://code.google.com/p/scroller-practice/source/browse/

답변

2

각도를 두 변수로 유지해야합니다.

올바른 방법이 각 루프

curr_angle += angle_step 

당신이 그것을 할 길의 끝에

curr_angle = 0 
angle_step = (math.pi*2)/shots 

다음 것 할, 당신은 * 다음, 각도 각도이 결국 각도, 4 * 각도 등.

모든 다른 부분을 빼앗아 그냥

angle = (math.pi*2)/shots 
for i in xrange(shots): 
    angle += angle 

당신이 각 각 시간을 두 배로 대신 그것을 증가하고 있음을 분명히해야입니다 루프가있는 경우.

+1

이것은 맞습니다. 'angle + = angle '은'angle * = 2' (또는'angle = angle + angle', 또는'angle = angle * 2')와 동일하게 끝나고 이것은 확실히 의도 된 행동이 아닙니다.우리의 그림에 따르면 처음 45도, 90도, 180도, 그리고 360 도의 정수배가 항상 동일한 위치에 있고, OP가 "두꺼워 짐"을 일으키는 것을 볼 수 있습니다. – heltonbiker

+0

하하! 오 와우. 나는 그것을 어떻게 놓쳤는가? 그 점을 지적 해 주셔서 너무 고마워요! 그러나 나는 아직도 경기 침체에 대해 궁금해. X 평면의 주사는 Y 평면의 주사보다 느립니다. 그래서, 곧바로 아래로/위로 가면서, 왼쪽과 오른쪽으로 천천히갑니다. 이견있는 사람? – jtsmith1287

+0

나는 가능한 이론을 가지고있다 : 당신은 "orig_pos + (math.sin (bullet.angle)"이 아닌 "(math.sin (bullet.angle) * bullet.speed) * time_passed") * bullet.speed) * time_passed "부모 개체의 속도가 촬영 속도에 영향을 미칠 수 있습니까? – BostonJohn