关于碰撞检测

creator系统自带了一个碰撞检测系统,不过好像只能检测组件之间的碰撞?我最近在写一个飞机游戏,里面的子弹使用的是自定义的cc.class类,继承的是节点
var bullet = cc.Class({
extends: cc.Node
})
类似这样的,请问这样创建出来的对象能使用自带的碰撞检测系统吗?

添加碰撞组件就可以了

不行啊,好像必须在组件下才能得到碰撞检测的回调函数,如果是两个对象都是通过代码创建的,就不能检测到,至少有一方得是组件对象才行

任何组件都是可以通过cc.Node对象的addComponent方法挂载到节点上的

看代码吧还是,这是我的子弹类

var bulletBase = cc.Class({
    extends: cc.Node,

    properties: {
        speed : cc.v2(0, 1) //子弹速度
    },
    
    ctor: function() {
        this.sprite = this.addComponent(cc.Sprite);
        this.sprite.spriteFrame = loadRes.getSpriteAtlasFrameRes("role/bullet_lv", "1_1");
        this.spriteSize = this.getContentSize();
        
        this.group = "playerBullet";
        
        //碰撞检测开始
        var manager = cc.director.getCollisionManager();
        manager.enabled = true;
        
        var box = this.addComponent(cc.BoxCollider);
    },
    
    //替换精灵
    replaceSpriteFrame: function(spriteFrameName) {
        this.sprite.spriteFrame = loadRes.getSpriteAtlasFrameRes("role/bullet_lv", spriteFrameName);
        this.spriteSize = this.getContentSize();
    },
    
    //发射子弹
    fireBullet: function() {
        this._sgNode.schedule(this.bulletMove.bind(this), 0.02);
    },
    
    //子弹移动
    bulletMove: function() {
        var position = cc.pAdd(this.getPosition(), this.speed);
        if (position.y >= cc.winSize.height * 0.5 + this.spriteSize.height * 0.5) {
            this.destory();
        }
        else {
            this.setPosition(position);
        }
    },
    
    //销毁子弹
    destory: function() {
        this._sgNode.unscheduleAllCallbacks();
        this.removeFromParent();
    },
    
    onCollisionEnter: function(other, self) {
        cc.log(other);
        cc.log(self);
        cc.log("pengzhuang");
    },
});

module.exports = bulletBase;

这样可以检测吗,我在画布上拖拽了一个精灵组件enemy,分组为enemy,然后playerbullet和enemy这两个分组是检测碰撞的,在enemy组件下添加了一个脚本组件,在这个脚本组件里是可以检测到和子弹的碰撞,子弹类里应该怎么操作才能检测碰撞

@panda 请大神帮个忙

同时我也在尝试将子弹类改成prefab类型

现在你的代码不能检测碰撞吗?

子弹类,就是我上面贴的代码不可以,外面拖拽的精灵组件下的js脚本里面可以检测到

你的子弹类是怎么创建对象的?

new出来的
var bulletBase = require(“bulletBase”);
var bullet = new bulletBase();

this.node.group = “playerBullet”; 这样吧

1赞

我继承的cc.Node,不用加.node,而且我也说了,我这样已经实现碰撞,在敌人那里可以检测到碰撞,只是子弹类检测不到,子弹继承的cc.Node,敌人继承的cc.Component,可能问题在这里

不行,事件只会分发到 component 中,你可以挂一个 bullet component 来接收

果然是这样吗,谢谢了,大概猜到这里的问题了

请问下 这样实例化子弹后 ,怎么添加到节点上,这个bullet 应该是一个ccclass类型不是cc.Node类型吧 怎么add进去

哇…好久没上了,没想到都好几个月了还有人问,是这样,cc.Class是个api,是用来声明类的,属于cocos creator里面的方法,创建的同时可以选择继承,而编辑器里面右键创建的javaScript里面默认是继承组件类的:extends: cc.Component,而我的子弹是继承的节点类:extends: cc.Node,这样new出来的对象是节点类型的,可以直接add上去的