少し長いですが、コピーと貼り付けの答えを探しているわけではありません。これにアプローチする方法について良い方法を知りたいだけです。視覚的な好みのために貼り付けられたコード。
より良い言葉で。画像が別の画像と衝突しています。このオブジェクトはタイル (床/屋根/壁/その他) を表しています。
これらのタイルを画面全体のさまざまな場所に配置します。rect オブジェクトを使用してこれらの位置を保存し、 として知られるリストに保存しますterrain
。そのため、リストを反復処理し、ヒーローと地形オブジェクトとの衝突に遭遇したら、動きを止めます。
これが問題だと今になって気づきました。これが発生して衝突すると、オブジェクトを動かすことができなくなり、動かなくなります。
では、オブジェクトが何らかのオブジェクトと衝突したときに、どうすればオブジェクトを動き回らせることができますか。同じ方向にさらに移動し続けることは許可されていません。
動きを制御するための主要な部分は次のとおりです。
ステートメントは、私がそれmoveDown
を実装しようとする部分です。
floorCollusion
5 つの False ブール値のリストです。
#0 represents - no collision
#1 " " - top face has collided
#2 " " - right face has collided
#3 " " - bottom face has collided
#4 " " - left face has collided
二項演算があることがわかりました。動くか動かないか。これを実装する別の方法がわかりません。
コードに追加する必要はありません。これをどのように見るかについての基本的なアイデアをいただければ幸いです。
moveDown = False
moveUp = False
moveLeft = False
moveRight = False
#when key down either move the hero or quit game
elif event.type == KEYDOWN:
if event.key in (K_UP, K_w):
moveDown = False
moveUp = True
playerObj['jumping'] = True #@@@@@@
elif event.key in (K_DOWN,K_s):
moveUp = False
moveDown = True
elif event.key in (K_LEFT, K_a):
moveRight = False
moveLeft = True
#if the image is not facing left, display the left img
if (playerObj['facing']) != LEFT:
playerObj['surface'] = L_HERO_IMG
playerObj['facing'] = LEFT
elif event.key in (K_RIGHT, K_d):
moveLeft = False
moveRight = True
#if the image is not facing right, display the right img
if (playerObj['facing']) != RIGHT:
playerObj['surface'] = R_HERO_IMG
playerObj['facing'] = RIGHT
elif event.key == K_ESCAPE:
terminate()
#testing hit point system
elif event.key == K_SPACE:
playerObj['health'] -= 3
if playerObj['health'] <= 0:
gameOver = True
#when key is lifted stop movement
elif event.type == KEYUP:
if event.key in (K_UP, K_w):
moveUp = False
elif event.key in (K_DOWN, K_s):
moveDown = False
elif event.key in (K_LEFT,K_a):
moveLeft = False
elif event.key in (K_RIGHT,K_d):
moveRight = False
#moving the hero
if not gameOver:
if moveLeft:
playerObj['x'] -= MOVERATE
if moveRight:
playerObj['x'] += MOVERATE
#if the player pressed key up or 'w' and hero isn't jump
#the hero will seems to have a jumping affect
if moveUp:
playerObj['y'] -= MOVERATE
if moveDown:
playerObj['y'] += MOVERATE
for i in range(len(terrain)):
tile = terrain[i]
if playerObj['rect'].colliderect(tile):
floorCollusion[2] = True
break
else:
floorCollusion[2] = False
if floorCollusion[2]:
playerObj['x'] -= MOVERATE