Pygame游戏框架
Pygame
Pygame是一套跨平台的Python模块,专为编写游戏而设计。
它包括计算机图形和声音库,旨在与Python编程语言一起使用。
展示窗体
引入pygame模块
import pygame
初始化游戏
pygame.init()
设置窗体大小
pygame.display.set_mode((400, 400))
展示窗体-程序执行流程
展示窗体
图形化界面程序都是阻塞式的
通常阻塞的实现策略就是死循环
事件捕获之窗体关闭
窗体关闭
pygame.event.get()提供事件的清单
event.type指明了事件的类型
pygame.locals模块提供了常量
QUIT就是窗体关闭事件
01.pygame窗口创建.py
-
# 导入游戏引擎
-
import pygame
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
pygame.display.set_mode(size=(
800,
800))
02.pygame窗口一直展示.py
-
# 导入游戏引擎
-
import pygame
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
pygame.display.set_mode(size=(
800,
800))
-
# 避免程序结束
-
while
True:
-
pass
03.游戏停止.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.
event.
get()
-
# if len(eventList)>0:
-
# 有事件发生
-
# 判断是否是退出事件
-
# if len(eventList)>0:
-
# print(eventList)
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
04.窗口标题和图标.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 设置窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标
-
icon = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(icon)
-
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
05.展示图片到窗口.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 设置窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标
-
icon = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(icon)
-
-
# 加载飞机图片
-
heroImg = pygame.image.load(
'img/hero2.png')
-
-
# 避免程序结束
-
while
True:
-
# 展示飞机图片
-
window.blit(heroImg,(
40,
40))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
06.键盘事件处理.py
06.1 键盘按压一次触发一次
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
-
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
# 退出事件类型
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
print(
'向左')
-
elif
event.
key==K_d:
-
print(
'向右')
-
elif
event.
key==K_w:
-
print(
'向前')
-
elif
event.
key==K_s:
-
print(
'向后')
-
elif
event.
key==K_RETURN:
-
print(
'点击了enter键')
-
-
06.2 键盘一直按压,就一直触发
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
-
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 退出事件类型
-
if event.type==QUIT:
# 退出事件类型
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.exit()
-
-
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
# 键盘一直按压,就一直触发
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
07.展示图片到窗口.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 设置窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标
-
icon = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(icon)
-
-
# 加载飞机图片
-
heroImg = pygame.image.load(
'img/hero2.png')
-
-
heroX =
200
-
heroY =
200
-
-
# 避免程序结束
-
while
True:
-
# 清空窗口,通过背景颜色覆盖
-
# R G B
-
window.fill((
0,
0,
0))
-
-
# 展示飞机图片
-
window.blit(heroImg,(heroX,heroY))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
heroX-=
10
-
elif
event.
key==K_d:
-
heroX+=
10
-
elif
event.
key==K_w:
-
heroY-=
10
-
elif
event.
key==K_s:
-
heroY+=
10
08.文字展示.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 加载字体
-
font = pygame.font.Font(
'font/happy.ttf',50)
-
# 渲染字体
-
fontSurface = font.render(
'游戏开始',True,(255,255,255))
-
-
# 避免程序结束
-
while
True:
-
# 显示字体控件
-
window.blit(fontSurface,(
200,
200))
-
# 刷新(只需要执行一次)
-
pygame.display.flip()
-
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
09.背景音效播放.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 加载背景音效
-
pygame.mixer.music.load(
'snd/bomb.wav')
-
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
# 退出事件类型
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
# 播放背景音效
-
pygame.mixer.music.play(loops=
-1)
10.特殊音效处理.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
-
# 加载特殊音效
-
sn = pygame.mixer.Sound(
'snd/bomb.wav')
-
-
# 避免程序结束
-
while
True:
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
# 退出事件类型
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
sn.
stop()
-
elif
event.
key==K_s:
-
sn.play(loops=
0)
-
11.FPS计算.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
import time
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
# 设置窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标
-
icon = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(icon)
-
-
# 加载飞机图片
-
heroImg = pygame.image.load(
'img/hero2.png')
-
-
heroX =
200
-
heroY =
200
-
-
# 避免程序结束
-
while
True:
-
# 开始时间
-
startTime = time.time()
-
-
# 清空窗口,通过背景颜色覆盖
-
# R G B
-
window.fill((
0,
0,
0))
-
-
# 展示飞机图片
-
window.blit(heroImg,(heroX,heroY))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
heroX-=
10
-
elif
event.
key==K_d:
-
heroX+=
10
-
elif
event.
key==K_w:
-
heroY-=
10
-
elif
event.
key==K_s:
-
heroY+=
10
-
# 降低fps
-
time.sleep(
0.008)
-
# 结束时间
-
endTime = time.time()
-
# 这一次渲染时间
-
renderTime = endTime-startTime
-
try:
-
# 求FPS
-
fps = int(
1/renderTime)
-
print(fps)
-
except:
-
pass
12.Surface.py
-
# 导入游戏引擎
-
import pygame
-
from pygame.locals import *
-
import sys
-
-
# 初始化pygame
-
pygame.init()
-
-
# 创建窗口
-
# size 窗口大小 宽度和高度
-
window = pygame.display.set_mode(size=(
800,
800))
-
-
print(window.get_width(),window.get_height())
-
# 设置窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标
-
icon = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(icon)
-
-
# 加载飞机图片
-
heroImg = pygame.image.load(
'img/hero2.png')
-
-
# 获取图片大小
-
# print(heroImg.get_width(),heroImg.get_height())
-
print(heroImg.get_rect())
-
-
heroX =
200
-
heroY =
200
-
-
# 避免程序结束
-
while
True:
-
# 清空窗口,通过背景颜色覆盖
-
# R G B
-
window.fill((
0,
0,
0))
-
-
# 展示飞机图片
-
window.blit(heroImg,(heroX,heroY))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理事件
-
eventList = pygame.
event.
get()
-
for
event
in eventList:
-
# 退出事件类型
-
if
event.type==QUIT:
-
# 退出界面
-
pygame.display.quit()
-
# sys退出
-
sys.
exit()
-
elif
event.type==KEYDOWN:
# 键盘按下的事件
-
# 判断按下的是哪个键
-
if
event.
key==K_a:
-
heroX-=
10
-
elif
event.
key==K_d:
-
heroX+=
10
-
elif
event.
key==K_w:
-
heroY-=
10
-
elif
event.
key==K_s:
-
heroY+=
10
飞机大战
01.创建飞机大战窗口
-
import pygame
-
-
# 初始化
-
pygame.init()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(
600,
800))
-
-
# 保证窗口不关闭
-
while
True:
-
pass
02.窗口处理:
-
import pygame
-
from pygame.locals
import *
-
import sys
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
-
# 初始化
-
pygame.init()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(
600,
800))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
-
# 保证窗口不关闭
-
while
True:
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type==QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
03.展示背景
-
import pygame
-
from pygame.locals
import *
-
import sys
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth,bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface,(
0,
0))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type==QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
04.入口函数处理
-
import pygame
-
from pygame.locals
import *
-
import sys
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth,bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface,(
0,
0))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type==QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
-
if __name__ ==
'__main__':
-
start()
05.添加我方飞机
-
import pygame
-
from pygame.locals
import *
-
import sys
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth,bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 加载我方飞机图片
-
heroSurface = pygame.image.load(
'img/hero2.png')
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface,(
0,
0))
-
# 展示我方飞机
-
window.blit(heroSurface,(
200,
600))
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type==QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
-
if __name__ ==
'__main__':
-
start()
06.飞机类抽取
-
import pygame
-
from pygame.locals
import *
-
import sys
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
-
"""------------------ 我方飞机类 ------------------"""
-
class Plane:
-
def __init__(self,x,y,window):
-
# 坐标
-
self.x = x
-
self.y = y
-
# 被展示到的窗口
-
self.window = window
-
# 飞机展示的Surface
-
self.surface = pygame.image.load(
'img/hero2.png')
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.window.blit(self.surface, (self.x, self.y))
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth,bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600,window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface,(
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type==QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
-
if __name__ ==
'__main__':
-
start()
07.飞机的移动
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -=
1
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x +=
1
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -=
1
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y +=
1
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
# 按下事件
-
if event.key == K_a:
-
plane.moveLeft()
-
elif event.key == K_d:
-
plane.moveRight()
-
elif event.key == K_w:
-
plane.moveUp()
-
elif event.key == K_s:
-
plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
08.飞机的移动细节处理
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 运动速度
-
self.speed =
1
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
09.子弹类的创建
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self,x,y,window):
-
# 展示的坐标
-
self.x = x
-
self.y = y
-
# 需要展示的窗口
-
self.window = window
-
# 展示的控件
-
self.surface = pygame.image.load(
'img/bullet_10.png')
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.window.blit(self.surface,(self.x,self.y))
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 运动速度
-
self.speed =
1
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
10.发射子弹
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self,x,y,window):
-
# 展示的坐标
-
self.x = x
-
self.y = y
-
# 需要展示的窗口
-
self.window = window
-
# 展示的控件
-
self.surface = pygame.image.load(
'img/bullet_10.png')
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.window.blit(self.surface,(self.x,self.y))
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 把所有发射的子弹渲染出来
-
for bullet
in self.__bullets:
-
# 把子弹展示出来
-
bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 创建子弹对象
-
bullet = Bullet(self.__x,self.__y,self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type==KEYDOWN:
-
if event.key==K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
11.子弹位置确定
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self,px,py,pw,window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px+(pw-self.width)/
2
-
self.__y = py-self.height/
2
-
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface,(self.__x,self.__y))
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 把所有发射的子弹渲染出来
-
for bullet
in self.__bullets:
-
# 把子弹展示出来
-
bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x,self.__y,self.width,self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type==KEYDOWN:
-
if event.key==K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
12.子弹的移动
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self,px,py,pw,window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px+(pw-self.width)/
2
-
self.__y = py-self.height/
2
-
# 自动运行速度
-
self.__speed =
2
-
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface,(self.__x,self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y-=self.__speed
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 把所有发射的子弹渲染出来
-
for bullet
in self.__bullets:
-
# 把子弹展示出来
-
bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x,self.__y,self.width,self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type==KEYDOWN:
-
if event.key==K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
13.子弹的越界处理
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self,px,py,pw,window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px+(pw-self.width)/
2
-
self.__y = py-self.height/
2
-
# 自动运行速度
-
self.__speed =
2
-
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface,(self.__x,self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y-=self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y<=-self.height
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 先销毁越界子弹
-
for bullet
in self.__bullets:
-
# 如果子弹需要销毁
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
-
# 把所有发射的子弹渲染出来
-
for bullet
in self.__bullets:
-
# 把子弹展示出来
-
bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x,self.__y,self.width,self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
-
-
def start():
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type==KEYDOWN:
-
if event.key==K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
14.子弹的越界处理错误解决
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 子弹类 ------------------"""
-
-
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
-
def start():
-
global bgWidth, bgHeight
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
15.提取敌方飞机类
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_1.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
-
def start():
-
global bgWidth, bgHeight
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示飞机
-
plane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
16.展示敌方飞机以及敌方飞机自动移动
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_1.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 自动移动
-
self.__speed =
1
-
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y += self.__speed
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
# 是否和敌方飞机发生了碰撞
-
# TODO 是否发生碰撞
-
-
# 展示
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
-
def start():
-
global bgWidth, bgHeight
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 创建敌方飞机类
-
enemyPlane = EnemyPlane(
100,
0,window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示我方飞机
-
plane.display()
-
# 展示敌方飞机
-
enemyPlane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
17.子弹和敌方飞机碰撞检测
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_1.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 自动移动
-
self.__speed =
1
-
-
def getX(self):
-
return self.__x
-
-
def getY(self):
-
return self.__y
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y += self.__speed
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
def hasShootEnemey(self,enemy):
-
'''
-
是否已经射击到敌方飞机
-
:param enemy: EnemyPlane
-
:return:
-
'''
-
# 子弹矩形
-
bulletRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
-
return bulletRect.colliderect(enemyRect)
-
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
# 是否和敌方飞机发生了碰撞
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
# bullet和enemy是否发生了碰撞
-
if bullet.hasShootEnemey(enemyPlane):
-
# 子弹销毁
-
self.__bullets.remove(bullet)
-
del bullet
-
# 敌方飞机打掉
-
# 敌方飞机复用
-
-
-
# 展示
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
# 敌方飞机
-
enemyPlane =
None
-
-
def start():
-
global bgWidth, bgHeight,enemyPlane
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 创建敌方飞机类
-
enemyPlane = EnemyPlane(
100,
0,window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示我方飞机
-
plane.display()
-
# 展示敌方飞机
-
enemyPlane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
18.敌方飞机复用
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
import random
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, window):
-
# 被展示到的窗口
-
self.__window = window
-
# 自动移动
-
self.__speed =
1
-
# 重置
-
self.__reset()
-
-
def getX(self):
-
return self.__x
-
-
def getY(self):
-
return self.__y
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y += self.__speed
-
# 如果越界 需要重置
-
if self.__y>bgHeight-self.height:
-
self.__reset()
-
-
def reUse(self):
-
'''
-
飞机被打死后者飞机越界 需要重新复用飞机
-
:return:
-
'''
-
self.__reset()
-
-
def __reset(self):
-
'''
-
重置
-
:return:
-
'''
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_{}.png'.format(random.randint(
1,
7)))
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 坐标
-
self.__x = random.randint(
0,bgWidth-self.width)
-
self.__y = -self.height
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
def hasShootEnemey(self,enemy):
-
'''
-
是否已经射击到敌方飞机
-
:param enemy: EnemyPlane
-
:return:
-
'''
-
# 子弹矩形
-
bulletRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
-
return bulletRect.colliderect(enemyRect)
-
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
print(len(self.__bullets))
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
# 是否和敌方飞机发生了碰撞
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
# bullet和enemy是否发生了碰撞
-
if bullet.hasShootEnemey(enemyPlane):
-
# 子弹销毁
-
self.__bullets.remove(bullet)
-
del bullet
-
# 敌方飞机打掉
-
# 敌方飞机复用
-
enemyPlane.reUse()
-
-
-
# 展示
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
# 敌方飞机
-
enemyPlane =
None
-
-
def start():
-
global bgWidth, bgHeight,enemyPlane
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 创建敌方飞机类
-
enemyPlane = EnemyPlane(window)
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示我方飞机
-
plane.display()
-
# 展示敌方飞机
-
enemyPlane.display()
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
批量产生敌方飞机:
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
import random
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, window):
-
# 被展示到的窗口
-
self.__window = window
-
# 自动移动
-
self.__speed =
1
-
# 重置
-
self.__reset()
-
-
def getX(self):
-
return self.__x
-
-
def getY(self):
-
return self.__y
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y += self.__speed
-
# 如果越界 需要重置
-
if self.__y>bgHeight-self.height:
-
self.__reset()
-
-
def reUse(self):
-
'''
-
飞机被打死后者飞机越界 需要重新复用飞机
-
:return:
-
'''
-
self.__reset()
-
-
def __reset(self):
-
'''
-
重置
-
:return:
-
'''
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_{}.png'.format(random.randint(
1,
7)))
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 坐标
-
self.__x = random.randint(
0,bgWidth-self.width)
-
self.__y = -random.randint(
3*self.height,
10*self.height)
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
def hasShootEnemey(self,enemy):
-
'''
-
是否已经射击到敌方飞机
-
:param enemy: EnemyPlane
-
:return:
-
'''
-
# 子弹矩形
-
bulletRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
-
return bulletRect.colliderect(enemyRect)
-
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
# 血量值
-
self.blood =
5
-
-
def hasCollision(self,enemy):
-
'''
-
是否和敌方飞机发生了碰撞
-
:param enemy:
-
:return:
-
'''
-
# 我方飞机矩形
-
myRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
return myRect.colliderect(enemyRect)
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
-
# 检测我方飞机和敌方飞机是否发生了碰撞
-
for enemy
in enemyList:
-
# 判断是否发生了碰撞
-
if self.hasCollision(enemy):
-
# 我方飞机掉血
-
self.blood -=
1
-
print(
'血量',self.blood)
-
# 敌方飞机重复使用
-
enemy.reUse()
-
-
# 子弹是否和敌方飞机发生了碰撞
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
for enemy
in enemyList:
-
# bullet和enemy是否发生了碰撞
-
if bullet.hasShootEnemey(enemy):
-
# 子弹销毁
-
self.__bullets.remove(bullet)
-
del bullet
-
# 敌方飞机打掉
-
# 敌方飞机复用
-
enemy.reUse()
-
# 退出里层循环
-
break
-
-
-
-
-
# 展示
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
# 敌方飞机
-
enemyList = []
-
-
def start():
-
global bgWidth, bgHeight,enemyPlane
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 创建5个敌方飞机对象
-
for index
in range(
0,
5):
-
enemyList.append(EnemyPlane(window))
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示我方飞机
-
plane.display()
-
# 展示敌方飞机
-
for enemy
in enemyList:
-
enemy.display()
-
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
20.游戏结束
-
import pygame
-
from pygame.locals
import *
-
import sys
-
-
"""
-
1.标题和图标
-
2.退出事件
-
"""
-
"""
-
飞机属性: x,y window
-
飞机行为:被展示行为display
-
"""
-
import random
-
"""------------------ 敌方飞机类 ------------------"""
-
class EnemyPlane:
-
def __init__(self, window):
-
# 被展示到的窗口
-
self.__window = window
-
# 自动移动
-
self.__speed =
1
-
# 重置
-
self.__reset()
-
-
def getX(self):
-
return self.__x
-
-
def getY(self):
-
return self.__y
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y += self.__speed
-
# 如果越界 需要重置
-
if self.__y>bgHeight-self.height:
-
self.__reset()
-
-
def reUse(self):
-
'''
-
飞机被打死后者飞机越界 需要重新复用飞机
-
:return:
-
'''
-
self.__reset()
-
-
def __reset(self):
-
'''
-
重置
-
:return:
-
'''
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/img-plane_{}.png'.format(random.randint(
1,
7)))
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 坐标
-
self.__x = random.randint(
0,bgWidth-self.width)
-
self.__y = -random.randint(
3*self.height,
10*self.height)
-
-
-
"""------------------ 子弹类 ------------------"""
-
class Bullet:
-
def __init__(self, px, py, pw, window):
-
# 需要展示的窗口
-
self.__window = window
-
# 展示的控件
-
self.__surface = pygame.image.load(
'img/bullet_10.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
self.__x = px + (pw - self.width) /
2
-
self.__y = py - self.height /
2
-
# 自动运行速度
-
self.__speed =
2
-
-
def display(self):
-
'''
-
展示控件
-
:return:
-
'''
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
# 自动移动
-
self.autoMove()
-
-
def autoMove(self):
-
'''
-
自动移动
-
:return:
-
'''
-
self.__y -= self.__speed
-
-
def needDestroy(self):
-
'''
-
是否需要被销毁
-
:return:
-
'''
-
return self.__y <= -self.height
-
-
def hasShootEnemey(self,enemy):
-
'''
-
是否已经射击到敌方飞机
-
:param enemy: EnemyPlane
-
:return:
-
'''
-
# 子弹矩形
-
bulletRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
-
return bulletRect.colliderect(enemyRect)
-
-
-
-
"""------------------ 我方飞机类 ------------------"""
-
-
-
class Plane:
-
def __init__(self, x, y, window):
-
# 坐标
-
self.__x = x
-
self.__y = y
-
# 被展示到的窗口
-
self.__window = window
-
# 飞机展示的Surface
-
self.__surface = pygame.image.load(
'img/hero2.png')
-
# 控件宽度和高度
-
self.width = self.__surface.get_width()
-
self.height = self.__surface.get_height()
-
# 运动速度
-
self.speed =
1
-
# 发射的子弹容器
-
self.__bullets = []
-
# 血量值
-
self.blood =
5
-
-
def hasCollision(self,enemy):
-
'''
-
是否和敌方飞机发生了碰撞
-
:param enemy:
-
:return:
-
'''
-
# 我方飞机矩形
-
myRect = pygame.Rect(self.__x,self.__y,self.width,self.height)
-
# 敌方飞机矩形
-
enemyRect = pygame.Rect(enemy.getX(),enemy.getY(),enemy.width,enemy.height)
-
return myRect.colliderect(enemyRect)
-
-
def display(self):
-
'''
-
被展示
-
:return:
-
'''
-
# 展示我方飞机
-
self.__window.blit(self.__surface, (self.__x, self.__y))
-
-
# 在循环遍历的时候做了移除元素的操作
-
# 先销毁越界子弹
-
# for bullet in self.__bullets:
-
# # 如果子弹需要销毁
-
# if bullet.needDestroy():
-
# # 移除子弹对象
-
# self.__bullets.remove(bullet)
-
# # 内存销毁对象
-
# del bullet
-
-
# 检测我方飞机和敌方飞机是否发生了碰撞
-
for enemy
in enemyList:
-
# 判断是否发生了碰撞
-
if self.hasCollision(enemy):
-
# 我方飞机掉血
-
self.blood -=
1
-
print(
'血量',self.blood)
-
# 敌方飞机重复使用
-
enemy.reUse()
-
-
# 子弹是否和敌方飞机发生了碰撞
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
for enemy
in enemyList:
-
# bullet和enemy是否发生了碰撞
-
if bullet.hasShootEnemey(enemy):
-
# 子弹销毁
-
self.__bullets.remove(bullet)
-
del bullet
-
# 敌方飞机打掉
-
# 敌方飞机复用
-
enemy.reUse()
-
# 退出里层循环
-
break
-
-
-
-
-
# 展示
-
for index
in range(len(self.__bullets) -
1,
-1,
-1):
-
bullet = self.__bullets[index]
-
if bullet.needDestroy():
-
# 移除子弹对象
-
self.__bullets.remove(bullet)
-
# 内存销毁对象
-
del bullet
-
else:
-
# 把子弹展示出来
-
bullet.display()
-
-
# # 把所有发射的子弹渲染出来
-
# for bullet in self.__bullets:
-
# # 把子弹展示出来
-
# bullet.display()
-
-
def fire(self):
-
'''
-
发射子弹
-
:return:
-
'''
-
# 子弹的x和y
-
# bx = px + (pw - bw) / 2
-
# by = py - bh / 2
-
# 创建子弹对象
-
bullet = Bullet(self.__x, self.__y, self.width, self.__window)
-
# 子弹对象添加到子弹列表中
-
self.__bullets.append(bullet)
-
-
def moveLeft(self):
-
'''
-
向左移动
-
:return:
-
'''
-
self.__x -= self.speed
-
# 越界处理
-
if self.__x <
0:
-
self.__x =
0
-
-
def moveRight(self):
-
'''
-
向右移动
-
:return:
-
'''
-
self.__x += self.speed
-
# 越界处理
-
if self.__x > bgWidth - self.width:
-
self.__x = bgWidth - self.width
-
-
def moveUp(self):
-
'''
-
向上移动
-
:return:
-
'''
-
self.__y -= self.speed
-
# 越界处理
-
if self.__y <
0:
-
self.__y =
0
-
-
def moveDown(self):
-
'''
-
向下移动
-
:return:
-
'''
-
self.__y += self.speed
-
# 越界处理
-
if self.__y > bgHeight - self.height:
-
self.__y = bgHeight - self.height
-
-
-
# 全局变量
-
bgWidth =
0
-
bgHeight =
0
-
-
# 敌方飞机
-
enemyList = []
-
-
def start():
-
global bgWidth, bgHeight,enemyPlane
-
# 初始化
-
pygame.init()
-
-
# 加载背景图片
-
bgSurface = pygame.image.load(
'img/img_bg_level_1.jpg')
-
# 获取背景图片的大小
-
bgWidth = bgSurface.get_width()
-
bgHeight = bgSurface.get_height()
-
-
# 创建游戏窗口
-
window = pygame.display.set_mode(size=(bgWidth, bgHeight))
-
# 窗口标题
-
pygame.display.set_caption(
'飞机大战')
-
-
# 加载图标图片
-
iconSurface = pygame.image.load(
'img/app.ico')
-
# 设置图标
-
pygame.display.set_icon(iconSurface)
-
-
# 创建飞机类
-
plane = Plane(
200,
600, window)
-
-
# 创建5个敌方飞机对象
-
for index
in range(
0,
5):
-
enemyList.append(EnemyPlane(window))
-
-
# 游戏结束文字
-
font = pygame.font.Font(
'font/happy.ttf',
50)
-
gameOverSurface = font.render(
'游戏结束',
True,(
255,
255,
255))
-
-
# 保证窗口不关闭
-
while
True:
-
# 展示背景
-
window.blit(bgSurface, (
0,
0))
-
# 展示我方飞机
-
plane.display()
-
-
# 展示敌方飞机
-
for enemy
in enemyList:
-
enemy.display()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
# 检测是否停止
-
if plane.blood<=
0:
-
# 游戏停止
-
window.blit(gameOverSurface,((bgWidth-gameOverSurface.get_width())/
2,(bgHeight-gameOverSurface.get_height())/
2))
-
# 刷新
-
pygame.display.flip()
-
continue
-
-
-
# 敌方飞机自动移动
-
for enemy
in enemyList:
-
enemy.autoMove()
-
-
# 刷新
-
pygame.display.flip()
-
-
# 处理窗口关闭
-
eventList = pygame.event.get()
-
for event
in eventList:
-
# 判断是否是退出类型
-
if event.type == QUIT:
-
# 退出游戏
-
pygame.quit()
-
# 退出程序
-
sys.exit()
-
elif event.type == KEYDOWN:
-
if event.key == K_RETURN:
-
# 发射子弹
-
plane.fire()
-
-
# 处理按压事件
-
# 返回所有键对应的状态 0:没有按压 1:有按压
-
states = pygame.key.get_pressed()
-
# 有按压事件
-
if
1
in states:
-
# 是否是关心的a d s w键
-
if states[K_a]:
# 0 1
-
plane.moveLeft()
-
elif states[K_d]:
-
plane.moveRight()
-
elif states[K_w]:
-
plane.moveUp()
-
elif states[K_s]:
-
plane.moveDown()
-
# elif event.type == KEYDOWN: # 按下事件 一次按下只能执行一次
-
# if event.key == K_a:
-
# plane.moveLeft()
-
# elif event.key == K_d:
-
# plane.moveRight()
-
# elif event.key == K_w:
-
# plane.moveUp()
-
# elif event.key == K_s:
-
# plane.moveDown()
-
-
-
if __name__ ==
'__main__':
-
start()
代码下载:
链接: https://pan.baidu.com/s/1yScaUX3Aumos_iMrI4ZKjw 提取码: xwct
注意:
打包时把所有的图片和文字路径改成绝对路径:
程序打包
PyInstaller
将Python应用打包成可执行文件
安装和使用
安装:
pip install pyinstaller
打包命令:
pyinstaller-F xx.py -w
最后说下-p这个参数
-p:添加搜索路径
这个参数是告诉打包工具到哪去搜索依耐性文件,此次我们没有使用-p参数是因为工具默认为到python安装路径下的Lib 以及 Lib文件夹下的site-packages。
Lib文件夹下是python自带的一些库,site-packages为pip安装的库。此次的第三方库我都是通过pip安装的,所以不用加-p参数。如果使用了第三方库并且不再这两个路径下的需要加上:-p 库地址,告诉打包工具你使用的库在哪
3.更改exe文件的图标
自定义打包出来的exe文件图标,需要使用-i参数,同时需要准备一个ico格式的图片,贴上一个在线ico制作网站:
pyinstaller -F --icon=1234.ico run.py
打包好的下载:
链接: https://pan.baidu.com/s/1EFsyTRQ6C6S82c0Tw33OYA 提取码: qkc6
注意: 如果打包后打不开文件,就把代码中用到的资源路径改成绝对路径后在打包
转载:https://blog.csdn.net/qq_15204179/article/details/104595193