Anthill Alpha 0.1.0

Ну вот, спустя три недели активной работы над доработками и рефакторингом движка, наконец-то я могу выложить первый билд, хоть и не идеальный, но вполне работоспособный.

Наконец-то это случилось! Кто-то долго ждал, а кто-то вообще наверное не ждал. Но это неважно. Это первый мой публичный открытый проект, который вышел в свет. Результат далеко не верх совершенства, так как совершенство безгранично. Но признаюсь, заявление о публикации своих наработок заставило меня не только немного попереживать, но и активно поработать над самим фреймворком, привести его в должный вид, местами весьма глобально переосмыслить код, вычитать комментарии и, конечно, же наделать новых багов. А ведь всем этим совершенно некогда заниматься, когда работаешь над играми. Нет времени и сил для вылизывания своих инструментов, ведь они не так важны, как продукт, который их использует. Главное чтобы игра работала и игрок был рад, а на каком там скотче и жевачке все держится внутри — уже последнее дело, а тут такой повод. Поэтому я немного взволнован.

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

Всем фанатам Flixel сразу хочу сообщить, что за основую Anthill взята идеология Flixel, так как там все достаточно просто и понятно для освоения и работы. Я пробовал много фреймворков, прежде чем начать работу над своим, и только во Flixel мне удалось разобраться, не скомпилировав на нем ни одной игры. Поэтому я решил, что если буду делать что-то свое, то буду придерживаться такой же идеологии.

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

Для Anthill Framework я сразу решил подготовить отдельную страничку, где можно посмотреть примеры, скачать сам фреймворк, а так же найти документацию.

Перейти на страничку Anthill Framework →

В общем, вот так вот совершенно случайно случился маленький подарок на день программиста. Пользуясь случаем всех неравнодушных к программированию - поздравляю с профессиональным днем! :)


Индикаторы: Релизы, Action Script 3
Постоянная ссылка

 

 

Наконец-то. Я долго ждал))) Как найдется время - обязательно протестирую и попробую твою библиотеку в новых проектах.

Naitonium
12 Сентября 2012
— 22:59
#

Антон, спасибо огромное! Щас посмотрим.

P.S. с днем программиста тебя.

manny_calavera
12 Сентября 2012
— 23:02
#

Да, совсем забыл. С днем программиста!
Хороший подарок. Спасибо!

Naitonium
12 Сентября 2012
— 23:17
#

Крутота.
Для класса antPoint такие функции, как divide и substract в общем-то и не требуются.
А вот вычисление скалярного и псевдовекторного произведения не помешало бы.

p.s. капча лютая

приветкакдела
12 Сентября 2012
— 23:20
#

Спасибо. Будем изучать.
С днем программиста!

Shtirlitz406
12 Сентября 2012
— 23:24
#

Антон, ты как всегда радуеш новыми вещами, и они каждый раз все больше и больше поражают проделанным трудом=)
Свой собственный фреймворк да и еще с примерами и детальной документацией - это вобще круто, спасибо тебе огромное=)

Ну и с разу хотелось бы задать такой вопрос: как Anthill будет работать со сторонними либками типа TweenLite? И будет ли удобен он для создания высокопроизводительных интерактивных RIA-приложений или он только для создания игр был спроектирован?

Заранее спасибо=) С днем программиста тебя, Антон=)

Xcite
13 Сентября 2012
— 00:56
#

Антон, спасибо за щедрость :)

Скажи, а ты видел вот эти штуки?

рендерилка мувиклипов в спрайты для старлинг:
https://github.com/richardlord/Fruitfly

три похожих игровых фрэймворка с entity архитектурой:
https://github.com/richardlord/Ash
https://github.com/tdavies/Ember2
https://github.com/alecmce/xember

если нет, и тебе будет интересно, подкину больше ссылок на эту тему

Good
13 Сентября 2012
— 02:45
#

Большое Спасибо! ^^

Crash
13 Сентября 2012
— 03:09
#

Ещеб скрутили все это в драгндроб конструктор по типу стенсила, было б уебще круто

starready
13 Сентября 2012
— 07:56
#

Всем привет!

Антон, выражаю своё восхищение за такой титанический труд!!!
Для меня, новичка, ты все равно, что золото раздариваешь горстями :)

Я только в начале пути, пытаюсь проследить логику работы AntActor, но мозгов пока не хватает.

Подскажите, добрые люди). Хочу понять принцип работы растеризации клипов.

Грубый пример: fps-25, есть move_mc, в нем 15 кадров аним. ходьбы, 5 из них ключевых, остальные промежуточные(для задержки, чтобы не мельтешил ногами).

При перегонке в массив растровых картинок, берутся все кадры или только ключевые?
В инете находил анимацию ходьбы в 4 кадра, но как её проигрывать, по событию EnterFrame, выставляя задержки?

Kazgarot
13 Сентября 2012
— 11:18
#

Fail с названием. Anthill уже занято и обнаруживается практически в первых пунктах выборки гугла.

Anton
13 Сентября 2012
— 12:17
#

Переименуй в Anthill game engine

Good
13 Сентября 2012
— 12:55
#

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

Ant.Karlov
13 Сентября 2012
— 13:01
#

@Xcite, мой фреймворк не настолько сложен и крут чтобы выкабениватся перед сторонними библиотеками типа TweenLite, поэтому каких-либо проблем я тут не вижу.

Да, фреймворк проектируется только для создания игр и я незнаю насколько эффективно его использовать для других задач. Лично мне, кроме игр толком больше ничего не доводилось создавать во флеше :)

Ant.Karlov
13 Сентября 2012
— 13:05
#

@Good, я вообще сразу на старлинг ругался в первую очередь за то, что к работе с ресурсами они подошли совершенно по дилетантски. Я не знаю чем думали разработчики когда писали для флеша движок работающий с классическими растровыми атласами, и чем потом еще думали после этого адобовцы когда прикручивали в CS6 генератор атласов для старлинга в том числе. Здорово что появилось дополнение которое позволяет избавится от дополнительной работы разработчикам и за одно с экономить на объеме флешки.

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

Ant.Karlov
13 Сентября 2012
— 13:16
#

@Kazgarot, при растеризации клипов кэшируются абсолютно все кадры которые есть в клипе.

Вы можете с экономить на памяти и ускорить процесс кэширования убрав промежуточные кадры между ключевыми кадрами которые используются для задержек. Но это хорошо работает только в том случае, если у вас в анимации не используются твины и количество промежуточных кадров кратно количеству ключевых (то есть после каждого ключевого кадра одинаковое количество промежуточных). Оставляете только ключевые кадры, а чтобы создать необходимую задержку между ними, просто измените скорость анимации для AntActor, например: actor.animationSpeed = 0.5 — это будет равносильно тому, что после каждого ключевого кадра у вас стоит по одному промежуточному кадру, то есть вы замедляете воспроизведение в два раза.

Ant.Karlov
13 Сентября 2012
— 13:23
#

Но старлинг это 2д через 3д, т.е. там полигоны и текстуры, там иначе просто невозможно кроме как спрайтшитами, так работает GPU

Про фрймворки:
роботлегс, сигналы и свивссаспендерс там не главное, главное интересный и гибкий принцип построения игровой архитектуры

вчера перевёл статью автора одного из этих фрэймворков. http://www.flasher.ru/forum/blog.php?b=590

Good
13 Сентября 2012
— 13:26
#

@Anton, @Good, да, действительно что-то я не проверил использует ли кто такое название для своих движков. Скорее всего этот момент я упустил из-за того, что изначально я не планировал выкладывать фреймворк в свет. Думаю, что переименоваться в "Anthill Game Framework" или "Anthill Game Engine" будет хорошим выходом :)

Ant.Karlov
13 Сентября 2012
— 13:27
#

@Good,

> Но старлинг это 2д через 3д, т.е. там полигоны и текстуры, там иначе просто невозможно кроме как спрайтшитами, так работает GPU
Это конечно все понятно. Но ведь никто иной как сами адобовцы хорошо знают, что достаточно легко создать генерацию этих самых спрайтишитов во время выполнения приложения. И даже если разработчики Старлинга вдруг не подозревали о таких возможностях, то прежде чем пиарить и продвигать Старлинг среди флешеров, Адоби могли же хоть как-то намекнуть разработчикам о том, что неплохо было бы реализовать такую фичу :)

За ссылки в целом спасибо, обязательно почитаю.

Ant.Karlov
13 Сентября 2012
— 13:53
#

Антон, спасибо за труды.

з.ы. Если при компиляции нету тексту - подключение "внутреннего" шрифта Anthill`а настроено на Flex v3.x SDK.... кто на четверке - смотреть Anthill.as

NoICE
13 Сентября 2012
— 14:35
#

@Good,

> вчера перевёл статью автора одного из этих фрэймворков. http://www.flasher.ru/forum/blog.php?b=590

Прочитал статью... Ах, теперь я знаю как называются эти "сложные" фреймворки в которых без бутылки не разберешься. В таких движках меня бесит большое количество файлов с маленьким количеством кода. И чтобы понять как работает такой движок, при чтении кода приходится сказать из файла в файл, причем кругами (заглядывая в один и тот же файл по нескольку раз) и при этом суть так и наровит выскочить из головы.

Я не очень люблю такой подход так как для того чтобы работать с таким движком, надо хорошо знать как он устроен. А вот классический подход с наследованием, как в том же Flixel — уменьшает количество забот для программиста использующего этот фреймворк, так как программисту не обязательно на отлично знать его внутреннее устройство.

Ant.Karlov
13 Сентября 2012
— 16:02
#

а вот меня впечатлило то как фрэймворк состоящий из 9 !!! классов (это я про Ash) позволяет создать структуры данных любой навороченности и разделить логику как этого захочется

это ведь не полноценный игровой движёк как фликсель или Anthill а архитектурный фрэймворк, вникнуть в него занятие на час, там даже не нужно про все классы знать - реально пользоваться нужно будет только тремя из них

и никто ведь не заставляет дробить на мелкие кусочки, если удобнее воспринимать длинные классы можно всю логику сложить в одну кучу

крутость в подходе: отделении данных (состояния) от логики, это оборачивается невероятной гибкостью

Good
13 Сентября 2012
— 18:06
#

Спасибо за фреймворк.
Вроде писал что будут методы работы с box2d. Будут и когда?:)

sovik
13 Сентября 2012
— 18:30
#

Антон, у меня вопрос не столько по фреймворку, сколько по коду. Зачем ты в конструкторе классов, которые наследуешь от Sprite вначале всегда прописываешь super(); Что это дает и что изменится, если этого не делать. Я просто тоже часто наследую от Sprite но super(); не прописываю. Спасибо...

А за фреймворк огромная благодарность. Руки чешутся, посмотреть, что и как там внутри...

jarofed
13 Сентября 2012
— 18:52
#

#jarofed
ну так это порядок, когда вызвать конструктор родителя, полезно ведь

horror812
14 Сентября 2012
— 00:12
#

IDE жалуется

AntTileMap.as:607
Unresolved variable or type point

kohver
14 Сентября 2012
— 00:21
#

@Good,

> а вот меня впечатлило то как фрэймворк состоящий из 9 !!! классов (это я про Ash) позволяет создать структуры данных любой навороченности и разделить логику как этого захочется

крутость в подходе: отделении данных (состояния) от логики, это оборачивается невероятной гибкостью


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

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

Ant.Karlov
14 Сентября 2012
— 00:51
#

@sovik, про надстройку для Box2D пока ничего не могу пообещать, там серьезно над ней следует еще поработать. Так же теперь еще немного поглядываю в сторону Nape. Но вообще сейчас пока проблема в другом: нет возможности дальше так же активно заниматься наработками на благо общественности, так что скорее всего физика появится не раньше чем в конце осени или даже зимой. В общем время покажет.

Ant.Karlov
14 Сентября 2012
— 00:54
#

@jarofed, при компиляции во FlexSDK с включенным Warning Mode — компилятор ругается на отсутствие вызова родительского конструктора. Если super() не писать, то родительский конструктор все равно будет вызван, но в таком случае разработчик не контролирует когда именно это случится, и это может порой привести к неприятным последствиям (например, попытки обращения к экземплярам классов которые еще небыли созданы в конструкторе). В случае со Sprite и MovieClip как и с многими другими классами можно конечно не писать super(), но у меня редактор когда сам его вписывает при создании класса ;)

Ant.Karlov
14 Сентября 2012
— 01:03
#

@kohver, замените строчку 607 в AntTileMap на:

var point:AntPoint = getCoordinates(aIndex);

Ant.Karlov
14 Сентября 2012
— 01:04
#

Антон, спасибо за фреймворк.
в одном из постов ты писал о вспомогательном классе для push`ов. а в фреймворке он есть?

Александр
14 Сентября 2012
— 13:12
#

Антон, спасибо за фреймворк.
в одном из постов ты писал о вспомогательном классе для push`ов. а в фреймворке он есть?

p.s. капча злая

Александр
14 Сентября 2012
— 13:13
#

Знаете чего не хватает этому фреймворку. Нормального списка фич, по которым можно сразу сделать вывод подходит тебе этот фреймворк или нет. Я вот так и не понял, что Anthill умеет, кроме растеризации графики на лету?
Есть ли редактор тайловых карт в фреймворке?
Нужно написать о возможностях Anthill в виде перечня пунктов.

Anton
14 Сентября 2012
— 13:49
#

Спасибо, на первый взгляд супер.

Стас
14 Сентября 2012
— 22:00
#

@Александр, в данной сборке нет ничего для работы с физикой включая надстроек для Box2D. Все это я выложу немного позже.

Ant.Karlov
16 Сентября 2012
— 17:47
#

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

Ant.Karlov
16 Сентября 2012
— 17:49
#

@Ant.Karlov, вы играли в Acorn Story?

Ищущий
16 Сентября 2012
— 18:18
#

@Ищущий, я играл =)

George Kobyakov
16 Сентября 2012
— 22:20
#

@Ищущий, нет не играл. Посмотрел видео ролик — похоже на слабенький клон/ремейк Limbo, как по графическому исполнению так и по геймплею.

Ant.Karlov
17 Сентября 2012
— 00:56
#

@Good, Насчет спрайтшитов Старлинг. Например Genome2D прекрасно умеет на лету собирать текстурные атласы из картинок. Так что полностью согласен с мнением Антона об ресурсоемкости Старлинга.

Dmitriy Yermak
17 Сентября 2012
— 00:59
#

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

Pasha
17 Сентября 2012
— 19:39
#

Спасибо ОГРОМНОЕ. Спасибо!

Arman11
18 Сентября 2012
— 08:27
#

Класс - теперь нужен цикл статей о том как им пользоваться )

shaman4d
18 Сентября 2012
— 12:23
#

@Pasha, меню паузы делается так же как и везде:
1. Обрабатываете клик на кнопку "пауза".
2. Устанавливаете флаг о том, что ваш игровой мир на паузе (по которому игровой мир определяет живет он или нет).
3. Создаете окно паузы и добавляете его по верх игрового мира. Окно паузы может быть создано как средствами фреймворка так и средствами обычных Sprite и MovieClips.

Ant.Karlov
18 Сентября 2012
— 13:29
#

@shaman4d, примеры плохо отражают то как можно использовать фреймворк?

Ant.Karlov
18 Сентября 2012
— 13:33
#

эх
еще бы физику
и вообще бы было золото

.nodoxi
19 Сентября 2012
— 08:52
#

>.nodoxi
чем вам уже существующие не угодили?

и.о. Капитан Очевидность
19 Сентября 2012
— 22:06
#

Список фич так и не появился. Печально. :(

Anton
19 Сентября 2012
— 22:37
#

>и.о. Капитан Очевидность
я не прошу автора написать свой физический движок :D
обертку такую же удобную для box2d или nape
вроде собирался же

.nodoxi
19 Сентября 2012
— 23:14
#

P.s. можно капчу не вводить? О_о

.nodoxi
19 Сентября 2012
— 23:15
#

@Anton,

> Список фич так и не появился. Печально. :(

Простите, но я не очень понимаю такие печальные комментарии. Об основных особенностях я достаточно подробно написал в анонсе, так же подготовил демки чтобы вы могли увидеть ключевые возможности наглядно. Снабдил исходники демок достаточно подробными комментариями. И я думаю, что если бы у вас было желание, то вы бы уже давно заглянули в исходники и сделали бы для себя выводы... Но на деле вас останавливает только отсуствие какого-то списка фич — вот это как раз пичаль.

Ant.Karlov
19 Сентября 2012
— 23:30
#

@.nodoxi,

> P.s. можно капчу не вводить? О_о

Ах, техническая неполадка. Спасибо что заметили :)

Ant.Karlov
19 Сентября 2012
— 23:40
#

Понял что - Я НЕ ПРОГРАМИСТ... v_v``
Только дизайнер.. ^_<

Crash
20 Сентября 2012
— 00:49
#

@Crash, это ничево, я когда читаю статьи по программированию или пытаюсь прочитать чужой код — тоже понимаю что я дизайнер :D

Ant.Karlov
20 Сентября 2012
— 02:16
#

>Ant.Karlov
Помните как в славном мультфильме — Делай добро и бросай его в воду.
=)

Русскоязычное коммюнити подвержено нескольким степеням разочарования.

Степень первая — отсутствие списков фич.

Степень вторая — отсутствие заточенности на конкретной задаче (а где в вашем движке кнопка - создать платформер? и тд и тп)

Степень третья — "как вы опять не объяли необъятное" (тут список разочарований начинается с "оберток" ко всем другим фреймворкам и движкам и заканчивается разочарованием, что оказывается отсутствует коннектор для управления телескопом Хаббл)

Степень четвертая — "подождите так мне что все же придется программировать?" (рисовать, работать, думать и тд и тп нужное подчеркнуть)

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

Спасибо.
=)

и.о. Капитан Очевидность
20 Сентября 2012
— 12:55
#

@и.о. Капитан Очевидность: Как же Вы правы, Капитан!
Я пару вечеров посвятил беглому изучению фреймворка, и некоторые идеи очень сильно понравились. Да, сразу видно, что в основе лежит Flixel, но значительно переработанный и это просто здорово! Я попытаюсь внедрить некоторые куски в свою библиотечку. Так что Антону глубочайшее уважение и благодарность.

Zaphod
20 Сентября 2012
— 18:07
#

:) это не я ленивый, это вы ленивый. список фич не критичная вещь, фиг с ним. но то, что вы не нашли 1 час свободного времени чтобы его написать и встроить в сайт говорит о том, что обновления фреймворка будут безнадежно нескоро и оооочень редко. Неужели он так уж идеален, что ему больше ничего не потребуется? А если критичный баг найдется? А если я начну проект, а критичный баг обнаружится на стадии релиза? Сколько ждать исправлений? Править самому? Правильно, я лучше сразу все сам напишу.

Русскоязычное комьюнити состоит на 50 процентов из школоты, на 49 процентов из сумашедших снобов и на 1 процент из всех остальных категорий. Привыкайте. Ваша школота.

Anton
20 Сентября 2012
— 18:35
#

@Anton, лучшая защита — это нападение! Вы все правильно делаете. Проходите мимо.

Ant.Karlov
20 Сентября 2012
— 19:14
#

@и.о. Капитан Очевидность, порадовали! Спасибо! :)

Ant.Karlov
20 Сентября 2012
— 19:14
#

Ant. Karlov, Вы славный представитель русского комьюнити, и вам не болеть.

Anton
20 Сентября 2012
— 19:50
#

to --> "Anton"
Поделитесь пожалуйста вашим фреймворком или чем нибудь, ведь, если вам верить, вы образец трудолюбия и предусмотрительности.

Конечно, хотелось бы взглянуть на список фич.
=)
Но даже без него я точно скажу вам спасибо.
А если он будет полезен, то скажу спасибо дважды.

и.о. Капитан Очевидность
20 Сентября 2012
— 22:56
#

А может вы на хуй пойдете господин очевидность?

Anton
20 Сентября 2012
— 23:09
#

мне почему "обертки" интересны для box2d или nape
не совсем понятно
после box2d, C++ и HGE
как во флеше делать апдейт физического мира.
в какой момент?
в AntState::update ? а дельта времени?
я честно продолбался с этим во фликселе

и хочется посмотреть как вы реализовали
при похожей структуре

.nodoxi
21 Сентября 2012
— 00:32
#

@.nodoxi, для физики лучше использовать фиксированный шаг. Во всяком случае для Box2D точно, а про Nape не уверен. Но где-то в демках видел, что динамический временной степ в Nape используется для стресс-теста.

В Anthill.as есть закомментированный код в основном enterFrame в котором апдейтилась физика, там она и обновлялась у меня, там же я считал сколько времени уходит на её аптдейт :) Частично код так и остался поскольку я его еще верну в доработанном виде.

Ant.Karlov
21 Сентября 2012
— 00:38
#

to--->Anton

С удовольствием проследую в указанном вами направлении, если вы составите мне компанию.

и.о. Капитан Очевидность
21 Сентября 2012
— 01:10
#

@Ant.Karlov
то есть
AntG.physics.update()
будет делать апдейт мира на фиксированное время.
и в нем же будут обходиться каждый кадр все физические тела и выставляться соответствующим активным AntActor`ам координаты и повороты?

