#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
в aMovieClip
; вы связываете с ним некоторую графику. Чтобы переместить графику, ваш поток выполняется примерно следующим образом: 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 за всю помощь…
С уважением