python - Pygame 移动问题
问题描述
当我在 python pygame 中使用移动代码时,它不会在我运行时加载代码。
#right to repestic creatovrs
import pygame, random, time, sys, pyscroll, pytmx
from Bruh import *
from pygame.locals import *
from pytmx.util_pygame import load_pygame
pygame.init()
width, height = 800, 600
backgroundColor = 255, 0, 0
screen = pygame.display.set_mode((width, height))
blue = (0, 0, 255)
darkblue = (20, 20, 70)
white = (255, 255, 255)
lightwhite = (170, 170, 170)
skin = (236, 188, 180)
floorcolor = (229,164,14)
sun = (250,255,63)
#the four numbers go x axis, y axis, width, and then height
def drawLevel1(window):
img = pygame.image.load("Overlay.png")
window.blit(img, (0, 0))
def drawLevel2(window):
img2 = pygame.image.load("Overlay2.png")
window.blit(img, (0, 0))
pygame.key.set_repeat(100,100)
Character = Bruh(35, 367)
Bruh.draw(Character, screen)
drawLevel1(screen)
'''
while True:
for event in pygame.event.get():
if event.type==QUIT or (event.type==KEYUP and event.key==K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_DOWN:
Character.moveUp()
elif event.key==K_UP:
Character.moveDown()
elif event.key==K_LEFT:
Character.moveLeft()
elif event.key==K_RIGHT:
Character.moveRight()
for event in pygame.event.get():
if event.type==QUIT or (event.type==KEYUP and event.key==K_ESCAPE):
pygame.quit()
sys.exit()
if event.key==K_DOWN:
Character.moveUp()
if event.key==K_UP:
Character.moveDown()
if event.key==K_LEFT:
Character.moveLeft()
if event.key==K_RIGHT:
Character.moveRight
either of these won't work for some reason. it just wont load the game once these are placed in the code
'''
pygame.display.update()
while (True):
for event in pygame.event.get() :
if ( event.type == pygame.QUIT or (event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)):
pygame.quit();
sys.exit();
以及来自 bruh.py 的代码:
import pygame
from pygame.locals import *
class Bruh:
def __init__(self, newX, newY):
self.x = newX
self.y = newY
self.img = pygame.image.load("Bruh.png")
def draw(self, window):
window.blit(self.img, (self.x,self.y))
def moveLeft(self):
self.x = self.x - 5
def moveRight(self):
self.x = self.x + 5
def moveUp(self):
self.y = self.y + 5
def moveDown(self):
self.y = self.y - 5
def getRec(self):
myRec = self.img.get_rect()
return (self.x, self.y, myRec[2], myRec[3])
这些都是 .py 文件,它们一定会引起一些问题。我没有收到任何错误消息,只是在我按运行时不会加载。我不知道为什么。如果有人有帮助那就太好了
解决方案
我认为 pygame 没有你想象的那么聪明。在您的while
循环中,您正在移动您的角色,但是当您“移动”该角色时您所做的只是更新该对象上的数字。您没有告诉 pygame 有任何变化,也没有重新绘制屏幕。知道自己做这件事还不够聪明。有些框架会跟踪您的值并尝试更新显示以与它们保持同步(主要用于 Web 开发),但这不是 pygame 的工作方式。
相反,实时视频游戏通常遵循以下模式:
while running:
handle_events() # check which keys have been pressed
loop() # handle, physics, AI, logic, etc
render() # re-draw a new version of the screen based on the new state of the world
有关更多信息,请参阅本教程。
在您的情况下,这可能看起来像:
pygame.key.set_repeat(100, 100)
character = Bruh(35, 367)
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_DOWN:
character.moveUp()
elif event.key == K_UP:
character.moveDown()
elif event.key == K_LEFT:
character.moveLeft()
elif event.key == K_RIGHT:
character.moveRight()
screen.fill((0, 0, 0))
drawLevel1(screen)
character.draw(screen)
pygame.display.update()
但实际上,这并不是做事的好方法。该行意味着您每 100 毫秒(10 次/秒)pygame.key.set_repeat(100, 100)
只会收到一个事件。KEYDOWN
但是,while
循环将运行更多次。这意味着您的角色移动只会以 10FPS 发生,但您将消耗资源以更快地运行游戏。
相反,我会做这样的事情:
# make a clock to help us run at a consistent framerate
clock = pygame.time.Clock()
# a dictionary to help us keep track of which keys are currently held down
keys_down = {
K_DOWN: False,
K_UP: False,
K_LEFT: False,
K_RIGHT: False,
}
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
# when the user presses a key, we keep track of the fact
# that that key is down until they release it
if event.key in keys_down:
keys_down[event.key] = True
elif event.type == KEYUP:
# when the user releases a key, it's not down anymore
if event.key in keys_down:
keys_down[event.key] = False
# This code will run *every loop*, regardless of
# whether the user has pressed or released a key recently
if keys_down[K_DOWN]:
character.moveDown()
if keys_down[K_UP]:
character.moveUp()
if keys_down[K_LEFT]:
character.moveLeft()
if keys_down[K_RIGHT]:
character.moveRight()
# Then, clear the screen and re-draw everything in the scene
screen.fill((0, 0, 0))
# drawLevel1(screen)
character.draw(screen)
pygame.display.update()
# clock.tick gets the number of `ticks` (milliseconds) since the
# last time it was called. If you specify a number like tick(30),
# then it will also wait an amount of time equal to 30 minus that
# number. Effectively it will limit you to 30fps.
clock.tick(30)
实际上,即使这样也不理想。确实,您应该尽可能快地运行并更新游戏逻辑以考虑帧速率(即,如果您获得较少的 fps,则每帧移动得更远)这样即使您的帧速率下降,您的角色也始终以一致的速度移动. 更好的是,让你的逻辑和渲染异步运行。不过,这涉及到一些高级的东西。
编辑:
正如@Kingsley 指出的那样,pygame 内置了这个功能。上面的例子可以简化如下:
import pygame
from pygame.locals import *
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
# This line handles all the KEYUP and KEYDOWN events
# instead of doing it manually
keys_down = pygame.key.get_pressed()
if keys_down[K_DOWN]:
character.moveDown()
if keys_down[K_UP]:
character.moveUp()
if keys_down[K_LEFT]:
character.moveLeft()
if keys_down[K_RIGHT]:
character.moveRight()
screen.fill((0, 0, 0))
drawLevel1(screen)
character.draw(screen)
pygame.display.update()
clock.tick(30)
推荐阅读
- angular - 为什么 Angular 7 不能使用 [ngClass] 正确渲染我的引导类
- python - sklearn ValueError: X 每个样本有 5 个特征;期待 4
- angular - Angular Reactive Forms FormArray - 无法分配第二个 FormGroup 元素
- firebase - 从 Firebase 下载文件(如 FTP)
- python - 给定一个日期开始和日期结束,给我一个包含 24 个值的数组中的持续时间,这些值对应于一天中的几个小时
- c# - 保存到 Excel - 内存不足异常
- python - 如何在迭代数据框时进行分组?
- javascript - setInterval 开始和停止行为
- c# - 将 ETA 添加到嵌入式循环序列
- javascript - 发送带有附件谷歌表格的电子邮件错误