-
类对象设置及分析:
游戏类
英雄飞机类
子弹类 -
gif转化器的因故,图片不清晰:
- 按键监测(单次按击,长按):
def event(self):
#获取键盘按下事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
print("点击关闭窗口按钮")
sys.exit() #关闭程序
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
print("space")
self.heroPlane.fire()
pressed_keys = pygame.key.get_pressed() #获取键盘长按事件
if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
self.heroPlane.move_left()
elif pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
self.heroPlane.move_right()
elif pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
self.heroPlane.move_up()
elif pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
self.heroPlane.move_down()
- 英雄飞机类设计:
class HeroPlane:
def __init__(self):
self.image = pygame.image.load("images/heroplane0.png")
self.width = self.image.get_width()
self.heigh = self.image.get_height()
self.x = (SCREEN_RECT.width - self.width) / 2
self.y = SCREEN_RECT.height - self.heigh
self.bullets = [] #记录飞机发出的所有子弹
def move_left(self):
self.x -= 5
if self.x <= 0:
self.x = 0 #控制飞机不越界
def move_right(self):
self.x += 5
if self.x >= SCREEN_RECT.width - self.width:
self.x = SCREEN_RECT.width - self.width #控制飞机不越界
def move_up(self):
self.y -= 5
if self.y <= 0:
self.y = 0 #控制飞机不越界
def move_down(self):
self.y += 5
if self.y >= SCREEN_RECT.height - self.heigh:
self.y = SCREEN_RECT.height - self.heigh #控制飞机不越界
def fire(self):
bullet = Bullet()
bullet.x = self.x + self.width * 0.5 - bullet.width * 0.5
bullet.y = self.y - bullet.heigh
self.bullets.append(bullet)
- 子弹类设计:
class Bullet:
#子弹位置应该立足于英雄飞机位置
def __init__(self):
self.image = pygame.image.load("images/herobullet0.png")
self.x = -500
self.y = -500
self.width = self.image.get_width()
self.heigh = self.image.get_height()
#向上移动
def move(self):
self.y -= 5
- 图中运行结果代码如下:
import pygame
import sys
SCREEN_RECT = pygame.Rect(0,0,480,700)
class Game:
def __init__(self):
self.window = pygame.display.set_mode(SCREEN_RECT.size)
self.backgroundImg = pygame.image.load("images/background.jpg")
self.heroPlane = HeroPlane() #英雄飞机
#事件监测,按键
def event(self):
#获取键盘按下事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
print("点击关闭窗口按钮")
sys.exit() #关闭程序
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
print("space")
self.heroPlane.fire()
pressed_keys = pygame.key.get_pressed() #获取键盘长按事件
if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
self.heroPlane.move_left()
elif pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
self.heroPlane.move_right()
elif pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
self.heroPlane.move_up()
elif pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
self.heroPlane.move_down()
def drow(self):
self.window.blit(self.backgroundImg, (0, 0))
# 要描述一个矩形区域有四个要素:(x, y)(width, height);在游戏中,所有可见的元素 都是以 矩形区域 来描述位置的。
self.window.blit(self.heroPlane.image,(self.heroPlane.x,self.heroPlane.y)) #贴飞机图
#贴子弹图
for bullet in self.heroPlane.bullets:
self.window.blit(bullet.image,(bullet.x,bullet.y))
def update(self):
pygame.display.update()
def action(self):
for bullet in self.heroPlane.bullets:
bullet.move()
if bullet.y <= 0:
self.heroPlane.bullets.remove(bullet)
def run(self):
#一直刷新
while True:
# 贴背景图
self.drow()
# 刷新界面
self.update()
self.action()
self.event()
#英雄飞机
class HeroPlane:
def __init__(self):
self.image = pygame.image.load("images/heroplane0.png")
self.width = self.image.get_width()
self.heigh = self.image.get_height()
self.x = (SCREEN_RECT.width - self.width) / 2
self.y = SCREEN_RECT.height - self.heigh
self.bullets = [] #记录飞机发出的所有子弹
def move_left(self):
self.x -= 5
if self.x <= 0:
self.x = 0 #控制飞机不越界
def move_right(self):
self.x += 5
if self.x >= SCREEN_RECT.width - self.width:
self.x = SCREEN_RECT.width - self.width #控制飞机不越界
def move_up(self):
self.y -= 5
if self.y <= 0:
self.y = 0 #控制飞机不越界
def move_down(self):
self.y += 5
if self.y >= SCREEN_RECT.height - self.heigh:
self.y = SCREEN_RECT.height - self.heigh #控制飞机不越界
def fire(self):
bullet = Bullet()
bullet.x = self.x + self.width * 0.5 - bullet.width * 0.5
bullet.y = self.y - bullet.heigh
self.bullets.append(bullet)
#子弹类
class Bullet:
#子弹位置应该立足于英雄飞机位置
def __init__(self):
self.image = pygame.image.load("images/herobullet0.png")
self.x = -500
self.y = -500
self.width = self.image.get_width()
self.heigh = self.image.get_height()
#向上移动
def move(self):
self.y -= 5
if __name__ == '__main__':
game = Game()
game.run()