Cocos Creator 开发实战——射线测试

 近期写了一款基于射线测试的小游戏,本篇会介绍射线测试知识和一些坑,保证大家会用并且避免引擎bug。
       国际惯例先上效果

射线测试基础知识
       先看一遍官网,在页面的最下面部分。射线测试需要用到物理引擎,接下来开始教学。

开启物理引擎
       物理系统默认是关闭的,如果需要使用物理系统,那么首先需要做的事情就是开启物理系统,否则你在编辑器里做的所有物理编辑都不会产生任何效果。

onLoad () {
cc.director.getPhysicsManager().enabled = true;
},

添加物理碰撞物体
添加组件

用到的是物理引擎 添加的碰撞体必须是物理组件里的碰撞体
添加组件-》物理组件-》Collider组件-》Box
       type设置撑Static
       否则会有重力自己下落

通过触摸点触发射线测试
代码挂载在Canvas节点下

onLoad () {
cc.director.getPhysicsManager().enabled = true;
//添加触摸监听 通过触摸点讲解射线测试
this.node.on(‘touchstart’, this.TouchStart, this)
},

TouchStart (event) {
//获得触摸点本地坐标位置
let p1 = event.getLocation()
//射线测试结束点位置 从开始点向右发射:x坐标增加1000 射线测试
let p2 = cc.v2(p1.x+1000, p1.y)
this.rayTest(p1, p2)
},

rayTest (p1, p2) {
var results = cc.director.getPhysicsManager().rayCast(p1, p2, cc.RayCastType.Closest);

for (var i = 0; i < results.length; i++) {
    //两点之间检测出来的点的数组
    var result = results[i];
    //射线穿过的是哪一个碰撞体。
    var collider = result.collider;
    //射线穿过的碰撞体的世界坐标
    var point = result.point;
    //碰撞体在相交点的表面的法线向量。
    var normal = result.normal;
    //相交点在射线上的分数。
    var fraction = result.fraction;
    //打印出碰撞点的坐标
    cc.log('point:', point)
}

},

检测类型介绍

cc.RayCastType.Any
检测射线路径上任意的碰撞体,一旦检测到任何碰撞体,将立刻结束检测其他的碰撞体,最快。

cc.RayCastType.Closest
检测射线路径上最近的碰撞体,这是射线检测的默认值,稍慢。

cc.RayCastType.All
检测射线路径上的所有碰撞体,检测到的结果顺序不是固定的。在这种检测类型下一个碰撞体可能会返回多个结果,这是因为 box2d 是通过检测夹具(fixture)来进行物体检测的,而一个碰撞体中可能由多个夹具(fixture)组成的,慢。更多细节可到 物理碰撞组件 查看。

cc.RayCastType.AllClosest
检测射线路径上所有碰撞体,但是会对返回值进行删选,只返回每一个碰撞体距离射线起始点最近的那个点的相关信息,最慢

result返回值介绍

实际开发过程中的坑

cc.director.getPhysicsManager().rayCast(p1, p2, cc.RayCastType.Closest);
1
       这句话会出现bug,原因是因为运行加载的时候物理引擎这部分没有加载完成,所以底层封装的变量没有new出来。
       解决方法: 加一个计时器。

this.schedule(function() {
this.rayTest()
}, 0.01);
1
2
3
结果

在这基础上增加表现形式
创建一个星星 检测到射线测试的点 自动移动到检测点的位置

拖拽进入场景

移动
properties: {
m_star: cc.Node,
},

       拖入星星

rayTest (p1, p2) {
    var results = cc.director.getPhysicsManager().rayCast(p1, p2, cc.RayCastType.Closest);

    for (var i = 0; i < results.length; i++) {
        //两点之间检测出来的点的数组
        var result = results[i];
        //射线穿过的是哪一个碰撞体。
        var collider = result.collider;
        //射线穿过的碰撞体的世界坐标
        var point = result.point;
        //碰撞体在相交点的表面的法线向量。
        var normal = result.normal;
        //相交点在射线上的分数。
        var fraction = result.fraction;

        // cc.log('point:', point)

        //世界坐标转成当前节点坐标
        let localPos = this.node.convertToNodeSpaceAR(point)
        //移动
        this.m_star.runAction(cc.moveTo(1,localPos))

    }
},


