Просмотр полной версии : Работа PhysicsEditor для Box2d в FlashDevelop
Добрый вечер. Учусь пользоваться PhysicsEditor для Box2d, рассматриваю пример (http://redefy.net/2011/12/26/physicseditor/). Сам исходник урока (http://www.flasher.ru/forum/attachment.php?attachmentid=29820&stc=1&d=1373901582) в Flash CS, пробую запустить проект (http://www.flasher.ru/forum/attachment.php?attachmentid=29822&stc=1&d=1373957026) в FlashDevelop не выходит. Видимо, это сам PhysicsEditor под Flash Ide составляет код. В общем, помогите, преписать код PhysicsData.as под FlashDevelop.
PainKiller
16.07.2013, 11:08
во флеш про у вас ресурсы (картинки). Во флешдевелоп, вам надо их заэмбедить (читайте про тег [Embed])
Да, точно, я делаю:
[Embed(source = 'floor.png')] public static const Floor:Class;
и так далее (забыл их вставить в исходник, сейчас поправлю)
Но, дело в том, что в PhysicsData.as используется public var dict:Dictionary;, которая обращется к этим картинкам по именам dict["drink"] = [
[
// density, friction, restitution
1, 0.2, 0.2,
// categoryBits, maskBits, groupIndex, isSensor
1, 65535, 0, false,
'POLYGON',
[
[ new b2Vec2(38/ptm_ratio, 61.5/ptm_ratio) , new b2Vec2(33/ptm_ratio, 171.5/ptm_ratio) , new b2Vec2(22/ptm_ratio, 167.5/ptm_ratio) , new b2Vec2(11/ptm_ratio, 71.5/ptm_ratio) , new b2Vec2(14/ptm_ratio, 63.5/ptm_ratio) ] ,
[ new b2Vec2(77.5/ptm_ratio, 73/ptm_ratio) , new b2Vec2(67.5/ptm_ratio, 161/ptm_ratio) , new b2Vec2(63.5/ptm_ratio, 170/ptm_ratio) , new b2Vec2(33/ptm_ratio, 171.5/ptm_ratio) , new b2Vec2(38/ptm_ratio, 61.5/ptm_ratio) , new b2Vec2(48/ptm_ratio, 60.5/ptm_ratio) , new b2Vec2(76/ptm_ratio, 64.5/ptm_ratio) ] ,
[ new b2Vec2(10/ptm_ratio, 4.5/ptm_ratio) , new b2Vec2(41.5/ptm_ratio, 29/ptm_ratio) , new b2Vec2(33.5/ptm_ratio, 32/ptm_ratio) , new b2Vec2(7.5/ptm_ratio, 10/ptm_ratio) , new b2Vec2(9/ptm_ratio, 4.5/ptm_ratio) ] ,
[ new b2Vec2(41.5/ptm_ratio, 29/ptm_ratio) , new b2Vec2(48/ptm_ratio, 60.5/ptm_ratio) , new b2Vec2(39.5/ptm_ratio, 58/ptm_ratio) , new b2Vec2(33.5/ptm_ratio, 32/ptm_ratio) ] ,
[ new b2Vec2(48/ptm_ratio, 60.5/ptm_ratio) , new b2Vec2(38/ptm_ratio, 61.5/ptm_ratio) , new b2Vec2(39.5/ptm_ratio, 58/ptm_ratio) ]
]
]
]; и описывает массив фигур картинки. Каким же образом мне написать?
PainKiller
16.07.2013, 13:23
Dictionary у вас создается в конструкторе класса PhysicsData, с этим все ОК. В приведенном вами коде создается ключ и его значение в словаре, тут тоже все ОК. Если где то что то не работает, то проблема не в нем. Я не увидел у вас в коде того, как картинка прикрепляется к телу и апдейтится.
Так, дело всё в Main.as. Да, не понимаю до конца, как здесь это делается. Делаю так:
package {
// импорты классов Flash
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getDefinitionByName;
import flash.display.DisplayObject;
// импорты классов Box2d
import Box2D.Dynamics.Joints.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
// импорт данных о шейпах
import PhysicsData;
public class Main extends Sprite {
[Embed(source = 'floor.png')] public static const Floor:Class;
[Embed(source = "drink.png")] public static const Drink:Class;
[Embed(source = "bkg_cor.png")] public static const Bkg_cor:Class;
[Embed(source = "hamburger.png")] public static const Hamburger:Class;
[Embed(source = "hotdog.png")] public static const Hotdog:Class;
[Embed(source = "icecream.png")] public static const Icecream:Class;
[Embed(source = "icecream2.png")] public static const Icecream2:Class;
[Embed(source = "icecream3.png")] public static const Icecream3:Class;
public var nextSprite:Number=10;
// создадим объект, который содержит данные о шейпах
public var physicsData:PhysicsData = new PhysicsData();
// создадим мир Box2D, настроим вектор гравитации
public var world:b2World = new b2World(new b2Vec2(0, 10.0), true);
public function Main():void {
// Вытаскиваем картинку из скомпиленных ресурсов
var artClass:Class = getDefinitionByName("floor") as Class;
addChild(new artClass() as DisplayObject);
// Создаем объект DisplayObject для добавления его на сцену
var bitmap:Bitmap = new Bitmap(new artClass(0, 0), "auto", true);
// Создаем физическое тело из класса с данными о шейпах
var body:b2Body=physicsData.createBody("floor",
world,
b2Body.b2_staticBody,
bitmap);
// Настраиваем начальное положение тела
body.SetPositionAndAngle(new b2Vec2(0,337/physicsData.ptm_ratio), 0);
// Добавляем изображение на сцену
addChild(bitmap);
// Добавляем слушатель события ENTER_FRAME,
// для обновления спрайтов и тел
addEventListener(Event.ENTER_FRAME, update, false, 0, true);
}
//Эта функция добавляет новые спрайты на сцену
public function addNewSprites():void {
// Спрайт добавляется только каждый 30 кадр
nextSprite--;
if(nextSprite > 0)
{
return;
}
nextSprite = 30;
// имена предметов/спрайтов, которые мы используем
var items:Array=["hamburger",
"drink",
"icecream",
"icecream2",
"icecream3"];
// Выбираем случайный объект
var name:String=items[Math.floor(Math.random()*items.length)];
// Вытаскиваем картинку из скомпиленных ресурсов
var artClass:Class = getDefinitionByName(name) as Class;
addChild(new artClass() as DisplayObject);
// Создаем объект DisplayObject для добавления его на сцену
var bitmap:Bitmap = new Bitmap(new artClass(0, 0), "auto", true);
// Создаем физическое тело из класса с данными о шейпах
var body:b2Body=physicsData.createBody(name,
world,
b2Body.b2_dynamicBody,
bitmap);
// Устанавливаем случайную начальную позицию
body.SetPositionAndAngle(new b2Vec2(Math.random()*14,-2), 0);
// Добавляем изображение на сцену
addChild(bitmap);
}
// эта функция запускает механизм симуляции физики
// и обновляет позиции и вращение спрайтов, в соответствии с позициями
// и вращением тел, участвующих в симуляции
public function update(e : Event):void {
// шаг времени мира
world.Step(1 / 30, 10, 10);
world.ClearForces();
// добавляем новые спрайты в мир
addNewSprites();
// обновляем скины тел
var Body:b2Body = world.GetBodyList();
for ( ; Body; Body = Body.GetNext()) {
if (Body.GetUserData() is Bitmap) {
// получаем ссылку на скин тела
var bitmap:Bitmap=Body.GetUserData() as Bitmap;
// обновляем положение скина
bitmap.x=Body.GetPosition().x*physicsData.ptm_ratio;
bitmap.y=Body.GetPosition().y*physicsData.ptm_ratio;
//обновляем вращение спрайта
bitmap.rotation = Body.GetAngle() * (180/Math.PI);
}
}
}
}
}
Т.е. здесь идёт добавление по очереди ключей по имени. Как же добавить картинки этих ключей, я не пойму, кроме как:
addChild(new artClass() as DisplayObject); Куда же тогда деть все [Embed]? Подскажите)
Добавлено через 4 часа 3 минуты
Порылся по нескольким примерам, по ним, следует делать так:
// Вытаскиваем картинку из скомпиленных ресурсов
var artClass:Class = getDefinitionByName("floor") as Class;
var floor:DisplayObject = new artClass();
Но результат тот же (пустой экран без ошибок)
PainKiller
17.07.2013, 10:37
Вы как то усложняете работу с ресурсами, для начала добейтесь появления картинок на экране без физики, а потом уже приделывайте её.
С ембед обычно работают так:
[Embed(source="picture.jpg")]
private var Picture:Class;
использование:
var pic:Bitmap = new Picture();
addChild (pic);
Добавлено через 33 секунды
у вас по моему картинки нигде и не добавляются на сцену
Да, вроде как добавляются:
// Создаем объект DisplayObject для добавления его на сцену
var bitmap:Bitmap = new Bitmap(new artClass(0, 0), "auto", true);
// Добавляем изображение на сцену
addChild(bitmap);
Пробую и просто добавить картинки:
[Embed(source = 'floor.png')] public static const Floor:Class;
var floor:Bitmap = new Floor();
addChild (floor);
Результат тот же. Ещё заметил, через минуту после запуска в окне Output наблюдается: Done(0)
[No debug Flash player connection request]
PainKiller
18.07.2013, 10:38
То что дебаг не работает я тоже заметил, проект битый какой то, попробуйте создать новый.
Попробовал. Без изменений. Похоже так и не разберусь, буду вручную создавать фигуры. PainKiller, спасибо за участие.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.