立志办公自动化 2019-01-05 14:15
浏览 1855
已结题

Python,请教如何对sprite中Group类的全体组员(所有行、列)进行操作

在手打《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
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 kali环境运行volatility分析android内存文件,缺profile
    • ¥15 写uniapp时遇到的问题
    • ¥15 vs 2008 安装遇到问题
    • ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
    • ¥15 找一个网络防御专家,外包的
    • ¥100 能不能让两张不同的图片md5值一样,(有尝)
    • ¥15 informer代码训练自己的数据集,改参数怎么改
    • ¥15 请看一下,学校实验要求,我需要具体代码
    • ¥50 pc微信3.6.0.18不能登陆 有偿解决问题
    • ¥20 MATLAB绘制两隐函数曲面的交线