网络编程
位置:首页>> 网络编程>> Python编程>> Python干货实战之八音符酱小游戏全过程详解

Python干货实战之八音符酱小游戏全过程详解

作者:顾木子吖  发布时间:2021-08-20 11:21:27 

标签:Python,小游戏,八音符,实战案例

导语🎼

Python干货实战之八音符酱小游戏全过程详解

嗨,大宝贝们,又到周末啦,今天你放假了嘛?

周末的日子总是无所事事,无所事事。一直在想做什么游戏,给大家来点儿新鲜感,这不?

玩游戏、找游戏、找素材、写代码,大家听说过这个游戏嘛?

声控2D动作小游戏它的名字叫做《不要停下来!八分音符酱♪》!

今天就来给大家肝一个仿八音符小游戏!

Python干货实战之八音符酱小游戏全过程详解

这款游戏需要操作者发声来控制人物,同时还得掌握好声音的力度...偷偷玩.jpg

操作起来全都靠吼,走位全都靠音调,再多骚操作都无用,小编只能劝告大家,不要在晚上玩,大概会被邻居误会吧~

Python干货实战之八音符酱小游戏全过程详解

Python干货实战之八音符酱小游戏全过程详解

正文🎼

Python干货实战之八音符酱小游戏全过程详解

🎵一、准备中

1.1 游戏规则🎶

不同于以往电脑键盘操作,亦不同于网络手游触屏操作,这款游戏的操作方法竟然是声音。

玩家可以通过调整声音的大小来控制音符酱的跳跃。简单来说。声音越大,音符酱跳的越高。

如果只发出微弱的声音, 音符酱就只会缓慢的移动。是不是超级有意思!

1.2 素材图片🎶

Python干货实战之八音符酱小游戏全过程详解

🎵二、环境

2.1 小介绍🎶

Cocos2d模块:

Cocos2d是一个用于构建2D游戏、演示和其他图形/交互应用程序的框架。

它可以在Windows、OSX和Linux上工作,它可以供用python语言编写的应用程序使用。

Pyaudio模块:

Pyaudio库,使用这个可以进行录音,播放,生成wav文件等等。PyAudio 提供了 PortAudio

的 Python 语言版本,这是一个跨平台的音频 I/O 库,使用 PyAudio 你可以在 Python 程

序中播放和录制音频。为PoTaTudio提供Python绑定,跨平台音频I/O库。使用PyAudio,您可

以轻松地使用Python在各种平台上播放和录制音频,例如GNU/Linux、微软Windows和苹果Mac

OS X/MACOS。

2.2 配置环境🎶

本文涉及环境:Python3、Pycharm、cocos2d模块;pyaudio模块;以及一些Python自带的模块。

模块安装:

pip install +模块名 或带豆瓣镜像源 pip install -i https://pypi.douban.com/simple/ +模块名

🎵三、正式敲代码

3.1 定义小黑八音符类:🎶

利用cocos2d模块来定义主角类是一件非常轻松的事情。你只需要继承sprites类,然后告诉sprites

类需要执行什么操作即可。根据八音符的游戏规则,我们赋予小黑跳跃、下降和静止的能力,同

时,我们规定小黑在空中时无法进行跳跃。具体代码如下:


import cocos

'''小黑类'''
class Pikachu(cocos.sprite.Sprite):
   def __init__(self, imagepath, **kwargs):
       super(Pikachu, self).__init__(imagepath)
       # 锚点
       self.image_anchor = 0, 0
       # 初始重置
       self.reset(False)
       # 更新
       self.schedule(self.update)
   '''声控跳跃'''
   def jump(self, h):
       if self.is_able_jump:
           self.y += 1
           self.speed -= max(min(h, 10), 7)
           self.is_able_jump = False
   '''着陆后静止'''
   def land(self, y):
       if self.y > y - 25:
           self.is_able_jump = True
           self.speed = 0
           self.y = y
   '''更新(重力下降)'''
   def update(self, dt):
       self.speed += 10 * dt
       self.y -= self.speed
       if self.y < -85:
           self.reset()
   '''重置'''
   def reset(self, flag=True):
       if flag: self.parent.reset()
       # 是否可跳跃
       self.is_able_jump = False
       # 速度
       self.speed = 0
       # 位置
       self.position = 80, 280