.nodoxi
21 Сентября 2012
— 01:35
#

ок
разобрался уже

попробую Nape с Anthill`ом подружить

вообще мне антхилл очень нравится
особенно крута растеризация мувикоипов

.nodoxi
21 Сентября 2012
— 01:44
#

Ant.Karlov, огромное спасибо.

Александр
21 Сентября 2012
— 08:03
#

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

Boyarskiy
21 Сентября 2012
— 09:27
#

@Boyarskiy
наверное придётся шляпу всё таки есть.
движок то хорош

@Ant.Karlov
Nape мне больше понравился чем Box2d
http://games.sothoth.ru/antnape.swf

как планируется дальше развивать Anthill?

.nodoxi
21 Сентября 2012
— 10:20
#

to-->Boyarskiy
Ничего личного, но очевидно же, что как минимум оба Зомботрона на "этом" и работают.

P.S.
Приятного аппетита.
=)

и.о. Капитан Очевидность
21 Сентября 2012
— 11:23
#

Антон, а можешь объяснить как работает у тебя TileMap и как создаются фоновые "слои"? В теории. Конкретный код мне не нужен.
Я так понимаю что ты рисуеш во Flash IDE, несколько MC, затем все это растрируется и разбивается на набор картинок, создается TileMap? Так? В демке где показана работа TileMap зеленый квадратик отображает размер тайлов?
Если нет - то скажи пожауйста какой ты используеш.

Спасибо.

Dmitriy Yermak
21 Сентября 2012
— 14:54
#

И еще вопрос: а насколько ниже будет производительность если перевести графику в растр, но не рендерить все это самому, а просто разместить в дисплйлисте битмапы? Нетестировал?
Или такой подход не имеет смысла?

Спасибо еще раз.:)

Dmitriy Yermak
21 Сентября 2012
— 16:14
#

@.nodoxi,

> как планируется дальше развивать Anthill?

Планирую сделать надстройку для Box2D, и может быть для Nape. Сейчас тоже заинтересовался Nape, так как народ прав: Box2D можно сказать "мертвый движок". По мимо этого буду думать о мелких переработках и оптимизациях. Но особых планов пока не строил кроме надстроек над физическими движками. Слабые места и недоделки чаще всего вылезают при создании игр, поэтому буду думать по ходу использования.

Ant.Karlov
21 Сентября 2012
— 22:43
#

@и.о. Капитан Очевидность

> Ничего личного, но очевидно же, что как минимум оба Зомботрона на "этом" и работают.

Нет, на самом деле на этом работает только Zombotron 2. Первый Зомботрон использует еще Sprite и MovieClip`s с использованием классов для кэширования вектора которые я выкладывал ранее :)

Ant.Karlov
21 Сентября 2012
— 22:48
#

@Dmitriy Yermak,

> Антон, а можешь объяснить как работает у тебя TileMap и как создаются фоновые "слои"?

Вся графика для уровней рисуется или расставляется во Flash IDE — это как правило большой клип с кучей вложенных векторных клипов представляющих собой оформление. Каждый уровень обычно состоит из двух больших клипов: задний слой (что позади героя) и передний слой (что перед героем и всеми объектами). Далее во время игры перед тем как запустить игрока на игровой уровень создаются оба клипа из библиотеки клипов и быстро растеризируются и нарезаются на тайлы. Как это выглядит с точки зрения кода я показл в примере работы с AntTileMap. Далее с полученными тайлами мы работаем как с обычными актерами (или вообще с ними не работаем).

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

Чтобы создать передний и задний план, вам понадобится две тайловых карты.

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

Зеленый квадрат — это актер показывающий тайл карты над которым находится курсор мыши. В примерах он не несет смысловой нагрузки, я его использовал для отладки, ну и для того чтобы показать как можно получать позицию текущего тайла :) А в примере с классической картой кликая по тайлам можно переключать их разновидность.

Ant.Karlov
21 Сентября 2012
— 23:01
#

Все, так что рано пока шляпу жрать. Работайте больше!

Boyarskiy
21 Сентября 2012
— 23:03
#

@Dmitriy Yermak,

> И еще вопрос: а насколько ниже будет производительность если перевести графику в растр, но не рендерить все это самому, а просто разместить в дисплйлисте битмапы?

Я не очень понял суть вопроса. Но скажу сразу что Anthill сделан таким образом, что единственный способ засунуть в него графику — это использовать клипы на кадрах которых должно быть какое-то графическое наполнение. Но по факту движку уже не важно что там в кадрах, растр или вектор, оно в любом случае еще раз будет пересохранено в формат движка (отпечатано в битмапы) и работа будет происходить непосредственно уже с этими битмапами. То есть если вы рассчитываете повысить производительность пересохранив всю векторную графику в растр, а потом растр вновь разместить в кадрах клипов — то это будет пустая трата времени (мартышкин труд)! :)

Ant.Karlov
21 Сентября 2012
— 23:06
#

В общем-то вопрос не по движку, а просто по скорости рендера. Я так понял что ты делаешь из вектора растр, а потом собираешь все это в одну BitmapDat`у c помошью copypixels.
А если растеризовать, но потом просто добавить получившиеся растровые объекты в DisplayList:
stage.addChild(Bitmap1),
stage.addChild(Bitmap2),
т.е. не собирать все это вместе самому, а позволить это делать рендеру флеша. Насколько хуже будет произодительность?

Dmitriy Yermak
22 Сентября 2012
— 01:35
#

Нисколько не хуже. Не надо думать, что внутренние механизмы флеш плейера работают медленнее чем его же экспортные функции, вроде bitmapdata.draw или copypixels, которые вы вызываете в своих скриптах (да да, байт-код это скрипты для флеш плейера).

По логике если вы позволите флешу самостоятельно просмотреть displaylist и отрисовать его, то он выполнит это с помощью тех же draw и copypixels или использует внутренние функции, которые все равно не потребуют дополнительной трансляции (они уже транслированы в ассемблерный код).

Anton
22 Сентября 2012
— 11:01
#

@Dmitriy Yermak,

> Я так понял что ты делаешь из вектора растр, а потом собираешь все это в одну BitmapDat`у c помошью copypixels.

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

> А если растеризовать, но потом просто добавить получившиеся растровые объекты в DisplayList:

Об этом я уже писал и не раз, просто так добавить в stage все битмапы можно, но не стоит, т.к. потом надо следить за тем что выехало за пределы камеры и удалять невидимые объекты, а потом вновь добавлять когда они опять видимы игроку ну и т.п.

Ant.Karlov
22 Сентября 2012
— 12:32
#

@Anton,

> Нисколько не хуже. Не надо думать, что внутренние механизмы флеш плейера работают медленнее чем его же экспортные функции, вроде bitmapdata.draw или copypixels, которые вы вызываете в своих скриптах (да да, байт-код это скрипты для флеш плейера).

А я и не думал и прежде чем залазить во все эти "ручные рендеры", я взял и сравнил насколько это будет полезно по сравнению со стандартным рендером флеша который по вашему утверждению сам использует copyPixels(), и о своих эксперементах достаточно подробно и с примерами написал здесь. Обязательно почитайте если вы пропустили.

Ant.Karlov
22 Сентября 2012
— 12:35
#

:) Глупый вы, старайтесь думать в следующий раз, и не писать статьи, которые вводят людей в заблуждение.

Даже ваш последний комментарии немного с "лжецой", я не говорил что там обязательно используется copyPixels, я лишь перечислил возможные варианты.

Anton
22 Сентября 2012
— 13:20
#

@Anton, в отличии от ваших высказываний мои статьи подкреплены наглядными примерами и практикой. Поэтому я не согласен с вами.

Если вы уверены в том, что стандартный рендер флеша единственно верный и самый быстрый рендер — это ваше право.

Ant.Karlov
22 Сентября 2012
— 13:40
#

to --->Anton

Какой операции, деление или умножение, вы отдаете предпочтение в ваших приложениях?

Чем отличается использование одного и того же кода в конструкторе и в теле класса?

Прошу простить если чем то оскорбил вас и буду признателен если вы ответите на эти простые вопросы.

и.о. Капитан Очевидность
22 Сентября 2012
— 14:44
#

как? кэп, вы еще не ушли на х#$? а ведь обещали!

Anton
22 Сентября 2012
— 14:57
#

Так вроде и вы мне компанию не составили, "а ведь обещали" =)

Держите для развития кругозора.

==== Слон и Моська ===
И.А. Крылов

По улицам Слона водили,
Как видно напоказ —
Известно, что Слоны в диковинку у нас —
Так за Слоном толпы зевак ходили.
Отколе ни возьмись, навстречу Моська им.
Увидевши Слона, ну на него метаться,
И лаять, и визжать, и рваться,
Ну, так и лезет в драку с ним.
«Соседка, перестань срамиться»,
Ей шавка говорит: «тебе ль с Слоном возиться?
Смотри, уж ты хрипишь, а он себе идет
Вперед
И лаю твоего совсем не примечает».—
«Эх, эх!» ей Моська отвечает:
«Вот то-то мне и духу придает,
Что я, совсем без драки,
Могу попасть в большие забияки.
Пускай же говорят собаки:
«Ай, Моська! знать она сильна,
Что лает на Слона!»

и.о. Капитан Очевидность
22 Сентября 2012
— 15:04
#

оставьте свои сексуальные мечты при себе, кэп. я вам ничего не обещал.

Anton
22 Сентября 2012
— 15:14
#

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

Но все еще предлагаю вам договор.
Я — перестаю топтать вашу тушку, а вы переводите дискуссию в область аргументированной доказательности.

