Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > As3 изучение и немного As2

Оценить эту запись

Создание игр типа казино. Часть первая : Рулетка (Скинование)

Запись от in4core размещена 16.01.2012 в 04:05
Обновил(-а) in4core 16.01.2012 в 17:16

Все привет на связи снова ваш друг и товарищ )) Совсем казалось бы недавно приступили к созданию онлайн-казино, а времени прошло... Вот решил поделится своими наработками в этой сфере, дабы кому пригодится. Писать буду много и не по делу))) .
Вообщем открываю цикл статей из 3х частей ( рулетка , блекджек* , игровые автоматы + начертания клиентского лобби ).

* если у Кордума будет желание, он расскажет Вам, как делал BJ, на самом деле надеемся на него ибо принципиальные подходы на разработку у нас различные - поэтому будет интересно, думаю, всем почитать и о его наработках, если он пожелает. Будем надеяться.

Если из названия непонятно, то речь пойдет о клиентских приложениях онлайн-казино игр, в данной статье о Рулетке. Конечно пару слов и про сервер будет сказано.

И так поехали...

1. Учимся анализировать.

Сначала нужно, ясное дело, представить из чего у нас все это будет состоять, как взаимодействовать друг с другом, возможны ли расширения и т.п.
а) Каким бы не был красивым интерфейс - он может и поменяться, поэтому без скинования нам не обойтись.
Скинование ( мы говорим про pure as - flex Не трогаем, да и еще речь пойдет про векторные скины) может быть 2х типов - swc library и swf library. Принципиальная разница ощутима - если в первом случае ( работая например в FD ) мы сможем легко видеть дерево классов, пихать в проект не задумываясь, менять их, расширятся ими - то во втором случае классы придется дергать по getDefenition . Еще один момент, во втором случае библиотеки грузятся run time без доп компиляции, что очень удобно. В цикле статей мы рассмотрим все два варианта.
Третьего варианта типа всю графику зашить в swf с программой - есть быдло-кодство, поэтому такого варианта существовать не будет совсем.
б) Надо помнить, что игр может быть сколько угодно, поэтому каждая игра должна быть независима, а уж если говорить о том, что игры может писать несколько разработчиков сразу, то вообще тьма. Не забываем, также, что может произойти такой момент, что в игру придется передавать какие либо параметры до инициализации на стейдж, поэтому, в любом случае, советую создать интерфейс для нашего Main, ну например IGame.
в) Организация кода. Важный момент, который изначально продумать сложно, но приблизительную структуру проекта создать все же можно. Не буду пропагандировать MVC в данном случае, но лучше с ним. Я же воспользовался своим альтернативным методом, который практикую почти в любом проекте. Структура :

- Main ( содержит только метод init и методы для передачи параметров извне )
--- init() const fw:FrameWorkManager = new FrameWorkManager(this); ( собственно понятно, что точка входа начнется там с передачей одного лишь параметра stage куда будет добавляться вся наша графика.
- Managers
--- FrameWorkManager ( объединяет, перекидывает данные, создает атмосферу так сказать, здесь будут созданы и инициализированы остальные менеджеры, а так же загрузка библиотек скинов )
--- ServerManager ( обработка серверных методов + коннекшн )
--- GameManager ( или в данном случае RouletteManager - класс будет заниматься интерактивом и слегка данными, то есть , например установка нового текста в текстовое поле, удаление-добавление DO и т.п.)
--- SKinManager ( организатор скинов )
- Utils
--- Config ( сборник констант, таких как адреса сервера например )
--- ServerParser ( по названию, парсер данных приходящих с сервера )
--- ServerErrors ( сборник констант ошибок сервера, сборник нотификационных сообщений )
--- Utils ( некие статические методы такие как - CreateSimpleButton и т.п. )
- Elements ( классы для любых интерактивных элементов ).
- Events ( с названия понятно, что речь о Event классах, например ServerEvent.CONNECT )

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

2. Первые шаги ( Скинование )


Парочка замечаний по организации fla. В самом fla советую сразу раскладывать скин по нужным координатам, ибо потом будет проще его натянуть. Пути для скинов предлагаю назвать так skins.SomeClass - собственно удобно. Классы стоит называть логично . Предлагаю такую схему -
для кнопок - CustomBtn , SuperButton, BtnMain - тоесть слово Btn должно присутствовать как бы говоря нам - это кнопка, а не дрова.
Для текстовых полей ( инстансы ). Если это статик текст то stf_login , stfLogin. Если dynamic то tf_login. Так не запутаешься. Ну, а остальные элементы по вкусу, главное не потеряться потом.

Далее привожу конкретно код своего менеджера скинов.

Код AS3:
public function SkinManager( library:String , obj:DisplayObjectContainer ):void  {
 
        _obj = obj;
	_loader = new Loader();
	_loader.contentLoaderInfo.addEventListener(Event.COMPLETE , skinsLoaded);
	_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , onError);
	_loader.contentLoaderInfo.addEventListener(Event.OPEN , onOpen);
	_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS , onProgress);
 
	var req:URLRequest = new URLRequest ( library );
 
	_loader.load ( req ) ;
}
 
