首页 > 解决方案 > pygame精灵元素重叠

问题描述

我正在做一个 python 速成课程练习 14-2,我知道绘制一个矩形对于这个测验就足够了,但不是“在屏幕的右边缘创建一个以稳定速率上下移动的矩形”,我想在 Sprite 上做一些练习,所以我在右边创建了一系列矩形。

虽然可以在静态中成功生成矩形,但如果我将update代码放入函数中,似乎所有矩形都重叠并像单个矩形一样落下。

这是代码:

#main.py

import pygame
from pygame.sprite import Group
import game_function as gf
from setting import Settings
from target import Target


def run_game():
    pygame.init()
    settings = Settings()

    canvas = pygame.display.set_mode((settings.canvas_width,settings.canvas_height))

    target = Target(canvas, settings)
    targets = Group()

    gf.create_targets(canvas,settings,targets)

    while True:
        gf.update_canvas(canvas,settings, targets)
        gf.check_events()
        targets.draw(canvas)
        targets.update()

run_game()

#setting.py

class Settings():
    def __init__(self):
        self.canvas_width = 1200
        self.canvas_height = 900
        self.canvas_bg_color = (100,111,158)

        self.target_width = 50
        self.target_height = 80
        self.target_color = (255, 0, 0)
        self.target_move_speed = 0.5

#game_function.py

import sys
from random import randint
import pygame
from target import Target

def check_events():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            pass
        elif event.type == pygame.KEYUP:
            pass

def update_canvas(canvas, settings, targets):
    canvas.fill(settings.canvas_bg_color)
    
    for target in targets.sprites():
        target.target_draw()

    pygame.display.flip()

def get_number_of_rows(canvas, settings):
    target = Target(canvas, settings)
    number_of_rows = int(settings.canvas_height / (2 * target.rect.height))
    return number_of_rows

def create_a_target(canvas, row_number, settings, targets):
    target = Target(canvas, settings)
    target.rect.y = target.rect.height + 2 * target.rect.height * row_number
    targets.add(target)

def create_targets(canvas,settings,targets):
    number_of_rows = get_number_of_rows(canvas, settings)
    for row_number in range(randint(1, number_of_rows)):
        create_a_target(canvas,row_number,settings,targets)
    print(len(targets)) # i put a len()here to ensure targets are successfully added to sprites.

#target.py

import pygame
from pygame.sprite import Sprite


class Target(Sprite):
    def __init__(self, canvas, settings):
        super(Target, self).__init__()
        self.settings = settings
        self.canvas = canvas
        self.canvas_rect = canvas.get_rect()
        self.image = pygame.Surface(
            [self.settings.target_width, self.settings.target_height])
        self.rect = self.image.get_rect()

        self.rect.right = self.canvas_rect.right

        self.rect.y = self.rect.height

        self.y = float(self.rect.y)

    def update(self):
        #pass

        self.y += (self.settings.target_move_speed)
        #self.rect.y += (self.settings.target_move_speed)
        self.rect.y = self.y

    def target_draw(self):
        pygame.draw.rect(self.canvas, self.settings.target_color, self.rect)

target.py 是棘手的部分,让我感到困惑。

如果注释里面的内容def update():并留下一个pass,就可以成功生成静态画布(超过一个矩形),如图:

静态图片

如果我删除self.y = float(self.rect.centery)self.rect.y = self.y

self.rect.y += (self.settings.target_move_speed)def updates()

仅当target_move_speed是整数时,块才会下降。

最后,如果我保留如上所示的代码,则会下降 1 个以上的矩形(如 所示print(len(targets))),但这些矩形相互重叠,使它们看起来像一个矩形。

落下的块。此图中的箭头是 print(len(targets)) 的结果,表示有 5 个块

谁能指出我的代码中缺少什么?

非常感谢。

标签: pythonpygame

解决方案


推荐阅读