python - 从列表中绘制的对象不留在屏幕上(pygame)
问题描述
我开始更多地使用类,并且试图将我的旧无类代码转换为这种新格式。之前,我将列表定义为全局变量,并且可以毫无问题地将多个敌人绘制到屏幕上。然而,这一次,与班级合作的一些事情会导致敌人被吸引并立即从他们的位置消失。
一些帮助或解决方法将不胜感激。这是代码:
import pygame
import sys
import random
import math
pygame.init()
class enemies(object):
enemies = []
def __init__(self, enemy_num, diff, enemy_size):
self.enemy_num = enemy_num
self.diff = diff
self.enemy_s = enemy_size
def add_enemies(self):
counter = 0
if len(self.enemies) < self.enemy_num:
for enemy in range(0, self.enemy_num):
if len(self.enemies) < 5:
self.enemies.append([counter * (self.enemy_s * 0.5), 200, (50, 168, 82)])
elif len(self.enemies) > 5 and len(self.enemies) <= 9:
self.enemies.append([counter * (self.enemy_s * 0.5), 250, (168, 160, 50)])
else:
self.enemies.append([counter * (self.enemy_s * 0.5), 300, (50, 52, 168)])
counter += 1
def move(self, surface):
for enemy in self.enemies:
surface.fill((0, 0, 0))
pygame.draw.rect(surface, enemy[2], (enemy[0], enemy[1], self.enemy_s, self.enemy_s))
pygame.display.update()
class ship(object):
def __init__(self, x, y, color):
self.x = x
self.y = y
self.color = color
def draw_all(self, surface, ship_size):
surface.fill((0, 0, 0))
pygame.draw.rect(surface, self.color, (self.x, self.y, ship_size, ship_size))
pygame.display.update()
def move(self):
keys = pygame.key.get_pressed()
for key in keys:
if keys[pygame.K_LEFT]:
self.x -= 0.2
if keys[pygame.K_RIGHT]:
self.x += 0.2
if keys[pygame.K_UP]:
self.y -= 0.2
if keys[pygame.K_DOWN]:
self.y += 0.2
def main():
width = 800
height = 1000
ship_size = 35
difficulty = 0
enemy_number = 12
enemy_size = 35
player = ship(width / 2, height - 100, (255, 0, 0))
aliens = enemies(enemy_number, difficulty, enemy_size)
screen = pygame.display.set_mode((width, height))
enemy_list = 12
run = True
clock = pygame.time.Clock()
aliens.add_enemies()
while run:
player.draw_all(screen, ship_size)
player.move()
aliens.move(screen)
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.display.quit()
main()
解决方案
您必须在应用程序的主循环中进行 1 次清晰显示和 1 次显示更新。分别从and方法中
删除。清除显示一次,绘制所有对象,然后更新显示:.fill()
.pygame.display.update
.move()
.draw_all
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.display.quit()
screen.fill((0, 0, 0))
player.draw_all(screen, ship_size)
player.move()
aliens.move(screen)
pygame.display.update()
注意,你没有看到敌人,因为在拉单个敌人之前显示是清晰的,enemies.move()
在拉船时又是清晰的ship.draw_all()
推荐阅读
- cloud - 使用层次结构获取表上的选择 - SAP Analytics Cloud 应用程序
- python - 使用二进制掩码裁剪图像时出错
- c++ - QT 3.3.8b 未将 SIGNAL 连接到新类中的 SLOT
- typescript - 根据对象的兄弟键推断对象属性的类型
- jenkins - jenkins pipeline groovy waitFor 执行命令,每5分钟超时一次
- jenkins - JMeter Maven Distributed - 立即关闭,结果为 0
- swiftui - TextField iOS 15 事件即将改变,未完成
- azure-devops - 无法在 Azure DevOps 中将工作项分配给来宾用户或提及来宾用户
- elasticsearch - Elasticsearch由于大小而恢复大型快照不完整
- spring-boot - 在两个节点上指定关系会导致 Spring Data Neo4j 中的逻辑循环映射依赖关系