cocos creator制作微信小游戏【跳一跳】

一、游戏的分析(之前没有接触过小游戏,制作的思维还停留在大型ARPG游戏大家共同协作的想法里,但是小游戏讲究小而全,大部分时间是一个人独立开发,所以需要迫使自己养成看到小游戏先拆分细化的思想)

二、一些必要的参数

台阶参数

1: 设置分辨率: 720x1280

2: 台阶的原点:

3: 配置好4个中心点,如果跳到就到4个中心点,否则就失败;

4: 编写代码获得中心点的位置,来初始化Player;

5: 斜率: 0.5560472, 与平行四边形相当;

6: 块开始的世界坐标的位置: (180, 350)

参数

1: 监听事件,开启蓄积能量, 2秒缩放到0.5;

2: 0.5秒内,scale变形到1;

3: 0.5秒内, 旋转一周;

4: 0.5秒内,跳跃到目的地;

5: 能量蓄积: 加速度: power: 600, 初始化: 150;

this.speed += dt * this.power;

this.jumpDistance += this.speed * dt;

6:带上拖尾:

MotionStreak组件: 配置好图片;(引擎bug,父节点移动,带有拖尾的子节点显示效果就会有问题,待解决)

7: ancher_offset: 100

8: 生成地图: 200, 400的距离随机

9: 地图滚动参数: y, 随着玩家滚动, x 取最左值和最右值(180, 580);

10:开始位置(180, 350)


三、实现的步骤

1 调整好player,具有旋转和压缩两个动画

2 实现跳跃,前置条件是有东西可跳,所以要先制作两个块

3 制作块,设置块的原点,中心点,前后左右点(主要是做跳跃检测,使用小色块),currBlock nextBlock

4 开始写game_scene.js脚本

绑定player和block

固定第一个block(坐标转换)

添加第二个block (add_block方法)

5 调整第一个块和player的位置

6 实现player的跳跃方法player_jump,以及block的检测方法is_jump_on_block

7 实现地图滚动方法move_map

8 完善游戏代码


四、代码

game_scene.js

//game_scene.js

cc.Class({

    extends: cc.Component,

    properties: {

        // foo: {

        //     // ATTRIBUTES:

        //     default: null,        // The default value will be used only when the component attaching

        //                           // to a node for the first time

        //     type: cc.SpriteFrame, // optional, default is typeof default

        //     serializable: true,   // optional, default is true

        // },

        // bar: {

        //     get () {

        //         return this._bar;

        //     },

        //     set (value) {

        //         this._bar = value;

        //     }

        // },

        player: {

            type: cc.Node,

            default: null

        },

        block_prefabs: {

            type: cc.Prefab,

            default: []

        },

        block_root: {

            default: null,

            type: cc.Node

        },

        left_org: cc.v2(0, 0),

        map_root: {

            default: null,

            type: cc.Node

        },

        y_radio: 0.5560472,

        checkout: {

            type: cc.Node,

            default: null

        }

    },

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {},

    start() {

        this.block_list = [];

        this.cur_block = cc.instantiate(this.block_prefabs[Math.floor(Math.random() * this.block_prefabs.length)]);

        this.block_root.addChild(this.cur_block);

        // 将第一个块的位置设置为初始位置

        this.cur_block.setPosition(this.block_root.convertToNodeSpaceAR(this.left_org));

        var w_pos = this.cur_block.getChildByName('mid').convertToWorldSpaceAR(cc.v2(0, 0));

        this.player.setPosition(this.map_root.convertToNodeSpaceAR(w_pos));

        this.next_block = this.cur_block;

        this.player_comp = this.player.getComponent("player");

        this.block_zOrder = -1;

        this.add_block();

    },

    add_block: function() {

        this.cur_block = this.next_block;

        this.next_block = cc.instantiate(this.block_prefabs[Math.floor(Math.random() * this.block_prefabs.length)]);

        this.block_root.addChild(this.next_block);

        this.next_block.zIndex = this.block_zOrder;

        this.block_zOrder--;

        var x_distance = 200 + Math.random() * 200;

        var y_distance = x_distance * this.y_radio;

        var next_pos = this.cur_block.getPosition();

        next_pos.x += x_distance * this.player_comp.direction;

        next_pos.y += y_distance;

        this.next_block.setPosition(next_pos);

        this.player_comp.set_next_block(this.next_block.getComponent("block"));

        // 删除block

        this.block_list.push(this.next_block);

        if (this.block_list.length >= 5) {

            for (var i = 0; i < 2; i++) {

                var block = this.block_list.shift();

                block.destroy();

            }

        }

    },

    // 地图滚动

    move_map(offset_x, offset_y) {

        var m1 = cc.moveBy(0.5, offset_x, offset_y);

        var end_func = cc.callFunc(function() {

            this.add_block();

        }.bind(this));

        var seq = cc.sequence([m1, end_func]);

        this.map_root.runAction(seq);

    },

    on_checkout_game: function() {

        this.checkout.active = true;

    },

    on_game_again: function() {

        cc.director.loadScene("game_scene");

    },

    // update (dt) {},

});

player.js

// player.js

var game_scene = require("game_scene");

cc.Class({

    extends: cc.Component,

    properties: {

        // foo: {

        //     // ATTRIBUTES:

        //     default: null,        // The default value will be used only when the component attaching

        //                           // to a node for the first time

        //     type: cc.SpriteFrame, // optional, default is typeof default

        //     serializable: true,   // optional, default is true

        // },

        // bar: {

        //     get () {

        //         return this._bar;

        //     },

        //     set (value) {

        //         this._bar = value;

        //     }

        // },

        init_speed: 150,

        a_power: 600,

        y_radio: 0.5560472,

        game_manager: {

            type: game_scene,

            default: null

        },

    },

    // LIFE-CYCLE CALLBACKS:

    onLoad() {

        this.next_block = null;

        this.direction = 1;

    },

    start() {

        this.rot_node = this.node.getChildByName("rotate");

        this.anima_node = this.rot_node.getChildByName("anima");

        this.is_power_mode = false;

        this.speed = 0;

        this.x_distance = 0;

        this.anima_node.on(cc.Node.EventType.TOUCH_START, function(e) {

            this.is_power_mode = true;

            this.x_distance = 0;

            this.speed = this.init_speed;

            this.anima_node.stopAllActions();

            this.anima_node.runAction(cc.scaleTo(2, 1, 0.5));

        }.bind(this), this);

        this.anima_node.on(cc.Node.EventType.TOUCH_END, function(e) {

            this.is_power_mode = false;

            this.anima_node.stopAllActions();

            this.anima_node.runAction(cc.scaleTo(0.5, 1, 1));

            this.player_jump();

        }.bind(this), this);

        this.anima_node.on(cc.Node.EventType.TOUCH_CANCEL, function(e) {

            this.is_power_mode = false;

            this.anima_node.stopAllActions();

            this.anima_node.runAction(cc.scaleTo(0.5, 1, 1));

            this.player_jump();

        }.bind(this), this);

    },

    update(dt) {

        if (this.is_power_mode) {

            this.speed += (this.a_power * dt);

            this.x_distance += this.speed * dt;

        }

    },

    player_jump: function() {

        var x_distance = this.x_distance * this.direction;

        var y_distance = this.x_distance * this.y_radio;

        var target_pos = this.node.getPosition();

        target_pos.x += x_distance;

        target_pos.y += y_distance;

        // 跳跃时候旋转

        this.rot_node.runAction(cc.rotateBy(0.5, -360 * this.direction));

        var w_pos = this.node.parent.convertToWorldSpaceAR(target_pos);

        var is_game_over = false;

        if (this.next_block.is_jump_on_block(w_pos, this.direction)) {

            target_pos = this.node.parent.convertToNodeSpaceAR(w_pos);

        } else {

            is_game_over = true;

        }

        var j = cc.jumpTo(0.5, target_pos, 200, 1);

        this.direction = (Math.random() < 0.5) ? -1 : 1;

        var end_func = cc.callFunc(function() {

            if (is_game_over) {

                this.game_manager.on_checkout_game();

            } else {

                if (this.direction === -1) {

                    this.game_manager.move_map(580 - w_pos.x, -y_distance);

                } else {

                    this.game_manager.move_map(180 - w_pos.x, -y_distance);

                }

            }

        }.bind(this));

        var seq = cc.sequence(j, end_func);

        this.node.runAction(seq);

    },

    set_next_block(block) {

        this.next_block = block;

    },

});

block.js

// block.js

cc.Class({

    extends: cc.Component,

    properties: {

        // foo: {

        //     // ATTRIBUTES:

        //     default: null,        // The default value will be used only when the component attaching

        //                           // to a node for the first time

        //     type: cc.SpriteFrame, // optional, default is typeof default

        //     serializable: true,   // optional, default is true

        // },

        // bar: {

        //     get () {

        //         return this._bar;

        //     },

        //     set (value) {

        //         this._bar = value;

        //     }

        // },

    },

    start() {

        this.mid = this.node.getChildByName("mid");

        this.up = this.node.getChildByName("up");

        this.down = this.node.getChildByName("down");

        this.left = this.node.getChildByName("left");

        this.right = this.node.getChildByName("right");

    },

    // dir 1右跳 -1左跳

    is_jump_on_block(w_dst_pos, direction) {

        var mid_pos = this.mid.convertToWorldSpaceAR(cc.v2(0, 0));

        var dir = w_dst_pos.sub(mid_pos);

        var min_len = dir.mag();

        var min_pos = mid_pos;

        if (direction === 1) {

            var up_pos = this.up.convertToWorldSpaceAR(cc.v2(0, 0));

            dir = w_dst_pos.sub(up_pos);

            var len = dir.mag();

            if (min_len > len) {

                min_len = len;

                min_pos = up_pos;

            }

            var down_pos = this.down.convertToWorldSpaceAR(cc.v2(0, 0));

            dir = w_dst_pos.sub(down_pos);

            var len = dir.mag();

            if (min_len > len) {

                min_len = len;

                min_pos = down_pos;

            }

        } else {

            var left_pos = this.left.convertToWorldSpaceAR(cc.v2(0, 0));

            dir = w_dst_pos.sub(left_pos);

            var len = dir.mag();

            if (min_len > len) {

                min_len = len;

                min_pos = left_pos;

            }

            var right_pos = this.right.convertToWorldSpaceAR(cc.v2(0, 0));

            dir = w_dst_pos.sub(right_pos);

            var len = dir.mag();

            if (min_len > len) {

                min_len = len;

                min_pos = right_pos;

            }

        }

        // 找到跳跃位置距离参考点最近的那个点以及位置

        dir = w_dst_pos.sub(min_pos);

        if (dir.mag() < 100) {

            w_dst_pos.x = min_pos.x;

            w_dst_pos.y = min_pos.y;

            return true;

        }

        return false;

    },

});点击链接加入群聊【cocos/unity交流群】

来源:博客园

声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容