目录
第一节 pygame基础
一、pygame框架
1、基本框架:
import pygame (导库)
pygame.init() (初始化)
screen = pygame.display.set_mode((800,600)) (设置大小)
pygame.display.set_caption("可多的王国") (设置窗口名称)
while True: (主循环)
king.quit() (退出)
screen.fill((255,255,255)) (设置颜色)
pygame.display.update() (更新画布)
2、导库
格式:import pygame,king
import表示导入、pygame表示游戏库、king是国王库
pygame是游戏库,会使用它做很多小游戏
king是国王使用的库
备注:库名之间用逗号隔开,当然也可以继续添加其他的库
3、初始化
格式:pygame.init()
打开游戏都有初始化的过程,相当于告诉电脑:"我要用pygame制作游戏啦!"
4、设置画布大小
格式:screen = pygame.display.set_mode((800,600))
第一个参数(800, 600)表示画布的大小,800表示画布的宽,600表示画布的高。注意是放在括号里。
变量screen代表设置的画布
注意是双扩号
画布大小的单位是像素
5、设置窗口名称
格式:pygame.display.set_caption("可多的王国")
注意:括号内是字符串,字符串需要使用双引号
6、填充颜色
格式:screen.fill((255,255,255))
这里使用的是变量screen,而不是pygame库
(255,255,255)是RGB颜色值,需要使用扩号
RGB颜色结构:
(num1,num2,num3)
num1是0-255的整数,代表R(red-红色),数字越大,颜色中红色成分越多
num2是0-255的整数,代表G(green-绿色),数字越大,颜色中绿色成分越多
num3是0-255的整数,代表B(blue-蓝色),数字越大,颜色中蓝色成分越多
7、更新画布
格式:pygame.display.update()
我们需要让画布一直显示,所以需要放进循环里
二、添加素材
1、添加图片
添加图片两步走:
1)加载图片 image = pygame.image.load("图片名.图片格式")
2)绘制图片 screen.blit(image,(100, 100))
这里的screen是pygame的画布,使用screen.blit()方法就可以将画布绘制到画布上,其中image是加载的图片,(100,100)是绘制的位置。
pygame的坐标系是以左上角为原点,坐标为(0,0)。
横轴(X轴)向右坐标依次变大,纵轴(Y轴)向下坐标依次变大。
坐标系图:
2、pygame加载图片
格式:变量名=pygame.image.load("图片名称.图片格式")
图片名称需要用字符串的形式,而且需要带上图片的格式
3、pygame绘制图片
格式:画布名称.blit(绘制对象,(坐标x,坐标y))
注意:坐标需要用括号括起来
绘制图片语句要放在程序主循环pygame.display.update()之前
绘制多张图片时,先绘制的对象在下面,后绘制的对象在上面。如果坐标重合,后绘制的对象遮挡先绘制的对象
4、pygame缩放图片的方法
格式:变量名=pygame.transform.scale(缩放对象,(宽度,高度))
参数宽度和高度表示缩放后的宽度和高度,需要用括号括起来
这里的缩放对象是指通过pygame.image.load()方法加载过图片的对象
5、pygame显示图片的方法
缩放根据需要选择是否缩放,不是必要步骤
img1=pygame.image.load("图片名称.图片格式")
img2=pygame.transform.scale(img1,(宽度,高度))
screen.blit(img2,(坐标x,坐标y))
pygame.display.update()
第二节 pygame中的事件
一、鼠标事件
概念:用鼠标控制的事件,我们称之为鼠标事件。
1、MOUSEBUTTONDOWN事件
检测鼠标按键按下:
event.type == pygame.MOUSEBUTTONDOWN
鼠标事件通常通常作为if条件语句中的条件。
MOUSEBUTTONDOWN全部都是大写。
2、MOUSEBUTTONDOWN事件使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.KEYDOWN: #检测键盘按键按下
print("这是键盘事件")
elif event.type == pygame.MOUSEBUTTONDOWN: #检测鼠标按下
print("这是鼠标事件") #执行语句
3、MOUSEBUTTONUP事件
检测鼠标按键按下:
event.type == pygame.MOUSEBUTTONUP
鼠标事件通常通常作为if条件语句中的条件。
MOUSEBUTTONUP全部都是大写。
4、MOUSEBUTTONUP事件使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.KEYDOWN: #检测键盘按键按下
print("这是键盘事件")
elif event.type == pygame.MOUSEBUTTONUP: #检测鼠标抬起
print("这是鼠标事件") #执行语句
二、键盘事件
概念:用键盘控制角色移动,我们称之为键盘事件。
1、键盘事件KEYDOWN
KEYDOWN事件语法如下:
event.type == pygame.KEYDOWN
用途:检测按键是否被按下。
pygame.KEYDOWN中KEYDOWN需要大写。
2、KEYDOWN事件使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.QUIT: #退出事件判断
pygame.quit() #窗口退出
sys.exit() #系统退出
elif event.type == pygame.KEYDOWN: #检测按键按下
print("已经按下按键") #执行语句
检测键盘按下作为if语句的条件,按下键盘后的程序作为条件语句的执行语句。
3、键盘事件KEYUP
KEYUP事件语法如下:
event.type == pygame.KEYUP
用途:检测按键是否被抬起。
pygame.KEYUP中KEYUP需要大写。
4、KEYUP事件使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.QUIT: #退出事件判断
pygame.quit() #窗口退出
sys.exit() #系统退出
elif event.type == pygame.KEYUP: #检测按键抬起
print("已经释放了按键") #执行语句
检测键盘抬起作为if语句的条件,抬起键盘后的程序作为条件语句的执行语句。
5、精确的检测某个按键的方法
精确的检测某个按键的语法如下:
event.key == pygame.K_按键名 或 event.type == ord("字符")
例如:检测按键1:event.type == pygame.K_1
检测按键a:event.type == ord("a")
注意:按键名前加大写的K和_。ord()函数表示取得字符对应的ASCII码。下面三种写法是相等的。
if event.type == pygame.K_a:
if event.type == ord("a"):
if event.type == 97:
ASCII码表如下:
字母 | a | b | c | ... | x | y | z |
ASCII | 97 | 98 | 99 | ... | 120 | 121 | 122 |
要检测其他的按键,只需要修改下划线后的按键名。常见按键名如下:
pygame中的方向键:
方向 | 方向键代码 |
上 | K_UP |
下 | K_DOWN |
左 | K_LEFT |
右 | K_RIGHT |
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.QUIT: #退出事件判断
pygame.quit() #窗口退出
sys.exit() #系统退出
elif event.type == pygame.KEYDOWN: #检测按键按下
if event.key == pygame.K_RIGHT: #判断按下右键
print("按下了向右的方向键")
精确的检测某个键时,需要先判断事件的类型,按下还是抬起,然后再检测按下的键是什么。
三、退出事件QUIT
1、QUIT事件语法如下:
event.type == pygame.QUIT
用途:判断程序是否需要退出。
在程序中,我们要一直判断退出事件是否触发,然后做出相应,所以退出事件通常需要配合循环语句和条件语句使用。
pygame.QUIT中QUIT需要大写。
2、QUIT事件使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.QUIT: #退出事件判断
pygame.quit() #窗口退出
sys.exit() #系统退出
窗口退出:就好比我们关闭了音乐软件的界面,但音乐还在播放。
系统退出:我们退出了音乐软件。
第三节 pygame中的图像
一、加载图片
格式:变量名=pygame.image.load("图片名称.图片格式")
图片名称需要用字符串的形式,而且需要带上图片的格式
二、缩放图片
格式:变量名=pygame.transform.scale(缩放对象,(宽度,高度))
参数宽度和高度表示缩放后的宽度和高度,需要用括号括起来
这里的缩放对象是指通过pygame.image.load()方法加载过图片的对象
三、绘制图片
格式:画布名称.blit(绘制对象,(坐标x,坐标y))
注意:坐标需要用括号括起来
绘制图片语句要放在程序主循环pygame.display.update()之前
绘制多张图片时,先绘制的对象在下面,后绘制的对象在上面。如果坐标重合,后绘制的对象遮挡先绘制的对象
四、rgb三原色
RGB颜色结构:
(num1,num2,num3)
num1是0-255的整数,代表R(red-红色),数字越大,颜色中红色成分越多
num2是0-255的整数,代表G(green-绿色),数字越大,颜色中绿色成分越多
num3是0-255的整数,代表B(blue-蓝色),数字越大,颜色中蓝色成分越多
五、图像拖拽
步骤:
鼠标动作 | 图形动作 | 矩形动作 |
1、鼠标按下 | 选中图形 | 选中图形对应的矩形对象 |
2、鼠标移动 | 移动图形 | 将矩形对象的坐标设置为鼠标坐标 |
3、鼠标松开 | 固定图形 | 取消选中图形的矩形对象 |
1、矩形和点的碰撞检测
格式:矩形.collidepoint(点的坐标)
例如:判断矩形rect1和点(520,233)是否碰撞:
if rect1.collidepoint(520,233):
print("矩形和点碰到了")
2、获取鼠标点位置
获取鼠标的坐标:event.pos
获取鼠标的x坐标:event.pos[0]
获取鼠标的y坐标:event.pos[1]
3、MOUSEMOTION事件
检测鼠标移动:
event.type == pygame.MOUSEMOTION
鼠标事件通常作为if条件语句中的条件。
4、MOUSEMOTION事件的使用方法
#导库
import pygame,sys
......
while True:
for event in pygame.event.get(): #循环检测
if event.type == pygame.KEYDOWN: #退出事件判断
print("这是键盘事件")
elif event.type == pygame.MOUSEBUTTONDOWN: #检测鼠标按下
print("这是鼠标事件") #执行语句
elif event.type == pygame.MOUSEMOTION: #检测鼠标移动
print("鼠标移动了") #执行语句
5、选中图形跟随鼠标移动
moveRect = None # 移动的对象
while True:
for event in pygame.event.get():
#退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
#鼠标事件
elif event.type == pygame.MOUSEBUTTONDOWN:
for n in rectList:
if n.collidepoint(event.pos):
# print(event.pos)
moveRect = n #设置变量为选中图形
elif event.type == pygame.MOUSEMOTION:
if moveRect != None:
moveRect.center = event.pos #设置选中图形跟随鼠标位置
6、固定图形-MOUSEBUTTONUP事件
检测鼠标按键按下:
event.type == pygame.MOUSEBUTTONUP
鼠标事件通常通常作为if条件语句中的条件。
MOUSEBUTTONUP全部都是大写。
7、MOUSEBUTTONUP事件使用方法
moveRect = None # 移动的对象
while True:
for event in pygame.event.get():
#退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
#鼠标事件
elif event.type == pygame.MOUSEBUTTONDOWN:
for n in rectList:
if n.collidepoint(event.pos):
# print(event.pos)
moveRect = n #设置变量为选中图形
elif event.type == pygame.MOUSEMOTION:
if moveRect != None:
moveRect.center = event.pos #设置选中图形跟随鼠标位置
elif event.type == pygame.MOUSEBUTTONUP:
moveRect = None #固定图形
8、完整代码展示
import pygame, sys, tangram
pygame.init()
screen = pygame.display.set_mode((700, 500))
pygame.display.set_caption("益智七巧板")
bg = pygame.image.load("bg.png")
sound = pygame.mixer.Sound("sound1.wav")
# 用列表imgNameList存储图片名
imgNameList = ["1.png", "2.png", "3.png", "4.png", "5.png", "6.png", "7.png"]
imgList = [] # 存储加载后的七巧板图片
#循环加载七巧板图片
for n in imgNameList:
img1 = pygame.image.load(n)
imgList.append(img1)
#为每一个七巧板创建Rect对象
rect1 = pygame.Rect(495, 118, 47, 93)
rect2 = pygame.Rect(478, 330, 69, 73)
rect3 = pygame.Rect(532, 184, 36, 73)
rect4 = pygame.Rect(569, 121, 52, 56)
rect5 = pygame.Rect(567, 273, 26, 50)
rect6 = pygame.Rect(517, 255, 26, 51)
rect7 = pygame.Rect(564, 365, 36, 47)
# 用列表rectList存储创建的Rect对象
rectList = [rect1, rect2, rect3, rect4, rect5, rect6, rect7]
moveRect = None # 移动的对象
while True:
for event in pygame.event.get():
#退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
#鼠标事件
elif event.type == pygame.MOUSEBUTTONDOWN:
for n in rectList:
if n.collidepoint(event.pos):
# print(event.pos)
moveRect = n
elif event.type == pygame.MOUSEMOTION:
if moveRect != None:
moveRect.center = event.pos
elif event.type == pygame.MOUSEBUTTONUP:
moveRect = None
sound.play()
screen.fill((255, 255, 255))
screen.blit(bg, (0, 0))
#绘制七巧板
for i in range(7):
screen.blit(imgList[i], rectList[i])
# 判断游戏是否完成
tangram.win(rectList, screen)
pygame.display.update()
运行效果初始状态截图: