在手打《python入门到实践》中,对aliens组员进行x方向上移动时遇到了问题。
简略版如下:
from pygame.sprite import Group
aliens=Group()(aliens中所有的alien都是Alien类)
aliens.update()
class Alien
方法1:def update():
self.rect.x=int(self.rect.x+self.ai_settings.alien_speed_factor)
方法2:def update():
self.floatx +=self.ai_settings.alien_speed_factor
self.rect.x=int(self.floatx)
方法1能正确移动和显示所有组员aliens
方法2只能显示第一列,移动第一列,len(aliens)后方法1和方法2的组员数量一致。貌似方法2中所有组员的x值都被覆盖为同一值。如何修改方法2?方法2中有什么错误?
主程序如下:
import pygame
from setting import Settings
from ship import Ship
import game_fuction as gf
from pygame.sprite import Group
def run_game():
pygame.init()
ai_settings=Settings()
#screen sequence is ((int,int))
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
#set menu name
pygame.display.set_caption("Alien Invasion")
#create a ship with actual parameters "screen"
ship=Ship(ai_settings,screen)
#create a group to instore the info of bullets
bullets=Group()
aliens=Group()
gf.create_fleet(ai_settings,screen,aliens,ship)
while True:
#Monitoring keyboards and events
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(aliens)
#set screen background and flash screen made it be visible
gf.draw_screen_and_aliens_and_bullets(ai_settings,screen,ship,bullets,aliens)
run_game()
game_fuction.py()
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_event_keydown(event,ai_settings,screen,ship,bullets):
if event.key==pygame.K_RIGHT:
ship.moving_right= True
elif event.key==pygame.K_LEFT:
ship.moving_left= True
elif event.key==pygame.K_UP:
ship.moving_up= True
elif event.key==pygame.K_DOWN:
ship.moving_down= True
elif event.key==pygame.K_SPACE:
if len(bullets) <ai_settings.bullet_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
elif event.key==pygame.K_q:
sys.exit()
def check_event_keyup(event,ship):
if event.key==pygame.K_RIGHT:
ship.moving_right= False
elif event.key==pygame.K_LEFT:
ship.moving_left= False
elif event.key==pygame.K_UP:
ship.moving_up= False
elif event.key==pygame.K_DOWN:
ship.moving_down= False
def check_events(ai_settings,screen,ship,bullets):
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_event_keydown(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP:
check_event_keyup(event,ship)
def update_bullets(bullets):
bullets.update()
'''bullets(Group class).sprites reture '''
for bullet in bullets.sprites():
if bullet.rect.y<=0:
bullets.remove(bullet)
def get_number_aliens_x(ai_settings,alien_width):
#calculate the available numeber of aliens in line
available_space_x=ai_settings.screen_width-(2*alien_width)
number_aliens_x=int(available_space_x/(alien_width))
return number_aliens_x
def get_number_of_rows(ai_settings,alien_height,ship_height):
available_space_y=ai_settings.screen_height-3*alien_height-ship_height
number_of_rows=int(available_space_y/alien_height)
return number_of_rows
def create_fleet(ai_settings,screen,aliens,ship):
alien=Alien(ai_settings,screen)
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_of_rows=get_number_of_rows(ai_settings,alien.rect.height,ship.rect.height)
for alien_number in range(number_aliens_x):
for row in range(number_of_rows):
create_alien(ai_settings,screen,aliens,alien_number,row)
def create_alien(ai_settings,screen,aliens,number_aliens_x,number_of_rows):
alien=Alien(ai_settings,screen)
alien_width=alien.rect.width
alien_height=alien.rect.height
alien.rect.x=int(alien_width+alien_width*number_aliens_x)
alien.rect.y=int(alien_height+alien_height*number_of_rows)
aliens.add(alien)
def update_aliens(aliens):
aliens.update()
''''def update(self):
self.floatx +=float(self.ai_settings.alien_speed_factor)
self.rect.x=self.floatx'''
def draw_screen_and_aliens_and_bullets(ai_settings,screen,ship,bullets,aliens):
screen.fill(ai_settings.bg_color)
ship.blitme()
aliens.draw(screen)
for bullet in bullets.sprites():
if bullet.rect.y>0:
bullet.draw_bullet()
pygame.display.flip()
alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,ai_settings,screen):
super(Alien,self).__init__()
self.screen=screen
self.ai_settings=ai_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.floatx=float(self.rect.x)
self.floaty=float(self.rect.y)
def blitme(self):
self.screen.blit(self.image,self.rect)
def update(self):
self.floatx +=self.ai_settings.alien_speed_factor
self.rect.x=int(self.floatx)
#self.rect.x=int(self.rect.x+self.ai_settings.alien_speed_factor)
settings.py
class Settings():
"""store all setting class"""
def __init__(self):
"""initialize all setting"""
#screen setting
self.screen_width=800
self.screen_height=600
self.bg_color=(230,230,230)
#set speed factor
self.ship_speed_factor=1.5
self.bullet_speed_factor=5
self.bullet_width=3
self.bullet_height=15
self.bullet_collor=60,60,60
self.bullet_allowed=10
self.alien_speed_factor=1