zoukankan      html  css  js  c++  java
  • 声控皮卡丘小游戏

    每天练习一点点~~

    参考文章
    百度云下载(密码rwlh)
    github地址

    不想看的直接看我贴代码吧.
    代码层次:

    1.pikachu类生成持续运动的pikachu

    import cocos
    import os
    
    
    class Pikachu(cocos.sprite.Sprite):
        # 实现一个皮卡丘类来生成皮卡实例
        def __init__(self):
            super(Pikachu, self).__init__('pikachu.png')
            # 是否可以跳跃
            self.jumpable = False
            # 行进速度
            self.speed = 0
            # 锚点
            self.image_anchor = 0, 0
            # 皮卡丘的位置
            self.position = 80, 280
            self.schedule(self.update)
    
        def jump(self, h):
            # 声控跳跃
            if self.jumpable:
                self.y += 1
                self.speed -= max(min(h, 10), 7)
                self.jumpable = False
    
        def land(self, y):
            # 着陆后静止
            if self.y > y - 25:
                self.jumpable = 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):
            self.parent.reset()
            self.jumpable = False
            self.speed = 0
            self.position = 80, 280
    
    

    2.block类生成地图上随机出现的黑色柱子

    import os
    import cocos
    import random
    
    
    class Block(cocos.sprite.Sprite):
        # 生成地图上的随机块状物
        def __init__(self, position):
            super(Block, self).__init__('black.png')
    
            # 锚点
            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
                self.position = x + 50 + random.random() * 100, 0
    
    
    

    3.程序主逻辑入口函数

    import os
    import cocos
    import struct
    from cocos.sprite import Sprite
    from pyaudio import PyAudio, paInt16
    from classes.pikachu import Pikachu
    from classes.block import Block
    
    
    class VCGame(cocos.layer.ColorLayer):
        # 定义声音控制类Voice Control Class
        is_event_handler = True
    
        def __init__(self):
            super(VCGame, self).__init__(255, 255, 255, 255, 800, 600)
            # 初始化参数
            # frames_per_buffer
            self.numSamples = 1000
            # 声控条
            self.vbar = Sprite('black.png')
            self.vbar.position = 20, 450
            self.vbar.scale_y = 0.1
            self.vbar.image_anchor = 0, 0
            self.add(self.vbar)
    
            # 皮卡丘类
            self.pikachu = Pikachu()
            self.add(self.pikachu)
    
            # cocosnode精灵类
            self.floor = cocos.cocosnode.CocosNode()
            self.add(self.floor)
            position = 0, 100
    
            for i in range(120):
                b = Block(position)
                self.floor.add(b)
                position = b.x + b.width, b.height
    
            # 声音输入
            audio = PyAudio()
            SampleRate = int(audio.get_device_info_by_index(0)['defaultSampleRate'])
            self.stream = audio.open(format=paInt16,
                                     channels=1,
                                     rate=SampleRate,
                                     input=True,
                                     frames_per_buffer=self.numSamples)
            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.
                    if self.pikachu.y < b.height:
                        self.pikachu.land(b.height)
                        break
    
            # 定义游戏规则
    
        def update(self, dt):
            # 获取每帧的音量
            audio_data = self.stream.read(self.numSamples)
            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
    
    
    if __name__ == '__main__':
        cocos.director.director.init(caption="Pikachu~~~")
        cocos.director.director.run(cocos.scene.Scene(VCGame()))
    
    
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/xiujin/p/11479141.html
Copyright © 2011-2022 走看看