|
|
|||||
Как раз сейчас балуюсь с JS + Box2D, тема для эксперимента вполне подойдет.
__________________
adobe AS3 manual |
|
|||||
В общем-то мысль про box2D у меня была... Когда я взялся за функцию появления новых блоков.
Нахождение схожих и общая, стартовая, расстановка блоков, падание блоков после убирания схожих - уже было сделано. Загвоздка стала именно с появлением новых. Потому что они сдвигали все блоки на одну ячейку влево. И нужно было ещё учитывать пустые ячейки, которые могли быть между основной "кучей" блоков и каким-нибудь остатком. В общем - после попыток всё это собрать, я посмотрел в сторону box2D. Но, как писал выше - после двух часов бесплотных попыток заставить его работать - плюнул и таки собрал нужную функцию. Которая сейчас благополучно прошла тестирование и работает К слову, кто хочет попробовать написать движок, я делаю аналог вот этой игры - http://www.deadwhale.com/play.php?game=2124 Чтоб я не расписывал все правила, так проще показать. |
|
|||||
Вы че, прикалываетесь все?
Тут поле ограниченных размеров - массив двумерный. Значение от ноля (пусто) до кол-ва цветов на поле. Плюс какой-то уникальный для взрывчатки. По клику: 1. Отловить всех соседей, если >= 2 - взорвать. (если взрывчатка то весь ряд) 2. Далее сдвигаем сверху вниз. Можно если не заморачиваться - пройтись по всему полю, начиная от самых верхних рядов, и если под ячейкой есть дырка - уронить ее. Если заморачиваясь, то волнами вокруг образовавшейся дырки. 3. Раз в несколько кликов - сдвинуть всю конструкцию влево. Опять же начиная от дальшнего ряда. Это работа модели и массива-карты поля. А вью по этим даным отрисовать вообще не проблема.
__________________
Кто к нам с чем для чего - тот у нас того от того. Последний раз редактировалось Dukobpa3; 04.10.2013 в 23:26. |
|
|||||
Классические линии реализовать сложнее в плане анимаций.
Там еще и поиск пути прикручивать надо. А тут вообще нифига нету. Взял и сделал.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Регистрация: Feb 2008
Сообщений: 21
|
Обычная задача на логику. Че тут делать то. Все сводится к поиску в массиве по определенному правилу, удалению элементов и последующей сортировке. Просто надо взять личт бумагии на нем для себя зарисовывать варианты и в голове прогонять алгоритм.
|
|
|||||
Да, я посмотрел какую именно вы игру делаете, думаю с Боксом Вы намучаетесь, я подумал за игру где кубы меняются местами. Первая сложность какая будет у Вас, это двигать их всех. А создавать виртуальный мир на каждый столбец не логично.
Лучше всего Вам работать с массивами. Примерно я думаю так package { import flash.display.Sprite; import flash.events.MouseEvent; public class Test extends Sprite { private var count:uint = 8; private var colors:Vector.<uint> = new Vector.<uint>(); private var game:Vector.<Vector.<Sprite>> = new Vector.<Vector.<Sprite>>; public function Test() { addEventListener(MouseEvent.MOUSE_DOWN, mouseHandler ); colors.push( 0xFF0000 ); colors.push( 0x00FF00 ); colors.push( 0x0000FF ); addBlock(); addBlock(); addBlock(); addBlock(); addBlock(); addBlock(); addBlock(); addBlock(); visualizator(); } private var targetColor:String; private var countT:Number = 0; private var stepAdd:Number = 3; private var step:Number = 0; private function mouseHandler(e:MouseEvent):void { var info:Array = informer(e.target.name); var coord:Array = info[1].split('.'); targetColor = info[0]; countT = 0; scanner( coord[0] , coord[1] ); rebuild(countT>2); if (++step==stepAdd) addBlock(); } private function rebuild(status:Boolean):void { var newGame:Vector.<Vector.<Sprite>> = new Vector.<Vector.<Sprite>>; for ( var cid:uint = 0 ; cid < game.length; cid++) { newGame.push( new Vector.<Sprite> ); for ( var bid:uint = 0 ; bid < game[ cid ].length ; bid++ ) { if (status) { if (game[ cid ] [ bid ].visible) { game[ cid ] [ bid ].visible = true; newGame[ cid ].push( game[ cid ] [ bid ] ); } } else { game[ cid ] [ bid ].visible = true; newGame[ cid ].push( game[ cid ] [ bid ] ); } } } game = newGame; visualizator(); } private function scanner( ix:uint , iy:uint ):void { rescanner( ix, iy ); try { if ( iy < game[ ix ].length - 1 ) for ( var sy:Number = iy+1; sy < game[ ix ].length ; sy++) { if ( game[ ix ] [ sy ].visible && informer( game[ ix ] [ sy ].name )[0] == targetColor ) { rescanner( ix, sy ); } else break; } if (iy) for ( sy = iy-1; sy >= 0 ; sy--) { if ( game[ ix ] [ sy ].visible && informer( game[ ix ] [ sy ].name )[0] == targetColor ) { rescanner( ix, sy ); } else break; } } catch (e:Error) { trace('omg') }; } private var scanVector:Number = 0; private function rescanner( ix:Number, iy:Number):void { try { if ( game[ ix ] [ iy ].visible && informer( game[ ix ] [ iy ].name )[0] == targetColor ) { game[ ix ] [ iy ].visible = false; countT++; } } catch (e:Error) { trace('omg');} var nx:Number; nx = ix+1; if ( nx < game.length && iy < game[ nx ].length ) { if ( game[ nx ] [ iy ].visible && informer( game[ nx ] [ iy ].name )[0] == targetColor) { game[ nx ] [ iy ].visible = false; countT++; scanner( nx,iy ); } } nx = ix-1; if ( nx >= 0 && iy < game[ nx ].length) { if ( game[ nx ] [ iy ].visible && informer( game[ nx ] [ iy ].name )[0] == targetColor) { game[ nx ] [ iy ].visible = false; countT++; scanner( nx,iy ); } } } private function blockBuilder(color:uint):Sprite { var block:Sprite = new Sprite(); block.name = color.toString()+'x'; block.graphics.beginFill( color ); block.graphics.drawRect(0,0, 20, 20); block.graphics.endFill(); return block; } private function informer(sname:String):Array { return sname.split('x'); } private function visualizator():void { while ( numChildren ) removeChildAt(0); var block:Sprite; for ( var cid:uint = 0 ; cid < game.length; cid++) { for ( var bid:uint = 0 ; bid < game[ cid ].length ; bid++ ) { block = game[ cid ][ bid ]; block.name = informer(block.name)[0]+'x'+cid+'.'+bid; block.x = stage.stageWidth - cid * 25; block.y = stage.stageHeight -bid * 25; addChild( block ); } } } private function addBlock():void { step = 0; var colums:Vector.<Sprite> = new Vector.<Sprite>; for (var i:uint = 1; i <= count; i++ ) { colums.push( blockBuilder( colors[ Math.floor( Math.random() * colors.length ) ] ) ); } var newGame:Vector.<Vector.<Sprite>> = new Vector.<Vector.<Sprite>>; newGame.push( colums ); var joins:Boolean = true; for ( i=0; i<game.length; i++) { if (!game[i].length && joins) { joins = false; continue; } newGame.push( game[i] ); } game = newGame; } } } конечно, нужно пихать экземпляры боксов в массив и не придумывать велосипеды с sprite.name но мне просто было лень создавать отдельный класс, хотя и можно было б в internal. Добавлено через 4 минуты да и там с проверкой чуток наворотил, можно обойтись одной рекурсией. Добавлено через 6 минут oops... бажит) Ну извините)
__________________
return this... |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
AlexCooper игра у Вас вообще не работает, она живет своей жизнью)
|
Часовой пояс GMT +4, время: 16:56. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|