为什么我的 pygame 应用程序循环无法正常工作? [英] Why is my pygame application loop not working properly?
问题描述
在浏览了 pygame 文档后,我正在开发一个非常粗糙的自上而下的 2d 冒险游戏.但是,在无法在相机系统上找到任何东西后,我遇到了一些障碍,发现大多数相机教程已经 5 年以上,似乎不再适用.有人可以帮我制作相机吗?
这是我的主要执行脚本
导入系统,pygame从 PlayerObject 导入 Playerpygame.init()屏幕高度 = 180屏幕宽度 = 320地图高度 = 1080地图宽度 = 1920num_objects = 5screen = pygame.display.set_mode((screen_width, screen_height))player_image = pygame.image.load('models/hero.bmp').convert()background = pygame.image.load('models/lobby.bmp').convert()screen.blit(背景, (0, 0))对象 = []# 随机生成 5 个实体,第一个是受控角色对于范围内的我(num_objects):o = Player(player_image, random.randint(0, screen_width), random.randint(0, screen_height), 10)objects.append(o)而 1:键 = pygame.key.get_pressed()如果键[pygame.K_LEFT]:screen.blit(背景,对象[0].pos,对象[0].pos)对象[0].move_left()screen.blit(objects[0].image,objects[0].pos)如果键[pygame.K_RIGHT]:screen.blit(背景,对象[0].pos,对象[0].pos)对象[0].move_right()screen.blit(objects[0].image,objects[0].pos)如果键[pygame.K_UP]:screen.blit(背景,对象[0].pos,对象[0].pos)对象[0].move_up()screen.blit(objects[0].image,objects[0].pos)如果键[pygame.K_DOWN]:screen.blit(背景,对象[0].pos,对象[0].pos)对象[0].move_down()screen.blit(objects[0].image,objects[0].pos)screen.blit(背景)对于 pygame.event.get() 中的事件:如果 event.type == pygame.QUIT:系统退出()对于 o 对象:screen.blit(背景,o.pos,o.pos)对于范围内的 num(num_objects - 1):对象[数量 + 1].rand_move()对于 o 对象:screen.blit(o.image, o.pos)pygame.display.update()pygame.time.delay(100)
这是我的播放器类
随机导入地图高度 = 180地图宽度 = 320类播放器:def __init__(self, image, width, height, speed):self.speed = 速度self.image = 图像self.pos = image.get_rect().move(width, height)self.image = 图像def set_speed(self, speed):self.speed = 速度def rand_move(self):x = random.randint(-self.speed, self.speed)y = random.randint(-self.speed, self.speed)self.pos = self.pos.move(x, y)# 将玩家限制在边界内如果 self.pos.left <0:self.pos.left = 0如果 self.pos.right >地图宽度:self.pos.right = map_width如果 self.pos.top <0:self.pos.top = 0如果 self.pos.bottom >地图高度:self.pos.bottom = map_heightdef move_left(self):速度 = self.speedself.pos = self.pos.move(-speed, 0)如果 self.pos.left <0:self.pos.left = 0def move_right(self):速度 = self.speedself.pos = self.pos.move(speed, 0)如果 self.pos.right >地图宽度:self.pos.right = map_widthdef move_up(self):速度 = self.speedself.pos = self.pos.move(0, -speed)如果 self.pos.top <0:self.pos.top = 0def move_down(self):速度 = self.speedself.pos = self.pos.move(0, 速度)如果 self.pos.bottom >地图高度:self.pos.bottom = map_height
你的基本误解,是你试图在一个对象的位置绘制背景,然后你移动了这个对象并blit
它终于登上了新的位置.这一切都没有必要.
通常,整个场景都是在主应用程序循环的每一帧中绘制的.将背景绘制到整个窗口和 blit
上面的每个对象就足够了.请注意,您不会立即看到窗口表面的变化.当显示由
I am working on a very rough topdown 2d adventure game after skimming around the pygame documentation. However, I have hit a bit of a roadblock after not being able to find anything on a camera system and found that most tutorials for a camera are 5+ years old and don't seem to work anymore. Can anybody help me build a camera?
This is my main executed script
import sys, pygame
from PlayerObject import Player
pygame.init()
screen_height = 180
screen_width = 320
map_height = 1080
map_width = 1920
num_objects = 5
screen = pygame.display.set_mode((screen_width, screen_height))
player_image = pygame.image.load('models/hero.bmp').convert()
background = pygame.image.load('models/lobby.bmp').convert()
screen.blit(background, (0, 0))
objects = []
# randomly generates 5 entities with the 1st one being the controlled character
for i in range(num_objects):
o = Player(player_image, random.randint(0, screen_width), random.randint(0, screen_height), 10)
objects.append(o)
while 1:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
screen.blit(background, objects[0].pos, objects[0].pos)
objects[0].move_left()
screen.blit(objects[0].image, objects[0].pos)
if keys[pygame.K_RIGHT]:
screen.blit(background, objects[0].pos, objects[0].pos)
objects[0].move_right()
screen.blit(objects[0].image, objects[0].pos)
if keys[pygame.K_UP]:
screen.blit(background, objects[0].pos, objects[0].pos)
objects[0].move_up()
screen.blit(objects[0].image, objects[0].pos)
if keys[pygame.K_DOWN]:
screen.blit(background, objects[0].pos, objects[0].pos)
objects[0].move_down()
screen.blit(objects[0].image, objects[0].pos)
screen.blit(background)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
for o in objects:
screen.blit(background, o.pos, o.pos)
for num in range(num_objects - 1):
objects[num + 1].rand_move()
for o in objects:
screen.blit(o.image, o.pos)
pygame.display.update()
pygame.time.delay(100)
This is my Player class
import random
map_height = 180
map_width = 320
class Player:
def __init__(self, image, width, height, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(width, height)
self.image = image
def set_speed(self, speed):
self.speed = speed
def rand_move(self):
x = random.randint(-self.speed, self.speed)
y = random.randint(-self.speed, self.speed)
self.pos = self.pos.move(x, y)
# keeps player in boundaries
if self.pos.left < 0:
self.pos.left = 0
if self.pos.right > map_width:
self.pos.right = map_width
if self.pos.top < 0:
self.pos.top = 0
if self.pos.bottom > map_height:
self.pos.bottom = map_height
def move_left(self):
speed = self.speed
self.pos = self.pos.move(-speed, 0)
if self.pos.left < 0:
self.pos.left = 0
def move_right(self):
speed = self.speed
self.pos = self.pos.move(speed, 0)
if self.pos.right > map_width:
self.pos.right = map_width
def move_up(self):
speed = self.speed
self.pos = self.pos.move(0, -speed)
if self.pos.top < 0:
self.pos.top = 0
def move_down(self):
speed = self.speed
self.pos = self.pos.move(0, speed)
if self.pos.bottom > map_height:
self.pos.bottom = map_height
Your basic misunderstanding, is that you try to draw the background at the position of an object, then you move the object and blit
it finally on its new position. That all is not necessary.
In common the entire scene is drawn in each frame in the main application loop. It is sufficient to draw the background to the entire window and blit
each object on top of it. Note, you do not see the changes of the window surface immediately. The changes become visible, when the display is updated by pygame.display.update()
or pygame.display.flip()
:
The main application loop has to:
- handle the events by either
pygame.event.pump()
orpygame.event.get()
. - update the game states and positions of objects dependent on the input events and time (respectively frames)
- clear the entire display or draw the background
- draw the entire scene (
blit
all the objects) - update the display by either
pygame.display.update()
orpygame.display.flip()
e.g.:
while 1:
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# update objects (depends on input events and frames)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
objects[0].move_left()
if keys[pygame.K_RIGHT]:
objects[0].move_right()
if keys[pygame.K_UP]:
objects[0].move_up()
if keys[pygame.K_DOWN]:
objects[0].move_down()
for num in range(num_objects - 1):
objects[num + 1].rand_move()
# draw background
screen.blit(background, (0, 0))
# draw scene
for o in objects:
screen.blit(o.image, o.pos)
# update dispaly
pygame.display.update()
pygame.time.delay(100)
Minimal example:
这篇关于为什么我的 pygame 应用程序循环无法正常工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!