и.о. Капитан Очевидность
22 Сентября 2012
— 15:30
#

да ты же быдло-дурачок, кэп :)

Anton
22 Сентября 2012
— 15:38
#

@Ant.Karlov
Об этом я уже писал и не раз, просто так добавить в stage все битмапы можно, но не стоит, т.к. потом надо следить за тем что выехало за пределы камеры и удалять невидимые объекты, а потом вновь добавлять когда они опять видимы игроку ну и т.п.
Гм. Всегда считал что рендер Флэша достаточно умный чтобы не рендерить то что за пределами экрана. ОК, спасибо, буду учиться на чужом опыте. :)

Dmitriy Yermak
23 Сентября 2012
— 01:08
#

@Dmitriy Yermak, проведите простой эксперимент:

1. Создайте клип и разместите в нем произвольно 100-150 других клипов не важно каких (вектор или растр), или больше если у вас компьютер мощный.
2. Двигайте этот большой клип произвольно попутно замеряя fps.
3. Потом попробуйте удалить большую часть (например 90-140) клипов из основного клипа методом removeChild() — оставив, например, только то количество которое реально может попадать в экран. Не обязательно их совсем удалять, просто удалите из структуры и подвигайте вновь этот клип попутно замеряя производительность.

Уверен, вы удивитесь.

Рендер флеша действительно умен — он умеет рендерить даже только те части экрана которые изменились, но подвох там где его мы его совсем не ждем :(

Ant.Karlov
23 Сентября 2012
— 01:53
#

Скажи мне, Антон.

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

Почему не публикуешь свои игры на gamedev.ru?
Люди там хорошие, следующие игры обязательно там посвети.

Какой-то хомяк
23 Сентября 2012
— 08:53
#

Обязательно, будешь очень в тему смотреться рядом с гульменом, онанорыцарем и "сабераю камманду для саздания ММОРПГ, мне 8 лет, Вася ".

Там хороших 3.5 человека осталось и те теперь рисуют Гнума.

Anton
23 Сентября 2012
— 11:11
#

>Там хороших 3.5 человека осталось
Было 4 но вы ушли?
=)

to--->Ant.Karlov
меня терзают смутные сомнения © что выражение
if("Какой-то хомяк" == "Anton")
вычисляется в true;

и.о. Капитан Очевидность
23 Сентября 2012
— 13:08
#

> и.о. Капитан Очевидность

Проверил.
Возвращает false.
AS3. FS4.

ЧЯДНТ?

Какой-то хомяк
23 Сентября 2012
— 13:12
#

Таак таак :) У кэпа едет крыша по параноидальному сценарию.

Anton
23 Сентября 2012
— 13:18
#

заюзай обертку - IP(rest...);

и.о. Капитан Очевидность
23 Сентября 2012
— 13:21
#

to ---> Какой-то хомяк
И для развития кругозора.
Инструкция if ничего не возвращает учите мат часть.

и.о. Капитан Очевидность
23 Сентября 2012
— 13:55
#

О боже, дикая попоболь такая дикая. Пациент бросается на окружающих, нужно его усыпить.

Anton
23 Сентября 2012
— 13:57
#

Констатация фактов для вас всегда равнозначна — "бросается на людей"?

и.о. Капитан Очевидность
23 Сентября 2012
— 14:01
#

вот троллей то )

@Ant.Karlov
начал делать на Anthill и Nape игрульку ) скоро покажу, очень интересно мнение

.nodoxi
23 Сентября 2012
— 20:48
#

сделал себе типа обертки для Nape
запихал в AntPhysics
и она доступна через
AntG.physics
:)

в enterFrameHandler вызывается расчет физики как полагается.

http://lumbergame.sothoth.ru/phystest.swf
(клик мышкой - добавить бабку, d - просмотр debug-draw nape)

правда еще сделать много чего нужно.
но в целом довольно все рабоче и радует.

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

.nodoxi
26 Сентября 2012
— 17:59
#
.nodoxi
26 Сентября 2012
— 18:00
#

/** Запускает воспроизведение текущией анимации. */
public function play():void
{
_playing = (!_playing) ? true : _playing;
}

А зачем в этом месте такая конструкция?

Вот я бы написал:
_playing = true;

Расскажите чем это хуже?

Kickerua
26 Сентября 2012
— 19:53
#

@.nodoxi, да производительность Nape впечатляет, я уже тоже серьезно задумался над тем чтобы в будущих проектах использовать именно его. Одна беда только, перекрыть его отладочную отрисовку немного накладно. Но это конечно не повод чтобы его не использовать :)

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

Ant.Karlov
26 Сентября 2012
— 22:37
#

@Kickerua,

> _playing = (!_playing) ? true : _playing;

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

Ant.Karlov
26 Сентября 2012
— 22:39
#

@Ant.Karlov
о спасибо
за линк на хитри

.nodoxi
26 Сентября 2012
— 23:09
#

@Ant.Karlov
а если возможность AntActor развернуть?
допустим персонаж пошел в другую сторону

во flixel в этом месте facing

.nodoxi
27 Сентября 2012
— 01:12
#

@.nodoxi, если имеется в виду отражение, то scale.

Ant.Karlov
27 Сентября 2012
— 02:38
#

@Ant.Karlov
млин, точно

.nodoxi
27 Сентября 2012
— 08:46
#

Здравствуй Антон. Будут ли остальные две части по искусственному интеллекту?

vacsa
27 Сентября 2012
— 22:32
#

@vacsa, будут, но немного позже. Сейчас готовлю большой материал по другой не менее интересной теме :)

Ant.Karlov
27 Сентября 2012
— 23:18
#

продолжаю эксперименты с физикой :D
http://grandmanomad.nodoxi.org/280912-testcontrol.swf

.nodoxi
28 Сентября 2012
— 14:11
#

Антон, скажите зачем несколько камер? И каждую обновлять?

Спасибо.

q13
28 Сентября 2012
— 19:44
#

@Ant.Karlov
>Одна беда только, перекрыть его отладочную отрисовку немного накладно.
А зачем её перекрывать?

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

.nodoxi
28 Сентября 2012
— 22:20
#

@q13, несколько камер — это такой задел на будущее. С использованием нескольких камер можно делать режим игры Split Screen  — это когда несколько игроков могут играть за одним компьютером и у каждого свой игровой экран. Стандартными средствами такую штуку весьма проблематично сделать. Есть и другие вещи для которых можно использовать более чем одну камеру.

Кроме того отделив сущность камеры от общего игрового мира, можно наделять её дополнительными возможностями, например типами слежения или применение постэффектов и т.п. В данной сборке стандартных возможностей у камеры пока никаких не предусмотрено.

Ant.Karlov
28 Сентября 2012
— 22:57
#

@.nodoxi,

>>Одна беда только, перекрыть его отладочную отрисовку немного накладно.
> А зачем её перекрывать?


А иначе приходится двигать отладочный битмап Nape в соответствии со скроллом камеры, нет? Да и с несколькими камерами могут неудобства возникнут, хотя дебажная отрисовка физики для всех камер наверное не так уж и нужна.

> и еще вопрос такой, а как работать с вложенными объектами.

Так же как с обычными спрайтами или клипами. Делаете какой-то один спрайт героя основным который привязывается к его физическому телу, а все остальные графические части героя вкладываете в него. AntActor унаследован от AntEntity, а значит может содержать в себе любые другие сущности.

Ant.Karlov
28 Сентября 2012
— 23:03
#

@Ant.Karlov
да, приходится двигать Nape`вский битмап. я так по крайней мере сделал.
ну меня пока устраивает такой путь.

AntEntity.add
точно, спасибо.

а есть ли возможность отрисовывать спрайт не прямоугольником, а произвольно задав 4 вершины?
например как тут:
http://hge.relishgames.com/doc/index.html?hgesprite_render4v.html

это надо _matrix как-то преобразовать в drawActor по идее.
это бы очень пригодилось для отображения ткани, например.

.nodoxi
29 Сентября 2012
— 00:20
#

@Ant.Karlov
спасибо за движок
я его уже люблю!

.nodoxi
29 Сентября 2012
— 00:20
#

Можно как-то применять маску?

q13
29 Сентября 2012
— 01:47
#

@Ant.Karlov

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

Ну и конечно вопрос: почему AntCamera расширяет Sprite, когда самое важное творится в Bitmap? Я не придираюсь, просто интересно, было ли это машинальным решением или все же есть какая нибуть причина.

Пэ.Эс.: хорошим примером использования множества камер в однопользовательском режиме есть игра Fahrenheit (http://ru.wikipedia.org/wiki/Fahrenheit). Думаю Вы, как человек творческий, с легкостью найдете применение подобным эффектам в своих работах. Ну а я, как поклонник Ваших трудов,буду рад испробовать их на себе :)

elder_Nosferatu
29 Сентября 2012
— 02:04
#

@.nodoxi,

> а есть ли возможность отрисовывать спрайт не прямоугольником, а произвольно задав 4 вершины?

Нет, такой возможности к сожалению нет. Matrix нельзя преобразовать таким образом чтобы отрисовывать, например, такань (меш). В документации написано, что все преобразования Matrix являются аффинными, а при аффинных преобразованиях сохраняется прямолинейность линий, то есть параллельные линии остаются параллельными.

Для отрисовки мешей можно использовать drawTriangles(), но к сожалению данный метод не имеет отношения к растру и может быть вызван только для объекта graphics какого-нибудь спрайта или клипа.

Ant.Karlov
29 Сентября 2012
— 14:51
#

@q13,

> Можно как-то применять маску?

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

Ant.Karlov
29 Сентября 2012
— 14:54
#

@elder_Nosferatu,

> Ну и конечно вопрос: почему AntCamera расширяет Sprite, когда самое важное творится в Bitmap?

Единственный спосб отобразить растровое содержимое — это вложить битмап в клип или спрайт. Изначально был просто растровый буффер в который рендерилось содержимое мира камерами и который так же был вложен в один единственный спрайт. Но потом было решено, что унаследовав камеру от Sprite можно легко и понятно устанавливать положение камеры на экране флеш приложения. Поэтому в итоге получилось так что камеры — это как бы спрайты-окна в визуальный мир Anthill.

Ant.Karlov
29 Сентября 2012
— 15:10
#

@Ant.Karlov

>...унаследовав камеру от Sprite можно легко и
>понятно устанавливать положение камеры на
>экране флеш приложения.

Если были бы в Вашем редакторе смайлики, я бы использовал тот, который репу чешет и смотрит как баран на новые ворота... Короче, "спрайты-окна" звучит красиво, но на счет позиционирования я не понял.

По сути Bitmap и Sprite отличаются тем, что у первого точка привязки всегда в левом верхнем углу, а у второго зависит от положения "внутренностей". В общем случае такая Sprite`овая фишка усложняет размещение.

