软件简介

别踩白块儿游戏源代码

运行 demo 需要配置好 CocosEditor,暂不支持其他工具。demo 是跨平台的,可移植运行 android,ios,html5 网页等,代码是基于 javascript 语言,cocos2d-x 游戏引擎,CocosEditor 手游开发工具完成的。

代码分析:(只挑选核心主代码分析,更多细节自行研究源码)

1 创建曲谱数组  do、re、mi、fa,sol、la、duo

CITY_OF_SKY = [
    4, 3, 4, 1, 3 , 3, 1, 1, 1, 7, 4, 4, 7, 7, 6, 7,
    1, 7, 1, 3, 7 , 3 , 6, 5, 6, 1 , 5 , 3, 3];

 

2 初始化表格,本来先创建4*曲谱数组长度的表格,但为了优化,先创建4*5表格,使用时候再不断新建增加表格;

 //tables
    this.tables = new Array(this.pianoLengthIndex);
    for (var j = 0; j < this.pianoLength; j++) {
        var sprites = new Array(4);
        var random = getRandom(4);
        for (var i = 0; i < 4; i++) {
            sprites[i] = this.newBlock(i, j, random);
        }
        this.tables[j] = sprites;
    }

 

3 创建单个表格元素,可根据colortype在一行里确定一个黑色元素

MainLayer.prototype.newBlock = function (i, j, colorType) {
    //simple block
    var block = cc.Sprite.create("res/whiteBlock.png");
    block.setPosition(cc.p(this.blockWidth / 2 + this.blockWidth * i, this.blockHeight / 2 + this.blockHeight * j));
    block.setScaleX(this.scaleX);
    block.setScaleY(this.scaleY);
    block.setZOrder(100);
    block.setAnchorPoint(cc.p(0.5, 0.5));
    var color = "white";
    if (j == 0) {
        block.setColor(cc.c3b(0, 255, 0));
    } else {
        if (i == colorType) {
            block.setColor(cc.c3b(30, 30, 30));
            color = "black";
        }
    }
    block.blockData = {col: i, row: j, color: color};
    this.blockNode.addChild(block);
    return block;
};

 

4 触摸表格,如果是黑色;如果是当前一行的上一行才能继续;

#如果没到顶,创建新的一行moveAddNewSprites,如果到顶了,创建分数结束节点createTopOverNode;

#如果整个表格移动到顶if (block.blockData.row == (this.pianoLengthIndex - 1)),游戏结束 this.gameStatus = OVER;

#如果没到顶,整个表格往下移一行this.blockNode.runAction(cc.MoveTo.create(0.2, cc.p(0, (this.blockNode.getPositionY() - this.blockHeight * heightNum))));

#单个元素运行一个缩放动画,移动步数+1; this.moveNum += 1;

//touch black
                        if (block.blockData.color == "black") {
                            if (block.blockData.row == (this.moveNum + 1)) {

                                //create new sprite 
                                if (this.pianoLength < this.pianoLengthIndex) {  //not reach top
                                    this.moveAddNewSprites();
                                }

                                if (this.pianoLength == this.pianoLengthIndex) {  //when reach top
                                    this.createTopOverNode();
                                }

                                //move down
                                cc.AudioEngine.getInstance().playEffect(PIANO_SIMPLE[this.pianoListIndex[j - 1]], false);
                                block.setColor(cc.c3b(100, 100, 100));
                                var heightNum = 1;
                                if (block.blockData.row == (this.pianoLengthIndex - 1)) { //when last row ,game success end, move two height
                                    heightNum = 2;
                                    cc.log("end");
                                    this.gameStatus = OVER;
                                    cc.AudioEngine.getInstance().playEffect(SOUNDS.win, false);

                                }
                                this.blockNode.runAction(cc.MoveTo.create(0.2, cc.p(0, (this.blockNode.getPositionY() - this.blockHeight * heightNum))));
                                this.moveNum += 1;
                                block.runAction(cc.Sequence.create(
                                    cc.ScaleTo.create(0, this.scaleX * 4 / 5, this.scaleY),
                                    cc.ScaleTo.create(0.2, this.scaleX, this.scaleY)
                                ));
                            }
                        }

 

5 触摸表格,如果是白色,游戏结束;

#创建分数结束节点this.createTopOverNode();

