Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Движок для игры "линии" (http://www.flasher.ru/forum/showthread.php?t=203668)

ndiezel 03.10.2013 19:16

Движок для игры "линии"
 
Всем привет.

Делаю сейчас игру, по типу "линий". Это когда собираешь три или больше кубика одного цвета в ряд - они исчезают. Ну, типа такой игры.
И вот, собственно, у меня вопрос - как лучше всего сделать движок для этой игры? Учитывая что новые блоки могут появляться с разных сторон и соответственно - будут двигать ряды или столбцы. Все или выборочно.
Я, поначалу, думал что легко сделаю эту игру, но как взялся за реализацию, понял что не всё тут просто.

Я сделал так. Создаю стартовый массив:
Код AS3:

private var blocks:Array =
                [
                ["blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","blank","blank","startingPosition","startingPosition","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","blank","startingPosition","startingPosition","startingPosition","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","blank","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","startingPosition","blank","blank"],
                ["blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank","blank"]
                ];

Заполняю на его основе экран блоками, запускаю саму игру:
Код AS3:

private function placeBlocksOnLevel():void
                {
                        addChild(blocksSloi);
                        for (var line:int=8; line>-1; line--)
                        {
                                for (var column:int = 12; column>-1; column--)
                                {
                                        var bv:int = 0;
                                        if (blocks[line][column] == "startingPosition")
                                        {
                                                bv = 1 + Math.random() * 7;
                                        }
                                        createBlock(line,column,bv);
                                }
                        }
 
                        addEventListener(Event.ENTER_FRAME,MainEnterFrame);
                }

Ну и дальше там уже перемещаю их, удаляю и т.д.
Подскажите, может есть более простые способы реализации подобной игры? Чтоб можно было легко отслеживать положение блока на экране и не терять его связь с данными в массиве?
Ато что-то мне кажется что что-то я намудрил... Сложная какая-то конструкция получается.

AlexCooper 03.10.2013 19:25

Я бы для начала использова вместо blank и startingPosition , 0 и 1, ну или тру / фэлсе.
А вообще конечно я бы использовал box2D и методом "сканирования" линий убивал не нужны. Тогда вообще не нужно было б знать что, где и куда ложить. Всё само б собиралось и рассыпалось.

ndiezel 03.10.2013 19:59

Цитата:

Сообщение от AlexCooper (Сообщение 1147573)
Я бы для начала использова вместо blank и startingPosition , 0 и 1, ну или тру / фэлсе.
А вообще конечно я бы использовал box2D и методом "сканирования" линий убивал не нужны. Тогда вообще не нужно было б знать что, где и куда ложить. Всё само б собиралось и рассыпалось.

Я бы тоже использовал box2D но он у меня не хочет запускаться. Пробовал и на Flash Develop и на Flash cs 6. Несколько часов на него убил, потом плюнул и решил сам всё писать.

AlexCooper 03.10.2013 20:38

Вложений: 1
ndiezel хм...

ndiezel 03.10.2013 20:48

Цитата:

Сообщение от AlexCooper (Сообщение 1147577)
ndiezel хм...

Скачал.
Тогда можно про вот это поподробней:
Цитата:

А вообще конечно я бы использовал box2D и методом "сканирования" линий убивал не нужны. Тогда вообще не нужно было б знать что, где и куда ложить. Всё само б собиралось и рассыпалось.
?

Это функция, которая будет находить от трёх и больше в одну линию? Или есть какая-то похожая в box2D?

KumoKairo 04.10.2013 00:09

Не надо бокс2Д, это оверкил.
Посмотрите пример PiratePigs который в пакете демо проектов с OpenFL идет, там все просто сделано
тут гайд по ковырянию в openFL
Заметьте, я не предлагаю делать на Haxe, я предлагаю посмотреть реализацию (синтаксис языка очень похож на AS3, а openFL апи вообще почти копирует стандартный флешевсий)

Dukobpa3 04.10.2013 01:05

Эммммм.....
Бокс для лайнсов?
Может пока не поздно курьером пойти работать и нуевонафиг это программирование?

Добавлено через 3 минуты
делаешь шаблоны вида:

Код:

0, 0, 1
0, 1, 0
1, 0, 0

Код:

1, 1, 1
Код:

1
1
1

Код:

1, 0, 0
0, 1, 0
0, 0, 1

Прикладываешь штамп к своему большому полю, получаешь пересечение со штампом.
Это как самое очевидное и простое решение.
Если мозги включить то можно и что-то поизящнее придумать. Мне сейчас этим заниматься не охота.
И да. В любом случае или 0, 1 или тру/фолс.
Но у тебя там скорее всего будут шарики разноцветные, так что тру фолс наверное нет, а вот номер цвета вполне может быть.

Добавлено через 7 минут
Еще одно простое решение - пройтись по всем ячейкам и посмотреть на +/- одну в каждую сторону от нее.
если и + и - будут такими же как исходная - можно убирать.

GBee 04.10.2013 01:17

Простого прохода по столбцам и по строкам хватит за уши. Прикручивать что-то левое для такой задачи очень мощный изврат.

Dukobpa3 04.10.2013 03:34

Я тут подумал.
Всё-таки склоняюсь к реализации через flex DataGrid + ItemRenderer.
Метода лучше - для этой задачи не найти.

ndiezel 04.10.2013 15:27

Цитата:

Сообщение от Dukobpa3 (Сообщение 1147588)
Эммммм.....
Бокс для лайнсов?
Может пока не поздно курьером пойти работать и нуевонафиг это программирование?

Поздно )
Уже лет 7 как.