elder_Nosferatu
29 Сентября 2012
— 16:57
#

@

> По сути Bitmap и Sprite отличаются тем, что у первого точка привязки всегда в левом верхнем углу, а у второго зависит от положения "внутренностей". В общем случае такая Sprite`овая фишка усложняет размещение.

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

Ant.Karlov
29 Сентября 2012
— 18:35
#

@Ant.Karlov

Вот черт! Я об этом не подумал. А раньше это написать не могли? Я сейчас собираю идеи с чужих библиотек и Вашу камеру забраковал. Теперь понимаю, что лишний спрайт даст больше преимуществ, чем излишеств. Пошел вносить правки в своей либе.
Спасибо!

elder_Nosferatu
29 Сентября 2012
— 19:19
#

Антон, можете написать короткий код чтоб камера следила за объектом?
Спасибо.

q13
30 Сентября 2012
— 13:37
#

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

Grizzly
30 Сентября 2012
— 16:57
#

@Grizzly

Осмелюсь предположить, что в игре хранится две коллекции всех реплик и подписей для каждого языка. А так как переключения языка "на лету" не предусмотрено, то скорее всего все строковые переменные, которые отвчают за вывод текста инициализируются на старте той коллекцией, которая соответствует выбраному языку.

elder_Nosferatu
30 Сентября 2012
— 17:58
#

Антон, можете написать короткий код чтоб камера следила за объектом?

Выдрал код из Flixel. Надо было немножко повозиться с ним. Так как в Flixel scroll, как я понял, работает в плюс для смещения. В Anthill - наоборот, в минус.

q13
30 Сентября 2012
— 18:17
#

@Grizzly, данный вопрос немного выходит по объему ответа за пределы одного комментария. Поэтому решил вынести данную тему в отдельную запись. Сегодня опубликую свое решение ;)

Ant.Karlov
1 Октября 2012
— 19:33
#

@Ant.Karlov, отлично. Большое спасибо!

Grizzly
1 Октября 2012
— 20:07
#

@Ant.Karlov
а какие рекомендуемые размеры для растеризованной AntTileMap?
иными словами - насколько большой уровень можно сделать?

.nodoxi
1 Октября 2012
— 20:48
#

@.nodoxi,

> а какие рекомендуемые размеры для растеризованной AntTileMap?

Если честно, то сам не замерял. Думаю, что рекомендуюемые размеры должны зависить от следующих факторов:

1. Размер карты в пикселях и количество таких карт (задний план, передний план, может быть фоны для параллакса).

То есть если планируется много слоев, то размер карты следует уменьшать чтобы вдруг не занять всю память.

2. Размер тайлов.

Например, если тайлы будут очень маленькие и их будет очень много, то на их процессинг может уходить много времени.

Подобным образом я создавал карты до 9000 pix в длину и в высоту 640 pix из двух слоев — это в грузовиках. В Зомботроне, например, уровни 3000x2500 pix (примерный размер), и состоят из двух слоев.

В общем надо пробовать :) Главное чтобы памяти не много занимало и кэшировалось быстро, а так же не тормозил процессинг, но с этим пока не доводилось мне сталкиваться.

Ant.Karlov
1 Октября 2012
— 23:05
#

@Ant.Karlov
спасибо за ответ!

.nodoxi
2 Октября 2012
— 00:14
#

Anthill на Flashdaily.net! =)

Mufasa
14 Октября 2012
— 17:44
#

Помогите пожалуйста с несколькими вопросами)
Первый касается экспорта в SWC - нужно чтобы у меня на первом кадре всё было, или создать набор символов?
Второ насчёт структуры. В движке в описании anthill указано что это ядро - значит ли это, что нужно от него наследовать main? Или его нужно подключать?

Владимир
17 Октября 2012
— 11:25
#

С графикой сам разобрался, дальше изучаю примеры)

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

Владимир
17 Октября 2012
— 12:51
#

Привет
нравится этот фреймворк

такой вопрос можно ли как то сделать,
что бы
actor.addAnimation(`mc`,[0,1,10,5,3,5,0,1,1])
массив кадров записать? что бы не кешекировать повторяющие кадры??

horror812
17 Октября 2012
— 21:04
#

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

Ant.Karlov
17 Октября 2012
— 23:36
#

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

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

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

Ant.Karlov
17 Октября 2012
— 23:42
#

#Ant.Karlov
Я не много не про это.
Вот смотри
Я кешекирую все кадры (с 1-5)
теперь хочу что бы у меня было несколько последовательностей анимаций
1) [1,2,3]
2) [4]
3) [1,3,5,2]
а таким способом (как у тебя в двиге) мне придется подготовить 3 независимых Мувиклипа и кешекировать этиже кадры снова по -отдельности
Вот во фликселе можно было сделать
addAnimaton(stand,[1,4,5,2]) и тд
мне кажется это очень удобно
былобы классно, если бы и ты добавил нечто подобное
спасибо

horror812
18 Октября 2012
— 01:32
#

@horror812, ага, теперь понятно. Интересное предложение.

Может быть сделать возможность дублировать анимацию с указанной последовательностью кадров и добавлять её в актера как отдельную анимацию?

Примерный код использования:

// Извлекаем анимацию из которой нужно получить отдельные кадры
var originalAnim:AntAnim = AntG.cache.getAnimation("MyHero_mc");

// Создаем новую анимашку с указанными кадрами
var newAnim:AntAnim = originalAnim.cloneWithFrames(1, 4, 6, 9, 10);

// Добавляем новую анимашку в кэш
AntG.cache.insertAnim(newAnim, "MyHero_mc_tweak");

Как-то так?

Ant.Karlov
18 Октября 2012
— 02:03
#

#Ant.Karlov
Да, но ведь так он и битмапу будет клонировать?
если нет - то отлично!
мне кажется можно так
actor.addAnimFromCache(`my_hero_mc`,`stand`,[1,2,3])
actor.addAnimFromCache(`my_hero_mc`,`jump`,[3,3,5])

actor.playSeq(`stand`)

horror812
18 Октября 2012
— 11:52
#

#Ant.Karlov
Еще мне кажется я баг нашел
когда у кнопки стоит флаг чекбокса - тогле (и 4 фрейма)
при "выбранном" состоянии не работают события овер и оут!

horror812
18 Октября 2012
— 15:37
#

#Ant.Karlov
Сорри за назойливость ^__^

также когда чекбокс
события от клика по другой кнопке вызывает повторно клик у чекбокса
потомучто не работает это условие
(в методе onMouseUp у AntButton)
if (!exists || !visible || !active || status != DOWN) return;
ведь
if(toggle) trace(userData,status);
говорит что status - 3

horror812
18 Октября 2012
— 16:19
#

#Ant.Karlov

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

За размером окна флэша же можно следить, насколько я знаю? Сегодня, если буде время, посмотрю...

Владимир
19 Октября 2012
— 10:14
#

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

Владимир
19 Октября 2012
— 10:35
#

Антон, а есть что-то для "красивых" переходов между состояними?

NightmareZ ^___^
19 Октября 2012
— 21:04
#

@horror812,

> Да, но ведь так он и битмапу будет клонировать?

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

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

Думаю, что завтра закоммичу на гитхаб доработанный AntAnim.as с учетом ваших пожеланий.

Ant.Karlov
20 Октября 2012
— 02:36
#

@horror812,

> когда у кнопки стоит флаг чекбокса - тогле (и 4 фрейма)

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

Базовая возможность toggle у кнопки больше планировалась для того чтобы делать что-то вроде палитры: кликнули на кнопку — выбрали объект какой-то, кнопка обозначилась как зажатая, кликнули на карте — кнопка выправилась и т.п.

За баг репорт спасибо! Класс кнопки проверю на ошибки. Думаю, что немного позже добавлю еще классов для работы с пользовательским интерфейсом, включая полноценные CheckBox`ы.

Ant.Karlov
20 Октября 2012
— 02:44
#

@Владимир, такие вещи как обработка изменения положения объектов при изменении размеров окна — обычно остаются за разработчиками, так как именно им лучше всего известно как правильно объекты должны реагировать на изменения.

Чтобы правильно реагировать на изменения окна, следует задавать положение по X и Y в процентах от центра игрового окна, либо от краев экрана. Таким образом зная положение объекта в процентах, при получении нового размера окна вы можете вычислить новое положение объекта в пикселях исходя из размеров нового окна. Как-то так в общем :)

Чтобы перехватить событие изменения сцены, согласно справке по AS3, следует подписаться на событие Event.RESIZE для stage. Только убедитесь в том, что для stage не установлена опция:

stage.scaleMode = StageScaleMode.NO_SCALE;

Если вы используете Anthill, то удалите либо закомментируйте строку 43 в AntPreloader.as

Ant.Karlov
20 Октября 2012
— 02:54
#

@NightmareZ ^___^, в данный момент никаких эффектов для переходов между состояниями не предусмотрено, к сожалению.

Ant.Karlov
20 Октября 2012
— 02:55
#

Спасибо, надо будет поэкспериментировать)
Ещё вопрос возник, изучаю встроенные возможности движения, и что-то не понимаю.
через velocity.set(); я задаю скорость и направление, через drag и acceleration могу менять эту скорость со временем, но указать скорость я могу, а вот изменения не работают, что я делаю не так?

Владимир
20 Октября 2012
— 13:23
#

Понял, слишком малыми цифрами оперировал, пытался проверить воздействие добавляя по единичке)

Владимир
20 Октября 2012
— 14:18
#

#Ant.Karlov

Спасибо за ответ. ну да отличный вариант.
У себя я уже сделал отдельный аналог Актора со своим вариантом ^___^
мне кажется полезно.
(Я ведь всю анимаю персонажа делаю в одном мувиклипе - и мне так удобно)
что типа как я писал
actor.addSeq(animName,seqName,frames...тут даже скорость своя, потворение и тд)
addSeq(`player`,`stand`,`1-5,6,5-1`)
у фремес это такая удобная запись (будет = 12345654321)

