关闭

【用Cocos Creator给暗恋的女生写一个游戏(9)】——(Run Game) 游戏逻辑与碰撞检测

标签: 游戏CocosCreator教程实战
1968人阅读 评论(2) 收藏 举报
分类:

至此为止,我们已经把主要的技术问题都解决了,现在我们给游戏添加
具体的逻辑

给主角添加碰撞组件

这里写图片描述

回顾一下我们已经添加的碰撞组件的节点

管子兄弟:tag=333

管子哥哥和管子弟弟:tag=3331

大老公:tag=666

主角可以跟它们产生碰撞,碰撞的效果如下

管子兄弟:(离开时)加分(相当于已经跳过了一组管子)

管子哥哥或者管子弟弟:主角死亡,游戏失败

大老公:能量槽加1,大老公销毁

完善主角逻辑,重新修改如下

Player.js

var STATE = cc.Enum({
NONE:0,
NORMAL:1,
SUPER:2,
DEAD:3,
});
cc.Class({
    extends: cc.Component,

    properties: {
        oSpeedX:0,
        superSpeedX:0,
        gravity:0,
        jumpSpeed:0,
        groundY:0,
        state:{
            default:STATE.NONE,
            type:STATE,
            visible:false,//属性面板不显示
        }
    },

    init: function (game) {
        this.game = game;
        this.speedY = 0;
        this.speedX = this.oSpeedX;
        this.state = STATE.NORMAL;
        this.registerInput();
        //cc.director.getCollisionManager().enabled = true;
    },

    onCollisionEnter:function(other,self){
        if(this.state == STATE.NORMAL){
            if(other.tag == 666){
                this.game.gainEnergy();
                this.game.prefabManager.desStar(other.node);
            }
            if(other.tag == 3331){
                this.die();
            }
        }
    },

    onCollisionExit:function(other,self){
        if(other.tag == 333){
            this.game.gainScore();
        }
    },

    registerInput: function(){
        let self = this;
        //键盘事件
        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyPressed: function(keyCode, event) {
                if(keyCode == cc.KEY.back){
                    cc.director.loadScene("Menu");
                }else{
                    self.jump();
                }
            }
        }, self.node);
        //触摸事件
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            onTouchBegan: function(touch, event) {
                self.jump();
            }
        }, self.node);
    },

    jump:function(){
        this.speedY = this.jumpSpeed;  
    },

    strengthen:function(){
        this.state = STATE.SUPER;
        this.node.color = cc.Color.RED;
        this.speedX = this.superSpeedX;
        //5秒超级速度,2秒普通速度进行缓冲,一共7秒无敌
        let self = this;
        var cache = function(){
            self.speedX = self.oSpeedX;
        }
        this.scheduleOnce(cache,5);
        this.scheduleOnce(this.recover,7);
    },

    recover:function(){
        this.state = STATE.NORMAL;
        this.node.color = cc.Color.WHITE;
        this.oSpeedX += 10;//给游戏加一点难度
        this.speedX = this.oSpeedX;
        this.game.energyBar.progress = 0;
        this.game.energyBar.node.getChildByName("Bar").color = cc.Color.GREEN;
    },

    die:function(){
        this.state = STATE.DEAD;  
        this.node.color = cc.Color.BLACK;
        this.game.stopGame();
    },

    update: function (dt) {
        if(this.state != STATE.NONE && this.state != STATE.DEAD){
            this.speedY -= this.gravity * dt;
            this.node.y += this.speedY * dt;
            if(this.node.y <= this.groundY){
                this.node.y = this.groundY;
            }
            this.game.cameraManager.moveBg(this.speedX * dt);
        }
    },
});

Game.js

var Player = require("Player");
var CameraManager = require("CameraManager");
var PrefabManager = require("PrefabManager");
cc.Class({
    extends: cc.Component,

    properties: {
        player:Player,
        cameraManager:CameraManager,
        prefabManager:PrefabManager,
        energyBar:cc.ProgressBar,
        scoreLabel:cc.Label,
        gameOverMenu:cc.Node,
        overScore:cc.Label,
    },

    onLoad: function () {
        //返回键返回菜单
        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyPressed: function(keyCode, event) {
                if(keyCode == cc.KEY.back){
                    cc.director.loadScene('Menu');
                }
            }
        }, this.node);
        this.startGame();
    },

    startGame: function(){
        cc.director.getCollisionManager().enabled = true;
        this.energyBar.progress = 0;
        this.score = 0;
        this.scoreLabel.string = "0m"
        this.cameraManager.init(this);
        this.prefabManager.init(this);
        this.player.init(this);
    },

    stopGame: function(){
        cc.director.getCollisionManager().enabled = false;
        this.gameOverMenu.active = true;
        this.overScore.string = this.score+"m";
    },

    gainScore: function(){
        this.score += 10;
        this.scoreLabel.string = this.score+"m";
    },

    gainEnergy:function(){
        this.energyBar.progress += 0.1;
        if(this.energyBar.progress > 0.9){
            this.energyBar.node.getChildByName("Bar").color = cc.Color.RED;
            this.player.strengthen();
        }
    },

    restartGame: function(){
        cc.director.loadScene("RunGame");
    },

    returnMenu: function(){
        cc.director.loadScene("Menu");
    },
});