#改变分数节点的颜色背景,结果失败;

                           this.createTopOverNode();   //create score node and move 
                            this.gameStatus = OVER;
                            cc.AudioEngine.getInstance().playEffect(SOUNDS.error, false);
                            block.setColor(cc.c3b(255, 0, 0));
                            block.runAction(cc.Sequence.create(
                                cc.ScaleTo.create(0, this.scaleX * 4 / 5, this.scaleY * 4 / 5),
                                cc.ScaleTo.create(0.2, this.scaleX, this.scaleY)
                            ));
                            this.scoreNode.bgColor.setColor(cc.c3b(255, 0, 0));
                            this.scoreNode.result.setString("失败了");
                            this.scoreNode.runAction(cc.MoveTo.create(0.2, cc.p(0, this.blockHeight * this.moveNum)));

 

 

6 创建添加新的一行

MainLayer.prototype.moveAddNewSprites = function () {
    cc.log("moveAddNewSprites");
    var sprites = new Array(4);
    var random = getRandom(4);
    for (var k = 0; k < 4; k++) {
        sprites[k] = this.newBlock(k, this.pianoLength, random);
    }
    this.tables[this.pianoLength] = sprites;
    this.pianoLength += 1;
};

 

7 分数结束节点创建函数

MainLayer.prototype.createTopOverNode = function () {
    //top score node
    this.scoreNode = cc.Node.create();
    this.scoreNode.setPosition(cc.p(0, this.blockHeight * this.pianoLength));
    this.scoreNode.setAnchorPoint(cc.p(0, 0));
    this.scoreNode.setZOrder(130);
    this.blockNode.addChild(this.scoreNode);

    //color bg
    var bgColor = cc.Sprite.create("res/whiteBlock.png");
    bgColor.setPosition(cc.p(0, 0));
    bgColor.setScaleX(720 / 300);
    bgColor.setScaleY(1280 / 500);
    bgColor.setAnchorPoint(cc.p(0, 0));
    bgColor.setColor(cc.c3b(0, 255, 0));
    this.scoreNode.addChild(bgColor);
    this.scoreNode.bgColor = bgColor;

    //mode
    var wordsMode = ["经典", "街机", "禅"];
    var modeLabel = cc.LabelTTF.create(wordsMode[GAME_MODE] + "模式", "Arial", 70);
    this.scoreNode.addChild(modeLabel);
    modeLabel.setPosition(cc.p(350, 1000));
    modeLabel.setColor(cc.c3b(0, 0, 0));
    modeLabel.setAnchorPoint(cc.p(0.5, 0.5));

    //result
    var resultLabel = cc.LabelTTF.create("成功了", "Arial", 110);
    this.scoreNode.addChild(resultLabel);
    resultLabel.setPosition(cc.p(360, 750));
    resultLabel.setAnchorPoint(cc.p(0.5, 0.5));
    resultLabel.setColor(cc.c3b(139, 58, 58));
    this.scoreNode.result = resultLabel;

    //back
    var backLabel = cc.LabelTTF.create("返回", "Arial", 50);
    this.scoreNode.addChild(backLabel);
    backLabel.setPosition(cc.p(200, 400));
    backLabel.setAnchorPoint(cc.p(0.5, 0.5));
    backLabel.setColor(cc.c3b(0, 0, 0));
    this.scoreNode.back = backLabel;

    //return
    var returnLabel = cc.LabelTTF.create("重来", "Arial", 50);
    this.scoreNode.addChild(returnLabel);
    returnLabel.setPosition(cc.p(500, 400));
    returnLabel.setAnchorPoint(cc.p(0.5, 0.5));
    returnLabel.setColor(cc.c3b(0, 0, 0));
    this.scoreNode.return = returnLabel;
};
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表于大前端专区
2016/03/21 11:31

真正的钢琴(Piano simulator)

小时候,家里都会有一个电子钢琴,不过买回来就没用用过,因为跟真的钢琴声音差距很大,很多小孩子都喜欢钢琴那个叮咚声,但又在昂贵的价格和学费前止步,真正的钢琴这款插件可以完成你的小小钢琴梦,你可以演奏一首曲子!按任何键显示在您的计算机的键盘上的小写,将让你打在钢琴上对应的按键。使用鼠标玩这个游戏。

