lufy's legend

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 29048|回复: 8

如何用键盘控制Box2d中的刚体移动

[复制链接]

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2013-4-14 23:03:52 |显示全部楼层
今天有位朋友问我,addBodyPolygon 之后怎么用键盘控制物体,我在这里简单说一下,其他朋友如果也有同样的问题的话,可以作为参考。
其实在box2d中也没有什么特别的,要控制一个刚体的移动,只需要重新设置它的坐标即可,
那么一个LSprite对象在addBodyPolygon变为刚体之后,被添加的刚体的b2Body可以通过box2dBody属性来得到,
假设这个LSprite对象是A,
那么,这个刚体在物理世界里的坐标为A.box2dBody.GetPosition(),相应的x坐标为A.box2dBody.GetPosition().x,y坐标为A.box2dBody.GetPosition().y。
重新设定一个刚体的坐标的时候,使用SetPosition函数。
比如,我要让一个刚体想右移动一个单位,那么只需要下面
  1. A.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(A.box2dBody.GetPosition().x+1,A.box2dBody.GetPosition().y));
复制代码
我这里所说的一个单位,是指box2d世界中的一个单位,并不是像素值。
使用SetPosition设定刚体位置的时候,参数也是box2d世界中的单位。
而box2d世界中的单位和像素值之间的换算单位是LGlobal.box2d.drawScale,也就是
像素坐标=box2d中的坐标/LGlobal.box2d.drawScale;
当然,重新设定了坐标之后,要唤醒刚体
  1. A.box2dBody.SetAwake(true);
复制代码
下面是一个使用鼠标控制刚体移动的例子,URL为
http://lufylegend.com/demo/test/2.html
点击[←]键或者[→]键来改变画面中的物体的位置。
代码如下:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>鼠标控制刚体移动</title>
  6. <script type="text/javascript" src="http://lufylegend.com/js/Box2dWeb-2.1.a.3.min.js"></script>
  7. <script type="text/javascript" src="http://lufylegend.com/js/lufylegend-1.5.1.min.js"></script>
  8. </head>
  9. <body>
  10. <div id="mylegend">loading……</div>
  11. <script type="text/javascript">
  12. init(10,"mylegend",800,480,main);
  13. var backLayer,wallLayer,ctrlBox;
  14. var KEY = {LEFT:37,RIGHT:39};
  15. var imgData = [
  16.         {name:"face",path:"http://lufylegend.com/images/html5/lufylegend/ps/face.jpg"}
  17. ];
  18. function main(){
  19.         LLoadManage.load(imgData, null, gameInit);
  20. }
  21. function gameInit(result){
  22.         LGlobal.box2d = new LBox2d();
  23.         backLayer = new LSprite();        
  24.         addChild(backLayer);

  25.         //添加一个框子
  26.         wallLayer = new LSprite();
  27.         wallLayer.x = 400;
  28.         wallLayer.y = 0;
  29.         backLayer.addChild(wallLayer);
  30.         wallLayer.addBodyPolygon(800,10,0);
  31.         wallLayer = new LSprite();
  32.         wallLayer.x = 0;
  33.         wallLayer.y = 240;
  34.         backLayer.addChild(wallLayer);
  35.         wallLayer.addBodyPolygon(10,480,0);
  36.         wallLayer = new LSprite();
  37.         wallLayer.x = 400;
  38.         wallLayer.y = 480;
  39.         backLayer.addChild(wallLayer);
  40.         wallLayer.addBodyPolygon(800,10,0);
  41.         wallLayer = new LSprite();
  42.         wallLayer.x = 800;
  43.         wallLayer.y = 240;
  44.         backLayer.addChild(wallLayer);
  45.         wallLayer.addBodyPolygon(10,480,0);

  46.         backLayer.graphics.drawRect(1,"#ffffff",[0, 0, 800, 5],true,"#000000");
  47.         backLayer.graphics.drawRect(1,"#ffffff",[0, 475, 800, 5],true,"#000000");
  48.         backLayer.graphics.drawRect(1,"#ffffff",[0, 0, 5, 480],true,"#000000");
  49.         backLayer.graphics.drawRect(1,"#ffffff",[795,0, 5, 480],true,"#000000");
  50.         
  51.         //添加刚体,键盘控制的就是这个刚体
  52.         ctrlBox = new LSprite();
  53.         var faceBitmap = new LBitmap(new LBitmapData(result["face"]));
  54.         ctrlBox.addChild(faceBitmap);
  55.         ctrlBox.x = 250;
  56.         ctrlBox.y = 200;
  57.         ctrlBox.addBodyPolygon(faceBitmap.getWidth(),faceBitmap.getHeight(), 1, 2, .4, .2);
  58.         backLayer.addChild(ctrlBox);

  59.         //添加其他刚体
  60.         for (var i = 0; i < 5; i++) {
  61.                 var box = new LSprite();
  62.                 faceBitmap = new LBitmap(new LBitmapData(result["face"],130*Math.random(),130*Math.random(),100,100));
  63.                 box.addChild(faceBitmap);
  64.                 box.x = 50 + 700*Math.random();
  65.                 box.y = 100*Math.random();
  66.                 box.addBodyPolygon(faceBitmap.getWidth(),faceBitmap.getHeight(), 1, 2, .4, .2);
  67.                 backLayer.addChild(box);
  68.         }

  69.         LEvent.addEventListener(LGlobal.window,LKeyboardEvent.KEY_UP,onkeyup);
  70. }
  71. function onkeyup(e){
  72.         if(e.keyCode == KEY.LEFT){
  73.                 ctrlBox.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(ctrlBox.box2dBody.GetPosition().x-1,ctrlBox.box2dBody.GetPosition().y));
  74.         }else if(e.keyCode == KEY.RIGHT){
  75.                 ctrlBox.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(ctrlBox.box2dBody.GetPosition().x+1,ctrlBox.box2dBody.GetPosition().y));
  76.         }
  77.         //唤醒刚体
  78.         ctrlBox.box2dBody.SetAwake(true);
  79. }
  80. </script>
  81. </body>
  82. </html>
