python - 为什么我的 pygame 应用程序循环不能正常工作?

标签 python pygame 2d

<分区>

在浏览了 pygame 文档后,我正在开发一款非常粗糙的自顶向下 2d 冒险游戏。但是,在无法在相机系统上找到任何内容后,我遇到了一些障碍,发现大多数相机教程都已有 5 年以上的历史,而且似乎不再适用。谁能帮我组装一个相机?

这是我主要执行的脚本

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)

这是我的播放器类

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

最佳答案

您的基本误解是,您尝试在对象的位置绘制背景,然后移动该对象并将它blit 最后放在它的新位置。这一切都没有必要。
通常,在主应用程序循环的每一帧中绘制整个场景。将背景绘制到整个窗口并blit 其上的每个对象就足够了。请注意,您不会立即看到窗口表面的变化。当 pygame.display.update() 更新显示时,更改变得可见或 pygame.display.flip() :

主应用程序循环必须:

例如:

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)

最小示例: repl.it/@Rabbid76/PyGame-MinimalApplicationLoop

关于python - 为什么我的 pygame 应用程序循环不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60387348/

相关文章:

python - PySpark - sortByKey() 方法以原始顺序从 k,v 对返回值

python - 使用类时将用户输入保存到文本小部件 Tkinter

python - Fiona 在 Windows 上使用 pip 安装错误

python - 如何在 Python 中抑制控制台输出?

python - 使用 pygame 覆盖显示 YUV420p 会导致图像顶部出现绿色条

python - pygame 中的 surface.blit() 函数是什么?它有什么作用?它是如何工作的?

c# - PDF云注释背后的算法是什么?

android - 帮助我为 2D 配置 OpenGL

c# - 用颜色填充点之间空间的算法

python - 升级Django后如何更新包?