или к примеру есть логотип
первые кадры -одинаковые
остальные - эффект блика
твоим способом придется делать кодом задержку
или кешекировать одинаковые кадры

а я делаю
addSeq(`logo`,`stand`,`1#10,2-16`,...)
что значит первый кадр будет 10 раз, а потом блик - со 2 по 16
и все круто

horror812
20 Октября 2012
— 14:27
#

Отлично ! Замеряли производительность на ios ? Можно добавить поддержку stage3d и будет scaleform - я бы за такой движок 150$ заплатил бы

Константин
20 Октября 2012
— 21:23
#

@Константин, данный движок не пойдет для iOS и вообще для мобильных платформ. У мобильных платформ все более менее впорядке с аппаратным ускорением, а Anthill работает на софтваре. Так что он никак не годится для мобильников. Вообще на мобилках Flash себя чувствует очень слабо, поэтому используйте лучше нативные движки или что-то мульти-платформенное, что отлично работает с аппаратным ускорением. Anthill категорически не рекомендую в качестве движка для мобильных игр.

Аппаратная поддержка в Anthill пока не планируется :) Разработка игр для меня приорететнее чем развитие фреймворка. Фреймворк развивается только по ходу разработки игр на нем.

Ant.Karlov
20 Октября 2012
— 23:02
#

#Ant.Karlov

У Мука написано что для слежения за Event.RESIZE наоборот нужно чтобы обязательно было включено
stage.scaleMode = StageScaleMode.NO_SCALE;
что-то я запутался...

Владимир
21 Октября 2012
— 09:59
#

Не знаю баг ли это
когда создаешь сущность, которая
имеет родители не в координатах 0,0
то ставя
ant.x = XX ant.y = YY
он их не учитывает
только, если делать
ant.reset(XX,YY)
может так и задуманно?

king
21 Октября 2012
— 17:22
#

Антон поясни разницу между методами в AntPoint:
/**
* Клонирует себя.
*
* @param aPoint Куда склонировать значения.
* @return Возвращает новый экземпляр класс с идентичными значениями.
*/
public function clone(aPoint:AntPoint = null):AntPoint
{
if (aPoint == null)
{
aPoint = new AntPoint();
}

aPoint.set(x, y);
return aPoint;
}

/**
* Копирует свои значения в указанную точку.
*
* @param aPoint Точка куда необходимо скопировать свои значения.
* @return Возвращает указатель на точку со скопированными значениями.
*/
public function copyTo(aPoint:AntPoint = null):AntPoint
{
if (aPoint == null)
{
aPoint = new AntPoint();
}

aPoint.set(x, y);
return aPoint;
}

ani526
21 Октября 2012
— 21:44
#

@Владимир,

> У Мука написано что для слежения за Event.RESIZE наоборот нужно чтобы обязательно было включено
stage.scaleMode = StageScaleMode.NO_SCALE;
что-то я запутался...


Просто нужно проверить. Сейчас точно не скажу, но по моему при NO_SCALE изменяется рабочая область stage, но содержимое не меняет размеры и сохраняет положение относительно левого верхнего угла.

Ant.Karlov
21 Октября 2012
— 23:45
#

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

Но предположу, что скорее всего проблема вызвана кэшированием положения родительской сущности и смещение для вложенных объектов в том числе и для нового не пересчитываются до тех пор, пока вы не сдвинете или не «сбросите» родительскую сущность. Проверю это, и если это действительно так, обязательно поправлю.

Спасибо!

Ant.Karlov
21 Октября 2012
— 23:49
#

@ani526, бывает. clone() появился первым и должен был быть удален, так как copyTo() созвучен с copyFrom(). Забыл убрать повторяющийся метод после того как убрал его использование из кода.

Ant.Karlov
21 Октября 2012
— 23:51
#

буду использовать и по возможности улудшать твой фреймворк

ani526
22 Октября 2012
— 09:24
#

Да, именно)
я сам не мог долго понять почему так происходит
ситуация такая создал актера на смещенном родителе на состоянии "Меню", и было все замечательно!
далее перешел на другоее состояние - "Игра", по возвращению
в это же состояние - "Меню"
уже было все сдвинуто не правильно!
и долго не мог понять почему, ведь я создаю новое состояние...
Видимо, действительно гдето кешекиркюется позиция! !

king
23 Октября 2012
— 18:37
#

Антон, подскажи как ты делаешь различные состояния героя(стоит, движется, стреляет и т.п.) Просто я привык делать один клип с соответствующими состояниями(причем со вложенными клипами, в кадрах которых так же могут быть определенные состояния) так вот как все это перевести в набор AntAnimation с именами соответствующим меткам кадра мувиклипа?

snaketm
24 Октября 2012
— 18:07
#

насколько я успел разобраться нужно сделать отдельные мувиклипы всех состояний, кешировать их и запускать тот который тебе необходим. Пример:
_hero = new AntActor();
// Добавляем в героя анимации атаки и хотьбы.
_hero.addAnimationFromCache("InfantryAttack_mc", "attack", false); _hero.addAnimationFromCache("InfantryWalk_mc", "walk");
// Устанавливаем героя в центр экрана.
_hero.reset(AntG.widthHalf, AntG.heightHalf);
// Скорость анимации героя.
_hero.animationSpeed = 0.25;
// Активируем возможности движения.
_hero.moves = true;
// Переключаем анимацию на анимацию ходьбы.
_hero.switchAnimation("walk");
// Запускаем проигрывание анимации.
_hero.play();
// Добавляем героя в структуру.
add(_hero);

ani526
24 Октября 2012
— 19:55
#

Привет, Антон.
Почему-то при вращении сущности, если она одновременно является и потомком и предком, ей устанавливается только угол. А позиция остается старой.
AntEntity.as(1090):
if (entity.isGroup)
{
entity.resetRotation(angle);
}
else
{
AntMath.rotateDeg(entity.x, entity.y, x /*+ axis.x*/, y /*+ axis.y*/, diff, point);
entity.x = point.x;
entity.y = point.y;
entity.angle += diff;
}

Интересно, это баг или фича? :)

fred
26 Октября 2012
— 17:05
#

@fred, вы имеете в виду, что сущности с вложениями не вращаются если они вложены в другие сущности?

Проверю этот момент.

Ant.Karlov
29 Октября 2012
— 19:44
#

Anthill обновлен до версии 0.1.2 — исправлены недочеты и внесены улучшения. Узнать об изменениях более подробно можно на github.

Ant.Karlov
29 Октября 2012
— 19:54
#

@Ant.Karlov
Вращаются. Принимают угол предка. Но остаются на месте, а позиция обновляется только у того потомка, который не группа :)
http://megaswf.com/file/2514784
Жёлтое потомок красного, красное потомок синего.

Кстати в новой версии (0.1.2), как я понял, если в группе есть потомки, то метод reset() для следующих добавляемых потомков нужно ставить в относительных координатах. А первый по-прежнему добавляется по абсолютным.
:)

fred
31 Октября 2012
— 23:02
#

@Ant.Karlov
Да, я про вложенные сущности.
Только почему-то называю их предками с потомками.

fred
31 Октября 2012
— 23:06
#

@fred
У меня тоже проявилась подобная проблема. Также если добавлять потомка после того предок был сдвинут (после update), то он тоже попадает не в те координаты, т.к. reset использует разницу между текущей и предпоследней позицией: mx = x - _lastPosition.x. Еще меня смущает что координаты и углы вложенных сущностей изменяются при сдвиге родительских.
Я сущностям добавил абсолютные координаты и угол, чтобы не "портились" локальные. И bounds, draw и прочие действия производятся с абсолютными координатами. Как-то так (в методе update):

absoluteX = x;
absoluteY = y;
absoluteAngle = angle;

if (parent)
{
absoluteX += parent.absoluteX;
absoluteY += parent.absoluteY;
absoluteAngle += parent.absoluteAngle;

if (parent.rotated)
{
var point:Point = new Point();
AntMath.rotate(absoluteX, absoluteY, parent.absoluteX, parent.absoluteY, parent.absoluteAngle, point);
absoluteX = point.x;
absoluteY = point.y;
}
}
// Флаг. Был ли сущность сдвинута за последний цикл.
moved = _lastAbsoluteX != absoluteX || _lastAbsoluteY != absoluteY;
// Флаг. Был ли сущность повернута за последний цикл.
rotated = angle != _lastAbsoluteAngle;

P.S. Начал делать свой движок на основе Flixel, затем вышел Anthill и я взял его за основу. Очень простой и удобный. Спасибо, Антон!

Андрей
1 Ноября 2012
— 10:49
#

Антон привет,
когда же будет физика?
nape или box2d? )

nape
1 Ноября 2012
— 14:42
#

@Андрей, толком не понял зачем нам ещё по две переменных на сущность :)

Я думаю, что решение проблемы с вложенными сущностями довольно простое на первый взгляд, правда сильно я его не тестировал.
http://megaswf.com/file/2515035
Суть в том, чтобы при вращении сущности делать смещение относительно предка:
if (entity != null && entity.exists)
{
entity.x += mx;
entity.y += my; // на сколько сместился предок
if (entity._isGroup)
{
AntMath.rotateDeg(entity.x, entity.y, x /*+ axis.x*/, y /*+ axis.y*/, diff, point);
mx += point.x - entity.x;
my += point.y - entity.y; // накапливаем смещение от корневой сущности до самой вложенной :)
entity.x += point.x - entity.x;
entity.y += point.y - entity.y; // на сколько сместилась сама сущность относительно угла

entity.resetRotation(aAngle,mx,my);
}
else
....

fred
1 Ноября 2012
— 18:11
#

А да, управление стрелками.
Номера - иерархия вложенности, 1 - корень.

fred
1 Ноября 2012
— 18:15
#

@fred, да, сама проблема вращения решается легко.

Основная причина, почему я ввел дополнительные переменные - это сохранение локальных координат.
Если вложить сущность с координатами (0, 0) в корневую сущность, затем повернуть/сдвинуть корневую, то вложенная сущность уже не будет иметь координаты (0, 0), а хотелось бы. Это упрощает управление внутренней сущностью.
Напр., внутренняя сущность постоянно двигается влево-вправо (x++, x--). Затем поворачиваем корневую сущность. Чтобы продолжить двигать внутреннюю сущность, простым x++ не обойдешься.
Это касается и масштабирования вложенных сущностей. Но, у себя я это тоже не делал - пока не надо.

Но если игру не усложнять такими объектами, то, конечно, без этого можно обойтись.

Андрей
1 Ноября 2012
— 19:26
#

Если align не left
то текст отображается не криво
что-то не так?

var label:AntLabel = new AntLabel(font,size,color,true);
label.beginUpdate();
label.x = x;
label.y = y;
label.angle = angle;
label.setSize(width,height);
label.align = align;
label.text = text;
label.endUpdate();
add(label);

king
24 Ноября 2012
— 22:29
#

Здравствуйте Антон, у меня к вам маленький вопрос.
Как я понимаю, свойство axis в AntEntity задает точку, вокруг которой, будет вращаться сущность.
Задаю точку:
ent.axis = new AntPoint(100, 100);
И потом вращаю:
ent. angle += 10;
Но сущность вращается по прежнему вокруг левого верхнего угла, что как я понимаю соответствует точке (0; 0). Что я делаю не так, или что я не так понял? Версия фреймверка 0.2.0, но и в предыдущей версии тоже не получалось. Заранее благодарен.

Sanchez
27 Января 2013
— 18:07
#

@Sanchez, там с осями немного непросто все пока получилось. Сейчас деталей и причин точно уже не помню, но axis.x/y не используется в расчетах оси — эти координаты используются в потомках для хранения смещения кадров относительно центра. (Думаю переменную надо переименовать чтобы не вводила в заблуждение :))

