Html5钢琴块游戏制作(音乐游戏)

news/2024/5/18 12:24:41 标签: html5, 游戏, 前端, 游戏程序

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

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

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

点击试玩

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

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

   长期更新不同类型 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.niftyadmin.cn/n/226390.html

相关文章

G1垃圾收集器回收步骤

1&#xff1a;类加载机制&#xff1a; 加、验、准、解、初、使、卸 加、烟、准、姐、初、湿、鞋 1.1&#xff1a;加载、将class 文件转化为二进制流加载 JVM 内存中并生成一个该类的Class对象 1.2&#xff1a;验证、Class 文件的字节流中包含的信息是否符合当前虚拟机的…

UniLM模型简单介绍

目录 一、概要 二、深入扩展 2.1 预训练任务 2.2 模型精调 一、概要 如果将基于Transformer的双向语言模型&#xff08;如BERT模型中的掩码语言模型&#xff09;与单向的自回归语言模型&#xff08;如BART模型的解码器&#xff09;进行对比&#xff0c;可以发现&#xff0c…

【实验报告】实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…

如何在Windows系统上制作U盘启动盘?

使用U盘重装Windows电脑系统&#xff0c;对于熟悉电脑的人来说十分常见&#xff0c;但是不少电脑小白并不会制作U盘启动盘。U盘启动盘是包含操作系统的外部硬盘驱动器&#xff0c;可用于启动计算机或笔记本电脑。下面我们就来了解一下如何制作U盘启动盘。 注意&#xff1a; U …

简单句区分判断

文章目录如何区分&#xff08;主谓宾&#xff09;和&#xff08;主谓宾宾补&#xff09;&#xff1f;如何区分&#xff08;主谓宾宾补&#xff09;和&#xff08;主谓宾状&#xff09;&#xff1f;不及物动词单及物动词双及物动词复杂及物动词如何区分&#xff08;主谓宾&#…

SpringBoot使用Hbase

SpringBoot使用Hbase 文章目录SpringBoot使用Hbase一&#xff0c;引入依赖二&#xff0c;配置文件添加自己的属性三&#xff0c;配置类注入HBASE配置四&#xff0c;配置Hbase连接池五&#xff0c;配置操作服务类一&#xff0c;引入依赖 <dependency><groupId>org.a…

【react 全家桶】组合组件

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录09 【组合组件】1.包含关系2.特例关系问题…

WPFPasswordBox绑定问题

PassWordBox的Password属性为什么不能绑定 Introduction WPF中的PassWordBox是用于输入密码的控件&#xff0c;它的Password属性是用于获取或设置PassWordBox中的密码。但是&#xff0c;有很多开发者在使用WPF的时候发现&#xff0c;无法通过绑定的方式来设置或获取Password属…