Box2d MovieClip в исходное положение

#actionscript-3 #box2d

#actionscript-3 #box2d

Вопрос:

Я хочу попробовать простую задачу, в которой, если я перемещаю объект внутри мира, а затем нажимаю кнопку, он должен вернуться в исходное положение, но это не работает, ниже приведен код, который я использую — файл здесь — http://www.fastswf.com/yAnIvBs (когда я удаляю прослушиватель событий)

с прослушивателем событий — http://www.fastswf.com/rpYsIt8

////////======================== стоп();

 var startXPos:Number = level1WorldObj.box1.x;
var startYPos:Number = level1WorldObj.box1.y;

function areaS(e:Event) {



level1WorldObj.box1.y= startYPos;
level1WorldObj.box1.x= startXPos;
level1WorldObj.box1.removeEventListener(Event.ENTER_FRAME, areaS);


}

but1.addEventListener(MouseEvent.CLICK,nClick3);

function nClick3(event:MouseEvent):void{
level1WorldObj.box1.addEventListener(Event.ENTER_FRAME, areaS);
level1WorldObj.box1.y= startYPos;
level1WorldObj.box1.x= startXPos;
}
  

/////////////////======================

Теперь я хочу иметь возможность делать это много раз, поэтому я сохранил переменные, которые определяют начальные значения x, y как глобальные…

Здесь вы можете увидеть, как он ведет себя в режиме debugdraw, странно, что перемещается только клип, а не фактическое тело — http://www.fastswf.com/-Ijkta4

Может ли кто-нибудь, пожалуйста, направить меня сюда…

Заранее спасибо…

Джин

Ответ №1:

Графика, которую вы видите ( box1 ), не связана с физическим объектом за кадром — в данный момент вы перемещаете только графику, а не сам объект.

Вам нужно использовать либо SetPosition() , либо SetTransform() для b2Body объекта

Редактирование 07/7

Поскольку вы используете Box2D World Construction Kit, я взглянул на исходный код (доступен здесь:https://github.com/jesses/wck ). Похоже, что основным классом является BodyShape (https://raw.githubusercontent.com/jesses/wck/master/wck/BodyShape.as ).

Просматривая его, вы должны иметь возможность получить b2Body прямой доступ. Если это null (что, вероятно, является источником TypeError того, что вы получаете, тогда вы не вызывали createBody() , что на самом деле использует все ваши свойства при создании физического объекта за кулисами.

После того, как у вас есть b2Body , если вы хотите расположить его на основе графики, есть функция syncTransform() для этого.

Вам следует включить его debugDraw в вашем World классе, чтобы было легче видеть, что происходит в фоновом режиме. ПРИМЕЧАНИЕ: это необходимо сделать перед вызовом create()

Комментарии:

1. большое спасибо, да, похоже, это так, но моя проблема в том, что после преобразования тела в видеоклип у меня есть имя box1 (имя экземпляра), так почему оно не перемещается, я не вызываю их с помощью кода, но тело уже находится в библиотеке, скажем, под именем purple, так как я могу получить его координаты…

2. Извините, я не смог понять ваше объяснение. Вы не преобразуете a b2Body в a MovieClip ; вы связываете с ним некоторую графику. Чтобы переместить графику, ваш поток выполняется примерно следующим образом: 1) обновить b2Body объект, 2) преобразовать b2Body позицию в пиксельные координаты (Box2D в метрах), 3) обновить соответствующую графическую позицию

3. Обычно, что бы вы ни делали, это сохраняет ссылку на графику MovieClip при b2Body использовании SetUserData() . Затем вы сохраняете свое тело так, как хотите, чтобы позже к нему можно было получить доступ (например, как к свойству класса или в массиве), затем вы можете обновить его по своему усмотрению и графику с помощью GetUserData()

4. Еще раз большое спасибо за ваше время и объяснение — я использую расширение box2d, которое позволяет нам создавать фигуры, мир, точно так же, как мы можем создать видеоролик или кнопку, а затем мы можем присвоить им значения с панели свойств, такие как гравитация, демпфирование и т.д… Итак , я преобразовал изображение прямоугольника в форму и внутри мира я пытаюсь изменить его положение … итак, есть ли способ, чтобы, если мы получим, скажем, круг, который уже есть в библиотеке со всеми свойствами , и чтобы мы могли использовать его внутри мира, чтобы воздействовать и на реальное тело… извините, если я не понял, но, похоже, здесь есть некоторое ограничение по словам

5. Можете ли вы дать ссылку на расширение, чтобы я мог понять, что вы имеете в виду? Когда вы создаете box1 , делаете ли вы это через графический интерфейс пользователя или с помощью кода. Если это с помощью кода, можете ли вы вставить свой образец?

Ответ №2:

Я смог найти решение этой проблемы, я нашел отправную точку, используя это —

трассировка (level1WorldObj.box1.b2body.GetPosition().x); трассировка (level1WorldObj.box1.b2body.GetPosition().y);

затем, как только у меня была позиция вручную, я записал координаты и использовал приведенный ниже код….

level1WorldObj.box1.b2body.setTransform(новая версия (-2, 2),0);

Спасибо @divillysausages за всю помощь…

С уважением