Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在BeginContact事件上设置新的身体位置_Javascript_Box2d - Fatal编程技术网

Javascript 在BeginContact事件上设置新的身体位置

Javascript 在BeginContact事件上设置新的身体位置,javascript,box2d,Javascript,Box2d,我想在BeginContact事件中设置一个新的身体位置,但它仍然不起作用。它是用JavaSript编写的,带有从绘图到画布的功能,但对于Box2d来说并不重要。在HTML文件中,主体只是空画布,没有其他内容。这是我的密码: 在JS文件的开头只声明了一些变量 Vec2 = Box2D.Common.Math.b2Vec2; BodyDef = Box2D.Dynamics.b2BodyDef; Body = Box2D.Dynamics.b2Body; FixtureDef = Box2D.Dy

我想在BeginContact事件中设置一个新的身体位置,但它仍然不起作用。它是用JavaSript编写的,带有从绘图到画布的功能,但对于Box2d来说并不重要。在HTML文件中,主体只是空画布,没有其他内容。这是我的密码:

在JS文件的开头只声明了一些变量

Vec2 = Box2D.Common.Math.b2Vec2;
BodyDef = Box2D.Dynamics.b2BodyDef;
Body = Box2D.Dynamics.b2Body;
FixtureDef = Box2D.Dynamics.b2FixtureDef;
Fixture = Box2D.Dynamics.b2Fixture;
World = Box2D.Dynamics.b2World;
PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
DebugDraw = Box2D.Dynamics.b2DebugDraw;

var player;
它后面是一个设置函数,该函数在开始时被调用

function setup()
{
    canvas = document.getElementById("collisionCanvas");
    context = canvas.getContext('2d');

    document.getElementsByTagName('body')[0].style.backgroundColor = "black";

    canvas.style.backgroundColor = "white";
    canvas.width = 320;
    canvas.height = 320;

    world = new World(new Vec2(0, 10), false);

    //Point of the problem!!!
    //setting contact listener
    var listener = new Box2D.Dynamics.b2ContactListener;
    listener.BeginContact = function(contact)
    {
        var body1 = contact.GetFixtureA().GetBody();
        var body2 = contact.GetFixtureB().GetBody();

        if(body1.GetUserData().type == "player")
        {
            body1.SetPosition({x:5, y:5});
        }
        else
        {
            body2.SetPosition({x:5, y:5});
        }
    }
    world.SetContactListener(listener);

    var fixDef = new FixtureDef;
    fixDef.density = 1.0;
    fixDef.friction = 0.5;
    fixDef.restitution = 0.2;

    var bodyDef = new BodyDef;

    //creating ground
    bodyDef.type = Body.b2_staticBody;
    bodyDef.position.x = convertPixelsToMeters(160);
    bodyDef.position.y = convertPixelsToMeters(320-32/2);
    bodyDef.userData = {type: "static"};
    fixDef.shape = new PolygonShape;
    fixDef.shape.SetAsBox(convertPixelsToMeters(canvas.width/2), convertPixelsToMeters(32/2));
    world.CreateBody(bodyDef).CreateFixture(fixDef);

    //creating player
    bodyDef.type = Body.b2_dynamicBody;
    bodyDef.fixedRotation = true;
    bodyDef.position.x = convertPixelsToMeters(160);
    bodyDef.position.y = convertPixelsToMeters(160);
    bodyDef.userData = {type: "player"};
    fixDef.shape = new PolygonShape;
    fixDef.shape.SetAsBox(convertPixelsToMeters(16), convertPixelsToMeters(16));
    player = world.CreateBody(bodyDef);
    player.CreateFixture(fixDef);

    //setup debug draw
    var debugDraw = new DebugDraw();
    debugDraw.SetSprite(document.getElementById("collisionCanvas").getContext("2d"));
    debugDraw.SetDrawScale(32.0);
    debugDraw.SetFillAlpha(0.3);
    debugDraw.SetLineThickness(1.0);
    debugDraw.SetFlags(DebugDraw.e_shapeBit | DebugDraw.e_jointBit);
    world.SetDebugDraw(debugDraw);

    window.setInterval(update, 1000 / 60);
}
最后只有更新功能,一个帮助功能,就是它

function update()
{
    world.Step(
        1 / 60   //frame-rate
        ,  10       //velocity iterations
        ,  10       //position iterations
    );
    world.DrawDebugData();
    world.ClearForces();
}

function convertPixelsToMeters(x)
{
    return x*0.03125;
}

$(function(){
    setup();
})
重要的是,只有中间代码是BeginContact event,其中调用的SetPosition函数不起作用


我尝试在其他地方更改位置,例如在按键事件中,它是正确的,因此我可以理解为什么它不起作用。

在b2Contactlistner方法中,我们不能更改任何属性或位置

您可以使用任何布尔变量,并在处于beign contact时使其为真,如果根据布尔变量更改实体的位置,则可以使其为真

就像你的代码一样。。。。。。。 var bodyyy
var boolennn

listener.BeginContact = function(contact)
{
    var body1 = contact.GetFixtureA().GetBody();
    var body2 = contact.GetFixtureB().GetBody();

    if(body1.GetUserData().type == "player")
    {
        //body1.SetPosition({x:5, y:5});
       bodyyy = body1;
       booleannn = true;
    }
    else
    {
       // body2.SetPosition({x:5, y:5});
        bodyyy = body2;
        boolennn = true;
    }
}
现在在更新方法中

if(booleann)
{
 bodyyy.SetPosition({x:5, y:5})
}

对不起,我不知道java脚本的语法,伙计,你说得对!我不知道我不能在那里改变任何事情。非常感谢!我希望您理解我想在代码中说的内容,我认为这将解决您的问题