private function skinsLoaded(e:Event):void {
 
        _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE , skinsLoaded);
	_loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR , onError);
	_loader.contentLoaderInfo.removeEventListener(Event.OPEN , onOpen);
	_loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS , onProgress);
 
	_manageSkins ( e.currentTarget as LoaderInfo );
 
	_loader = null;
}
 
private function _manageSkins (skin:LoaderInfo) :void {
 
        var clipClass:Class;
	// для клипов
	clipClass = skin.applicationDomain.getDefinition("skins.SKTableBig") as Class;
	var tableBig:MovieClip  = new clipClass() as MovieClip;
        // для текста
        var tfnum:TextField  =  ( skin.content as MovieClip ).getChildByName ('stf_number') as TextField;
        // далее идут addChild ы ,  затем установка координат, или наоборот, неважно. 
}
// Ну и в конце концов идут доступы до каждого нужного элемента. В данном случае я предложил 
//воспользоваться static ибо скин грузится первым делом, 
//а только потом идет инициализация игры, 
//во вторых теперь с любого места я могу достучаться до любого элемента скина, 
//если вдруг потеряю нить верной архитектуры.
 
public static function getLobbyButton():MovieClip {
	return _lobbyButton;
}
СОбственно все довольно просто.
Напоминаю, что мы рассматривали swf library. Еще один важный момент по скин - классам - для кнопок советую сразу описывать out/over/push хандлеры особенно если стейты раскиданы по кадрам кнопки,а так же фичи типа mouseChildren. Вот и отлично, после всего этого можно смело сдавать первую часть заказчику со словами смотрите , как много я сделал, даже кнопки нажимается))) И получать свою первую ЗП ))
В следующей части разбора игры мы поговорим о сервере, видео канале, чате.

UPD : Забыл еще сказать, что при таком подходе добавление MC из скина, добавит его на 0-0, и координату нащупать придется самому ( поэтому выше было написано о том, что сразу рисуйте скин на нужных координатах, чтобы потом смотреть их и сразу прописывать ), а вот для текстовых полей все намного удобнее, после добавления - они останутся на тех координатах , на которых были заявлены в скине
Всего комментариев 12

Комментарии

Старый 16.01.2012 11:17 red_penguin вне форума
red_penguin
 
Аватар для red_penguin
и ни слова про рулетку.
Старый 16.01.2012 12:27 GBee вне форума
GBee
 
Аватар для GBee
Насчет первого пункта скажу одно - у всех он свой в той или иной форме, и постепенно меняется от проекта к проекту. А если не меняется значит либо разработчик остановился в развитии, либо достиг идеала (хотя, по-моему, это одно и тоже).

