为什么我的 pygame 应用程序循环无法正常工作? [英] Why is my pygame application loop not working properly?

查看:17
本文介绍了为什么我的 pygame 应用程序循环无法正常工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在浏览了 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:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