前言:
本期我們將制作一個類似八音符的小游戲。
讓我們愉快地開始吧~~~
開發工具**
Python版本:3.6.4
相關模塊:
cocos2d模塊;
pyaudio模塊;
以及一些Python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
原理介紹
相信很多人對八音符這款游戲並不陌生吧,其核心玩法是利用聲音控制一個帶辮子的小黑球不斷前進,大概是長這樣子的吧:
今天我們就來做一個低配版本的T_T,其功能為利用聲音控制皮卡丘不斷前進。
游戲主要使用了cocos2d模塊和pyaudio模塊,前者用於搭建游戲框架,后者用於獲得麥克風的聲音。
Step1 定義皮卡丘類:
既然游戲的主角是皮卡丘,那我們總得單獨定義一個類來體現一下主角吧?
利用cocos2d模塊來定義主角類是一件非常輕松的事情。你只需要繼承sprites類,然后告訴sprites類需要執行什么操作即可。
根據八音符的游戲規則,我們賦予皮卡丘跳躍、下降和靜止的能力,同時,我們規定皮卡丘在空中時無法進行跳躍。具體代碼如下:
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()
Step2 定義block類:
顯然,主角需要有站的地方吧T_T,到處都是萬丈深淵怕是一萬只皮卡丘也拯救不了地球人吧T_T。
對於地面,剛開始的時候先得有一段長點的平地緩沖一下,讓玩家先試試自己的嗓音,然后再隨機生成跳躍塊,讓玩家展示自己的歌喉。具體代碼如下:
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
Step3 實現游戲主循環:
有了上面的鋪墊,就可以開始實現我們的小游戲了。
此時我們需要繼承ColorLayer類來實現游戲主循環。首先,我們定義聲控條類來“暗中觀察”我們的嗓音,代碼如下:
# 聲控條
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)
然后就是實例化皮卡丘類和block類,其中,block類將被放置進容器以方便整體處理。代碼如下:
# 皮卡丘類
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)
最后,我們需要告訴程序游戲規則,那就是根據麥克風接收到的聲音的音量來控制聲控條的長短以及皮卡丘的動作。這里,我們通過block塊的整體后移來實現皮卡丘的前進效果。
當然,我們也需要加入必要的碰撞檢測程序,不然皮卡丘一登場就陷入沼澤一樣的地面中了。並且我們規定當皮卡丘掉入“溝壑”后游戲重置。
代碼如下:
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()
文章到這里就結束了,感謝你的觀看,Python24個小游戲系列,下篇文章分享拼圖小游戲
All done~詳見個人簡介或者私信獲取完整源代碼。。