2014-03-31 6 views
0

여기에 내 코드파이 게임 벽 충돌 감지는 "도청"보인다

import pygame, sys 

pygame.init() #load pygame modules 
size = width, height = 800, 600 #size of window 
speed = [25,25] #speed and direction 
x= 100 
y= 100 
screen = pygame.display.set_mode(size) #make window 
s=pygame.Surface((50,50)) #create surface 50px by 50px 
s.fill((33,66,99)) #color the surface blue 
r=s.get_rect() #get the rectangle bounds for the surface 
r[0] = x #changes initial x position 
r[1] = y #changes initial y position 
clock=pygame.time.Clock() #make a clock 

while 1: #infinite loop 

     clock.tick(30) #limit framerate to 30 FPS 
     for event in pygame.event.get(): #if something clicked 
       if event.type == pygame.QUIT:#if EXIT clicked 
         pygame.quit() 
         sys.exit() #close cleanly 

     r=r.move(speed) #move the box by the "speed" coordinates 
     #if we hit a wall, change direction 
     if r.left <= 0 or r.right >= width: 
       speed[0] = -(speed[0])*0.9 #reduce x axis "speed" by 10% after hitting 

     if r.top <= 0 or r.bottom >= height: 
       speed[1] = -speed[1]*0.9 #reduce y axis "speed" by 10% after hitting 

     screen.fill((0,0,0)) #make redraw background black 
     screen.blit(s,r) #render the surface into the rectangle 
     pygame.display.flip() #update the screen 

그것은 가장자리를 치는 다시 수신 거부, 사각형 이동을 보여주는 간단한 창의입니다. 그러나이 특정 예 (속도를 양쪽 축에서 25로 설정)와 속도 감소를 0.9로 설정 한 뒤 되돌리기 (10 % 미만), 내 사각형이 창 왼쪽에 붙어있는 것처럼 보입니다. 붙여 넣기 및 직접 참조하십시오)

내가 낮은 값으로 변경하거나 모든 속도를 줄이면 아무 것도 수신 거부 후 모든 것을 잘 작동합니다.

왜 이런 일이 발생하는지 이유가 무엇입니까?

+0

@dwerner 왜 그런가요? 문서에 달리 명시되어 있습니다. –

답변

0

오른쪽! 사각형을 잠재적으로 가장자리에 붙이지 않고 자유롭게 움직이고 바운스하게하려면 속도를 반대로 (그리고 10 % 감소) 전에 전에 실제로 공을 움직여야합니다! 이건 내 간단한 제안

위의 수정이 관리하는 어떤
if r.left + speed[0] <= 0 or r.right + speed[0] >= width: 
    speed[0] = - (speed[0])*0.9 

if r.top + speed[1] <= 0 or r.bottom + speed[1] >= height: 
    speed[1] = -(speed[1])*0.9 

, 그것은 essentialy 광장 언제든지 경계 밖으로 이동하는 것을 허용하지 않는다는 것입니다! 디버깅을 한 후에 위의 문제가 발생한 부분까지는 스퀘어가 화면 바깥으로 움직이는 것으로 나타났습니다! (예 : 음수 x, 음수 y 등) 무해한 것처럼 보일 수 있지만 특히 낮은 속도에서이 동작은 정사각형을 빠르게 뒤집을 수 있고 동시에 속도를 10 % 낮출 수 있습니다.

예를 들어 어느 지점에서든지 사각형이 위치 x = - 1이고 x 속도가 1 인 경우. 이 조건으로 인해 : if r.left + speed[0] <= 0 or r.right + speed[0] >= width: 속도가 앞뒤로 여러 번 뒤집어지고 사각형이이 가장자리에서 빠져 나오지 못하게됩니다!

피어! 긴 대답에 대해 유감스럽게 생각하고 도와줬으면 좋겠다. 건배!

알렉스 하나이 코드 하나를 통해

+0

Alex에게 많은 고마움을 전합니다. 그 설명도 고맙게 여기고 있습니다. –

+0

대니얼 문제가 해결되어 기쁩니다. –

1

하자 단계 :

speed = [25,25] #speed and direction 
if r.left <= 0 or r.right >= width: 
     speed[0] = -(speed[0])*0.9 

은 그냥 x 축에 어떻게되는지 살펴 보자.

이 검사 전에 위치가 1이라고 가정합니다. 다음 프레임에서 position 값은 1-25 = -24입니다. 조건이 충족되었으므로 속도는 25 * 0.9 = 22.5가됩니다.

사각형이 -1.5 위치로 이동하고 우리는 여전히 벽의 잘못된쪽에 있습니다. 각 프레임의 속도 방향을 변경하기 때문에 사각형이 거기에 붙습니다.

두 가지 해결책이 있습니다. 첫 번째 문제는 이미 Alex가 설명했습니다.

두 번째 것은 먼저 사각형을 이동하고, 사각형이 범위를 벗어난 경우 벽 앞으로 가져옵니다.

+0

자세한 대답을 보내 주셔서 감사합니다. –