понедельник, 24 января 2011 г.

Разметался.

Что то разметался я по проектам между работои и домом.
ЛевелГенератор от Джеикоба классная штука со своими плющками но мне как первооткрывателю сложно, приходиться постоянно общаться и показывать что мне мешает.
Решил хватит буду писать свои попроще, это не так и сложно. Посмотрим.

четверг, 20 января 2011 г.

BOX2D LEVEL GENERATION TOOL V2 (НОВАЯ ВЕРСИЯ)

Вы любите клевые заголовки? Я да.
Этот подразумевает классный апдейт. Оригинал
АПДЕЙТ: Добавлена документация и классы для работы с клавиатурой.
АПДЕЙТ: Добавлена поддержка Flex 4.





Нажмите на демо игры и увидите что можете сделать при помощи Version 2. Используйте клавиатуру для управления персонажем, Вы можете собирать монеты и летать вокруг (пробел для переключения в режим полета).


Используя Bisonkick вы можете создавать по-настоящему классные игры, проще, быстрее, БОЛЬШЕ.
Но если серьезно  в V2 есть несколько на самом деле классных нововведений и использовать их проще простого, а именно:
Создайте персонажа. И делайте с ним все что вам взбредет в голову.
  1. Создайте “Персонажа”, это предоставляет возможность управления им с клавиатуры и некоторые другие возможности например отловка событий ( HeroEvents ).
  2. Создайте кастомные скины для уровня которые автоматически изменят свой размер под размер ваших физических объектов. ( Или, если хотите не изменят ).
  3. Задайте режим полета для вашего персонажа, если хотите чтобы он мог летать.
  4. Разрушайте физические объекты простым и безопасным способом.
  5. Задайте высоту прыжка, скорость бега/полёта, смертельную/повреждающую силу удара ( значения урона нанесенное персонажу при ударе )
  6. Создавайте классные Box2d игры без необходимости в больших познаниях Box2d.
И даже больше.
SWC уже имеет встроенный Box2d 2.1a. То есть все что вам нужно это просто одна SWC.

АПДЕЙТ: Я добавил  полноценную поддержку клавиатуры и она хороша. Новая загрузка заменит предыдущее SWC.
Я должен добавить лучшую поддержку для событий с клавиатуры ( keyboardEvents ) и я реализую это в ближайшее время. В данный моменты пробел включает/выключает режим полета. Загрузить 

Box2dLevelGenerationToolV2 1.0
Документация

Далее пример приложения. Оно же с более подробным объяснением кода будет добавлено в ближайшее время. В данный момент swc только для Flex AS3 (не Flash ) проектов, знает ли кто-нибудь как получить класс mx.core.BitmapAsset во Flash (Help!).

Создайте новый AS3 проект.
Добавьте SWC в папку с библиотеками в вашем AS3 Project
Правый клик на корневой папке Properties --> далее клик по Actionscript Build Path --> Add SWC и добавьте из места расположения Box2dLevelGeneratorTollV2.

Импортируйте ее в главный класс проекта. ( Убедитесь что имя вашего класса соответствует приведенному в коде, в противном случае измените его ).

Вы можете скачать изображения из assets демо игры по этой ссылке.
Создайте папку с именем assets и поместите в нее изображения.
Обратите внимание что большая часть кода это создание текстового поля и гиганитскии массив карта.

АПДЕЙТ: Код обновлен с учетом демонстрации нового Key класса ( по стилю AS2 ) и слушателя событий keyup, keydown. Приступим к коду:

