4

在过去的几天里,我一直在对这个主题进行广泛的研究,但我似乎无法为我的确切问题找到答案。

所以,我有一个简单的游戏设置,我的玩家在 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'])
4

2 回答 2

4

拆分 x/y 运动。

移动 x,检查是否碰撞,如果是,则向后移动并将 xspeed 设置为 0。

移动 y,检查是否碰撞,如果是,则向后移动并将 yspeed 设置为 0。

这确实意味着每一步进行两次碰撞检查,但它非常流畅。:)

于 2012-11-03T05:36:16.537 回答
1

Pygame API 邀请您以面向对象的方式编写所有游戏主题——这样你的坠落角色将拥有所有“方法”和“属性”来正确响应场景中的事物——比如击中某物。

所以,如果你的角色被定义为简单的东西:

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 的 sprite 模块——它允许您可以自动执行大量检查和更新,而无需for为每次检查显式编写循环

于 2012-10-25T01:15:29.187 回答