目前python正在自学中,这个飞机大战小游戏是自学一点点做的,目前还不完整,没有将分数系统加入,因为还在学习,还缺少PLAY按钮,所以学习仍然继续。
飞机游戏是根据python的pygame的模块来设计的,import pygame利用了pygame的大量类和模块,在使用pygame之前,先对pygame进行初始化init().
创建游戏窗口:pygame.display.set_mod(height,width)。(在创建窗口大小是,要写入参数,我建议不要直接将数字大小直接写入,因为避免以后改写屏幕大小时不方便改写我们可以这样写:在准备模块中定义一个常量:SCREEN_RECT=(0,0,100,200),然后在main函数中调用pygame.display.set_mod(SCREEN_RECT.size)来创建窗口。
窗口标题:pygame.display.set_caption(CAPTION),同样利用常量来传递,CAPTION=“飞机游戏大战“。
游戏时钟:pygame.time.Clock.tick(CLOCK_TICK),同样利用常量传递,CLOCK_TICK=60。
定时器:pygame.time.set_timer(eventid,milliseconds),第一个参数eventid,表示事件的id,是基于pygame.USEREVENT来指定的;第二个参数是单位毫秒,例如定义1000时,便是1秒出现一次。在定义第一个参数时,我们同样使用常量传递到主函数,由于会在创作敌机和发射子弹时使用到两个定时器,所以定义两个定时器:
敌机:CREAT_ENEMY_EVENT = pygame.USEREVENT
子弹:HERO_FIRE_EVENT = pygame.USEREVENT + 1,在主函数中使用pygame.time.set_timer(CREAT_ENEMY_EVENT,1000) ,pygame.time.set_timer(HERO_FIRE_EVENT,500)来调用定时器。
鼠标:调用pygame.mouse.set_visible(0)函数使鼠标在游戏界面时消失。
精灵:继承pygame.sprite.Sprite创建一个游戏精灵类,在初始化方法里使用self.image=pygame.image.load(image_name)对精灵图片进行加载,使用self.rect=self.image.get_rect()对位置进行获取。然后英雄飞机类,敌机类,子弹类,游戏背景类,都需要继承这个游戏精灵类来进行创建。在游戏精灵类中,还要定义update()方法进行刷新。
精灵组:pygame.sprite.Group()创建精灵组的类,调用update()方法时会自动调用精灵各自的update()方法。四个精灵组:1,self.hero=pygame.sprite.Group() 2,self.bullets=pygame.sprite.Group() 3,self.background=pygame.sprite.Group() 4,self.enemy=pygame.sprite.Group().为了使精灵能够出现在游戏窗口上,必须对每个精灵进行刷新,也就是精灵组的update()方法和draw()方法.
self.background.update()
self.background.draw(self.screen)
self.ene my.update()
self.enemy.draw(self.screen)
self.hero.update()
self.hero.draw(self.screen)
self.hero.bullets.update()
self.hero.bullets.draw(self.screen),其中,draw方法返回surface。
事件监听:pygame.event.get()返回一个列表,可以对获取的事件进行遍历。如果event.typeCREAT_ENEMY_EVENT,便创建一个敌机并且搁1秒创建一个;event.typeHERO_FIRE_EVENT,便创建一个子弹并且搁0.5秒等等。。
键盘模块:pygame.key.get_pressed(),这个模块主要使获取键盘的所有按键,并且返回元组,keys_pressed=pygame.key.get_pressed(),如果元组中存在按键操作,就为1,例如if keys_pressed[pygame.K_RIGHT]:
print(“向右移动”)
碰撞检测:利用pygame提供的pygame.sprite.groupcollide(group1,group2,dokill1,dokill2)模块对两个精灵组进行碰撞检测,dokill1和dokill2如果为真,则都进行消除。利用pygame.sprite.spritecollide(sprite,group,dokillgroup)模块对精灵和精灵组进行碰撞检测,其模块返回一个列表,如果列表内有长度,则表示发生碰撞,那么使dokill为真,便消除group,在增加一个判断条件,使sprite也消除,一旦英雄飞机sprite消除,整个游戏就结束,调用exit()使程序终结,在终结之前,要对pygame进行quit().
部分代码如下:精灵类
class GameSprite(pygame.sprite.Sprite): def __init__(self, image_name, speed=1): super().__init__() self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() self.speed = speed def update(self): self.rect.y += self.speed 背景类
class BackGround(GameSprite): def __init__(self, is_alt=False): super().__init__("./images/background.png", speed=2) if is_alt: self.rect.y = -self.rect.height def update(self): self.rect.y += self.speed if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.height敌机类
class Enemy(GameSprite): def __init__(self): super().__init__("./images/enemy1.png") self.speed = random.randint(1, 3) self.rect.y = -self.rect.height _x = SCREEN_RECT.width-self.rect.width self.rect.x = random.randint(0, _x) def update(self): super().update() if self.rect.y >= SCREEN_RECT.height + self.rect.height: self.kill()子弹类
class Bullet(GameSprite): def __init__(self): super().__init__("./images/bullet1.png", speed=-3.5) def update(self): super().update() if self.rect.bottom < 0: self.kill() def __del__(self): pass英雄飞机类
class Myhero(GameSprite): def __init__(self): super().__init__("./images/me1.png", speed=0) self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 self.bullets = pygame.sprite.Group() def move(self, x, y): self.rect.x += x self.rect.y += y if self.rect.left < SCREEN_RECT.left: self.rect.left = SCREEN_RECT.left elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right elif self.rect.top < SCREEN_RECT.top: self.rect.top = SCREEN_RECT.top elif self.rect.bottom > SCREEN_RECT.bottom: self.rect.bottom = SCREEN_RECT.bottom def fire(self): for i in [1, 2, 3]: bullet = Bullet() bullet1 = Bullet() bullet2 = Bullet() bullet2.rect.bottom = self.rect.y - i * 20 bullet1.rect.bottom = self.rect.y - i * 20 bullet.rect.bottom = self.rect.y - i * 20 bullet.rect.centerx = self.rect.centerx bullet1.rect.centerx = self.rect.centerx - 20 bullet2.rect.centerx = self.rect.centerx + 20 self.bullets.add(bullet, bullet1, bullet2) def update(self): pass