结果

————————————————
版权声明:本文为CSDN博主「游戏创造者黄昱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/creator_HY/article/details/104074282

CocosCreator中加入webSocket的使用

前言

使用WebSocket作为网络连接的方式,简单的使用文本传输,使用onfire做事件的分发,可以替换NetControl里面的websocket实现为socket和其他网络方案,只要修复onfire的激发,基本不用该游戏代码。

新建一个配置类

  • NetConfig.js
  • 用于配置网络的相关内容
  • 当前只有host port
  • 还可以配置其他的内容
/**
 * 当前的网络配置
 */
module.exports={
    host:"ws://localhost",
    port:9000

};

新建一个网络控制类

//定义全局的变量
window.onfire=require("onfire");           //处理事件的类库
var netConfig=require('NetConfig');
var NetControl={
    _sock:{},  //当前的webSocket的对象
    connect: function () {
        if(this._sock.readyState!==1){
            //当前接口没有打开
            //重新连接
            this._sock = new WebSocket(netConfig.host+":"netConfig.port); 
            this._sock.onopen = this._onOpen.bind(this);
            this._sock.onclose = this._onClose.bind(this);
            this._sock.onmessage = this._onMessage.bind(this);
        }
        return this;
    },

    _onOpen:function(){
        onfire.fire("onopen");
    },
    _onClose:function(err){
        onfire.fire("onclose",err);
    },
    _onMessage:function(obj){

        onfire.fire("onmessage",obj);
    },

    send:function(msg){
        this._sock.send(msg);
    },

};

module.exports=NetControl;

引入一个onfire类库

项目地址:
https://github.com/hustcc/onfire.js535

  • 主要用于注册和分发webSocket的事件
  • 自己用listener写也是可以的
  • 不过 有类库干嘛不用呢

下面是onfire的例子

import onfire from 'onfire.js';

function test_callback(data1, data2) {
    console.log('this is a event 1');
}

// bind event and callback
var eventObj = onfire.on('test_event', test_callback);
var eventObj2 = onfire.on('test_event', function(data1, data2) {
    console.log('this is a event 2');
});

// fire event
onfire.fire('test_event', 'test_data1', 'test_data2');

// cancel bind event
onfire.un(eventObj); // only cancel the eventObj.
onfire.un('test_event'); // cancel all events named `test_event`.
onfire.un(test_callback); // cancel all the `test_callback` functions.

使用方法

  1. 拖入onfire.js到assert文件夹内导入类库
    不用导入为插件…
  2. 引入类库
var netControl=require('NetControl');
  1. 连接网络加入监听(可以多次注册同一方法)
netControl.connect();
this.msssageFire=onfire.on("onmessage",this.onMessage.bind(this));
  1. 本地监听方法
onMessage:function(obj){
    console.log("It's HelloWorld onMessage----->"+obj);
}
  1. 发送数据
var jsonTmp = "{ \"Mobile\": \"" + 121212 + "\", \"Password\": \"" + 121313454545 + "\" }"; 
netControl.send("1010" + jsonTmp);
console.log("sendToWS");
  1. 销毁事件的注册
onDestroy:function(){
    onfire.un(this.msssageFire);

}

原文地址:http://allknowboy.com/posts/e8f856f4/767

Centos卸载gcc

(1)查看安装的gcc版本

[y@localhost Desktop]

$ rpm -q gcc
gcc-4.4.7-23.el6.x86_64
1
2
3
(2)执行卸载命令 rpm -e

[y@localhost Desktop]

