プレイヤーが常に真ん中にいて、背景が動いてプレイヤーが動いているように見えるゲームを作っています。2つの矢印キーを押すと例。上下に斜めになりますが、上矢印を放すと右に進みます。動作する場合もありますが、ほとんどの場合、動きが止まります。
これを修正する方法がわかりません。
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
key = pygame.key.get_pressed()
if key[K_UP]:
if key[K_RIGHT]:
bg.move("up_right")
elif key[K_LEFT]:
bg.move("up_left")
else:
bg.move("up")
elif key[K_DOWN]:
if key[K_RIGHT]:
bg.move("down_right")
elif key[K_LEFT]:
bg.move("down_left")
else:
bg.move("down")
elif key[K_RIGHT]:
if key[K_DOWN]:
bg.move("down_right")
elif key[K_UP]:
bg.move("up_right")
else:
bg.move("right")
elif key[K_LEFT]:
if key[K_DOWN]:
bg.move("down_left")
elif key[K_UP]:
bg.move("up_left")
else:
bg.move("left")
ここで動きが変わります
def move(self, direction):
if direction == "up_right":
self.posY += self.speed
self.posX -= self.speed
if direction == "up_left":
self.posY += self.speed
self.posX += self.speed
if direction == "down_right":
self.posY -= self.speed
self.posX -= self.speed
if direction == "down_left":
self.posY -= self.speed
self.posX += self.speed
if direction == "up":
self.posY += self.speed+2
if direction == "down":
self.posY -= self.speed+2
if direction == "right":
self.posX -= self.speed+2
if direction == "left":
self.posX += self.speed+2
最初は、「up_left」などを追加しませんでした。両方のifを通過して、両方の位置を編集するだけだと思ったからです。しかし、そうではありませんでした。
このトピックに対する回答がすでにある場合は申し訳ありませんが、見つかりませんでした。
ありがとう
主な問題は、イベントループ内で押されたキーをチェックすることです。
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# only executed if there's an event returned by pygame.event.get()
# and possible executed multiple times per frame
key = pygame.key.get_pressed()
if key[K_UP]:
...
したがって、移動(if key[K_UP]: ...
)を実行するコードは、現在キューにイベントがある場合にのみ実行されます。
このコードをイベントハンドラーループの外に移動するだけです。
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# always executed every frame
key = pygame.key.get_pressed()
if key[K_UP]:
...
私見では、動きを処理するためのより良い方法は、ベクトルを使用することです。ベクトルを使用すると、一定の移動速度を簡単に確保でき、コードがはるかに少なくなります。
簡単な例を次に示します。
import pygame
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
dt = 0
movement = {
pygame.K_UP: ( 0, -1),
pygame.K_DOWN: ( 0, 1),
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: ( 1, 0)
}
pos = pygame.Vector2((100, 100))
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
pressed = pygame.key.get_pressed()
# calculate the movement vector
move = pygame.Vector2()
for dir in (movement[key] for key in movement if pressed[key]):
move += dir
if move.length() > 0: move.normalize_ip()
# ensure we have a constant speed
pos += move * dt/5
screen.fill(pygame.Color('grey'))
pygame.draw.circle(screen, pygame.Color('dodgerblue'), [int(x) for x in pos], 20, 0)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加