0
0
发表了博客
07/03 08:46

使用钢琴键盘作为电脑键盘[关闭] - Using a piano keyboard as a computer keyboard [closed]

问题: I have RSI problems and have tried 30 different computer keyboards which all caused me pain. 我有RSI问题,并尝试了30种不同的电脑键盘,这些都给我带来了痛苦。 Playing piano does not cause me ......

0
0
发表了博客
04/28 08:23

使用钢琴键盘作为电脑键盘[关闭] - Using a piano keyboard as a computer keyboard [closed]

问题: I have RSI problems and have tried 30 different computer keyboards which all caused me pain. 我有RSI问题,并尝试了30种不同的电脑键盘,这些都给我带来了痛苦。 Playing piano does not cause me ......

0
0
发表了博客
2018/08/09 11:09

Java 多态总结

主要说一下遇到的很有意思的问题,具体的多态看上篇,应该就能理解多态了,这篇主要讲述遇到的另外一个有意思的机制 package work0808; class Wtf { String name; public void sound(Guitar g) { System.out.println("用吉他演奏"); } public void sound(Piano p) { System.out.println("用钢琴演奏"); } public void s...

0
0
10/31 08:45

黑白键上的字节跳动:全球最大钢琴MIDI数据集背后的故事

在上海纽约大学的 Music X Lab,一架自动演奏钢琴正在播放古典钢琴独奏曲《钟》。原本只有两个人的实验室里,不断有人循着钢琴声加入,大家安静地听着,直至曲终。 听众里的孔秋强来自字节跳动,作为 GiantMIDI-...

0
0
发表了博客
10/28 08:45

万余首钢琴作品一千多小时,字节跳动发布全球最大钢琴MIDI数据集

  机器之心专栏   机器之心编辑部    近期,字节跳动发布全球最大的古典钢琴数据集 GiantMIDI-Piano,包括来自 2,784 位作曲家 10,854 首作品的 MIDI 文件,总时长为 1,237 小时。研究者为完成该数据集的构建,开发并开源了一套高精度钢琴转谱系统。   钢琴转谱是一项将钢琴录音转为音乐符号(如 MIDI 格式)的任...

0
0
发表了博客
10/28 07:33

万余首钢琴作品、一千多个小时,字节跳动发布全球最大钢琴MIDI数据集 - 知乎

近期,字节跳动发布全球最大的古典钢琴数据集 GiantMIDI-Piano,包括来自 2,784 位作曲家 10,854 首作品的 MIDI 文件,总时长为 1,237 小时。研究者为完成该数据集的构建,开发并开源了一套高精度钢琴转谱系统。 钢琴转谱是一项将钢琴录音转为音乐符号(如 MIDI 格式)的任务。在人工智能领域,钢琴转谱被类比于音乐领域...

0
0
发表了博客
2018/01/13 15:49

《MuseGAN: Multi-track Sequential Generative Adversarial Networks for Symbolic Music Generation an...

出处:2018 AAAI SourceCode:https://github.com/salu133445/musegan abstract: (写得不错 值得借鉴)重点阐述了生成音乐和生成图片,视频及语音的不同。首先音乐是基于时间序列的;其次音符在和弦、琶音(arpeggios)、旋律、复音等规则的控制之下的;同时一首歌曲是多track的。总之不能简单堆叠音符。本文基于GAN提出...

0
0
发表于大前端专区
2019/08/10 23:36

用键盘8个键演奏一首蒲公英的约定送给自己或者一首月亮代表我的心送给她

> 体验地址: https://wscats.github.io/piano/build/ > 项目地址: https://github.com/Wscats/piano 用键盘8个键演奏一首蒲公英的约定送给996的自己或月亮代表我的心给七夕的她,非常简单~ 这个项目仅仅用了几个...

0
0
发表于软件架构专区
2019/10/07 22:38

【Rust日报】 2019-10-07:Async 基础设施差不多了,是时候抛光打磨了

piano-rs - 在终端下多人同时弹钢琴 通信使用 UDP socket 实现,用键盘弹钢琴。 我惊叹的是,作者的想象力和愿意做这些“无聊”的事情的能力。 Repo: https://github.com/ritiek/piano-rs Mun - 用 Rust 写的语言...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
39 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部