2014-05-15 2 views
2

내 프로그램의 특정 지점에 실제로 붙어있어 도움을받을 수 있기를 바랍니다.Python Pygame Loop 비정상적인 지연

기본적으로 움직이는 이미지 게임을 만들려고합니다. 이미지는 무작위로 일련의 "상향 점"중 하나에 배치되고 플레이어는 이미지가 새로운 위치에 배치되기 전에 이미지를 명중해야합니다.

모든 것이 잘 될 것 같지만 pygame.tick 또는 python time.sleep()과 함께 이상한 지연이 발생하는 것 같습니다.

저는 파이썬과 파이 게임의 초보자라고 말하고 싶습니다.하지만 내 인생은 잘못 될지 이해할 수 없습니다. 지금까지 나의 이해에서, 이미지는 정규 1s 간격으로 새 위치로 이동해야합니다.

대신 프로그램이 가끔 "멈추거나"지연되는 것처럼 보입니다. 이미지가 꽤 잠시 동안 자리를 비 췄다가 따라 잡으려고하는 것처럼 앞뒤로 달려가는 것처럼 보일 것입니다. 몇 초 동안 (정상 1 초 지연) 정상적으로 작동하는 것으로 작동 한 다음 이동하거나 계속 고생하는 데 다시 돌아갑니다. 내가 time.sleep를 사용하는 경우

# The values are tuples which hold the top-left x, y co-ordinates at which the 
# rabbit image is to be blitted... 

uppoints = {1: (70, 70), 2: (250, 70), 3: (430, 70), 4: (600, 70), 
     5: (70, 250), 6: (250, 250), 7: (430, 250), 8: (600, 250), 
     9: (70, 430), 10: (250, 430), 11: (430, 430), 12: (600, 430)} 


# Get a random location to pop up... 
def getpos(ups): 
    x = random.randint(1, 2) 
    if x == 1: 
     up = ups[1] 
     return up 
    elif x == 2: 
     up = ups[2] 
     return up 

uppos =() 

while gamerunning: 
    uppos = getpos(uppoints) 

     for event in pygame.event.get(): 
      if event.type == QUIT: 
      gamerunning = False 

      if event.type == pygame.MOUSEMOTION: 
       mpos = pygame.mouse.get_pos() 

      if event.type == pygame.MOUSEBUTTONDOWN: 
       if event.button == 1: 
        if rabbits.rect.collidepoint(event.pos): 
         score += 10 

    mainwin.fill((0, 0, 0)) 
    scoretxt2 = basefont.render(str(score), True, (0, 0, 0)) 
    mainwin.blit(mainback, (0, 0)) 
    mainwin.blit(rabbits.image, uppos) 
    mainwin.blit(scoretxt, (70, 30)) 
    mainwin.blit(scoretxt2, (160, 32)) 
    mainwin.blit(livestxt, (600, 30)) 
    mainwin.blit(livestxt2, (690, 32)) 

    pygame.display.flip() 

    time.sleep(1) 

    # Check which level the user is by score, and increase the speed of the rabbits as needed... 
    fpsclock.tick(60) 

이 게임에서 실행 : 나는 문제를 데 생각하는 곳을 볼 수 있도록 의미 : 것이죠은 루프를 사용하여 코드합니다

희망 1 초 간격으로 블리 팅의 적절한 속도가되는 것 같습니다. 만약 내가 time.sleep()을 사용하고 .tick (60)을 사용한다면, 이미지는 미친 듯이 blit하지만 나는 여전히 어떤 종류의 지연을 볼 수 있다고 확신한다.

나는 약간의 인터넷 검색을 시도하고 파이 게임의 .tick() 메소드와 python sleep() 메소드 모두에 문제가 있음을 알았지 만 이것이 사실인지 알 수없는 몇 페이지를 발견했다.

솔직히 필자는 여기에서 잘못 수행 그래서 당신이 :)

감사 alot을 도울 수 있기를 바랍니다 무슨 생각이 없다!

답변

2

time.sleepfpsclock.tick은 다소 모순적입니다. sleep을 호출하면 Python이 아무 것도하지 않고 초 동안 멈추도록 지시합니다. 반면에 tick 호출은 초당 60 프레임으로 실행하고 싶다고 말합니다.

sleep을 사용하고 싶지는 않습니다. 프로그램이 잠자는 동안 입출력 이벤트가 처리되지 않고 프로그램이 중단 된 것처럼 보입니다. 대신 코드의 나머지 부분을 변경하여 초당 1 회 이상 업데이트 할 때 올바르게 동작하도록해야합니다.

아마도 getpos이라고하는 곳을 1 초에 한 번만 변경하려고한다고 생각합니다. 나는 다음과 같이 제안합니다 :

ms = 0 

while gamerunning: 
    ms += fpsclock.get_time() 
    if ms > 1000: # 1000 ms is one second 
     ms -= 1000 
     uppos = getpos(uppoints) 

    # ... 
+0

안녕하십니까, 답장을 보내 주셔서 감사합니다. if ms .. 문장을 시도 할 때, 나는 그 위치 (upos)로 blit 할 수 없다는 에러를 얻었을 때 False로 평가한다고 생각한다. 그래서 나는 그 빈 튜플을 생각한다. else 절을 ​​추가하면 문제가 계속됩니다 ... –

+0

@ user3069267 : 아, 아마도 첫 번째 단계에서 도청 당했을 것입니다. 루프를 시작하기 전에'uppos'를 초기화하거나'1000'에서'ms'를 시작하여 첫 번째 프레임에서 업데이트를 실행하십시오. – Blckknght

+0

놀라운 것들! 도와 줘서 정말 고마워. :) –