Python速成课程,第二版。侧身射手。外星人一直向下移动,直到第一排撞到底部
你好,我正在努力让我的侧身射击游戏加速。但是当我试图将外星人舰队向下移动到左边时,我遇到了一个问题。我已经设置了Python速成课程,第二版。侧身射手。外星人一直向下移动,直到第一排撞到底部,python,loops,pygame,Python,Loops,Pygame,你好,我正在努力让我的侧身射击游戏加速。但是当我试图将外星人舰队向下移动到左边时,我遇到了一个问题。我已经设置了self.rect.bottom>=屏幕\u rect.bottom。但是这个代码只对我的第一排外星人做出响应。我尝试设置一个数值,但这并没有给我想要的结果。非常感谢您的帮助 这是我给外星人的密码: 外星人 def check_edges(self): """Return True if alien is at edge of screen.&qu
self.rect.bottom>=屏幕\u rect.bottom
。但是这个代码只对我的第一排外星人做出响应。我尝试设置一个数值,但这并没有给我想要的结果。非常感谢您的帮助
这是我给外星人的密码:
外星人
def check_edges(self):
"""Return True if alien is at edge of screen."""
screen_rect = self.screen.get_rect()
if self.rect.bottom >= screen_rect.bottom or self.rect.top <= 0:
return True
def update(self):
"""Move the alien up or down."""
self.y += (self.settings.alien_speed *
self.settings.fleet_direction)
self.rect.y = self.y
您的
for
-循环在第一个外星人之后立即中断
用于self.异形.sprites()中的异形:
如果是外星人。请检查_边()
自我改变车队方向()
打破
break
语句必须位于if
-语句的代码块中。这是个问题
用于self.异形.sprites()中的异形:
如果是外星人。请检查_边()
自我改变车队方向()
打破
我建议您的代码更加健壮。如果外星人到达顶端,新的舰队方向应该是向下的。如果外星人到达底部,新的舰队方向应该是向上的 编写一个方法
\u设置车队方向
,而不是\u更改车队方向
。该方法有一个指示新方向的方向
参数。向下的参数必须为1,向上的参数必须为-1。新的fleet\u方向可以用当前绝对值()乘以新方向来计算:
def设置车队方向(自身,方向):
self.settings.fleet\u方向=abs(self.settings.fleet\u方向)*方向
根据范围检查设置方向:
def\u check\u fleet\u边缘(自):
“”“如果有外星人到达边缘,请做出适当的反应。”“”
screen\u rect=self.screen.get\u rect()
对于自我中的外星人。外星人。精灵()
如果alien.top=屏幕右下角
自我。_设置_车队_方向(-1)#新方向向上
打破
所以我终于找到了解决方案。
这很有效,但我不确定这是最好的方法。
我最终还是保留了那本书
def\u更改车队方向(自身):
我应该将其保留为自己的帮助函数,还是可以将其包含在def\u set\u fleet\u方向(self,direction):
中
我觉得这个游戏比我原来的外星人入侵游戏落后了一点
有什么建议吗
这就是我最终得到的解决方案:
def _check_fleet_edges(self):
screen_rect = self.screen.get_rect()
for alien in self.aliens.sprites():
if alien.rect.top <= screen_rect.top:
self._set_fleet_direction(1) # new direction is down
break
elif alien.rect.bottom >= screen_rect.bottom:
self._set_fleet_direction(-1) # new direction is up
break
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
"""Moving the aliens left"""
for alien in self.aliens.sprites():
alien.rect.x -= self.settings.fleet_left_speed
def _set_fleet_direction(self, direction):
self.settings.fleet_direction = abs(self.settings.fleet_direction) *
direction
def\u check\u fleet\u边缘(自):
screen\u rect=self.screen.get\u rect()
对于自我中的外星人。外星人。精灵()
如果alien.rect.top=屏幕_rect.bottom:
自我。_设置_车队_方向(-1)#新方向向上
打破
对于自我中的外星人。外星人。精灵()
如果是外星人。请检查_边()
自我改变车队方向()
打破
def_更改车队方向(自我):
“向左移动外星人”
对于自我中的外星人。外星人。精灵()
alien.rect.x-=self.settings.fleet\u left\u速度
def设置车队方向(自身,方向):
self.settings.fleet\u direction=abs(self.settings.fleet\u direction)*
方向
是的,谢谢。我两个都试过了,也许我应该说明一下。如果我打破了if语句中的循环,我的外星人就不会向下移动。他们只是直接向左移动。还有什么我需要更改的吗?@Vegpy如果最上面的外星人的顶部坐标在开始时为0,舰队将立即更改方向,因为self.rect.top@Vegpy我在答案中添加了一些建议。非常感谢您的帮助。我不得不对你的代码进行一些修改以使其正常工作,但我真的不知道我在做什么。我发布了最终成为我的解决方案的内容,它很有效,但我对此不太自信。如果你能看一看,给我一些建议,那将是惊人的。
def _check_fleet_edges(self):
screen_rect = self.screen.get_rect()
for alien in self.aliens.sprites():
if alien.rect.top <= screen_rect.top:
self._set_fleet_direction(1) # new direction is down
break
elif alien.rect.bottom >= screen_rect.bottom:
self._set_fleet_direction(-1) # new direction is up
break
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
"""Moving the aliens left"""
for alien in self.aliens.sprites():
alien.rect.x -= self.settings.fleet_left_speed
def _set_fleet_direction(self, direction):
self.settings.fleet_direction = abs(self.settings.fleet_direction) *
direction