lufy 发表于 2013-4-14 23:03:52

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

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

        //添加一个框子
        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",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");
        
        //添加刚体,键盘控制的就是这个刚体
        ctrlBox = new LSprite();
        var faceBitmap = new LBitmap(new LBitmapData(result["face"]));
        ctrlBox.addChild(faceBitmap);
        ctrlBox.x = 250;
        ctrlBox.y = 200;
        ctrlBox.addBodyPolygon(faceBitmap.getWidth(),faceBitmap.getHeight(), 1, 2, .4, .2);
        backLayer.addChild(ctrlBox);

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

        LEvent.addEventListener(LGlobal.window,LKeyboardEvent.KEY_UP,onkeyup);
}
function onkeyup(e){
        if(e.keyCode == KEY.LEFT){
                ctrlBox.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(ctrlBox.box2dBody.GetPosition().x-1,ctrlBox.box2dBody.GetPosition().y));
        }else if(e.keyCode == KEY.RIGHT){
                ctrlBox.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2(ctrlBox.box2dBody.GetPosition().x+1,ctrlBox.box2dBody.GetPosition().y));
        }
        //唤醒刚体
        ctrlBox.box2dBody.SetAwake(true);
}
</script>
</body>
</html>问题解决了,如果大家有问题的话,可以留言咱们继续讨论。


汪汪猫 发表于 2013-4-22 13:45:23

感谢先生!
发邮件询问的少年便是俺了,我还有一个问题想请教下,上代码:…………
LEvent.addEventListener(LGlobal.window,LKeyboardEvent.KEY_DOWN,keydown);
       
}




function keydown (event){
       
        switch(event.keyCode){
                case KEY.LEFT:
                        god.move({x:-god.speed,y:0});
                        break;
                case KEY.RIGHT:
                        god.move({x:god.speed,y:0});
                        break;
                case KEY.UP:
                        god.move({x:0,y:-god.speed});
                        break;
                case KEY.DOWN:
                        god.move({0,y:god.speed});
                        break;

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

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

lufy 发表于 2013-4-22 14:09:32

汪汪猫 发表于 2013-4-22 13:45 static/image/common/back.gif
感谢先生!
发邮件询问的少年便是俺了,我还有一个问题想请教下,上代码:那个keycode的用法还是向你学的, ...

代码不全,god,god.speed等都无法确认,能否贴出完整代码,以方便检查

vykpq 发表于 2013-12-28 01:00:57

行,有意义,我顶 谢谢您了

987212385 发表于 2014-5-16 16:45:59

:P:P:P:P:P:P:P:P:P

987212385 发表于 2014-5-16 16:48:44

两个刚体发出碰撞的时候有没有什么事件驱动 啊,,,,,,,,,比如说返回一个值

987212385 发表于 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",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");
        backLayer.graphics.drawRect(1,"#ffffff",,true,"#000000");


有什么作用

lufy 发表于 2014-5-16 18:42:46

987212385 发表于 2014-5-16 17:11 static/image/common/back.gif
//添加一个框子
        wallLayer = new LSprite();
        wallLayer.x = 400;


限制刚体移动的空间,另外自由落体,没这个东西就掉下去了

987212385 发表于 2014-5-17 09:17:57

好像自由落体,是默认的吧
页: [1]
查看完整版本: 如何用键盘控制Box2d中的刚体移动