4

過去数日間、このトピックについて広範な調査を行ってきましたが、正確な問題に対する答えが見つからないようです。

だから、10x10 の幅で 0, 0 にプレイヤーがいる単純なゲームのセットアップがあります。

    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

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 のスプライト モジュールを見てください多くのチェックと更新を自動化し、forチェックごとにループを明示的に記述する必要はありません。

于 2012-10-25T01:15:29.187 に答える