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

编辑: admin 分类: python 发布时间: 2021-12-03 来源:互联网
目录
  • 导语🎼
  • 正文🎼
    • 🎵一、准备中
      • 1.1 游戏规则🎶
      • 1.2 素材图片🎶
    • 🎵二、环境
      • 2.1 小介绍🎶
      • 2.2 配置环境🎶
    • 🎵三、正式敲代码
      • 3.1 定义小黑八音符类:🎶
      • 3.2 定义block类:🎶
      • 3.3 实现游戏主循环:🎶
    • 🎵四、效果展示
    • 总结🎼

      导语🎼

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

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

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

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

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

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

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

      正文🎼

      🎵一、准备中

      1.1 游戏规则🎶

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

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

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

      1.2 素材图片🎶

      🎵二、环境

      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 小游戏内容请搜索hwidc以前的文章或继续浏览下面的相关文章希望大家以后多多支持hwidc!

      【来源:自由互联:http://www.yidunidc.com/usa.html 欢迎留下您的宝贵建议】