過去数日間、このトピックについて広範な調査を行ってきましたが、正確な問題に対する答えが見つからないようです。
だから、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'])