expl 04.10.2013 17:30

Вложений: 1
Цитата:

Чтоб можно было легко отслеживать положение блока на экране и не терять его связь с данными в массиве?
1. Вместо текста "blank" храним null, вместо текста блока храним экземпляр класса Block
2. В экземпляре класса храним ссылку на визуальный объект
Или, если мы фанаты MVC и не хотим чтобы наш массив что-то знал об отображении, то не делаем ссылку внутри Block, а храним словарь (Dictionary):
Код AS3:

viewByBlock[block] = blockView;
...
var blockView = viewByBlock[block];

Моё древнющее творчество по несколько другой игре. Но кода мало, откровенного маразма нет - можно разобраться.
Eсли fla не открывается - не обращайте на него внимания - там кода нет, он весь снаружи
Вложение 30061

AlexCooper 04.10.2013 18:23

Чем вам бокс не угодил?)
Создаем физические карты, генерируем объекты сверху вниз и методом сканирования проходим по телам определяя индекс по остатку от деления index[ X%(CountObjectX/StepX) , Y%(CountObjectX/StepX) ]. Не нужно никаких дополнительных массивов. При клике сдвигаем только отображение, сами тела оставляем в покое, при составлении линий уничтожаем тела, имеем красивую визуализацию взаимодействия объектов, играем с физ свойствами и профит.

ndiezel 04.10.2013 18:27

Цитата:

Чем вам бокс не угодил?)
Боюсь ошибиться, но наверное это что-то вроде как из пушки по воробьям стрелять...

AlexCooper 04.10.2013 18:32

Цитата:

Сообщение от ndiezel (Сообщение 1147648)
Боюсь ошибиться, но наверное это что-то вроде как из пушки по воробьям стрелять...

Не знаю, не знаю на счет пушки, мне лично не пришлось бы думать как там красивенько их двигать, всё работало само собой. Создал бы еще класс который генерировал кубики если под "точкой регистрации" этого класса нет объекта. И всё вообще само собой играло и создавалось. Осталось только создать различные зоны и натянуть красивую графику и сделать процедуру нахождения линий.

Dukobpa3 04.10.2013 18:53

Наверное поэтому уже и играть не во что.

Добавлено через 39 секунд
Потому что "думать не приходится".
Ни души ни идеи, ни усилий. Только фреймворк написанный кем-то и непонятно как работающий. Конструктор.

AlexCooper 04.10.2013 19:02

Цитата:

Сообщение от Dukobpa3 (Сообщение 1147651)
Потому что "думать не приходится".

