您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python干貨實(shí)戰(zhàn)之如何實(shí)現(xiàn)八音符醬小游戲”,在日常操作中,相信很多人在Python干貨實(shí)戰(zhàn)之如何實(shí)現(xiàn)八音符醬小游戲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Python干貨實(shí)戰(zhàn)之如何實(shí)現(xiàn)八音符醬小游戲”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
導(dǎo)語?
正文?
?一、準(zhǔn)備中
1.1 游戲規(guī)則?
1.2 素材圖片?
?二、環(huán)境
2.1 小介紹?
2.2 配置環(huán)境?
?三、正式敲代碼
3.1 定義小黑八音符類:?
3.2 定義block類:?
3.3 實(shí)現(xiàn)游戲主循環(huán):?
?四、效果展示
這款游戲需要操作者發(fā)聲來控制人物,同時(shí)還得掌握好聲音的力度...偷偷玩.jpg
操作起來全都靠吼,走位全都靠音調(diào),再多騷操作都無用,小編只能勸告大家,不要在晚上玩,大概會(huì)被鄰居誤會(huì)吧~
不同于以往電腦鍵盤操作,亦不同于網(wǎng)絡(luò)手游觸屏操作,這款游戲的操作方法竟然是聲音。
玩家可以通過調(diào)整聲音的大小來控制音符醬的跳躍。簡單來說。聲音越大,音符醬跳的越高。
如果只發(fā)出微弱的聲音, 音符醬就只會(huì)緩慢的移動(dòng)。是不是超級(jí)有意思!
Cocos2d是一個(gè)用于構(gòu)建2D游戲、演示和其他圖形/交互應(yīng)用程序的框架。
它可以在Windows、OSX和Linux上工作,它可以供用python語言編寫的應(yīng)用程序使用。
Pyaudio庫,使用這個(gè)可以進(jìn)行錄音,播放,生成wav文件等等。PyAudio 提供了 PortAudio
的 Python 語言版本,這是一個(gè)跨平臺(tái)的音頻 I/O 庫,使用 PyAudio 你可以在 Python 程
序中播放和錄制音頻。為PoTaTudio提供Python綁定,跨平臺(tái)音頻I/O庫。使用PyAudio,您可
以輕松地使用Python在各種平臺(tái)上播放和錄制音頻,例如GNU/Linux、微軟Windows和蘋果Mac
OS X/MACOS。
本文涉及環(huán)境:Python3、Pycharm、cocos2d模塊;pyaudio模塊;以及一些Python自帶的模塊。
模塊安裝:
pip install +模塊名 或帶豆瓣鏡像源 pip install -i https://pypi.douban.com/simple/ +模塊名
利用cocos2d模塊來定義主角類是一件非常輕松的事情。你只需要繼承sprites類,然后告訴sprites
類需要執(zhí)行什么操作即可。根據(jù)八音符的游戲規(guī)則,我們賦予小黑跳躍、下降和靜止的能力,同
時(shí),我們規(guī)定小黑在空中時(shí)無法進(jìn)行跳躍。具體代碼如下:
import cocos '''小黑類''' class Pikachu(cocos.sprite.Sprite): def __init__(self, imagepath, **kwargs): super(Pikachu, self).__init__(imagepath) # 錨點(diǎn) 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
初始化界面小黑要有一段站立的地方,對(duì)于地面,剛開始的時(shí)候先得有一段長點(diǎn)的平地緩沖一下,
讓玩家先試試自己的嗓音,然后再隨機(jī)生成跳躍塊,讓玩家展示自己的歌喉。
具體代碼如下:
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
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 '''定義游戲規(guī)則''' 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()))
到此,關(guān)于“Python干貨實(shí)戰(zhàn)之如何實(shí)現(xiàn)八音符醬小游戲”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。