Html5钢琴块游戏制作与分享(音游可玩)

news2025/6/21 6:57:03

当年一款手机节奏音游,相信不少人都玩过或见过。最近也是将其做了出来分享给大家。

游戏的基本玩法:点击下落的黑色方块,弹奏音乐。(下落的速度会越来越快) 

可以进行试玩,手机玩起来效果会更好些。

点击试玩

游戏使用了一首儿歌乐谱,听出来是啥了吗^ ^

----------------------------------------------------------------------

   长期更新不同类型 H5 游戏,进行经验分享

   对游戏感兴趣的小伙伴,加个关注哈

----------------------------------------------------------------------

实现功能

  1. 制作了简单的近乎黑白的显示界面。
  2. 加入了音频乐谱,可以快速弹奏出一首简单的音乐。
  3. 游戏加入了Game Over的判断,当点击两次,或为点击黑色方块时,游戏结束。

源码地址:pro.youyu001.com

制作思路

  1. 游戏的主场景使用了js绘图进行制作,里面的方块都是程序画出来的。
  2. 音乐方面采用了weixin的js控件,进行了预加载处理。
  3. 不同的音色,找了10几个音节的Mp3文件,演奏时进行播放控制。
  4. 声音播放时做了一个音频对象池子,进行音乐的播放和停止后的回收。

以上为开发的一些思路和关键点。欢迎一起讨论

代码说明

1、通过绘图方式制作了游戏中钢琴按键的效果

this.graphics = new PIXI.Graphics();
this.graphics.beginFill(this.color, 1);
this.graphics.drawRect(0, 0, w, h);
this.addChild(this.graphics);

2、游戏的按钮进行了对象化处理控制了按钮的下落速度显示状态与点击事件等

function Rect(w, h, rectType) {
    //对象继承Container
    PIXI.Container.call(this);
    //用于控制回掉函数的本对象属性控制
    var self = this;

    this.clicked = true;

    this.rectType = rectType;
    this.color = 0x555555;
    if(this.rectType == 0) {
        //黑色
        this.color = 0x000000;
        this.clicked = false;

    } else if(this.rectType == 1){
        //白色
        this.color = 0xFFFFFF;

    } 

    this.graphics = new PIXI.Graphics();
    this.graphics.beginFill(this.color, 1);
    this.graphics.drawRect(0, 0, w, h);
    this.addChild(this.graphics);

    //添加黑色或白色方块点击事件
    if(this.rectType != 2) {
        this.interactive = true;
        this.on("click", function(){
            self.play();
        });
        this.on("touchstart", function(){
            self.play();
        });
    }

    this.play = function() {
        
        //方块只能点击一次,添加此验证
        if(this.rectType == 0 && this.clicked == false) {
            //记录点击状态
            this.clicked = true;
            //黑色方块被点击变色
            self.graphics.beginFill(0x888888, 1);
            self.graphics.drawRect(0, 0, 123, 150);
            
            //按照乐谱寻找需要播放的音色
            var mIndex = musicArrListIndex[music[musicIndex]];
            var audio = musicArrList[music[musicIndex]][mIndex];
            //播放音乐
            audio.play();

            //切换同音色的声音对象,解决同音色一起播放问题
            mIndex ++;
            if(mIndex >= 5) {
                mIndex = 0;
            }
            //记录同音色 播放的序列,5选1
            musicArrListIndex[music[musicIndex]] = mIndex;
            musicIndex ++;
            //乐谱循环播放
            if(musicIndex >= music.length - 1) {
                musicIndex = 0;
            }
            
            //得分
            score ++;
            scoreTxt.text = "score: " + score;

        } else {
            //黑色方块被点击变红
            self.graphics.beginFill(0xff1111, 1);
            self.graphics.drawRect(0, 0, 123, 200);

            over();
        }
    }

}
//对象继承Container的属性方法
Rect.prototype = Object.create(PIXI.Container.prototype);

3、游戏中的音频处理模块音频预加载

    //iphone手机声音预加载兼容
    document.addEventListener("WeixinJSBridgeReady", function () {
        
        var controls = document.getElementsByTagName('audio');
        for(var i=0; i<controls.length; i++){
            controls[i].load();
            controls[i].pause();
        }

    }, false);

