Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Работа PhysicsEditor для Box2d в FlashDevelop (http://www.flasher.ru/forum/showthread.php?t=202432)

Fazer 15.07.2013 20:35

Работа PhysicsEditor для Box2d в FlashDevelop
 
Вложений: 2
Добрый вечер. Учусь пользоваться PhysicsEditor для Box2d, рассматриваю пример. Сам исходник урока в Flash CS, пробую запустить проект в FlashDevelop не выходит. Видимо, это сам PhysicsEditor под Flash Ide составляет код. В общем, помогите, преписать код PhysicsData.as под FlashDevelop.

PainKiller 16.07.2013 11:08

во флеш про у вас ресурсы (картинки). Во флешдевелоп, вам надо их заэмбедить (читайте про тег [Embed])

Fazer 16.07.2013 11:53

Да, точно, я делаю:

Код AS3:

[Embed(source = 'floor.png')] public static const Floor:Class;
и так далее

(забыл их вставить в исходник, сейчас поправлю)

Но, дело в том, что в PhysicsData.as используется
Код AS3:

public var dict:Dictionary;

, которая обращется к этим картинкам по именам
Код AS3:

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, с этим все ОК. В приведенном вами коде создается ключ и его значение в словаре, тут тоже все ОК. Если где то что то не работает, то проблема не в нем. Я не увидел у вас в коде того, как картинка прикрепляется к телу и апдейтится.

Fazer 16.07.2013 18:11

Так, дело всё в Main.as. Да, не понимаю до конца, как здесь это делается. Делаю так:

Код AS3:

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;
 
        <b>addChild(new artClass() as DisplayObject);b>
 
    // Создаем объект 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);
                                }
                        }
                }
        }
}

Т.е. здесь идёт добавление по очереди ключей по имени. Как же добавить картинки этих ключей, я не пойму, кроме как:
Код AS3:

addChild(new artClass() as DisplayObject);

Куда же тогда деть все [Embed]? Подскажите)

Добавлено через 4 часа 3 минуты
Порылся по нескольким примерам, по ним, следует делать так:


Код AS3:

// Вытаскиваем картинку из скомпиленных ресурсов
    var artClass:Class = getDefinitionByName("floor") as Class;
 
    var floor:DisplayObject = new artClass();


Но результат тот же (пустой экран без ошибок)

PainKiller 17.07.2013 10:37

Вы как то усложняете работу с ресурсами, для начала добейтесь появления картинок на экране без физики, а потом уже приделывайте её.
С ембед обычно работают так:
Код AS3:

[Embed(source="picture.jpg")]
private var Picture:Class;

использование:
Код AS3:

var pic:Bitmap = new Picture();
addChild (pic);

Добавлено через 33 секунды
у вас по моему картинки нигде и не добавляются на сцену

Fazer 17.07.2013 12:58

Да, вроде как добавляются:
Код AS3:

// Создаем объект DisplayObject для добавления его на сцену  
    var bitmap:Bitmap = new Bitmap(new artClass(0, 0), "auto", true);
// Добавляем изображение на сцену
    addChild(bitmap);

Пробую и просто добавить картинки:

Код AS1/AS2:

[Embed(source = 'floor.png')] public static const Floor:Class;        
 
var floor:Bitmap = new Floor();
addChild (floor);

Результат тот же. Ещё заметил, через минуту после запуска в окне Output наблюдается:
Код AS3:

Done(0)
[No debug Flash player connection request]


PainKiller 18.07.2013 10:38

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

Fazer 18.07.2013 13:40

Попробовал. Без изменений. Похоже так и не разберусь, буду вручную создавать фигуры. PainKiller, спасибо за участие.


Часовой пояс GMT +4, время: 16:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.