问题描述
我正在尝试按照 this 教程学习 pygame。我已经到了尝试生成敌人对象的地步,但我认为我犯了一个错误,因为没有显示任何内容。
class Player(pygame.sprite.Sprite):
def __init__(self):
super(Player,self).__init__()
self.surf = pygame.Surface((75,25))
self.surf.fill((0,0))
self.rect = self.surf.get_rect()
#Moves sprite based on keypresses(removed for clarity)
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super(Enemy,self).__init__()
self.surf = pygame.Surface((20,10))
self.surf.fill((0,0))
self.rect = self.surf.get_rect(
center = (
random.randint(SCREEN_WIDTH + 20,SCREEN_WIDTH + 100),random.randint(0,SCREEN_HEIGHT),)
)
self.speed = random.randint(5,20)
# moves sprite based on speed,remove when passes left edge
def update(self):
self.rect.move_ip(-self.speed,0)
if self.rect.right < 0:
self.kill()
#How sad for them
pygame.init()
#create screen
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
#custom events for adding a new Enemy
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY,250)
# Instantiate player
player = Player()
enemies = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
#keep the game running!
running = True
#loop time!
while running:
#look at all the events
for event in pygame.event.get():
#did the user hit a key?
if event.type == KEYDOWN:
#Was it escape? uh oh we gotta stop
if event.key == K_ESCAPE:
running = False
elif event.type ==QUIT:
running = False
elif event.type == ADDENEMY:
#Create the new enemy
new_enemy = Enemy()
enemies.add(new_enemy)
all_sprites.add(new_enemy)
#gets the keys that were just pressed
pressed_keys = pygame.key.get_pressed()
#updates location based on keys
player.update(pressed_keys)
#updates enemy position
enemies.update()
#fill screen with white
screen.fill((255,255,255))
#Draw the sprites
for entity in all_sprites:
screen.blit(entity.surf,entity.rect)
# Create a surface and pass in a tuple containing legth and width
surf = pygame.Surface((50,50))
pygame.display.flip()
据我所知,我必须创建一个敌人类,然后添加一个添加敌人的事件(ADDENEMY)。当该事件被调用时(由于计时器每 250 毫秒),它应该显示一个向左移动的敌人,直到它到达显示的末尾。
我有一组敌人精灵和一组 all_sprites,我使用 screen.blit 和 for 循环将 all_sprites 中的每个实体渲染到屏幕上。我错过了什么?当我运行这个(连同我编辑掉的部分)时,我看到玩家精灵很好,它移动了,但我没有看到任何敌人。
解决方法
您的精灵不在窗口中。所有精灵都在窗口之外,因为范围指定不正确:
random.randint(SCREEN_WIDTH + 20,SCREEN_WIDTH + 100)
random.randint(20,SCREEN_WIDTH + 100),
另外,Indentation 有问题。方法 update
需要是类 Enemy
的范围:
class Enemy(pygame.sprite.Sprite):
def __init__(self):
# [...]
# INDENTATION
#<--|
def update(self):
# [...]
此外,请参阅pygame.sprite.Group.draw()
:
将包含的精灵绘制到 Surface 参数。这对源表面使用 Sprite.image
属性和 Sprite.rect
。 [...]
将属性 surf
重命名为 image
并调用 all_sprites.draw(screen)
:
class Player(pygame.sprite.Sprite):
def __init__(self):
super(Player,self).__init__()
self.image = pygame.Surface((75,25))
self.image.fill((0,0))
self.rect = self.image.get_rect()
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super(Enemy,self).__init__()
self.image = pygame.Surface((20,10))
self.image.fill((0,0))
self.rect = self.image.get_rect(
center = (
random.randint(20,random.randint(0,SCREEN_HEIGHT),)
)
self.speed = random.randint(5,20)
while running:
# [...]
#for entity in all_sprites:
# screen.blit(entity.surf,entity.rect) <---- DELETE
all_sprites.draw(screen) <---- ADD