python - 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 个块
谁能指出我的代码中缺少什么?
非常感谢。
解决方案
推荐阅读
- excel - 具有原位结果的 Excel 插值
- php - 如何让我的文本视图从我的会话中获取 id?
- kubernetes - Helm 图表最佳实践:最新标签与否
- java - 如何在 apache kafka 中使用以前的消息
- c# - 如何在 sql server 中获取最后插入的计算列的值并在 asp.net 中提交表单后显示给用户
- firebase - 如何使用 Firebase 云消息传递解决错误“SENDER_ID_MISMATCH”错误?
- java - 以下代码线程安全吗
- r - 改变绘图大小时ggplot2中列的奇怪变形
- r - ggplot2 - 导入和绘制多个 .csv 文件
- javascript - ES6 imports doesn't work