Pygame游戏之 愤怒的小鸟

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游戏之 豌豆射手

好啦,游戏到此就结束了,是不是小有意思呢

  • 12
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值