Oracle中joint,Nape中的LineJoint-线段关节
今天要学习的内容时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-线段关节相关推荐
- Oracle中joint,oracle support
什么是Joint Escalation Team? Joint Escalation Team也可以简写为JET.JET是指当客户采用了多种软件供应商的产品搭建系统后, 系统所发生的问题通过单独的某一 ...
- oracle删除表某一字段,oracle中删除表中某字段出现重复的信息 保留其中一条
记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法. 首先我们在这里创建一个测试表添加相应的测试数据. create table test (id number,name ...
- 如何从Oracle数据库中的表中获取列名(字段名)列表?
如何从Oracle数据库中的表中获取列名(字段名)列表? 目录 如何从Oracle数据库中的表中获取列名(字段名)列表? #示例一 #示例二 示例三: #示例一 可以获取: table_name:表名 ...
- 如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中
如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中 2011-05-12 14:19 方法一,使用SQL*Loader 这个是用的较多的方法,前提必须oracle数据中目的表已经 ...
- Oracle的left join中on和where的区别
Oracle的left join中on和where的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wher ...
- Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】
Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...
- oracle sql命令行中上下左右使用
oracle sql命令行中上下左右使用 yum -y install readline,rlwrap 配置环境变量 alias sqlplus='rlwrap sqlplus' 测试 posted ...
- oracle删除表空间中的表,ORACLE删除表空间中的所有表
ORACLE删除表空间中的所有表,如果是非sysdbA连接用如下sql语句 declare vsql varchar2(200); cursor c1 is select 'drop table '| ...
- php7连接oracle数据库,使用一个持久连接连到 Oracle 数据库 - PHP 7 中文文档
(PHP 5, PHP 7, PECL OCI8 >= 1.1.0) oci_pconnect – 使用一个持久连接连到 Oracle 数据库 说明 oci_pconnect ( string ...
最新文章
- 解决ubuntu14.04下Qt 5.3.1下的QtCreator fcitx,ibus不能输入中文
- 只读字符串的c语言命令,C语言只读空间 - C 语言程序设计
- 【热点】黑客入侵的常用手段及防护措施分析
- keras fine-tune方法
- 【必须收藏】那些酷炫的深度学习网络图怎么画出来的?
- VTK:Filtering之GenericClip
- .NET Framework Client Profile/.net framework 客户端配置
- python中执行shell脚本之subprocess模块_如何使用Python中的subprocess模块检查shell脚本的状态?...
- 48. PHP 页面静态化(1)
- 2021第四届浙江省大学生网络与信息安全竞赛预赛部分Writeup
- 关于能力模型的思考总结
- 光学efl_海康机器人:镜头学堂之工业镜头参数知多少
- selenium实例自动登陆知乎
- niushop多商户商户端手机uniapp源码v4单商户v4_Saas开源版含uniapp以及niushop社区团购标准版源码开源的区别
- Windows画图使用总结
- 初创软件企业如何合理避税?
- SecureCRT标签显示IP地址
- vue3之常范低级错误の错误指南
- 车载以太网 - SomeIP - 总纲
- 生活总是麻烦不断,我还不习惯
热门文章
- B站Up主-山地人-这位老哥2019年的前端自学计划进展如何?——讲一个B站Up主自学前端85天的故事...
- shell 脚本学习
- Unity Gamma Linear Color Space
- Access violation reading location 0x000000XX
- (已解决)579B但答案仍旧错误terminate called after throwing an instance of ‘ std::bad_array_length‘,
- 开放API接口签名验证,让你的接口从此不再裸奔
- MapReduce之InputFormat、OutputFormat(三)
- Java合并word文档的两种方式
- scite的基本配置
- iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