Сейчас в Anthill работа с осями идентична тому как это работает в MovieClip или Sprite — вы не можете задать ось вращения так как она всегда считается нулевой точкой. Но чтобы получить нужный вам эффект вы можете сдвигать вложенные объекты (содержимое) относительно нулевой точки и таким образом вы получите «эффект смещения оси».

Ant.Karlov
28 Января 2013
— 01:15
#

@king, извиняюсь что сразу не ответил на ваш комментарий. В версии Anthill 0.2 (и выше) проблемы с выравниванием текстов исправлены.

Ant.Karlov
28 Января 2013
— 01:16
#

Антон, спасибо за ответ!

Sanchez
28 Января 2013
— 11:23
#

Добрый день!

@Ant.Karlov
Наверное это вопрос тебе уже поднадоел, но народ жаждет надстройку над Box2D/Nape :) Она будет в ближайшее время, или сейчас вообще не до неё? :)

Alex R.
31 Января 2013
— 12:40
#

@Alex R., я сейчас немного в авральном режиме, даже блог вот опять немного забросил.

Надстройка Box2D будет где-нибудь ближе к концу февраля как отдельный плагин — отрефакторю старую свою работу и выложу. А про Nape пока ничего не могу сказать, совсем не до него пока. В феврале планирую очередное обновление Anthill — появятся новые возможности.

Ant.Karlov
1 Февраля 2013
— 02:10
#

Привет, Антон.

Не мог ты объяснить или какой-нибудь туториал написать, как реализовать игровое меню и плавные анимационные переходы из одного меню в другое при помощи фреймворка.

Спасибо.

Виталий
1 Февраля 2013
— 13:52
#

@Виталий, сейчас готовлю мини туториалы — статьи по Anthill для Вики которые станут доступны вместе с Anthill Alpha 0.3.0, там будут объяснены все эти базовые возможности. Так же в новой версии появится простой твиннер который упростит создание простых анимаций и переходов между меню.

Но в кратце скажу: идеология такова, что все игровые меню должны находится в одном состоянии (AntState) и унаследованы от AntEntity — только так можно будет создавать красивые переходы между окнами. Далее в AntEntity складываем актеры с бэками, текстовые метки и кнопки — вот и получается игровое меню. Сейчас вопрос анимации появления и исчезновения меню ложится на ваши плечи, а в ближайшем обновлении будут новые инструменты которые упростят эти задачи :)

Ant.Karlov
1 Февраля 2013
— 21:55
#

@Ant.Karlov, было бы здорово видеть мини-туториалы или описание, например, различного рода полезных игровых практик как: так называемый Backdrop, мини карта с отображением миниатюры мира с игроком в риал-тайм, загрузку достаточно больших уровней. Как-то так (раскатал губу) :)

Alex R.
2 Февраля 2013
— 19:12
#

Здравствуй труженик Инди!
Антон, не мог бы ты рассказать про AntLabel, какие шрифты можно использовать, как их добавлять - растровые или векторные, типы, методы класса. Просто это очень востребованная часть игр. Заранее спасибо!

Vacsa
3 Февраля 2013
— 00:24
#

@Alex R., да, я думал о таких тотуриалах, но все больше в рамках серии уроков, например по тому же TowerDefence. Возможно имеет смысл сделать серию таких мини статей и в блоге — подумаю об этом.

По поводу миникарты я вам и так могу сказать в двух словах: миникарта делается достаточно просто. Берете позицию каждого юнита и высчитываете её в процентном соотношении с размерами уровня. Например уровень у вас 1000 пикселей по ширине и высоте, а юнит находится в 100 пикселях — значит юнит находится в 10% уровня по ширине. Далее, предположим что мини карта у вас 100 на 100 пикселей, при этом мы знаем что юнит находится в позиции по x = 10%, а 10% от 100 — это 10 пикселей на миникарте, таким образом зная позицию юнита на основной карте, мы можем через проценты узнать позицию на мини карте. Аналогично делается и для вычисления координат по высоте. Данный способ хорошо работает независимо от размеров и пропорций карт.

Как рисовать карту — это уже зависит от частного случая, можно заранее нарисовать фигурки юнитов для миникарты, а можно ручками рисовать пиксели — это уже как больше нравится. Миникарту обновляем раз в 2-5 кадров и при обновлении перебираем все объекты на основной карте которые должны быть видимы на миникарте и пересчитываем их положение на миникарте.

Что подразумевается под загрузкой очень больших уровней — я не очень понял.

Ant.Karlov
3 Февраля 2013
— 03:15
#

@Vacsa, AntLabel — это обертка для TextField. Суть AntLabel заключается в том, что когда туда передается какой-то текст, то он тут же растеризируется в битмапу и на экран выводится уже пикселями — этот подход не только оптимизирует работу рендера и позволяет работать с текстами как с актерами, но и дает дополнительные плюшки: возможность скэйлить и вращать тексты. А так возможности у AntLabel такие же как и у TextField. Шрифты для AntLabel используются так же как и для TextField.

В будущем планирую добавить поддержку битмаповых шрифтов — это когда текст формируется из картинок с буквами.

Ant.Karlov
3 Февраля 2013
— 03:20
#

@Ant.Karlov под загрузкой больших уровней я имел ввиду, что ты где-то в блоге уже писал про то как ты подгружал уровень графика которого не влазила в холст флэша и ты разбивал его на несколько частей и потом подгружал. Было бы здорово выделить такие советы и много чего интересного в комментариях пишется, с той же миникартой вот в комменте. А так бы человек зашел на страничку твоего фрэймворка а там еще и faq по игровым фичам.

Alex R.
3 Февраля 2013
— 09:40
#

Здравствуй Антон!
Спасибо за ответ. У меня возник еще небольшой вопрос?
В твоём движке используется обертка для стандартных классов мыши, клавиатуры и других.
А есть ли у тебя оптимизации для класса Timer, а если нет то какие бы ты дал советы по улучшению его работы?

vacsa
5 Февраля 2013
— 12:15
#

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

А что до фака по отдельным вопросам, то это конечно можно сделать, причем прямо в Wiki Anthill — я не против, главное чтобы времени на все хватало. Впрочем все желающие могут принимать в этом участие.

Ant.Karlov
6 Февраля 2013
— 08:09
#

@vacsa, а что нужно оптимизировать в работе Timer? :) В состав Anthill входит AntTaskManager — в нем можно задавать цепочки задач с различными интервалами которые будут выполняться по кругу или по порядку и т.п. — это то что нужно?

Ant.Karlov
6 Февраля 2013
— 08:11
#

Ant.Karlov, для различного рода игровых меню (например MenuState, RatingState), где по сути бэкграунд клип и камера статичны, оптимальным решением будет:
1. Добавить растровый бэкграунд в мувиклип и экспортировать его в swc.
2. В самом MenuState (например) сделать
AntG.cache.addClips([BackgroundMenu_mc]);
и после кэширования уже добавить через add()
_background = new AntActor();
_background.addAnimationFromCache("BackgroundMenu_mc");
add(_background);

Или для таких статичных фонов в игровых меню есть какое-то другое решение (возможно проще добавить через addChild() ? )

broken
6 Февраля 2013
— 15:36
#

И еще вопрос, для AntButton есть возможность наподобие useHandCursor (buttonMode)? Т.е. чтобы автоматически отображался при наведении дефолтный курсор руки?

broken
6 Февраля 2013
— 16:52
#

И так же получается, что нельзя применить фильтры (GlowFilter) с того же TweenLite к AntButton.

broken
6 Февраля 2013
— 17:01
#

@broken,

> 1). для различного рода игровых меню (например MenuState, RatingState), где по сути бэкграунд клип и камера статичны, оптимальным решением будет:

В версии Anthill 0.2 можно сделать фон только через описанную вами схему в два шага. В версии же Anthill 0.3 появится возможность загружать за эмбедженные картинки без необходимости кэширования. А вот использовать классический способ добавления фонов для AntState к сожалению невозможен, так как холст камеры куда рендерится весь контент, не может быть прозрачным.

> 2) для AntButton есть возможность наподобие useHandCursor (buttonMode)? Т.е. чтобы автоматически отображался при наведении дефолтный курсор руки? Или нужно создавать свой курсор.

Нет, только свой курсор, к сожалению. Впрочем лично у меня, например, в браузере не работает курсор HandPoint — всегда стрелочка отображается не зависимо от настройки кнопок.

> 3) получается, что нельзя применить фильтры (GlowFilter) с того же TweenLite к AntButton или эффект появления (через alpha) к AntEntitty (AntActor).

Да, с фильтрами работа ограничена, но они очень медленные поэтому если хочется производительности, то приходится отказываться от некоторых вещей. Прозрачность работает для AntActor, но не для AntEntity. В обновленной версии прозрачность будет применительная для AntEntity и для вложенных в нее объектов.

Ant.Karlov
7 Февраля 2013
— 07:35
#