Про скины хорошо. При таком подходе графику можно и во флэшку зашить быстро и безболезненно для всего остального (если заказчик захочет).
Старый 16.01.2012 13:16 Tails вне форума
Tails
 
Аватар для Tails
Жду продолжения

Поправь комментарий:
Код AS3:
// Ну и в конце концов идут доступы до каждого нужного элемента. В данном случае я предложил 
воспользоваться static ибо скин грузится первым делом, 
а только потом идет инициализация игры, 
во вторых теперь с любого места я могу достучаться до любого элемента скина, 
если вдруг потеряю нить верной архитектуры.
public static function getLobbyButton():MovieClip {
			return _lobbyButton;
}
Старый 16.01.2012 13:55 КорДум вне форума
КорДум
 
Аватар для КорДум
Цитата:
блекджек*
Сам писать будешь?
Это, Сань, пробегись по статье, поисправляй форматирование. Глаз немного стукается.
Старый 16.01.2012 14:26 in4core вне форума
in4core
 
Аватар для in4core
Щас заправим форматирование.

red_penguin - всему свое время, я буду писать последовательно, от начала проекта до конца. А сразу все свалить в одно - будет не органично ибо темы то разные
Старый 16.01.2012 14:34 red_penguin вне форума
red_penguin
 
Аватар для red_penguin
можно было бы хотя бы план работ кинуть.
Старый 16.01.2012 14:52 mayakwd вне форума
mayakwd
очень здорово, все время узнаешь что-то новое.
ещё один хит в копилку.
Старый 16.01.2012 15:54 in4core вне форума
in4core
 
Аватар для in4core
mayakwd - подколка или как?
Старый 16.01.2012 16:37 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
Цитата:
// для текста
var tfnum:TextField = ( skin.content as MovieClip ).getChildByName ('stf_number') as TextField;
вот тут не понял что это дает?

Цитата:
_obj.dispatchEvent(new Event(LOADED));
вот тут я не понял чегойто какой то менеджер диспатчит событие левого элемента? (я так понял ДисплейОбжектКонтейнер передавался только для того, чтоб отдиспатчить?)
и чем родной COMPLETE не угодил?

и да, где MVC-то?
и да, где Рулетка-то?
Старый 16.01.2012 17:16 in4core вне форума
in4core
 
Аватар для in4core
cleptoman конечно же отвечу на каждый вопрос.
1. Что дает. Если в fla мы на сцену сразу кидаем текстовое-динамик поле, выставляем его координаты , форматирование и т.д. , после чего из swf получить ссылку на него можно таким вот образом, после чего добавить его в DisplayList - соотв поле будет стоять уже на нужном нам месте, со всеми делами.
2. Да это можно было бы убрать, случайно скопировал лишнее. Там ситуация немного другая, и событие лоадед диспатчится не по комплит, а немного позже, после некоторых операция. Щас удалим это .

MVC то и нет, читайте внимательнее я описал, что я не использовал его, а юзал свой собственный метод. С другой стороны причем в данном посте может быть мвс? Не причем, тут рассказ только про скинование.
Где рулетка - уже ответил на этот вопрос, я освящаю ПОЛНЫЙ проект, в 3й части будем рассматривать как раз именно функционал рулетки, тоесть столов , а до этого идет вводная часть, а так же взаимодействие с сервером.
Старый 16.01.2012 17:31 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
1 - т.е. если нам понадобится 2 текстфилда, то в либе у нас будет 2 текстфилда?..не проще ли с таким подходом делать 1 класс с преформатированнми текстфилдами типа SomePage или TextFieldHolder ?.Я ,конечно, не в курсе структуры как там чего..но сам подход какой то странный )
Старый 16.01.2012 17:39 in4core вне форума
in4core
 
Аватар для in4core
Не в том дело, что нам 2 таких (однотипных ) не понадобится, текстфилдов у нас конечно навалом, не менее 25, но они все разные, то шрифты, то цвет, то стоят на разных координатах.
 

 


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


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