Дык а что думать. Вы наверное всё в ручную пишете? И TweenLite'том тоже не пользуетесь? Ну хочется Вам подумать, думайте кто Вам мешает) Пиши свой класс, пихайте в массивы, играйтесь с анимацией, просчитывайте взаимодействия. Согласен с тем что функционально, есть избыточность, которая заключается в самом движке Box2D, но помоему это может существенно с экономить время на разработку.

Добавлено через 7 минут
p.s. и не думаю что уступит рукописным методам ТС.

strangedk 04.10.2013 19:19

А разве в случае с Box2D нет вероятности что блок вдруг решит повернуться и застрять? Принципиально дома попробую сделать просто падающие блоки, что-то мне подсказывает что ничего не выйдет. И оно всё развалится.

AlexCooper 04.10.2013 19:35

Для этого в Box2D есть физ. свойства объектов. Можно объект на объекте налаживать и ничего не развалиться, не помню точное название свойства но знаю что 100% есть. (Запрещает прокручивание объекта)

Добавлено через 2 минуты
Вот визуально выглядит на 11 Шаге с выключенным балансированием и включенным

strangedk 04.10.2013 19:47

Ага, понял. Спасибо. Идея неплохая, но всё же кажется что физ.движок здесь лишний.
Разве что сделать так, чтобы физика использовалась по делу. Эффекты какие-то, или в конце игры взрыв кубикам делать)

AlexCooper 04.10.2013 19:54

Да можно просто изменить вес объектов и их пружинные свойства, etc. В соответствии будут разные визуальные эффекты как одно на другое падает. Так же можно вконце игры или взрывать или сглаживать углы чтобы все ящики сползли, вообще м вариаций множество. Опять таки соглашусь с тем что физ. движок здесь избыточен но он решает вопрос игровой логики, остается только генерить с условие сверху объекты и механизм определяющий линии. профит.

strangedk 04.10.2013 20:04

Как раз сейчас балуюсь с JS + Box2D, тема для эксперимента вполне подойдет.

AlexCooper 04.10.2013 20:36

Цитата:

Сообщение от strangedk (Сообщение 1147663)
Как раз сейчас балуюсь с JS + Box2D, тема для эксперимента вполне подойдет.

Поделитесь результатами)

ndiezel 04.10.2013 21:31

В общем-то мысль про box2D у меня была... Когда я взялся за функцию появления новых блоков.
Нахождение схожих и общая, стартовая, расстановка блоков, падание блоков после убирания схожих - уже было сделано. Загвоздка стала именно с появлением новых. Потому что они сдвигали все блоки на одну ячейку влево. И нужно было ещё учитывать пустые ячейки, которые могли быть между основной "кучей" блоков и каким-нибудь остатком.

В общем - после попыток всё это собрать, я посмотрел в сторону box2D. Но, как писал выше - после двух часов бесплотных попыток заставить его работать - плюнул и таки собрал нужную функцию.
Которая сейчас благополучно прошла тестирование и работает :)

К слову, кто хочет попробовать написать движок, я делаю аналог вот этой игры - http://www.deadwhale.com/play.php?game=2124 Чтоб я не расписывал все правила, так проще показать.

Dukobpa3 04.10.2013 21:52

Вы че, прикалываетесь все?
Тут поле ограниченных размеров - массив двумерный. Значение от ноля (пусто) до кол-ва цветов на поле. Плюс какой-то уникальный для взрывчатки.

По клику:
1. Отловить всех соседей, если >= 2 - взорвать. (если взрывчатка то весь ряд)
2. Далее сдвигаем сверху вниз. Можно если не заморачиваться - пройтись по всему полю, начиная от самых верхних рядов, и если под ячейкой есть дырка - уронить ее. Если заморачиваясь, то волнами вокруг образовавшейся дырки.
3. Раз в несколько кликов - сдвинуть всю конструкцию влево. Опять же начиная от дальшнего ряда.

Это работа модели и массива-карты поля.
А вью по этим даным отрисовать вообще не проблема.

GBee 04.10.2013 22:50

В классических линиях никто никуда не падает

Dukobpa3 04.10.2013 23:11

Классические линии реализовать сложнее в плане анимаций.
Там еще и поиск пути прикручивать надо. А тут вообще нифига нету. Взял и сделал.

RedLizard 05.10.2013 00:01