4、乐谱与音频对象的代码逻辑编写

//乐谱
var music = [1,1,1,3,5,5,5,5,6,6,6,8,5,4,4,6,6,3,3,3,3,2,2,2,2,5,5,1,1,1,3,5,5,5,5,6,6,6,8,5,4,4,4,6,3,3,3,3,3,3,2,2,2,3,1];
var musicIndex = 0;

//储存声音autio对象
var musicArrList = [];
var musicArrListIndex = [];
for(var i=1;i<10;i++){
    //创建声音
    var musicArr = [];
    //初始化9个音色
    for(var j = 0; j < 5;j ++) {
        var audio = new Audio();
        audio.autoplay = true;
        audio.src='';
        audio.src = 'audio/'+i+'.mp3';
        audio.load();
        audio.pause();
        audio.preload="auto";
        document.body.appendChild(audio);
        musicArr.push(audio);   
    }
    musicArrListIndex.push(0);
    musicArrList.push(musicArr);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】基于serial的UART串口通信(可实现AT指令自动化 以ML307A开发板为例)

【Python】基于serial的UART串口通信&#xff08;可实现AT指令自动化 以ML307A开发板为例&#xff09; Python下的串口serial库 串行口的属性&#xff1a; name:设备名字 portstr:已废弃&#xff0c;用name代替 port&#xff1a;读或者写端口 baudrate&#xff1a;波特率 byt…

Charles 安装及配置,详细步骤(不错,保存一下)

一、安装激活 1.1、下载 https://www.charlesproxy.com/download/ 1.2、激活 打开Charles > Help > Register Charles > 输入 Registered Name &#xff1a; https://zhile.io License Key&#xff1a;48891cf209c6d32bf4 二、代理配置 2.1、代理设置 Proxy > Pr…

Nodejs中的fs模块

一、文件写入操作 writeFile 直接打开文件默认是 w 模式&#xff0c;所以如果文件存在&#xff0c;该方法写入的内容会覆盖旧的文件内容 语法&#xff1a; writeFile(file, data[, options], callback)异步writeFileSync(file, data)同步 参数&#xff1a; file文件名data要…

MYSQL 2:一条更新语句是如何进行的

一. MYSQL的一条更新语句如何进行的&#xff1f; 和查询一样&#xff0c;一开始我们需要通过连接器连接到MYSQL服务器上&#xff0c;然后我们会将我们的语句交给解析器&#xff0c;然后交给执行器。比如我们执行一条这样的语句 update cc1 from user_info where id 2 1.执行…

PTA:C课程设计(5)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;5&#xff09;函数题5-6-1 求一组数中的平均值及最大值5-6-2 判断满足条件的三位数5-6-3 函数实现字符串逆序5-6-4 查找子串5-6-5 计算最长的字符串长度5-6-6 二分查找编程题5-7-1 找最长的字符串5-7-2 藏…

第七天sql优化篇

一、查询SQL尽量不要使用select *&#xff0c;而是select具体字段 因为select * 进行查询时&#xff0c;很可能就不会使用到覆盖索引了&#xff0c;就会造成回表查询 select stu.name from student stu; 二、如果知道查询结果只有一条或者只要最大/最小一条记录&#xff…

CMMI认证唯一查询官网

CMMI是“能力成熟度模型集成”的意思。是一种评估或者认证制度。最新的CMMI V2.0模型有四个视图&#xff0c;DEV开发视图、SVC服务视图、供应商、人力资源&#xff0c;目前开发视图是全球应用最广泛的&#xff0c;主要是由CMMI研究院主任评估师按照CMMI模型检查企业或组织的软件…

HTML - 实现IE浏览器访问网址自动跳转至谷歌浏览器打开

HTML - 实现IE浏览器访问网址自动跳转至谷歌浏览器打开一. 实现代码二. IE浏览器设置一. 实现代码 注意&#xff1a;代码中的数据变量需要使用 var 声明 核心代码var href "http://www.baidu.com" //创建ActiveXObject实例&#xff0c;只在IE下有效&#xff0c;才可…

TensorFlow详解2原理

一、从helloworld开始 二、Tensorflow编程模式 一般有两种编程模式。 第一种是命令式编程–Torch&#xff0c; 第二种是符号式编程–Tensorflow; tensorflow比torch有相对的一定的优化&#xff1b; 命令式编程实际上是一种最常见的编程模式&#xff0c;因为易于理解而且基本没…

怎么压缩pdf,如何压缩pdf大小,4种高质量办法

怎么压缩pdf&#xff0c;如何压缩pdf大小&#xff0c;如何找到最合适、最高效的方法&#xff0c;是每一个人必须认真对待的问题。那么我们如何能提高工作效率呢&#xff1f;在办公中我们首先就是要先制定工作计划&#xff0c;心中有机会才能合理的安排工作时间&#xff0c;这样…

工业企业清洁运输台账存在的问题及应对措施

按照超低排放政策规定&#xff0c;企业要实现清洁运输超低排放改造&#xff0c;除了提高企业大宗物料和清洁方式运输比例外&#xff0c;同时还要建立清洁运输台账&#xff0c;根据台账等数据资料判断企业清洁运输比例是否满足要求。而目前对于大多数未完成超低排放的企业来说&a…

Nand Flash基础知识

1、Nand Flash组织架构 Device&#xff08;Package&#xff09;就是封装好的nand flash单元&#xff0c;包含了一个或者多个target。一个target包含了一个或者多个LUN&#xff0c;一个target的一个或者多个LUN共享一组数据信号。每个target都由一个ce引脚&#xff08;片选&…

07-vue的组件化

文章目录1.概述存在的问题&#xff1a;那么如何解决这种状况&#xff1a;2.组件化1.基本概述2.优点1.概述 对于前端来说&#xff0c;我们为用户创造价值才是特别需要关注的一个问题&#xff0c;这么多年过去了&#xff0c;前端到底为用户创造了什么价值呢&#xff1f; 70 年代…

Nacos2.2版本Tomcat启动报错

Nacos2.2版本Tomcat启动报错 错误日志 查看 logs/start.out&#xff0c;可以看到报错信息 2023-04-09 19:36:23,081 ERROR Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean wi…

Linux系统上如何禁用 USB 存储

Linux系统上如何禁用 USB 存储 为了保护数据不被泄漏&#xff0c;我们使用软件和硬件防火墙来限制外部未经授权的访问&#xff0c;但是数据泄露也可能发生在内部。 为了消除这种可能性&#xff0c;机构会限制和监测访问互联网&#xff0c;同时禁用 USB 存储设备。 我是艾西&…

手写一个Promise

Promise Promise是一个对象&#xff0c;用于解决异步变成的问题&#xff0c;由传统的异步回调为服务端立即调用优化为使用者者掌握回调主动权。 比如传统的JSONP&#xff0c;如下&#xff0c;在请求路由里添加回调函数&#xff0c;由接收请求的一方来调用请求&#xff0c;使用…

小白学Pytorch系列--Torch.nn API Vision Layers(15)

小白学Pytorch系列–Torch.nn API Vision Layers(15) 方法注释nn.PixelShuffle将形状张量(∗&#xff0c;Cr2,H,W)(*&#xff0c;C r^2,H,W)(∗&#xff0c;Cr2,H,W)中的元素重新排列为形状张量(∗&#xff0c;C,Hr,Wr)(*&#xff0c;C,H r,W r)(∗&#xff0c;C,Hr,Wr)&#x…

详细介绍React路由

路由 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;&#xff0c;整个应用只有一个完整的页面&#xff0c;点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 一个路由就是一…

高通SDX12:ProSLIC Si32185移植调试

一、SLIC业务流程图 本次在高通SDX12平台上支持语音芯片Si32185大致流程如下: 驱动部分直接放在Kernel中,通过SPI注册设备创建字符节点,与硬件建立连接注册设备成功并在audio_kernel中正确配置FE、BE后,声卡会创建出来应用层直接放在apps_proc下,通过IOCTL操作驱动层,通…

操作系统、输入法和编码的理解

操作系统和输入法 操作系统有一个输入法管理器&#xff0c;叫做IMM,管理系统内的所有输入法&#xff0c;或者说一个输入法想要使用操作系统提供的输入法API,就必须在IMM进行注册。 应用程序和输入法 应用程序一般都会使用输入法&#xff0c;也就是调用输入法的api进行文字输…