复制代码
问题解决了,如果大家有问题的话,可以留言咱们继续讨论。


不回答与技术和引擎不相关的问题
回复

使用道具 举报

0

主题

0

好友

6

积分

士兵

Rank: 1

发表于 2013-4-22 13:45:23 |显示全部楼层
感谢先生!
发邮件询问的少年便是俺了,我还有一个问题想请教下,上代码:
  1. …………
  2. LEvent.addEventListener(LGlobal.window,LKeyboardEvent.KEY_DOWN,keydown);
  3.        
  4. }




  5. function keydown (event){
  6.        
  7.         switch(event.keyCode){
  8.                 case KEY.LEFT:
  9.                         god.move({x:-god.speed,y:0});
  10.                         break;
  11.                 case KEY.RIGHT:
  12.                         god.move({x:god.speed,y:0});
  13.                         break;
  14.                 case KEY.UP:
  15.                         god.move({x:0,y:-god.speed});
  16.                         break;
  17.                 case KEY.DOWN:
  18.                         god.move({0,y:god.speed});
  19.                         break;

  20. ………………
复制代码
那个keycode的用法还是向你学的,其实我一直没搞懂 [ blabla ] 还有 {x:blabla ,y:blabla} 这些用法有什么不同还有要怎么用……
  1. …………

  2. god.prototype.move = function(value){
  3.         var self = this;
  4.         self.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(A.box2dBody.GetPosition().x + value.x,A.box2dBody.GetPosition().y + value.y));
  5.        
  6. }
  7. ……………………
复制代码
这样打开是有错误无法运行的,实在不明白,请指教!
回复

使用道具 举报

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2013-4-22 14:09:32 |显示全部楼层
汪汪猫 发表于 2013-4-22 13:45
感谢先生!
发邮件询问的少年便是俺了,我还有一个问题想请教下,上代码:那个keycode的用法还是向你学的, ...

代码不全,god,god.speed等都无法确认,能否贴出完整代码,以方便检查
不回答与技术和引擎不相关的问题
回复

使用道具 举报

0

主题

0

好友

6

积分

士兵

Rank: 1

发表于 2013-12-28 01:00:57 |显示全部楼层
行,有意义,我顶 谢谢您了
回复

使用道具 举报

9

主题

1

好友

116

积分

士兵

Rank: 1

发表于 2014-5-16 16:45:59 |显示全部楼层
回复

使用道具 举报

9

主题

1

好友

116

积分

士兵

Rank: 1

发表于 2014-5-16 16:48:44 |显示全部楼层
两个刚体发出碰撞的时候有没有什么事件驱动 啊,,,,,,,,,比如说返回一个值
回复

使用道具 举报

9

主题

1

好友

116

积分

士兵

Rank: 1

发表于 2014-5-16 17:11:58 |显示全部楼层
  //添加一个框子
        wallLayer = new LSprite();
        wallLayer.x = 400;
        wallLayer.y = 0;
        backLayer.addChild(wallLayer);
        wallLayer.addBodyPolygon(800,10,0);
        wallLayer = new LSprite();
        wallLayer.x = 0;
        wallLayer.y = 240;
        backLayer.addChild(wallLayer);
        wallLayer.addBodyPolygon(10,480,0);
        wallLayer = new LSprite();
        wallLayer.x = 400;
        wallLayer.y = 480;
        backLayer.addChild(wallLayer);
        wallLayer.addBodyPolygon(800,10,0);
        wallLayer = new LSprite();
        wallLayer.x = 800;
        wallLayer.y = 240;
        backLayer.addChild(wallLayer);
        wallLayer.addBodyPolygon(10,480,0);

        backLayer.graphics.drawRect(1,"#ffffff",[0, 0, 800, 5],true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",[0, 475, 800, 5],true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",[0, 0, 5, 480],true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",[795,0, 5, 480],true,"#000000");


有什么作用
回复

使用道具 举报

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2014-5-16 18:42:46 |显示全部楼层
987212385 发表于 2014-5-16 17:11
//添加一个框子
        wallLayer = new LSprite();
        wallLayer.x = 400;

限制刚体移动的空间,另外自由落体,没这个东西就掉下去了
不回答与技术和引擎不相关的问题
回复

使用道具 举报

9

主题

1

好友

116

积分

士兵

Rank: 1

发表于 2014-5-17 09:17:57 |显示全部楼层
好像自由落体,是默认的吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

防止垃圾广告,请填写任意字符

Archiver|lufy's legend

GMT+8, 2024-3-29 04:08 , Processed in 0.055077 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部