前言
前期已经完成了小蜜蜂(这里我想更名了,因为是一只大花猫,每次说小蜜蜂怪怪的,以后都叫大花猫吧)的创建,现在我们要创建它的对手了,一群小老鼠,今天我们按照计划,先搞定一只小老鼠。
一、寻找图片
像之前的小蜜蜂一样,找图片不好找,本来是想找一只可爱的小老鼠,白色的,萌萌的,结果找不到,只能找一只写实的,看着有点恶心,不过缩小以后好多了,大家凑合看。
二、创建Alien类
有了前面创建大花猫的经历,其实我们做这个小老鼠还是有一定思路的,首先,我们要创建一个老鼠的类mouse,为了编写的时候不搞混淆,我们把类的名字设置的和书上一样,也命名为Alien,然后我们需要在里面设置小老鼠的位置、速度等属性,和大花猫一样,下面我们看代码:
import pygame from pygame.sprite import Sprite class Alien(Sprite): def __init__(self,new_setting,screen): super(Alien,self).__init__() self.screen = screen self.new_setting = new_setting self.image = pygame.image.load('mouse.jpg') 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 blitme(self): self.screen.blit(self.image,self.rect)
可以看出,这段代码与大花猫的代码Ship很相似,但是它导入了Sprite类,这个类在创建子弹的时候也导入了,因为Sprite可以处理多个对象,子弹和小老鼠都不止一个。self.x = float(self.rect.x)的作用也和子弹、大花猫一致,用来存储位置信息,会有一个属性来控制速度,不明白的可以看看前面的内容。
三、小老鼠实例化
Alien类写好之后,我们就需要在主函数中创建它的实例,创建实例很简单,我们导入Alien类,再创建,看代码:
import pygame import settings from ship import Ship import game_functions as gf from pygame.sprite import Group from alien import Alien def run_game(): pygame.init() new_setting=settings.Settings() screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height)) ship = Ship(screen,new_setting) alien = Alien(new_setting,screen) pygame.display.set_caption("狂敲代码的橘子") bullets = Group() while True: gf.check_events(new_setting,screen,ship,bullets) ship.update() gf.update_bullets(bullets) gf.update_screen(new_setting,screen,ship,bullets) run_game()
我们将创建实例的代码就写在ship下面,目前我们的操作都是按照先创建一只小老鼠来的,创建好实例后,我们先让屏幕显示这一只小老鼠看看效果。
四、小老鼠上灯台
在Alien类中,我们已经写好了显示函数blitme(),我们只需要在game_functions模块的update_screen()函数里调用blitme就可以了,同样,我们把代码写在ship.blitme()后面。
import sys import pygame from bullet import Bullet def check_keydown_events(event,new_setting,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_SPACE: fire_bullet(new_setting, screen, ship, bullets) elif event.key ==pygame.K_q: sys.exit() def check_keyup_events(event,ship): if event.key == pygame.K_RIGHT: ship.moving_right = False if event.key == pygame.K_LEFT: ship.moving_left = False def check_events(new_setting,screen,ship,bullets): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type==pygame.KEYDOWN: check_keydown_events(event,new_setting,screen,ship,bullets) elif event.type==pygame.KEYUP: check_keyup_events(event, ship) def fire_bullet(new_setting,screen,ship,bullets): if len(bullets) < new_setting.bullets_allowed: new_bullet = Bullet(new_setting, screen, ship) bullets.add(new_bullet) def update_bullets(bullets): bullets.update() for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) def update_screen(new_setting,screen,ship,bullets,alien): screen.fill(new_setting.bg_color) for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() alien.blitme() pygame.display.flip()
这里我们要注意,我们将alien作为传参,传给了update_screen,所以我们的主函数调用update_screen的代码需要修改,加上传参alien。
现在一只小老鼠已经完成,我们来看看效果。
总结
今天完成了一只小老鼠的创建,明天我们来创建一群小老鼠。