Pygame墙碰撞检测似乎“被窃听”

时间:2014-03-31 01:26:45

标签: python pygame collision

这是我的代码

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%),我的方块似乎卡在窗口的左侧(我建议你复制和粘贴它并亲自看看)

如果我将速度更改为较低的值或在弹跳后没有设置任何速度减少一切正常。

出现这种情况的原因有哪些?

2 个答案:

答案 0 :(得分:1)

让我们逐一介绍这段代码:

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

让我们看看x轴发生了什么。

假设此检查前的位置为1.在下一帧中,位置的值为1-25 = -24。由于现在满足条件,速度变为25 * 0.9 = 22.5。

矩形移动到-1.5位置,我们仍然在墙的错误一侧。由于你改变了每帧的速度方向,矩形将被卡在那里。

这个问题有2个解决方案,第一个已经由Alex描述。

第二个是首先移动矩形,如果矩形移出界限,则将其返回到墙前。

答案 1 :(得分: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

以上修改管理的内容是,它必然不允许广场随时出界!至于造成上述问题的原因,经过一些调试后,很明显广场设法移出屏幕! (即负x,负y等),虽然它看似无害,但这种行为尤其是在较低速度下会导致方块快速反转,同时将其速度降低10%!

例如,如果广场位于x = - 1的任意位置,其xspeed为1。由于这种情况:if r.left + speed[0] <= 0 or r.right + speed[0] >= width:它的速度会来回反转多次,同时不会让方块逃脱这个边缘!

唷!对不起,答案很长,希望我帮忙! 干杯!,

亚历