星际争霸之小霸王之小蜜蜂(七)--消失的子弹
星际争霸之小霸王之小蜜蜂(六)--让子弹飞
星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
目录
前言
一、寻找图片
二、创建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。
现在一只小老鼠已经完成,我们来看看效果。
今天完成了一只小老鼠的创建,明天我们来创建一群小老鼠。