3.2 定义block类:🎶

初始化界面小黑要有一段站立的地方,对于地面,刚开始的时候先得有一段长点的平地缓冲一下,

让玩家先试试自己的嗓音,然后再随机生成跳跃块,让玩家展示自己的歌喉。

具体代码如下:


import cocos
import random

'''地面块'''
class Block(cocos.sprite.Sprite):
   def __init__(self, imagepath, position, **kwargs):
       super(Block, self).__init__(imagepath)
       self.image_anchor = 0, 0
       x, y = position
       if x == 0:
           self.scale_x = 4.5
           self.scale_y = 1
       else:
           self.scale_x = 0.5 + random.random() * 1.5
           self.scale_y = min(max(y - 50 + random.random() * 100, 50), 300) / 100.0
           self.position = x + 50 + random.random() * 100, 0

3.3 实现游戏主循环:🎶


import cfg
import cocos
import struct
from modules import *
from cocos.sprite import Sprite
from pyaudio import PyAudio, paInt16

'''定义声控游戏类'''
class VCGame(cocos.layer.ColorLayer):
   def __init__(self):
       super(VCGame, self).__init__(255, 255, 255, 255, 800, 600)
       # frames_per_buffer
       self.num_samples = 1000
       # 声控条
       self.vbar = Sprite(cfg.BLOCK_IMAGE_PATH)
       self.vbar.position = 20, 450
       self.vbar.scale_y = 0.1
       self.vbar.image_anchor = 0, 0
       self.add(self.vbar)
       # 皮卡丘
       self.pikachu = Pikachu(cfg.PIKACHU_IMAGE_PATH)
       self.add(self.pikachu)
       # 地面
       self.floor = cocos.cocosnode.CocosNode()
       self.add(self.floor)
       position = 0, 100
       for i in range(120):
           b = Block(cfg.BLOCK_IMAGE_PATH, position)
           self.floor.add(b)
           position = b.x + b.width, b.height
       # 声音输入
       audio = PyAudio()
       self.stream = audio.open(format=paInt16, channels=1, rate=int(audio.get_device_info_by_index(0)['defaultSampleRate']), input=True, frames_per_buffer=self.num_samples)
       # 屏幕更新
       self.schedule(self.update)
   '''碰撞检测'''
   def collide(self):
       diffx = self.pikachu.x - self.floor.x
       for b in self.floor.get_children():
           if (b.x <= diffx + self.pikachu.width * 0.8) and (diffx + self.pikachu.width * 0.2 <= b.x + b.width):
               if self.pikachu.y < b.height:
                   self.pikachu.land(b.height)
                   break
   '''定义游戏规则'''
   def update(self, dt):
       # 获取每帧的音量
       audio_data = self.stream.read(self.num_samples)
       k = max(struct.unpack('1000h', audio_data))
       self.vbar.scale_x = k / 10000.0
       if k > 3000:
           self.floor.x -= min((k / 20.0), 150) * dt
       # 皮卡丘跳跃
       if k > 8000:
           self.pikachu.jump((k - 8000) / 1000.0)
       # 碰撞检测
       self.collide()
   '''重置'''
   def reset(self):
       self.floor.x = 0

'''run'''
if __name__ == '__main__':
   cocos.director.director.init(caption="xiaohei Go Go Go ")
   cocos.director.director.run(cocos.scene.Scene(VCGame()))

🎵四、效果展示

Python干货实战之八音符酱小游戏全过程详解

总结🎼

Python干货实战之八音符酱小游戏全过程详解

今天的木木子呢,也试玩了一下这个八分音符酱,因为是实在害怕同事会打我,所以就回家录了一下。没能通关,也没办法这个游戏实在不是我能驾驭的,玩了几局嗓子就要开始冒烟了~在这提醒好奇心比较强的宝宝们,一定不要在宿舍,夜晚,玩这个声控小游戏。否则,真的可能会被打!!

好啦,到这里就结束了,想玩的小伙伴儿可以偷偷在家里玩儿,记得小声点儿哈~🤫

来源:https://blog.csdn.net/weixin_55822277/article/details/120919888

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com