>> А вот использовать классический способ добавления фонов для AntState к сожалению невозможен, так как холст камеры куда рендерится весь контент, не может быть прозрачным.
Ну т.е. если я хочу сделать окна меню и рейтинга, где используются кастомные контролы и эффекты (например TweenLite), мне нужно будет целиком на этом AntState использовать возможности чистого AS3 через addChild без функционала движка (AntButton, AntLabel и тп). Так я делал на flashpunk (различного рода меню, и тп, сделаны через Sprite, а игра через игровой движок)

Сейчас попробовал, бэкграунд добавил через AntActor а поверх него кнопки через addChild(), вроде бы все работает.

P.S. feature request - Level Manager (В Citrus Engine вроде неплохой). Понятно уж что и ручками его не сложно сделать самому, просто написал :)

broken
7 Февраля 2013
— 10:54
#

Немного оффтоп, никто не пробовал?
http://threerings.github.com/flump
"Flump converts Flash keyframe animations into texture atlases and XML or JSON that can be easily integrated into any scene graph-based 2D game engine. Flump runtimes exist for a growing number of game engines, including Starling, Sparrow, and Flambe."

broken
8 Февраля 2013
— 12:30
#

@broken, да, в AntState можно добавлять обычные клипы, спрайты и кнопки, и работать с ними как обычно — это никак не отражается на работе Anthill.

> feature request - Level Manager (В Citrus Engine вроде неплохой)

Посмотрю. Спасибо!

Ant.Karlov
8 Февраля 2013
— 18:41
#

@broken, Flump годится только для игр использующих аппаратное ускорение. А так то в флеше все так и работает (если вы не растеризируете анимации). Такой подход без аппаратного ускорения создает дополнительную нагрузку на процессор.

Ant.Karlov
8 Февраля 2013
— 18:45
#

Ant. Karlov не знаю, какого рода ты планировал надстройку сделать над Box2D, но может быть сможешь что-то интересное увидеть в Level Editor для Citrus Engine. Там тоже делается левел с расстановками объектов в CS, а потом это всё конвертится в физические объекты.

broken
10 Февраля 2013
— 00:34
#

Здравствуйте Антон!
Скажите пожалуйста, в Вашем движке возможно ли применять масштабирование через камеру для кэшированой тайловой карты? Например, когда грузовик подпрыгивает на холмах вся карта отдалялась, а когда он падает на землю маштаб возвращался 1:1 ?
С Уважением.

Vacsa
13 Февраля 2013
— 00:49
#

Добрый день, спасибо за фреймворк!
Вопрос: есть ли встроенный в фреймворк способ определять столкновения объектов/наведение мыши на кешированные растеризованные объекты?
Простой getHitTestPoint даже при третьем параметре true работает по прямоугольнику вокруг кешированного объекта, а если смотреть цвет пикселя под курсором - это бьет по производительности.

Вача
14 Февраля 2013
— 02:18
#

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

Dan
19 Февраля 2013
— 11:01
#

@Ant. Karlov, просьба создать новый топик с выходом новой версии фрэймворка :)

broken
21 Февраля 2013
— 21:21
#

@broken, сейчас готовлю вступительные мануалы для новой версии на вики, после того как большая их часть будет готова, обязательно отдельно напишу об этом в блоге еще :)

Ant.Karlov
21 Февраля 2013
— 22:15
#

Я тут искал, как передвигать камеру при отрисовке дебага Nape, и так понял вы пошли по пути наименьшего сопротивления =) А я все же решил еще поискать, и таки нашел как о-о-очень просто изменять положение камеры и ресайз дебажной картинки: http://game-projects.ru/nape/nape---kamera-v-igre.html

Там вся соль в одной строчке:
debug.transform = Mat23.translation( -camera_x, -camera_y);

Но, если вам, например, нужен и ресайз, то:
_debug.transform = new Mat23 (_scaleX, 0, 0, _scaleY, -camera_x, -camera_y);

Сам пишу правда на Starling, я беру картинку дебага делаю размером со stage и использую transform. Делаю _btmDebugData.draw (_debug.display); и _imageDebug.texture = Texture.fromBitmapData (_btmDebugData);
И потом _imageDebug делаю прозрачность в 0.4 и располагаю выше спрайта с игрой =)

Надеюсь вам это поможет чем нибудь ;)

pSi_X
22 Февраля 2013
— 19:37
#

Антон что-нибудь слышно про надстройку Box2D? С нетерпением жду, когда смогу попробовать ее в действии.

Владимир
23 Февраля 2013
— 14:21
#

@Владимир, слышно! В начале марта планирую опубликовать надстройку для Box2D в виде отдельного плагина для Anthill.

Ant.Karlov
27 Февраля 2013
— 13:35
#

@pSi_X, я пока не писал еще надстройку для Nape, поэтому не пытался реализовывать смещение дебажной отрисовки относительно положения камеры. Поэтому вдвойне благодарен за предоставленную вами информацию — пригодится! :)

Перекрыть методы отрисовки в Nape будет весьма проблематично, там много специфичных объектов отрисовываются (пружины, спирали и т.п.), поэтому писать свой рендер дебаг отрисовки не рационально, т.к. его прийдется еще и поддерживать и при обновлении Nape (а это происходит намного чаще чем у Box2D), поэтому я от этой идеи отказался совсем :)

Ant.Karlov
27 Февраля 2013
— 13:38
#

@Ant.Karlov, Зачем перекрывать? =)
_debug.display это обычная картинка того что просходит в мире дебага Nape.

А с помощью:
for (var i:int = 0; i < space.liveBodies.length; i++) {
_tempBody = space.liveBodies.at (i);
if (_tempBody.userData.graphicUpdate) {
_tempBody.userData.graphicUpdate (_tempBody);
}
}

function updateGraphics (b:Body):void {
var gr:DisplayObject = b.userData.graphic;
gr.x = b.position.x;
gr.y = b.position.y;
gr.rotation = b.rotation;
}
Заранее в созданном объекте добавив
_body.userData.graphic = this;
_body.userData.graphicUpdate = Game.updateGraphics;
_body.userData.graphicUpdate (_body);

Вы спокойно сможете обновлять отображение физических объектов у себя во фреймворке. Посмотрите на то, как взаимодействует Starling с Nape и думаю вы увидите схожесть с вашими наработками ;)
Если что, обращайтесь, помогу чем смогу ;)

pSi_X
28 Февраля 2013
— 15:46
#

Антон, когда будет надстройка Box2D?

skyboy
14 Марта 2013
— 09:13
#

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

Владимир
31 Марта 2013
— 17:59
#

Антон пропал :)

broken
1 Апреля 2013
— 10:29
#

@Владимир, зима затянулась, детишки болеют, да и работы много. Хотел написать небольшой пост с новостями о том, что у меня происходит и как я ничего не успеваю. Но потом момент отчаяния прошел и решил ничего не писать :) Надеюсь в ближайшее время чуть разгружусь и вернусь к блогу.

Про надстройку ничего пока сказать не могу. Слишком много я всего на себя взвалил и, к сожалению, все обещания держать не получается, поэтому такие вещи как надстройка Box2D и развитие Anthill идут весьма заторможенными темпами по ходу разработки своих проектов. Поэтому пока у меня со временем полный трэш — не буду ничего обещать повторно (примерные сроки и планы). Извините :)

Ant.Karlov
1 Апреля 2013
— 19:28
#

Добрый день Антон.Не могу запустить ваш Framework с FLASH IDE:( Вот такие ошибки -

http://www.saveimg.ru/pictures/13-04-13/44176e0348e12e80abd0181fde2eb0a0.PNG

Не могли бы вы более подробно описать процесс запуска?Я вроде все делаю правильно .Указываю ,где находяться файлы swc в папке bin.Не могу только понять - Что за flex.swc.Извиняюсь,пока туповат я с этим.Спасибо

silvvver
13 Апреля 2013
— 12:59
#

@silvvver, судя по ошибкам, вы скачали только примеры, а сам Anthill не скачали. Чтобы все заработало, необходимо скачать Anthill и положить его классы к исходникам примеров. В состав примеров не входит сам фреймворк, так как он обновляется чаще чем примеры :)

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

Ant.Karlov
13 Апреля 2013
— 20:07
#

не могу понять как работает отображение(
я пишу:
var antState:AntState=new AntState();
var anthill:Anthill= new Anthill(null, 60);
addChild(anthill);
создаю лоадер подгружаю мувик
anthill.switchState(antState);
дальше добавляю мувик
var actor:AntActor= new AntActor();
actor.addAnimationFromCache(`tst`);
antState.add(actor);
но только черный экран, в чем проблема?
как сделать чтобы можно было работать как на разных слоях (задний ,передний фон)?

flac
13 Апреля 2013
— 20:54
#

@flac, без более полного кода я не смогу подсказать почему у вас ничего не отображается на экране. Могу лишь предположить что растеризированный клип (если это так), скрывающийся под именем `tst` содержит непосредственно свое графическое содержимое в отрицательных координатах относительно точки регистрации и по умолчанию получается так что он оказывается за пределами экрана.

Попробуйте включить отдалочную отрисовку и подвигать актера x = 100 и т.п.

В качестве слоев могут выступать как сами актеры, так и AntEntity, например:

var layer1:AntEntity = new AntEntity();
layer1.add(actor1);

var layer2:AntEntity = new AntEntity();
layer2.add(actor2);
layer2.add(actor3)

antState.add(layer1);
antState.add(layer2);

Так же рекомендую почитать вводный курс по Anthill. А в случае вопросов или проблем, можете писать мне на почту.

Ant.Karlov
13 Апреля 2013
— 21:39
#

да действительно круто и просто)
вводный курс очень много раз прочел и мало что понял.
а не отображалось потому что если при создании отправить null в aInitialState, то отрисовка не запускается, и потом после смены state необходимо вызвать anthill.start();
спасибо большое)

flac
14 Апреля 2013
— 12:34
#

@flac, вики достаточно молодая поэтому статьи пока не охватывают всех тонкостей.

Хорошо, что вы сообщили о том где у вас возникла проблема и как вы её решили. Я добавил пояснение по этому поводу в Вики, а в следующей версии сделаю чтобы при добавлении состояния, Anthill автоматически стартовал если еще не запущен.

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

Ant.Karlov
14 Апреля 2013
— 20:38
#