Pygame游戏(7)
让我们用键盘控制小鸟躲避成群结队的绿皮猪
当小鸟与绿皮猪发生碰撞后,会进入一个新的界面,并且有按钮让玩家重玩(动态图稍大,加载比较慢)
首先我们还是老步骤
准备好一个基本的游戏/窗口框架
import pygame,sys
from pygame.locals import *
pygame.init() #初始化模块
pygame.mixer.init() #初始化播放器
pygame.mixer.music.load('Angry_Birds.ogg') #加载音乐
pygame.mixer.music.set_volume(0.5) #设置音量
pygame.mixer.music.play(-1) #循环播放
bg = pygame.image.load('photo/bg2.png') #加载背景图片
bgpos = bg.get_rect() #获取图片的外接矩形
size = width,height = 1200,675 #游戏窗口的大小
screen = pygame.display.set_mode(size) #创建窗口
pygame.display.set_caption("愤怒的小鸟") #设置标题
#pygame.display.set_icon(bg) 将背景图作为标题栏的图片,可自行更换
while True:
for event in pygame.event.get(): #获取事件
if event.type == QUIT: #按下窗口的关闭按钮
sys,exit() #退出
elif event,type == KEYDOWN: #按下键盘
if event.key == K_ESCAPE: #按下ESC键
sys.exit() #退出
screen.blit(bg,bgpos) #绘制背景
pygame.dispaly.update() #刷新屏幕
玩家通过pygame.display.set_icon(surface)可以把标题栏这个默认的小黄猫切换成自己喜欢的图片
好啦,这样一个带背景图和音乐的窗口就完成了
接下去我们要做的工作有以下几点:
1、加入一个小鸟,让我们可以用键盘控制它移动
2、批量加入绿皮猪,让他随机在屏幕右端出现并往左边移动
3、检测它们是否发成碰撞(冲突)
4、当我们的小鸟撞上绿皮猪时,显示重玩界面
5、玩家的鼠标在重玩按钮上时,按钮的颜色变深,鼠标按下去后,进入游戏
6、我们会简单了解到如何切换两个界面
注释在代码行的后面,尽力详细解释
import pygame,sys,random
from pygame.locals import *
class Bird(pygame.sprite.Sprite): #继承精灵类
def __init__(self):
pygame.sprite.Sprite.__init__(self) #初始化
position = 230,230 #小鸟的初始坐标
self.img = pygame.image.load('photo\\ab.png') #或者用('photo/ab.png')加载图片
self.rect = self.img.get_rect() #获取图片的外接矩形
self.rect.center = position #将图片的中心设在position位置
self.image = self.img
#控制小鸟往左移动(以下三个方法同理)
def move_left(self):
self.speed = [-5,0] #速度
if self.rect.left <= 0: #当小鸟到达屏幕的左边界
self.rect.left = 0 #不让小鸟移动到窗口外
else:
self.rect = self.rect.move(self.speed) #让小鸟以速度speed移动
def move_right(self):
self.speed = [5,0]
if self.rect.left >= 1200:
self.rect.right = 1200
else:
self.rect = self.rect.move(self.speed)
def move_up(self):
self.speed = [0,-5]
if self.rect.top <= 0:
self.rect.top = 0
else:
self.rect = self.rect.move(self.speed)
def move_down(self):
self.speed = [0,5]
if self.rect.bottom >= 675:
self.rect.bottom = 675
else:
self.rect = self.rect.move(self.speed)
class Pig(pygame.sprite.Sprite): #继承精灵类
def __init__(self): #初始化
pygame.sprite.Sprite.__init__(self)
y = random.randint(0,600) #让绿皮猪的y坐标随机生成
position = [1130,y] #设置绿皮猪的坐标
self.img = pygame.image.load('photo/pb.png') #加载图片
self.rect = self.img.get_rect() #获取外接矩形
self.rect.center = position #将绿皮猪的中心设在position位置
self.image = self.img
speed = [-4,0] #绿皮猪的移动速度
self.speed = speed
def move(self):
self.rect = self.rect.move(self.speed) #往做移动
def main():
pygame.init() #初始化模块
pygame.mixer.init() #初始化播放器
pygame.mixer.music.load('Angry_Birds.ogg') #加载背景音乐
pygame.mixer.music.set_volume(0.5) #设置音量
pygame.mixer.music.play(-1) #循环播放
bg = pygame.image.load('photo/bg2.png') #加载背景图片
bgpos = bg.get_rect() #获取图片的外接矩形
size = width,height = 1200,675 #窗口的大小
screen = pygame.display.set_mode(size) #创建窗口
pygame.display.set_caption("愤怒的小鸟") #设置标题
bird = Bird() #将类实例化(创建小鸟对象)
i = 0 #控制绿皮猪数量的开关
group = pygame.sprite.Group() #创建精灵组
state = True #是否进入重玩界面的开关
while state:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
sys.exit()
key = pygame.key.get_pressed() #第二种获取键盘事件的方法
if key[K_LEFT]: #按下左键
bird.move_left() #调用小鸟对象的往左移动的方法
if key[K_RIGHT]:
bird.move_right()
if key[K_UP]:
bird.move_up()
if key[K_DOWN]:
bird.move_down()
screen.blit(bg,bgpos) #绘制背景
screen.blit(bird.image,bird.rect) #绘制小鸟
i = i + 1 #每隔一段事时间
if i%30 == 0:
pig = Pig() #创建绿皮猪对象
group.add(pig) #往精灵组里面添加绿皮猪
for p in group.sprites(): #遍历精灵组
p.move() #让全部绿皮猪调用移动的方法,实现往左移动
screen.blit(p.img,p.rect) #绘制绿皮猪
if pygame.sprite.collide_mask(bird,p): #检测一个对象和一个精灵组是否发成冲突(碰撞)
state = False #开关关闭,进入重玩界面
pygame.display.update() #刷新屏幕
pygame.time.Clock().tick(60)#控制刷新的速率(帧数)
def pause():
bg_go = pygame.image.load('photo/gameover.jpg') #加载游戏结束(重玩)的图片
bg_gopos = bg_go.get_rect() #获取外接矩形
size = width,height = 1200,675 #设置大小
screen = pygame.display.set_mode(size) #创建窗口
pygame.display.set_caption("Game Over") #标题
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
sys.exit()
img = pygame.image.load('photo/restar.png') #加载按钮图片
imgpos = img.get_rect() #获取外接矩形
imgpos.center = (620,420)
mouse_press = pygame.mouse.get_pressed() #获取鼠标
mouse_pos = pygame.mouse.get_pos() #鼠标的位置
left = imgpos.left #按钮的左边界
right =imgpos.right #按钮的右边界
top = imgpos.top #上边界
bottom = imgpos.bottom #下边界
#当鼠标移动到按钮范围内时,切换颜色更深的按钮图片
#产生鼠标一移动到按钮上,按钮颜色就变化的效果
if left < mouse_pos[0] < right and top < mouse_pos[1] < bottom:
img = pygame.image.load('photo/restar_02.png') #颜色较深的按钮图片
if mouse_press[0]: #按下鼠标左键
main() #重新开始游戏
screen.blit(bg_go,bg_gopos) #绘制背景
screen.blit(img,imgpos) #绘制按钮
pygame.display.update() #刷新屏幕
main()
pause()
注:
1、这是两个不同颜色深度的按钮图片,当检测到鼠标在按钮范围内时,就切换颜色较深的。
2、可能有些读者对精灵组不太了解,这里暂时简单理解成一个存放图片的列表就行啦
3、如果读者有些不太理解的地方,可以看一下两篇较短的小游戏,帮助理解
Pygame游戏之 合金弹头
Pygame游戏之 豌豆射手
好啦,游戏到此就结束了,是不是小有意思呢
转载:https://blog.csdn.net/weixin_44754772/article/details/102411637
查看评论