Обычная задача на логику. Че тут делать то. Все сводится к поиску в массиве по определенному правилу, удалению элементов и последующей сортировке. Просто надо взять личт бумагии на нем для себя зарисовывать варианты и в голове прогонять алгоритм.

AlexCooper 05.10.2013 01:32

Да, я посмотрел какую именно вы игру делаете, думаю с Боксом Вы намучаетесь, я подумал за игру где кубы меняются местами. Первая сложность какая будет у Вас, это двигать их всех. А создавать виртуальный мир на каждый столбец не логично.
Лучше всего Вам работать с массивами.
Примерно я думаю так
Код AS3:

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;
 
 
                }
        }
 
}

Добавлено через 4 минуты
конечно, нужно пихать экземпляры боксов в массив и не придумывать велосипеды с sprite.name но мне просто было лень создавать отдельный класс, хотя и можно было б в internal.

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

Добавлено через 6 минут
oops... бажит) Ну извините)

Akopalipsis 05.10.2013 01:42

AlexCooper игра у Вас вообще не работает, она живет своей жизнью)

AlexCooper 05.10.2013 13:32

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

Akopalipsis 05.10.2013 14:28

AlexCooper у меня к Вам вот какой вопрос, да и вообще ко всем кто сможет ответить - я у Вас в коде не нашёл методов удаления элементов массива, и что мне первое пришло в голову, когда я думал как это сделать, это тоже не удалять или просто нулить элементы. Но если играть два часа, то не получится так, что память уронится?

ndiezel 05.10.2013 14:39

AlexCooper, спасибо вам за труды. Вы, пока что, один из не многих кто не доказывал мне как просто это сделать, а взял и попробовал сделать сам. (Да-да, это камень в огород некоторых :) )

Но к сожалению, я почти ничего не понял в вашем коде. Сначала я даже засомневался - на AS3 ли это?..
Попытался разобраться, но видимо, я ещё не так хорошо знаю язык.

Я надеялся что отпишется кто-нибудь кто занимался разработкой именно такой или похожей игры, игра-то популярная, шансы были. Но всё скатилось к обсуждениям в стиле "как я бы это сделал" или "как я считаю это должно работать в теории". А такие обсуждения я считаю безсмыссленными, в силу уже написанного ранее: "Сам был такой же умный, пока не взялся сделать".

Ну и поскольку в обсуждении не было ничего такого, что кардинально бы отличалось от способа, которым сделал я, буду надеяться что движок выдержит все последующие мои "фичи", а если где не выдержит - мне хватит извилин в тыковке, чтоб его допилить)

В общем - буду делать по своему, тем более что пока что - всё работает. А там посмотрим.
Благодарю всех за ответы.

Пы.Сы. К слову, кто хочет посмотреть на игрушку, которая уже потихоньку рождается - пишите в личку, дам доступ к ней на фгл.

Akopalipsis 05.10.2013 14:59

А мне наоборот интересно сам принцип реализации, так как я много ещё чего не знаю, то очень хотел бы получить названия способов реализации. Меня интересует -
1) Стоит ли создавать обьекты заново или же стоит в самом начале создать максимум квадратов, а потом их перекладывать из массива в массив?
2) Как узнавать всб цепочку совпадений цветов? Это обход пути?

Dukobpa3 05.10.2013 15:00

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

ndiezel 05.10.2013 15:12

Цитата:

1) Стоит ли создавать обьекты заново или же стоит в самом начале создать максимум квадратов, а потом их перекладывать из массива в массив?
Объекты (мувиклипы) должны быть в библиотеке, а вы из неё должны будете их размещать на полотно столько, сколько вам нужно.
Если игра не закончилась и в последующем будут новые объекты, то обычно "отработавшие" объекты не удаляют, а скрывают.
Лично я перемещал "отработанные объекты" в отдельный массив и если мне нужен был "новый" объект - выдёргивал мувик из вот этого, массива отработавших объектов. Задавал ему нужные параметры, размещал там, где мне нужно, удалял из отработанного массива и размещал в новый, с рабочими мувиками.
Это позволяло снижать нагрузку на процессор, когда мувиков оказывалось много.

Код AS3:

Как узнавать всб цепочку совпадений цветов? Это обход пути?

