Форум 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=144450)

greegreeman 12.09.2010 21:52

обеспечить переход по уровням игры
 
привет, подскажите, как можно обеспечить наилучшим образом смену уровней в игре. пробую написать простенькую игру на базе MVC и никак не могу всунуть туда переход по уровням. кто должен за это отвечать?

etc 13.09.2010 11:58

Контроллер.

greegreeman 14.09.2010 02:23

ок. контроллер. пускай есть 15 уровней. каждый уровень - это вьюшка отдельная, которая грузится по листнеру в контроллере? или это одна вьюшка, в которую подгружается data или VO? или надо делать 15 мувиклипов и в зависимости от номера уровня грузить тот или иной? мне нравится вариант, когда у меня одна вьюшка - GameLevelsView, в которую подгружается data с инфой об уровне и в зависимости от нее создаются новые и удаляются старые мувики. Как все таки лучше? может есть удачные примеры левел провайдеров?

in4core 14.09.2010 03:47

1е решение или 2е. по желанию. все норм будет

etc 14.09.2010 10:26

Вьюшка одна.

greegreeman 15.09.2010 01:50

мне вполне нравится вариант с одной вьюшкой. перейду к коду. предположим мы нажали кнопку Play, удалилось менюшка и задиспатчился кастомный ивент о начале нового уровня, который я слушаю в контроллере:
Код AS3:

dispatcher.addEventListener(GameEvent.PROCESS_NEXT_LEVEL, onProcessNextLevel);

обрабатываю его так:
Код AS3:

private function onProcessNextLevel(e : GameEvent) : void {
        view.createGameLevel(model.currentLevel);
        model.increaseCurrentLevel();
}

как видно я передаю во вьюшку номер левела и сразу увеличиваю номер следующего уровня. во вьюшке я, зная какой номер уровня, подгружаю соответствующую графику.
И вот, что мне не нравится, так это то, что во вьюшке мне приходится делать так:
Код AS3:

switch(levelsNum) {
        case 1:
                // for example
                createSquares();
                createCircles();
                break;
        case 2:
                createTriangles();
                createPyramids();
                break;

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

Wolsh 15.09.2010 08:30

Абстрактный класс AGameLevel, интерфейс IGameLevel, классы-наследники GameLevel001 ... GameLevel100.
Эти классы (классы, не экземпляры) складываем в массив _gameLevels. При повышении уровня создаем новый уровень -
Код AS3:

val level:IGameLevel = new _gameLevels[_currentLevelIndex + 1];

Не нужна будет конкретика в названиях методов, квадратики там или пирамидки, определяется классом-наследником, то есть собственно левелом. Абстрактно это "фигура1" и "фигура2", операции с которыми и доступ к ним могут быть описаны еще в суперклассе и интерфейсе, а конкретное рисование - в методах подклассов (левелов).

mikhailk 15.09.2010 13:44

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

Что-то типа:

Код AS3:

 
val iGameLevel:IGameLevel;
 
private function openLevel(levelIndex) : void
{
  if (iGameLevel)
  {
      iGameLevel.remove();
  }
  iGameLevel = new _gameLevels[levelIndex];
}


Впрочем, возможно, это только у меня такая необходимость. :)

greegreeman 15.09.2010 20:23

Wolsh, где хранится массив _gameLevels?
mikhailk, согласен.

mikhailk 15.09.2010 20:29

_gameLevels - это переменная класса основного контейнера, в котором будут открываться уровни.

С другой стороны, очень от игры зависит.
Если каждый левел весит по 2-3 метра, их никто заранее не закачивает, в этом случае и массив объектов GameLevel, возможно, смысла большого не имеет.


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

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