$ rpm -e gcc-4.4.7-23.el6.x86_64
error: Failed dependencies:
gcc = 4.4.7-23.el6 is needed by (installed) gcc-c++-4.4.7-23.el6.x86_64
gcc = 4.4.4 is needed by (installed) libtool-2.2.6-15.5.el6.x86_64
1
2
3
4
5
提示gcc-4.4.7-23.el6.x86_64被2个软件依赖,卸载失败,则先卸载被依赖的软件包

sudo rpm -e gcc-c++-4.4.7-23.el6.x86_64
sudo rpm -e libtool-2.2.6-15.5.el6.x86_64
1
2
(4)再执行sudo rpm -e gcc-4.4.7-23.el6.x86_64进行卸载

sudo rpm -e gcc-4.4.7-23.el6.x86_64
1
卸载成功
(5) 验证,输入gcc -v

[y@localhost Desktop]

$ gcc -v
bash: gcc: command not found
1
2
3
提示command not found,说明的确卸载成功了。
————————————————
版权声明:本文为CSDN博主「yzpyzp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yzpbright/java/article/details/81568830

cenos 升级 g++ gcc(cc1plus: error: unrecognized command line option “-std=c++11”)

Building with ‘g++’.
Error using mex
cc1plus: error: unrecognized command line option “-std=c++11”
1、下载源码

在这里,稳妥起见,选择了4.8.5,如果需要别的版本,改掉版本号就好了,可以去GCC官网查看

$ wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
2、下载依赖包 & 预安装

编译安装 GCC 需要依赖 mpc,mpfr,gmp包。好在 GCC 源码里自带脚本可以轻松下载依赖包。

$ tar zxf gcc-4.8.5.tar.gz
$ cd gcc-4.8.5
$ ./contrib/download_prerequisites

在此脚本里可以看到依赖包的版本号依次是 mpc-0.8.1,mpfr-2.4.2,gmp-4.3.2。

3、$ yum -y install glibc-devel.i686 –setopt=protected_multilib=false

4、编译安装

$ cd ..     //这样做的原因主要是要在源代码外建立build文件夹
$ mkdir gcc-build-4.8.5
$ mkdir /usr/local/gcc-4.8.5   //放置的是 include 文件。
$ mkdir /usr/local/gcc         //放置的是 bin + lib 文件
$ cd gcc-build-4.8.5
$ ../gcc-4.8.5/configure   –prefix=/usr/local/gcc-4.8.5 –exec-prefix=/usr/local/gcc –enable-languages=c,c++   //为了节省时间,这里只编译c和c++的
$ make && make install
为了避免安装后系统里出现多个版本的 GCC,这里直接将编译安装的目录指定为 /usr/local/gcc-4.8.5和/usr/local/gcc下,如果不指定 –prefix,则会默认安装到/usr/local下。

等待

make以后,漫长的等待,搞定

5、环境变量配置

将 gcc/g++改名,留存旧版本

$ mv /usr/bin/gcc /usr/bin/gcc-4.4.7
$ mv /usr/bin/g++ /usr/bin/g++-4.4.7
$ export PATH=/usr/local/gcc/bin:$PATH # 使用最新的 gcc/g++;
确认版本号

$ g++ –version
$ gcc –version
$ which g++
$ which gcc
错误

1、Build文件夹建立到错误的位置 stubs-32.h 找不到,CentOS 是64位的

compilation terminated.
make[5]: *** [_muldi3.o] Error 1
make[5]: Leaving directory `/home/wei/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/32/libgcc’
…………
解决方法:安装 32 位的 glibc-devel,后面的参数是忽略某个软件的多版本问题。

$ yum -y install glibc-devel.i686 –setopt=protected_multilib=false

这个错主要原因是新建的build文件夹在源代码树里,需要在另外独立的文件夹使用。  解决方法是:在源代码外新建了文件夹,解决后的代码已经更新到上面了。

First, we highly recommend that GCC be built into a separate directory from the sources whichdoes not reside within the source tree. This is how we generally build GCC; building where srcdir == objdir should still work, but doesn’t get extensive testing; building where objdir is a subdirectory of srcdir is unsupported.