第二课、实现飞机大战
一、项目介绍
项目实战:飞机大战
课程目标
- 掌握面向对象分析和开发的思想
- 能对项目进行拆分,进行模块化开发
- 了解项目开发的基本流程
- 理解并运用python的包、模块相关知识
- 理解并运用文件读写,函数式编程
- 理解简单2D游戏开发的基本思路
- 能独立开发简单的2D游戏项目
- 掌握IDE的调试技巧
项目功能模块
- 我方飞机
- 敌方小型飞机
- 敌方中型飞机
- 图片资源
- 音效资源
- 游戏历史
- 子弹
- 游戏展示结果
所需技能点
- python的基础,包括变量、字符串、分支、条件控制、循环等
- python中的运算符及运算符的优先级
- 列表、元组、字典等数据类型的使用
- 函数式编程,形参、实参、装饰器
- 面向对象分析方法,类及类的实例,类变量、实例变量、方法等
- 包与模块,标准模块和第三方模块的使用
- python多线程、多进程
- 文件读写
- pygame
技能重点说明
- python的包与模块,标准模块和第三方模块的使用
- 面型对象分析方法,类及类的实例,类变量,实例变量,方法等
- python多线程、多进程
- 文件读写
- 游戏开发入门
技能难点说明
- 对python多线程、多进程的运用
- 面向对象分析及开发方法
- 游戏开发入门及对pygame的使用
环境要求
| python及第三方模块 | 开发工具 | 操作系统 |
| python3.7 | pycharm | Windows10 |
| pygame1.9.4 |
学习建议
- 老师敲过的代码要跟着敲一遍,理解其中的意思
- 扎实python基础知识
- 多练习,多思考,多看文档
二、pygame的介绍及使用
2.1 pygame入门
章节概要
- 介绍及安装
- 介绍:2D游戏开发工具包
- 安装:
- >>>pip install pygame
- import pygame
- 帮助文档
- https://www.pygame.org/docs/
- 文字及颜色
- 游戏中的图片
- 游戏音效
- 动画切换
- 精灵及精灵组
- 碰撞检测
Hello World
- 引入相关包:import pygame,sys等
- 初始化:pygame.init()
- 得到窗口pygame.Surface对象:pygame.display.set_mode((400,300))
- 游戏主循环
- 处理游戏事件
- 更新游戏状态
- 在屏幕上绘制
- 游戏事件
- for event in pygame.event.get():
- #退出游戏事件
- if event.type == QUIT:
- pygame.quit()
- sys.exit()
- for event in pygame.event.get():
1 # 1.引入相关的包 2 import sys, pygame 3 4 # 2.pygame进行初始化 5 pygame.init() 6 7 size = width, height = 320, 240 8 speed = [2, 2] 9 black = 0, 0, 0 10 11 # 3.得到屏幕对象Surface 12 screen = pygame.display.set_mode(size) 13 14 ball = pygame.image.load("intro_ball.gif") 15 ballrect = ball.get_rect() 16 17 # 4.游戏主循环 18 while 1: 19 20 # 处理游戏的事件 21 for event in pygame.event.get(): 22 if event.type == pygame.QUIT: sys.exit() 23 24 # 更新游戏的状态 25 ballrect = ballrect.move(speed) 26 if ballrect.left < 0 or ballrect.right > width: 27 speed[0] = -speed[0] 28 if ballrect.top < 0 or ballrect.bottom > height: 29 speed[1] = -speed[1] 30 31 # 在屏幕上进行绘制 32 screen.fill(black) 33 screen.blit(ball, ballrect) 34 pygame.display.flip()
2.2 pygame中的图片、颜色和形状
1.游戏中的图片
- 图片加载
bg=pygame.image.load('bg.png')
- 在屏幕上绘制
screen.blit(bg,bg.get_rect())
2.像素中的坐标
3.游戏中的颜色
- 使用RGB表示
R(red):红色 G(green):绿色 B(blue):蓝色
取值范围:0-255
- RGBA表示透明色
A(alpha);0-255
4.游戏中的形状
- 线
pygame.draw.line(screen,RED,(1,1),(50,50),6)
- 矩形
pygame.draw.rect(screen,RED,(10,20,200,300),10)
- 圆
pygame.draw.circle(screen,RED,(100,100),50,5)
1 import sys, pygame 2 3 # 初始化pygame 4 pygame.init() 5 6 # 屏幕对象 7 screen = pygame.display.set_mode((500, 500)) 8 9 #加载图片 10 ball = pygame.image.load('intro_ball.gif') 11 12 red = pygame.Color(255,0,0) 13 14 # 游戏主循环 15 while True: 16 # 处理事件 17 for event in pygame.event.get(): 18 if event.type == pygame.QUIT: 19 pygame.quit() 20 sys.exit() 21 # 更新状态 22 23 # 画线 24 pygame.draw.line(screen,red,(10,10),(200,200),10) 25 26 # 画矩形 27 pygame.draw.rect(screen,red,(10,10,200,200),5) 28 29 # 画圆 30 pygame.draw.circle(screen,red,(100,100),50,5) 31 32 # 绘制 33 screen.blit(ball,(100,100)) 34 pygame.display.flip()
2.3 pygame中的文字
1.游戏中的文字
- 加载字体
font = pygame.font.SysFont('华文楷书',32)
- 得到Surface对象
text = font.render('得分:0',True,RED,BLUE)
- 在屏幕上绘制
screen.blit(text,text.get_rect())
2.游戏中的音效
- 加载背景音乐
pygame.mixer.music.load('./bg_music.mp3')
- 无限循环播放
pygame.mixer.music.play(-1)
1 import pygame,sys 2 3 pygame.init() 4 5 6 screen = pygame.display.set_mode((500,500)) 7 8 9 # 加载字体['arial', 'arialblack', 'bahnschrift', 'calibri', 'cambriacambriamath', 'cambria', 'candara', 'comicsansms', 'consolas', 'constantia', 'corbel', 'couriernew', 'ebrima', 'franklingothicmedium', 'gabriola', 'gadugi', 'georgia', 'impact', 'inkfree', 'javanesetext', 'leelawadeeui', 'leelawadeeuisemilight', 'lucidaconsole', 'lucidasans', 'malgungothic', 'malgungothicsemilight', 'microsofthimalaya', 'microsoftjhengheimicrosoftjhengheiui', 'microsoftjhengheimicrosoftjhengheiuibold', 'microsoftjhengheimicrosoftjhengheiuilight', 'microsoftnewtailue', 'microsoftphagspa', 'microsoftsansserif', 'microsofttaile', 'microsoftyaheimicrosoftyaheiui', 'microsoftyaheimicrosoftyaheiuibold', 'microsoftyaheimicrosoftyaheiuilight', 'microsoftyibaiti', 'mingliuextbpmingliuextbmingliuhkscsextb', 'mongolianbaiti', 'msgothicmsuigothicmspgothic', 'mvboli', 'myanmartext', 'nirmalaui', 'nirmalauisemilight', 'palatinolinotype', 'segoemdl2assets', 'segoeprint', 'segoescript', 'segoeui', 'segoeuiblack', 'segoeuiemoji', 'segoeuihistoric', 'segoeuisemibold', 'segoeuisemilight', 'segoeuisymbol', 'simsunnsimsun', 'simsunextb', 'sitkasmallsitkatextsitkasubheadingsitkaheadingsitkadisplaysitkabanner', 'sitkasmallsitkatextboldsitkasubheadingboldsitkaheadingboldsitkadisplayboldsitkabannerbold', 'sitkasmallsitkatextbolditalicsitkasubheadingbolditalicsitkaheadingbolditalicsitkadisplaybolditalicsitkabannerbolditalic', 'sitkasmallsitkatextitalicsitkasubheadingitalicsitkaheadingitalicsitkadisplayitalicsitkabanneritalic', 'sylfaen', 'symbol', 'tahoma', 'timesnewroman', 'trebuchetms', 'verdana', 'webdings', 'wingdings', 'yugothicyugothicuisemiboldyugothicuibold', 'yugothicyugothicuilight', 'yugothicmediumyugothicuiregular', 'yugothicregularyugothicuisemilight', 'dengxian', 'fangsong', 'kaiti', 'simhei', 'holomdl2assets'] 10 fonts = pygame.font.get_fonts() 11 print(fonts) 12 13 red = pygame.Color(255,0,0) 14 15 # 加粗 斜体 16 # 方式一:使用系统默认的字体来进行加载 17 #font = pygame.font.SysFont('fangsong',40,True,True) 18 # 方式二:自己准备好一个字体文件ttf,放到咱们的项目里面 19 font = pygame.font.Font('simfang.ttf',40) 20 # 文字对象 21 text = font.render('得分',True,red) 22 23 # 加载音乐 24 bg_music = pygame.mixer.music.load('game_music.mp3') 25 # 循环播放背景音乐 26 pygame.mixer.music.play(-1) 27 # 设置音量大小(0-1),值越小,音量越小 28 pygame.mixer.music.set_volume(0.5) 29 30 while True: 31 for event in pygame.event.get(): 32 if event.type == pygame.QUIT: 33 pygame.quit() 34 sys.exit() 35 36 screen.blit(text, (20,20)) 37 pygame.display.flip()
2.4 pygame动画切换及音效
动画切换
- 帧速率
用FPS或帧/秒来度量
- 通过pygame.time.Clock()中的tick(num)控制
- 算法切换
精灵和精灵组
- 什么是精灵
精灵可以认为是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame绘制函数绘制的图像,也可以是原来就有的图像文件。
- 什么是精灵组
精灵组是一个容器,用于管理组内精灵的绘制和更新。
1 import pygame,sys 2 3 pygame.init() 4 5 6 screen = pygame.display.set_mode((500,500)) 7 8 # 加载图片 9 image = pygame.image.load('hero1.png') 10 image2 = pygame.image.load('hero2.png') 11 12 clock = pygame.time.Clock() 13 14 counter = 0 15 16 while True: 17 counter =+ 1 18 print(111) 19 for event in pygame.event.get(): 20 if event.type == pygame.QUIT: 21 pygame.quit() 22 sys.exit() 23 24 clock.tick(30) 25 26 # 绘制白色屏幕 27 screen.fill(pygame.Color(255,255,255)) 28 29 # 绘制图片 30 if counter % 5 == 0: 31 screen.blit(image, (20,20)) 32 else: 33 screen.blit(image2, (20, 20)) 34 35 pygame.display.flip()
2.5 pygame自定义精灵及碰撞检测
碰撞检测
- 两个精灵之间的矩形检测
pygame.sprite.collide_rect(sprite_1,sprite_2)
pygame.sprite.collide_rect_ratio(0.5)(sprite_1,sprite_2)
(未完待续)
浙公网安备 33010602011771号