最终效果

这里写图片描述

结束菜单

这里写图片描述

至此,我们的第一个小游戏就结束了

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【用Cocos Creator给暗恋的女生写一个游戏(1)】——Cocos Creator初遇见

X去网上百度了一下怎样快速开发一款手机游戏,却发现前几条都是广告,后来还是了解到了游戏引擎,知道了Cocos和Unity,据说市面上大多数手游都是Cocos做的,所以他决定尝试一下,他去官网下载了Co...
  • potato47
  • potato47
  • 2016-08-28 22:42
  • 2000

【用Cocos Creator给暗恋的女生写一个游戏(7)】——(Run Game)背景移动

新建CameraManager.js添加到在Game的子节点CameraManager下CameraManager.jscc.Class({ extends: cc.Component, ...
  • potato47
  • potato47
  • 2016-08-29 07:47
  • 1525

CocosCreator学习1:做一个简单的游戏

把计步器写好了,到了写游戏场景、控件什么的时候,傻眼了。想做一个简单的地图,可以在地图上点击选择城市,发现用Cocos2D-X代码码出来好麻烦,尤其是城市位置问题,需要调试去找对像素区域做一个按钮控制...
  • lin453701006
  • lin453701006
  • 2017-02-20 21:41
  • 4789

CocosCreator零基础制作游戏《极限跳跃》二、制作游戏开始场景

转自:http://www.byjth.com/CocosCreator/67.html CocosCreator零基础制作游戏《极限跳跃》二、制作游戏开始场景 我们刚刚分...
  • gf771115
  • gf771115
  • 2017-12-16 16:04
  • 518

Unity3D游戏开发之简单的碰撞检测

在“Project”面板中单击“Create”旁边的小三角,选择“javascript”创建一个名为“collision”的js文件。双击它,系统启动Monodevelop来编辑js文件。     ...
  • xfnjlove
  • xfnjlove
  • 2014-06-03 19:20
  • 1801

微信打飞机游戏(小时候玩的雷电)使用cocos creator制作,讲解具体js代码实现

使用cocos creator制作微信打飞机游戏,代码详解
  • xzl159
  • xzl159
  • 2017-07-26 09:58
  • 901

【用Cocos Creator给暗恋的女生写一个游戏(6)】——(Run Game)主角逻辑

我们在Canvas节点的同级添加一个Game节点,并添加两个子节点如图新建一个脚本取名叫做“Game”并添加到Game节点上Game.jsvar Player = require("Player");...
  • potato47
  • potato47
  • 2016-08-29 07:44
  • 1634

android游戏物理引擎开发——碰撞检测(三)

碰撞检测什么游戏都会用到,FPS游戏里的子弹和角色的碰撞,角色扮演里角色之间的碰撞,角色和环境之间的碰撞~太多了~我先给大家做一个碰撞基础知识的介绍,然后给大家细讲一下碰撞中的矩形碰撞!介绍这个的原因...
  • lxtalx
  • lxtalx
  • 2013-11-21 20:56
  • 3036

Java游戏之碰撞检测

Java游戏之碰撞检测在进行Java游戏开发时,我们经常会遇到碰撞检测的问题。如坦克大战中,炮弹与坦克相遇发生爆炸;守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血;打飞机游戏中,飞机发送的子弹与敌机...
  • zhliro
  • zhliro
  • 2015-05-18 23:49
  • 921

Android 游戏检测碰撞方法:多种检测碰撞的定义及说明

Android 游戏检测碰撞方法:多种检测碰撞的定义及说明
  • u010779977
  • u010779977
  • 2014-06-26 09:30
  • 1044
    个人资料
    • 访问:189052次
    • 积分:2583
    • 等级:
    • 排名:第16362名
    • 原创:71篇
    • 转载:8篇
    • 译文:0篇
    • 评论:175条
    最新评论