Я сделал простым перебором от кликнутого мувика и по сторонам остальных мувиков. В мувике - переменная с цветом. Совпадают - найден, ищу уже от этого тоже.
Вот функция:
Код AS3:

                private var findedPause:int;
                private function findBrothers(line:int, column:int):void
                {
                        blocks[line][column].findedBrother = true;
                        //Ищем слева
                        if (blocks[line][column - 1].blockType != "blank" && ! blocks[line][column - 1].findedBrother)
                        {
                                if (blocks[line][column].blockType == blocks[line][column - 1].blockType)
                                {
                                        findBrothers(line,column-1);
                                }
                        }
                        //Ищем справа
                        if (blocks[line][column + 1].blockType != "blank" && ! blocks[line][column + 1].findedBrother)
                        {
                                if (blocks[line][column].blockType == blocks[line][column + 1].blockType)
                                {
                                        findBrothers(line,column+1);
                                }
                        }
                        //Ищем сверху
                        if (blocks[line - 1][column].blockType != "blank" && ! blocks[line - 1][column].findedBrother)
                        {
                                if (blocks[line][column].blockType == blocks[line - 1][column].blockType)
                                {
                                        findBrothers(line-1,column);
                                }
                        }
                        //Ищем снизу
                        if (blocks[line + 1][column].blockType != "blank" && ! blocks[line + 1][column].findedBrother)
                        {
                                if (blocks[line][column].blockType == blocks[line + 1][column].blockType)
                                {
                                        findBrothers(line+1,column);
                                }
                        }
 
                        findedPause = 10;
                        clicksNotAviable();
                        removeBlock(line,column);
                        createBlock(line,column,0);
                }


Цитата:

Сообщение от Dukobpa3 (Сообщение 1147736)
Так что извините. На камень не откликнусь.

Извините, но уже. Пусть и таким странным образом. :)

Dukobpa3 05.10.2013 15:31

Я в данной теме обсервер:) Хоть направление уже ближе к верному избрали))))

Akopalipsis 05.10.2013 18:50

А если уйти от слов "тестовых заданий" и представить, что знания одного кода мало, нужен ещё опыт, которого лично у меня нет и скоро не предвидится. То как должна быть построена сама игра?
То есть не логика, а механизм игры? Ряды кубиков, это отдельные массивы? Если это все один массив, то как он двигает только часть его? Ведь когда между рядами пробелы, то ряды за пробелами не двигаются.
Может тут есть сетка, которая каждый ход обновляет данные о своем состоянии?)

Dukobpa3 05.10.2013 18:56

Я бы во-первых рекомендовал мвц.
Все изменения производить с двумерным массивом интовых кодов в модели.
Далее уже думать как рисовать вью. И вот тут уже однозначного ответа дать не могу. Тут уже хоть бокс2д может по этому массиву рисоваться с физ-эффектами. Могуть быть партиклы, может быть плавное переекание одного кубика в другой как лава или кисель. От этого всего очень сильно может отличаться реализация вьюхи.

Модель же при любых раскладах проще всего сделать именно двумерным массивом и просто сортировать и двигать ячейки в нем.

Если берем за основу пример по ссылке - то тут один из самых простых вариантов - во вью тоже двумерный массив. Т.е. и во вью и в модели два идентичных массива данных, но в модели просто код цвета, а во вью уже мувики.
Далее просто остается научить каждый мувик в массиве вью научить удаляться и двигаться и всё. (Добавляться они все будут стандартно и по целому столбцу слева, это другой механизм, это уже в каждый кубик пихать не стоит)

Akopalipsis 05.10.2013 19:26

Цитата:

Все изменения производить с двумерным массивом интовых кодов в модели.
А какими свойствами должен обладать элемент этого массива?

Dukobpa3 05.10.2013 23:26

Написал же выше.
Цитата:

массивом интовых кодов
Никакими.
Можно:
Код AS3:

Vector.<Vector.<int>>

Добавлено через 1 минуту
Хотя я бы использовал битмапдату как массив.
И брал бы один элемент массива как один пиксель и по цвету бы уже смотрел. Но это уже высокая материя.
(примерно так)


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

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