玩家位置未在 pygame 中更新
Player position not being updated in pygame
我在 pygame 制作游戏,当我为菜单和播放时间添加不同的音乐时,我遇到了玩家位置未更新周期的问题,因此我将代码简化为只测试播放器,当我 运行 它作为
主文件
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
玩家class
import pygame
pygame.init()
class playerOBJ:
def __init__(self, color, size, vel, pos):
self.color = color
self.width, self.height = size
self.vel = vel
self.diag = 3.5
self.up = 1
self.left = 1
self.down = 1
self.right = 1
self.xpos, self.ypos = pos
self.shape = (self.xpos, self.ypos, self.width, self.height)
self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)
self.dead = False
def render(self, screen):
pygame.draw.rect(screen, self.color, self.shape)
def move(self):
key = pygame.key.get_pressed()
if key[pygame.K_w]:
if key[pygame.K_w] and key[pygame.K_a]:
self.xpos -= self.diag * self.left
self.ypos -= self.diag * self.up
elif key[pygame.K_w] and key[pygame.K_d]:
self.xpos += self.diag * self.right
self.ypos -= self.diag * self.up
elif key[pygame.K_w]:
self.ypos -= self.vel * self.up
elif key[pygame.K_s]:
if key[pygame.K_s] and key[pygame.K_a]:
self.xpos -= self.diag * self.left
self.ypos += self.diag *self.down
elif key[pygame.K_s] and key[pygame.K_d]:
self.xpos += self.diag * self.right
self.ypos += self.diag * self.down
elif key[pygame.K_s]:
self.ypos += self.vel * self.down
elif key[pygame.K_a]:
self.xpos -= self.vel * self.left
elif key[pygame.K_d]:
self.xpos += self.vel * self.right
self.shape = (self.xpos, self.ypos, self.width, self.height)
self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)
我从这个项目的测试版本
复制了一个工作移动class
尝试向您的 main.py
文件添加 pygame.event.get()
调用,来自:
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
至:
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
pygame.quit()
实际上,如果您不关心检查诸如关闭 pygame window 之类的事件,则不需要额外的 for
循环;一个简单的 pygame.event.get()
调用就足够了。
我在 pygame 制作游戏,当我为菜单和播放时间添加不同的音乐时,我遇到了玩家位置未更新周期的问题,因此我将代码简化为只测试播放器,当我 运行 它作为
主文件
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
玩家class
import pygame
pygame.init()
class playerOBJ:
def __init__(self, color, size, vel, pos):
self.color = color
self.width, self.height = size
self.vel = vel
self.diag = 3.5
self.up = 1
self.left = 1
self.down = 1
self.right = 1
self.xpos, self.ypos = pos
self.shape = (self.xpos, self.ypos, self.width, self.height)
self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)
self.dead = False
def render(self, screen):
pygame.draw.rect(screen, self.color, self.shape)
def move(self):
key = pygame.key.get_pressed()
if key[pygame.K_w]:
if key[pygame.K_w] and key[pygame.K_a]:
self.xpos -= self.diag * self.left
self.ypos -= self.diag * self.up
elif key[pygame.K_w] and key[pygame.K_d]:
self.xpos += self.diag * self.right
self.ypos -= self.diag * self.up
elif key[pygame.K_w]:
self.ypos -= self.vel * self.up
elif key[pygame.K_s]:
if key[pygame.K_s] and key[pygame.K_a]:
self.xpos -= self.diag * self.left
self.ypos += self.diag *self.down
elif key[pygame.K_s] and key[pygame.K_d]:
self.xpos += self.diag * self.right
self.ypos += self.diag * self.down
elif key[pygame.K_s]:
self.ypos += self.vel * self.down
elif key[pygame.K_a]:
self.xpos -= self.vel * self.left
elif key[pygame.K_d]:
self.xpos += self.vel * self.right
self.shape = (self.xpos, self.ypos, self.width, self.height)
self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)
我从这个项目的测试版本
复制了一个工作移动class尝试向您的 main.py
文件添加 pygame.event.get()
调用,来自:
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
至:
import pygame
pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))
WIDTH = 800
HEIGHT = 600
wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
p.move()
p.render(wn)
clock.tick(60)
pygame.display.flip()
pygame.quit()
实际上,如果您不关心检查诸如关闭 pygame window 之类的事件,则不需要额外的 for
循环;一个简单的 pygame.event.get()
调用就足够了。