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制作网站:
ico图片转换
pyinstaller -F --icon=1234.ico run.py
打包好的下载:
链接: https://pan.baidu.com/s/1EFsyTRQ6C6S82c0Tw33OYA 提取码: qkc6
注意: 如果打包后打不开文件,就把代码中用到的资源路径改成绝对路径后在打包