今天要学习的内容时LineJoint线段关节,通过线段关节,我们可以限制刚体在某个指定的方向上来回移动。就像算珠只能在算盘的轴上移动一样。

老规矩,我们先来看一下LineJoint的构造函数:

public function LineJoint(

body1:Body,

body2:Body,

anchor1:Vec2,

anchor2:Vec2,

direction:Vec2,

jointMin:Number,

jointMax:Number):void

每个参数的作用说明如下:

body1:和其他的关节一下,关节连接的第1个刚体

body2:和其他的关节一下,关节连接的第2个刚体

anchor1:连接刚体body1的节点,其坐标是相对于body1的本地坐标的

anchor2:连接刚体body2的节点,其坐标是相对于body2的本地坐标的

direction:线段关节中线条的方法,用一个Vec2向量表示

jointMin:线段上沿direction方法,距离anchor1的距离

jointMax:线段沿上direction方向,距离anchor2的距离

看完构造函数和参数说明,依然有些不知其解,看看下面的图示会更简单些:

如图所示,anchor1和anchor2是线段关节中的两个点,两点形成的线段即线段关节。线段关节的方向可以用anchor1.sub(anchor2)表示。线段起点与anchor1的距离是JointMin,终点与anchor1的距离是jonitMax;jointMin/jointMax小于0,在anchor1左侧,大于0在anchor1右侧。值得注意的是,body1可不能绕着anchor1旋转,而body2可以绕着anchor2旋转。

还记得distanceJoint示例吗?如果把示例中的刚体限制在水平方向移动,会是什么样子呢?下面的示例中,点击圆形刚体,可以在水平方向拖动,它通过一个distanceJoint关节与下面的矩形刚体连接。按下空格键”剪断”这个distanceJoint关节,让矩形落到下面的圆形范围内。有没有《割绳子》游戏里的样子呢?赶快动手试试吧!

Sorry, either Adobe flash is not installed or you do not have it enabled

完整的代码和注释如下:

package learnNape {

import ldEasyNape.LDEasyUserData;

import com.bit101.components.PushButton;

import nape.callbacks.InteractionCallback;

import nape.callbacks.InteractionType;

import nape.callbacks.CbEvent;

import nape.callbacks.InteractionListener;

import nape.callbacks.CbType;

import flash.ui.Keyboard;

import flash.events.KeyboardEvent;

import nape.constraint.DistanceJoint;

import nape.shape.Circle;

import flash.events.MouseEvent;

import nape.constraint.LineJoint;

import ldEasyNape.LDEasyNape;

import nape.phys.Body;

import nape.geom.Vec2;

import learnNape.AbstractNapeTest;

/**

* @author yangfei

*/

[SWF( width="400", height="500", frameRate="60")]

public class T19_LineJoint extends AbstractNapeTest {

private var anchorX1 : Number = 100;

private var anchorX2 : Number = 300;

private var anchorY1 : Number = 100;

private var anchorY2 : Number = 300;

private var anchorBody1 : Body;

private var anchorBody2 : Body;

private var joint1 : LineJoint;

private var joint2 : LineJoint;

private var distanceJoint : DistanceJoint;

private var box : Body;

private var sensorType : CbType;

private var boxType : CbType;

private var graphic : LDEasyUserData;

public function T19_LineJoint() {

super();

}

override protected function onNapeWorldReady() : void {

createStuff();

var sensorListener : InteractionListener = new InteractionListener(CbEvent.BEGIN, InteractionType.SENSOR, sensorType, boxType, onCollision);

napeWorld.listeners.add(sensorListener);

new PushButton(this, 280, 15, "reStart",function (e:MouseEvent):void{

box.position.setxy(anchorBody1.position.x+10, anchorY1-50);

distanceJoint.body1= anchorBody1;

distanceJoint.body2 = box;

distanceJoint.active = true;

});

}

private function createStuff():void{

var sensorShape : Circle = new Circle(50);

sensorShape.sensorEnabled = true;

sensorType = new CbType();

graphic = new LDEasyUserData();

graphic.setGraphicAuotmatically(0);

//创建上面的圆形刚体

anchorBody1 = LDEasyNape.createCircle(anchorX1, anchorY1, 10, false, false, graphic);

anchorBody1.shapes.add(sensorShape);

anchorBody1.cbTypes.add(sensorType);

//用线段关节限制anchorBody1只能在水平方向移动

var anchorStart1 : Vec2 = new Vec2(anchorX1, anchorY1);

var anchorEnd1 : Vec2 = new Vec2(anchorX2, anchorY1);

var direction1 : Vec2 = anchorEnd1.sub(anchorStart1);

joint1 = new LineJoint(napeWorld.world, anchorBody1, anchorStart1, Vec2.weak(), direction1, 0, direction1.length);

joint1.space = napeWorld;

//创建下面的刚体

anchorBody2 = LDEasyNape.createCircle(anchorX2, anchorY2, 10, false, false, graphic.clone());

anchorBody2.shapes.add(sensorShape.copy());

anchorBody2.cbTypes.add(sensorType);

//用线段关节限制anchorBody1只能在水平方向移动

var anchorStart2 : Vec2 = new Vec2(anchorX1, anchorY2);

var anchorEnd2 : Vec2 = new Vec2(anchorX2, anchorY2);

var direction2 : Vec2 = anchorEnd2.sub(anchorStart2);

joint2 = new LineJoint(napeWorld.world, anchorBody2, anchorStart2, Vec2.weak(), direction2, 0, direction2.length);

joint2.space = napeWorld;

graphic.setGraphicAuotmatically(0xFF0000,1);

box = LDEasyNape.createBox(anchorX1+10, anchorY1-50, 30, 30, false, false, graphic.clone());

boxType = new CbType();

box.cbTypes.add(boxType);

//创建距离关节,连接矩形和圆形

distanceJoint = new DistanceJoint(anchorBody1, box, Vec2.weak(), Vec2.weak(), 0, 100);

distanceJoint.space = napeWorld;

}

private function onCollision(cb: InteractionCallback):void{

var anchorBody : Body = cb.int1.castBody;

if(!anchorBody.constraints.has(distanceJoint)){

distanceJoint.body1 = anchorBody;

distanceJoint.body2 = box;

distanceJoint.active = true;

}

}

override protected function mouseEventHanlder(event : MouseEvent) : void {

if(event.type == MouseEvent.MOUSE_DOWN){

if(LDEasyNape.getBodyAtMouse()!=null ){

if(LDEasyNape.getBodyAtMouse().shapes.length<=1) return;

}

}

super.mouseEventHanlder(event);

}

override protected function keyBoardEventHanlder(event : KeyboardEvent) : void {

if(event.type != KeyboardEvent.KEY_DOWN) return;

if(event.keyCode == Keyboard.SPACE){

if(box.constraints.length>0){

box.constraints.at(0).active = false;

}

}

}

}

}