package
{
 import Box2D.Common.Math.b2Vec2;
 import Box2D.Dynamics.b2World;
 
 import com.jacobschatz.bisonkick.autogeneration.Box2DLevelGenerationV2;
 import com.jacobschatz.bisonkick.autogeneration.Key;
 import com.jacobschatz.bisonkick.autogeneration.b2GSkinning;
 import com.jacobschatz.bisonkick.autogeneration.events.HeroEvent;
 
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.text.TextField;
 import flash.text.TextFormat;
 import flash.ui.Keyboard;
 
 [SWF(frameRate='60', backgroundColor='#000000')]
 public class SampleGame extends Sprite
 {
  private var world:b2World = new b2World(new b2Vec2(0,10.0),true);
  private var b2dLG:Box2DLevelGenerationV2;

                //4 изображения   доступны для загрузки по
//http://jacobschatz.com/wp-content/uploads/2010/12/bo2dgV2Sample/coin.zip
[Embed(source="assets/coin.png")] private var _coin:Class;   [Embed(source="assets/hero.png")] private var _hero:Class;   [Embed(source="assets/goal.png")] private var _goal:Class;   [Embed(source="assets/plat.png")] private var _plat:Class;     //Карта сгенирированная BisonKick //order: x , y , height, width, rotation, isDynamic, shape, friction,density,restitution,ID  & vertices private var map:Array = [ [173.5,769.35,49.99999999999999,148.99999999999997,0.2557344265043148,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[346.5,893.35,50,245,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[239,1016.3499999999999,49.999999999999886,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[452,1084.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[531,991.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[479,1312.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[681.5,1415.35,49.99999999999998,174.99999999999997,0.415088820880265,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1008.25,1586.9,49.99999999999999,127.99999999999993,-0.3600593293510518,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[858,1664.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1042,2044.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1218,2238.35,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1131.5,2406.85,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[591.5,1092.35,50,1023,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[434.5,666.3499999999999,49.99999999999998,187.00000000000003,-0.344019607077031,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[817.5,572.35,50,135,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[207,265.35,50.00000000000005,49.99999999999999,0.04256942056577332,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[705.5471568880848,288.6578960971827,49.99999999999998,348.97720886209925,-0.14832783412176492,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1051.435674945717,313.46139669152507,49.99999999999999,226.58934344245162,-0.6667484216307344,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1131,1335.35,50,340,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[209,180.35000000000002,32,32,0,true,'CIRCLE' , 0.5,0.5,0.5,'hero', '()','FOLLOWER'] ,[1865.05,1742.175,3450.9500000000003,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[34.899999999999864,1723.8,3447.7000000000003,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[974.1454901967322,3450.721983239433,1911.2657917113074,50.000000000000036,1.5883899390533787,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[964.0954901967323,24.921983239432997,1911.2657917113074,50.000000000000036,1.5883899390533787,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1572.5,472.5,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1710.05,1017.5,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[641.25,1885,50,402.5,0.3404877139747048,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1645.05,2575.15,50,50,0,true,'CIRCLE' , 0.5,0.5,0.5,'goal', '()'] ,[1819,181,50,50,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[856.5,2604.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1086,2785.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[806,2977.6,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1058.5,3150.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1383.5,3302.6,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1573.5,3335.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1163.5,3220.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[908.5,3065.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[943.5,2880.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[903.5,2705.1,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1056,2502.6,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1221,2311.6,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[1061,2136.6,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[841,2064.85,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[808.5,1784.85,50,237,0,false,'SQUARE' , 0.5,0.5,0.5,'plat', '()'] ,[421.65,484.95000000000005,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[441.65,506.95000000000005,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[459.65,524.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[385.65,518.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[405.65,540.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[425.65,558.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[357,546.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[377,568.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ,[397,586.95,26,26,0,true,'CIRCLE' , 0.5,0.5,0.5,'jewel', '()'] ];   private var heroLife:Number = 100;   public function SampleGame() { init(); }   private function init():void { var tf:TextField = new TextField(); var tfm:TextFormat = new TextFormat(null,40); tf.width = 900; tf.height = 900; tf.text = 'Use your arrow keys to control the "hero".\nCollect the coins and get to the goal. And explore.\nPress spacebar to turn on/off flying mode.'; tf.textColor = 0xFFFFFF; tf.mouseEnabled = false; tf.setTextFormat(tfm); tf.x = 700; tf.y = 700; addChild(tf); this.scaleX = 0.5; this.scaleY = 0.5; b2dLG = new Box2DLevelGenerationV2(world,this,true,map,false); b2dLG.keyDownHandler = keydown; b2dLG.keyUpHandler = keyup; b2dLG.addEventListener(HeroEvent.HURT,heroHurt); b2dLG.addEventListener(HeroEvent.COIN,heroCoin); b2dLG.addEventListener(HeroEvent.GOAL,heroGoal); b2dLG.addEventListener(HeroEvent.ITEM,heroItem); var skins:Object = {hero:_hero,coin:_coin,goal:_goal,plat:_plat}; var skinSettings:Object = {plat:b2GSkinning.STRETCH,hero:b2GSkinning.STRETCH};   b2dLG.createLevel('hero','goal','jewel',skins,skinSettings); b2dLG.hurtImpulse = 10;   b2dLG.heroCanFly = false; b2dLG.heroJump = 3.0; addEventListener(Event.ENTER_FRAME,update); }   private function keydown():void { if(Key.isDown(Keyboard.SPACE)) { b2dLG.heroCanFly = !b2dLG.heroCanFly; } } private function keyup():void {
                      //Что то классное произоидет здесь;
}   private function heroCoin(e:HeroEvent):void { b2dLG.destroyList.push(e.body); }   private function heroGoal(e:HeroEvent):void { trace("WINNER"); }   private function heroHurt(e:HeroEvent):void { if(heroLife > 0) { heroLife -= 20; //trace('Персонаж поврежден, осталось жизни: ' + heroLife); } else {
                                 //trace("Персонаж мертв" + e.impulse);
                                 //b2dLG.heroDead = true;
} } private function heroItem(e:HeroEvent):void { if(e.itemName == 'heart') { b2dLG.heroCanFly = true; } }   private function update(e:Event):void { b2dLG.update(false); } } }