python - 外星人移动功能中的pygame python'break loop'导致不同的效果
问题描述
更新:修改代码仍然不正确:
def edge(self,setting,aliens):
for alien in aliens.sprites():
if alien.x > setting.w or alien.x < 0:
return True
def ck_edge(setting,aliens):
for alien in aliens.sprites():
if alien.edge(setting,aliens):
alien.change_direction()
break # cant use break here,why
self
如果他们不在def edge(setting,aliens):
如何在#<<中调用如何修改这个命令??
def ck_edge(setting,aliens):
for alien in aliens.sprites():
if alien.edge(setting,aliens):
我参考这本书让外星人移动,当他们触摸屏幕时向下移动并转向另一个方向。
我创建了我的代码并使其工作,然后我发现与书中的代码有些不同
在我的代码中,函数是:
def ck_edge(setting,aliens):
for alien in aliens.sprites():
if alien.x > setting.w:
alien.change_direction()
elif alien.x < 0:
alien.change_direction()
def change_direction(self):
self.rect.y +=50
self.direction *= -1
书中的相同功能是:
def _check_fleet_edges(self):
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break #this break is my question
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
alien.rect.y += self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1
我不知道为什么需要break
在这个循环中使用,如果我break
在自己的代码中使用,它只会导致一排外星人动作,但在书中这个函数是正确的
为什么在书的代码中需要使用break
,我尝试标记break
,功能也正确,是什么原因造成的?因为在我的代码中我不能使用'break',因为它只会检查一个if
但在书中它是正确的
这是我的代码:
#!/usr/bin/python
import sys
import pygame as p
class Setting():
def __init__(self,width,height):
self.w=width
self.h=height
self.flag=p.RESIZABLE
self.screen=p.display.set_mode((self.w,self.h),self.flag)
p.display.set_caption("Muhaha")
class Alien(p.sprite.Sprite):
def __init__(self):
super().__init__()
pic=p.image.load("../image/ship.jpg").convert_alpha()
self.image=p.transform.smoothscale(pic,(100,100))
self.rect=self.image.get_rect()
self.x = float(self.rect.x)
self.rect.x=(self.rect.width)
self.speed=1
self.direction = 1
def create(self,setting,aliens):
spacex=setting.w-(self.rect.x)*2
spacey=(setting.h)/2-self.rect.y
alien_number=int(spacex/(2*(self.rect.width)))
alien_row=int(spacey/(2*(self.rect.height)))
for row in range(alien_row):
for number in range(alien_number):
alien=Alien()
alien.x=alien.rect.x+2*alien.rect.width*number
alien.rect.x=alien.x
alien.rect.y=alien.rect.y+2*alien.rect.height*row
aliens.add(alien)
def ck_edge(setting,aliens):
for alien in aliens.sprites():
if alien.x > setting.w:
alien.change_direction()
elif alien.x < 0:
alien.change_direction()
def change_direction(self):
self.rect.y +=50
self.direction *= -1
def update(self):
self.x += (self.speed*self.direction)
self.rect.x =self.x
def position(setting,aliens):
Alien.ck_edge(setting,aliens)
aliens.update()
def blit(setting,aliens):
aliens.draw(setting.screen)
def game():
p.init()
setting=Setting(1200,800)
alien=Alien()
aliens=p.sprite.Group()
alien.create(setting,aliens)
while True:
for event in p.event.get():
if event.type == p.QUIT:
sys.exit()
setting.screen.fill((255,0,0))
Alien.blit(setting,aliens)
Alien.position(setting,aliens)
p.display.flip()
game()
这里是书中的代码(只在屏幕上保持外星人)
#! /usr/bin/python
import sys
import pygame
from pygame.sprite import Sprite
class Settings:
def __init__(self):
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
self.alien_speed = 1.0
self.fleet_drop_speed = 10
self.fleet_direction = 1
class Alien(Sprite):
def __init__(self, ai_game):
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= 0:
return True
def update(self):
self.x += (self.settings.alien_speed * self.settings.fleet_direction)
self.rect.x = self.x
class AlienInvasion:
def __init__(self):
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode((1200, 800), pygame.RESIZABLE)
self.settings.screen_width = self.screen.get_rect().width
self.settings.screen_height = self.screen.get_rect().height
pygame.display.set_caption("Alien Invasion")
self.aliens = pygame.sprite.Group()
self._create_fleet()
def run_game(self):
while True:
self._check_events()
self._update_aliens()
self._update_screen()
def _check_events(self):
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def _update_aliens(self):
self._check_fleet_edges()
self.aliens.update()
def _create_fleet(self):
alien = Alien(self)
alien_width, alien_height = alien.rect.size
available_space_x = self.settings.screen_width - (2 * alien_width)
number_aliens_x = available_space_x // (2 * alien_width)
available_space_y = (self.settings.screen_height -
(3 * alien_height))
number_rows = available_space_y // (2 * alien_height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
self._create_alien(alien_number, row_number)
def _create_alien(self, alien_number, row_number):
alien = Alien(self)
alien_width, alien_height = alien.rect.size
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
self.aliens.add(alien)
def _check_fleet_edges(self):
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
alien.rect.y += self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1
def _update_screen(self):
self.screen.fill(self.settings.bg_color)
self.aliens.draw(self.screen)
pygame.display.flip()
if __name__ == '__main__':
# Make a game instance, and run the game.
ai = AlienInvasion()
ai.run_game()
解决方案
推荐阅读
- c# - CATIA V5 C# 如何从活动文档中获取 AxisSystem
- c++ - 我无法在快板中获得快速简便的方法来获取键盘事件
- python - 如何在 django 中获取内部连接的表别名
- typescript - 打字稿索引签名和方法
- postgresql - FlywayDB 未创建扩展
- java - 有没有办法用不同的组件替换 JMenu 的 JPopup 组件?
- python - 如何在python中实现卷积层?
- javascript - 如何根据用户使用javascript发送的时间显示消息
- spring - 与继承对象的多对一关系 - Postgres
- xml - Parse XML with SQL Server 2016