Oracle中joint,Nape中的LineJoint-线段关节相关推荐

  1. Oracle中joint,oracle support

    什么是Joint Escalation Team? Joint Escalation Team也可以简写为JET.JET是指当客户采用了多种软件供应商的产品搭建系统后, 系统所发生的问题通过单独的某一 ...

  2. oracle删除表某一字段,oracle中删除表中某字段出现重复的信息 保留其中一条

    记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法. 首先我们在这里创建一个测试表添加相应的测试数据. create table test  (id number,name ...

  3. 如何从Oracle数据库中的表中获取列名(字段名)列表?

    如何从Oracle数据库中的表中获取列名(字段名)列表? 目录 如何从Oracle数据库中的表中获取列名(字段名)列表? #示例一 #示例二 示例三: #示例一 可以获取: table_name:表名 ...

  4. 如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中

    如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中 2011-05-12 14:19 方法一,使用SQL*Loader      这个是用的较多的方法,前提必须oracle数据中目的表已经 ...

  5. Oracle的left join中on和where的区别

    Oracle的left join中on和where的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wher ...

  6. Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  7. oracle sql命令行中上下左右使用

    oracle sql命令行中上下左右使用 yum -y install readline,rlwrap 配置环境变量 alias sqlplus='rlwrap sqlplus' 测试 posted ...

  8. oracle删除表空间中的表,ORACLE删除表空间中的所有表

    ORACLE删除表空间中的所有表,如果是非sysdbA连接用如下sql语句 declare vsql varchar2(200); cursor c1 is select 'drop table '| ...

  9. php7连接oracle数据库,使用一个持久连接连到 Oracle 数据库 - PHP 7 中文文档

    (PHP 5, PHP 7, PECL OCI8 >= 1.1.0) oci_pconnect – 使用一个持久连接连到 Oracle 数据库 说明 oci_pconnect ( string ...

最新文章

  1. 解决ubuntu14.04下Qt 5.3.1下的QtCreator fcitx,ibus不能输入中文
  2. 只读字符串的c语言命令,C语言只读空间 - C 语言程序设计
  3. 【热点】黑客入侵的常用手段及防护措施分析
  4. keras fine-tune方法
  5. 【必须收藏】那些酷炫的深度学习网络图怎么画出来的?
  6. VTK:Filtering之GenericClip
  7. .NET Framework Client Profile/.net framework 客户端配置
  8. python中执行shell脚本之subprocess模块_如何使用Python中的subprocess模块检查shell脚本的状态?...
  9. 48. PHP 页面静态化(1)
  10. 2021第四届浙江省大学生网络与信息安全竞赛预赛部分Writeup
  11. 关于能力模型的思考总结
  12. 光学efl_海康机器人:镜头学堂之工业镜头参数知多少
  13. selenium实例自动登陆知乎
  14. niushop多商户商户端手机uniapp源码v4单商户v4_Saas开源版含uniapp以及niushop社区团购标准版源码开源的区别
  15. Windows画图使用总结
  16. 初创软件企业如何合理避税?
  17. SecureCRT标签显示IP地址
  18. vue3之常范低级错误の错误指南
  19. 车载以太网 - SomeIP - 总纲
  20. 生活总是麻烦不断,我还不习惯

热门文章

  1. B站Up主-山地人-这位老哥2019年的前端自学计划进展如何?——讲一个B站Up主自学前端85天的故事...
  2. shell 脚本学习
  3. Unity Gamma Linear Color Space
  4. Access violation reading location 0x000000XX
  5. (已解决)579B但答案仍旧错误terminate called after throwing an instance of ‘ std::bad_array_length‘,
  6. 开放API接口签名验证,让你的接口从此不再裸奔
  7. MapReduce之InputFormat、OutputFormat(三)
  8. Java合并word文档的两种方式
  9. scite的基本配置
  10. iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