# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-03-19 23:45:29
# @Last Modified by: Clarence
# @Last Modified time: 2018-03-21 21:33:48
"""
常用键盘事件的检响应有两种方法:
1.通过键盘事件的检测,执行相应的代码
2.pygame.key.get_pressed() 返回一个包含键盘上所有按键Bool类型值的序列
Returns a sequence of boolean values representing the state of
the every key on the keyboard. Use the key constant values to index
the array.A True value means the that button is pressed.
建议对于偶然触发的事件用第一种方法,频繁触发的键盘事件使用第二种方法
控制飞机方向使用第二种方法
"""
import pygame
class MyPlane(pygame.sprite.Sprite):
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
#不断切换飞机的两张图片会产生喷气效果
self.image1 = pygame.image.load("images/me1.png").convert_alpha()
self.image2 = pygame.image.load("images/me2.png").convert_alpha()
# 将受到撞击的图片Surface对象放入到列表中
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load("images/me_destroy_1.png").convert_alpha(),\
pygame.image.load("images/me_destroy_2.png").convert_alpha(),\
pygame.image.load("images/me_destroy_3.png").convert_alpha(),\
pygame.image.load("images/me_destroy_4.png").convert_alpha()\
])
self.rect = self.image1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
#飞机的起始位置在屏幕的下方中央位置 距离底部状态栏大约60像素位置
self.rect.left, self.rect.top=\
(self.width - self.rect.width) // 2,\
(self.height - self.rect.height - 60)
self.speed = 10
self.active = True
self.invincible = False
#将传进来的Surface对象中的非透明部分设置为mask 飞机边缘之外矩形之内的都是透明部分
self.mask = pygame.mask.from_surface(self.image1)
#定义四个方法描述飞机的上下左右移动
def moveUp(self):
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.rect.top = 0
def moveDown(self):
if self.rect.bottom < self.height -60:
self.rect.top += self.speed
else:
self.rect.bottom = self.height - 60
def moveLeft(self):
if self.rect.left > 0:
self.rect.left -= self.speed
else:
self.rect.left = 0
def moveRight(self):
if self.rect.right < self.width:
self.rect.left += self.speed
else:
self.rect.right = self.width
def reset(self):
self.rect.left, self.rect.top = \
(self.width - self.rect.width) // 2,\
(self.height - self.rect.height - 60)
self.active = True
# 无敌状态只有三秒钟的时间
self.invincible = True
myplane模块中只需要定义我方飞机类就可以了,共有五个方法,赋予了飞机上下左右飞行的功能,同时也可以让飞机
从新初始化
下面是supply补给模块
# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-03-19 23:46:02
# @Last Modified by: Clarence
# @Last Modified time: 2018-03-21 21:33:52
"""
补给初始化的时候在界面上方100个像素的时候掉落
"""
import pygame
from random import *
class Bullet_Supply(pygame.sprite.Sprite):
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/bullet_supply.png").convert_alpha()
self.rect = self.image.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.rect.left, self.rect.bottom = \
randint(0, self.width - self.rect.width), -100
self.speed = 5
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
if self.rect.top < self.height:
self.rect.top += self.speed
else:
self.active = False
def reset(self):
self.active = True
self.rect.left, self.rect.bottom = \
randint(0, self.width - self.rect.width), -100
class Bomb_Supply(pygame.sprite.Sprite):
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/bomb_supply.png").convert_alpha()
self.rect = self.image.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.rect.left, self.rect.bottom = \
randint(0, self.width - self.rect.width), -100
self.speed = 5
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
if self.rect.top < self.height:
self.rect.top += self.speed
else:
self.active = False
def reset(self):
self.active = True
self.rect.left, self.rect.bottom = \
randint(0, self.width - self.rect.width), -100
接下来是bullet子弹模块,子弹类共有两种,一种普通黄色子弹,另一种蓝色超级子弹
# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-03-19 23:45:49
# @Last Modified by: Clarence
# @Last Modified time: 2018-03-21 11:02:53
import pygame
class Bullet1(pygame.sprite.Sprite):
def __init__(self, position):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/bullet1.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.speed = 12
self.active = True
self.mask = pygame.mask.from_surface(self.image)
def move(self):
self.rect.top -= self.speed
if self.rect.top < 0:
self.active = False
def reset(self, position):
self.rect.left, self.rect.top = position
self.active = True
class Bullet2(pygame.sprite.Sprite):
def __init__(self, position):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/bullet2.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.speed = 12
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
self.rect.top -= self.speed
if self.rect.top < 0:
self.active = False
def reset(self, position):
self.rect.left, self.rect.top = position
self.active = True
敌机模块中,总共有大中小三个敌机类
# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-03-19 23:34:54
# @Last Modified by: Clarence
# @Last Modified time: 2018-03-21 21:33:40
"""
敌机只能向下移动 移出屏幕后重新生成位置
"""
import pygame
from random import *
class SmallEnemy(pygame.sprite.Sprite):
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/enemy1.png").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load("images/enemy1_down1.png").convert_alpha(),\
pygame.image.load("images/enemy1_down2.png").convert_alpha(),\
pygame.image.load("images/enemy1_down3.png").convert_alpha(),\
pygame.image.load("images/enemy1_down4.png").convert_alpha()\
])
self.rect = self.image.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
# active属性表示敌机的存活状态,True绘制正常画面,False绘制毁灭画面
self.active = True
self.speed = 2
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-5 * self.height, 0)
self.mask = pygame.mask.from_surface(self.image)
def move(self):
if self.rect.top < self.height:
self.rect.top += self.speed
else:
self.reset()
def reset(self):
self.active = True
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-5 * self.height, 0)
class MidEnemy(pygame.sprite.Sprite):
energy = 8 #energy是类变量,可以由类名直接调用,也可以用对象来调用
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images/enemy2.png").convert_alpha()
self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load("images/enemy2_down1.png").convert_alpha(),\
pygame.image.load("images/enemy2_down2.png").convert_alpha(),\
pygame.image.load("images/enemy2_down3.png").convert_alpha(),\
pygame.image.load("images/enemy2_down4.png").convert_alpha()\
])
self.rect = self.image.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
# active属性表示敌机的存活状态,True绘制正常画面,False绘制毁灭画面
self.active = True
self.speed = 1
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-10 * self.height, -self.height)
self.mask = pygame.mask.from_surface(self.image)
self.energy = MidEnemy.energy
# hit属性表示是否被击中,检测这个属性来切换到击中的图片
self.hit = False
def move(self):
if self.rect.top < self.height:
self.rect.top += self.speed
else:
self.reset()
def reset(self):
self.active = True
self.energy = MidEnemy.energy
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-10 * self.height, -self.height)
class BigEnemy(pygame.sprite.Sprite):
energy = 20
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha()
self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha()
#飞机被打中的图片特效
self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load("images/enemy3_down1.png").convert_alpha(),\
pygame.image.load("images/enemy3_down2.png").convert_alpha(),\
pygame.image.load("images/enemy3_down3.png").convert_alpha(),\
pygame.image.load("images/enemy3_down4.png").convert_alpha(),\
pygame.image.load("images/enemy3_down5.png").convert_alpha(),\
pygame.image.load("images/enemy3_down6.png").convert_alpha()\
])
self.rect = self.image1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.speed = 1
# active属性表示敌机的存活状态,True绘制正常画面,False绘制毁灭画面
self.active = True
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-15 * self.height, -5 * self.height)
self.mask = pygame.mask.from_surface(self.image1)
self.energy = BigEnemy.energy
self.hit = False
def move(self):
if self.rect.top < self.height:
self.rect.top += self.speed
else:
self.reset()
def reset(self):
self.active = True
self.energy = BigEnemy.energy
self.rect.left, self.rect.top = \
randint(0, self.width -self.rect.width), \
randint(-15 * self.height, -5 * self.height)