目录
  • 导语
  • 正文
    • 一、准备中
      • 1.1 游戏规则
      • 1.2 素材图片
    • 二、环境
      • 2.1 小介绍
      • 2.2 配置环境
    • 三、正式敲代码
      • 3.1 定义小黑八音符类:
      • 3.2 定义block类:
      • 3.3 实现游戏主循环:
    • 四、效果展示
    • 总结

      导语

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

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

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

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

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

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

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

      正文

      一、准备中

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