过去几天我一直在对这个话题进行广泛的研究,我似乎无法找到解决我确切问题的答案。
所以,我有一个简单的游戏设置,我将玩家设置为0,0,宽度为10x10
player= pygame.Rect(0, 0, 10, 10)
除此之外,玩家的速度为x:0,y:10,这将使他跌倒(y为正,因为屏幕的原点位于左上角。)
我有一个0,100的图块,如图所示:
dirt= pygame.Rect(0, 100, 10, 10)
所以,我怎么能处理碰撞,我已经知道我可以用Rect.colliderect(Rect)来检测它。
我尝试了几种方法,但遇到了一些问题:
当他击中某个东西然后移动他时,我无法将玩家的速度降低到0 回到他只是触摸物体,因为这仍然导致行走问题,当他走路时,我在x上施加+10速度,但不幸的是,游戏仍在处理他正在下降并且碰撞和移动横向,所以它只是让他回到他开始的地方。
我是初学者,所以一个简单的答案将会受到赞赏,我会喜欢不必使用任何第三方模块,如果我没有那么pygame不得不。
更新
以下是我尝试过的一些粗略测试代码:
def sim(obj, time, world):
time= time / 1000
obj.physProp['vel']= (obj.physProp['vel'][0] + (accel[0] * time), obj.physProp['vel'][1] + (accel[1] * time))
if obj.physProp['vel'][1] > terminalY:
obj.physProp['vel']= (obj.physProp['vel'][0], terminalY)
obj.pos= (obj.pos[0] + (obj.physProp['vel'][0] * time) + ((accel[0] / 2) * (time ** 2)), obj.pos[1] + (obj.physProp['vel'][1] * time) + ((accel[1] / 2) * (time ** 2)))
for ID in world:
if obj.getRect().colliderect(world[ID].getRect()) == True:
pass
return (obj.pos, obj.physProp['vel'])
答案 0 :(得分:4)
分割x / y移动。
移动x,检查是否发生碰撞,如果是,则向后移动并将xspeed设置为0。
移动y,检查是否发生碰撞,如果是,则向后移动并将yspeed设置为0.
它确实意味着每步两次碰撞检查,但它非常流畅。 :)
答案 1 :(得分:1)
Pygame API邀请您以面向对象的方式编写所有游戏主题 - 这样您的下降角色将拥有所有“方法”和“属性”来正确响应场景中的事物 - 比如击中某些东西。 / p>
所以,如果你的角色被定义为简单的东西:
class Char(object):
# these start as class attributes,
# but whenever they are assigned to with a "self.var = bla" in
# a method, an instance attribute starts existing
x, y = 0,0
vx, vy = 0,0
def update(self):
self.x += self.vx
self.y += self.vy
在检测到碰撞时,您的外部代码可以做到这一点:
def mainloop():
while True:
...
obj.update()
if obj.getRect().colliderect(world[ID].getRect()): # don't do "== True" in `if's - it is just silly
# take character back to the precious position
obj.x -= obj.vx
obj.y -= obj.vy
# zero out velocities to make it stop:
obj.vx = obj.vy = 0
依此类推 - 你很快会认为你的游戏“事物”被认为是“对象”,因为它们在编程中使得代码流很自然 - 一旦你得到它的工作方式,看看Pygame的精灵模块 - 允许您自动执行大量检查和更新,而无需为每个检查显式写入for
循环