Anthill Alpha 0.1.0
Ну вот, спустя три недели активной работы над доработками и рефакторингом движка, наконец-то я могу выложить первый билд, хоть и не идеальный, но вполне работоспособный.
Наконец-то это случилось! Кто-то долго ждал, а кто-то вообще наверное не ждал. Но это неважно. Это первый мой публичный открытый проект, который вышел в свет. Результат далеко не верх совершенства, так как совершенство безгранично. Но признаюсь, заявление о публикации своих наработок заставило меня не только немного попереживать, но и активно поработать над самим фреймворком, привести его в должный вид, местами весьма глобально переосмыслить код, вычитать комментарии и, конечно, же наделать новых багов. А ведь всем этим совершенно некогда заниматься, когда работаешь над играми. Нет времени и сил для вылизывания своих инструментов, ведь они не так важны, как продукт, который их использует. Главное чтобы игра работала и игрок был рад, а на каком там скотче и жевачке все держится внутри — уже последнее дело, а тут такой повод. Поэтому я немного взволнован.
К сожалению, мне не удалось подготовить полноценное ревью фреймворка с описанием всех классов и их возможностей, как я планировал, так как пока нет возможности этим заниматься. Но исходные коды фреймворка неплохо документированны комментариями, на основе которых мне удалось даже скомпилировать полноценную документацию. Сразу извиняюсь за синтаксические ошибки в комментариях и документации, а так же за местами не совсем внятные комментарии, но пока получилось как-то так. Очень спешил. Далее походу обновлений буду потихоньку исправляться.
Всем фанатам Flixel сразу хочу сообщить, что за основую Anthill взята идеология Flixel, так как там все достаточно просто и понятно для освоения и работы. Я пробовал много фреймворков, прежде чем начать работу над своим, и только во Flixel мне удалось разобраться, не скомпилировав на нем ни одной игры. Поэтому я решил, что если буду делать что-то свое, то буду придерживаться такой же идеологии.
Хардкорным программистам и перфекционистам тоже хочется сразу передать привет и сообщить, что не стоит искать там супер-пупер идеального и вылизанного кода. Anthill — это библиотека от художника со всеми вытекающими отсюда последствиями. К сожалению, программирование — это не первое и не последнее, над чем мне активно приходится заниматься в этой жизни :) Если вы нашли проблему или неоптимальное решение, не нужно рассказывать мне о том, какие вы умные и что вы знаете больше, чем я! Лучше сразу докажите это, рассказав, как можно это исправить или улучшить. В общем, надеюсь на понимание.
Для Anthill Framework я сразу решил подготовить отдельную страничку, где можно посмотреть примеры, скачать сам фреймворк, а так же найти документацию.
Перейти на страничку Anthill Framework →
В общем, вот так вот совершенно случайно случился маленький подарок на день программиста. Пользуясь случаем всех неравнодушных к программированию - поздравляю с профессиональным днем! :)
Антон, спасибо огромное! Щас посмотрим.
P.S. с днем программиста тебя.
Да, совсем забыл. С днем программиста!
Хороший подарок. Спасибо!
Крутота.
Для класса antPoint такие функции, как divide и substract в общем-то и не требуются.
А вот вычисление скалярного и псевдовекторного произведения не помешало бы.
p.s. капча лютая
Спасибо. Будем изучать.
С днем программиста!
Антон, ты как всегда радуеш новыми вещами, и они каждый раз все больше и больше поражают проделанным трудом=)
Свой собственный фреймворк да и еще с примерами и детальной документацией - это вобще круто, спасибо тебе огромное=)
Ну и с разу хотелось бы задать такой вопрос: как Anthill будет работать со сторонними либками типа TweenLite? ? будет ли удобен он для создания высокопроизводительных интерактивных RIA-приложений или он только для создания игр был спроектирован?
Заранее спасибо=) С днем программиста тебя, Антон=)
Антон, спасибо за щедрость :)
Скажи, а ты видел вот эти штуки?
рендерилка мувиклипов в спрайты для старлинг:
https://github.com/richardlord/Fruitfly
три похожих игровых фрэймворка с entity архитектурой:
https://github.com/richardlord/Ash
https://github.com/tdavies/Ember2
https://github.com/alecmce/xember
если нет, и тебе будет интересно, подкину больше ссылок на эту тему
Большое Спасибо! ^^
Ещеб скрутили все это в драгндроб конструктор по типу стенсила, было б уебще круто
Всем привет!
Антон, выражаю своё восхищение за такой титанический труд!!!
Для меня, новичка, ты все равно, что золото раздариваешь горстями :)
Я только в начале пути, пытаюсь проследить логику работы AntActor, но мозгов пока не хватает.
Подскажите, добрые люди). Хочу понять принцип работы растеризации клипов.
Грубый пример: fps-25, есть move_mc, в нем 15 кадров аним. ходьбы, 5 из них ключевых, остальные промежуточные(для задержки, чтобы не мельтешил ногами).
При перегонке в массив растровых картинок, берутся все кадры или только ключевые?
В инете находил анимацию ходьбы в 4 кадра, но как её проигрывать, по событию EnterFrame, выставляя задержки?
Fail с названием. Anthill уже занято и обнаруживается практически в первых пунктах выборки гугла.
Переименуй в Anthill game engine
@приветкакдела, изначально еще был класс AntVector где было больше математическо-геометрических методов, но я пока его убрал оставив простой AntPoint.
@Xcite, мой фреймворк не настолько сложен и крут чтобы выкабениватся перед сторонними библиотеками типа TweenLite, поэтому каких-либо проблем я тут не вижу.
Да, фреймворк проектируется только для создания игр и я незнаю насколько эффективно его использовать для других задач. Лично мне, кроме игр толком больше ничего не доводилось создавать во флеше :)
@Good, я вообще сразу на старлинг ругался в первую очередь за то, что к работе с ресурсами они подошли совершенно по дилетантски. Я не знаю чем думали разработчики когда писали для флеша движок работающий с классическими растровыми атласами, и чем потом еще думали после этого адобовцы когда прикручивали в CS6 генератор атласов для старлинга в том числе. Здорово что появилось дополнение которое позволяет избавится от дополнительной работы разработчикам и за одно с экономить на объеме флешки.
Остальные движки не видел. По одной из ссылок где-то в папках наткнулся на robotlegs — его вроде хвалили, но я что-то с наскоку не разобрался что там и как, да и было это уже сильно после того как я занимался изучением движков. В общем, спасибо за ссылки, изучу по внимательнее на досуге.
@Kazgarot, при растеризации клипов кэшируются абсолютно все кадры которые есть в клипе.
Вы можете с экономить на памяти и ускорить процесс кэширования убрав промежуточные кадры между ключевыми кадрами которые используются для задержек. Но это хорошо работает только в том случае, если у вас в анимации не используются твины и количество промежуточных кадров кратно количеству ключевых (то есть после каждого ключевого кадра одинаковое количество промежуточных). Оставляете только ключевые кадры, а чтобы создать необходимую задержку между ними, просто измените скорость анимации для AntActor, например: actor.animationSpeed = 0.5 — это будет равносильно тому, что после каждого ключевого кадра у вас стоит по одному промежуточному кадру, то есть вы замедляете воспроизведение в два раза.
Но старлинг это 2д через 3д, т.е. там полигоны и текстуры, там иначе просто невозможно кроме как спрайтшитами, так работает GPU
Про фрймворки:
роботлегс, сигналы и свивссаспендерс там не главное, главное интересный и гибкий принцип построения игровой архитектуры
вчера перевёл статью автора одного из этих фрэймворков. http://www.flasher.ru/forum/blog.php?b=590
@Anton, @Good, да, действительно что-то я не проверил использует ли кто такое название для своих движков. Скорее всего этот момент я упустил из-за того, что изначально я не планировал выкладывать фреймворк в свет. Думаю, что переименоваться в "Anthill Game Framework" или "Anthill Game Engine" будет хорошим выходом :)
@Good,
> Но старлинг это 2д через 3д, т.е. там полигоны и текстуры, там иначе просто невозможно кроме как спрайтшитами, так работает GPU
Это конечно все понятно. Но ведь никто иной как сами адобовцы хорошо знают, что достаточно легко создать генерацию этих самых спрайтишитов во время выполнения приложения. ? даже если разработчики Старлинга вдруг не подозревали о таких возможностях, то прежде чем пиарить и продвигать Старлинг среди флешеров, Адоби могли же хоть как-то намекнуть разработчикам о том, что неплохо было бы реализовать такую фичу :)
За ссылки в целом спасибо, обязательно почитаю.
Антон, спасибо за труды.
з.ы. Если при компиляции нету тексту - подключение "внутреннего" шрифта Anthill`а настроено на Flex v3.x SDK.... кто на четверке - смотреть Anthill.as
@Good,
> вчера перевёл статью автора одного из этих фрэймворков. http://www.flasher.ru/forum/blog.php?b=590
Прочитал статью... Ах, теперь я знаю как называются эти "сложные" фреймворки в которых без бутылки не разберешься. В таких движках меня бесит большое количество файлов с маленьким количеством кода. ? чтобы понять как работает такой движок, при чтении кода приходится сказать из файла в файл, причем кругами (заглядывая в один и тот же файл по нескольку раз) и при этом суть так и наровит выскочить из головы.
Я не очень люблю такой подход так как для того чтобы работать с таким движком, надо хорошо знать как он устроен. А вот классический подход с наследованием, как в том же Flixel — уменьшает количество забот для программиста использующего этот фреймворк, так как программисту не обязательно на отлично знать его внутреннее устройство.
а вот меня впечатлило то как фрэймворк состоящий из 9 !!! классов (это я про Ash) позволяет создать структуры данных любой навороченности и разделить логику как этого захочется
это ведь не полноценный игровой движёк как фликсель или Anthill а архитектурный фрэймворк, вникнуть в него занятие на час, там даже не нужно про все классы знать - реально пользоваться нужно будет только тремя из них
и никто ведь не заставляет дробить на мелкие кусочки, если удобнее воспринимать длинные классы можно всю логику сложить в одну кучу
крутость в подходе: отделении данных (состояния) от логики, это оборачивается невероятной гибкостью
Спасибо за фреймворк.
Вроде писал что будут методы работы с box2d. Будут и когда?:)
Антон, у меня вопрос не столько по фреймворку, сколько по коду. Зачем ты в конструкторе классов, которые наследуешь от Sprite вначале всегда прописываешь super(); Что это дает и что изменится, если этого не делать. Я просто тоже часто наследую от Sprite но super(); не прописываю. Спасибо...
А за фреймворк огромная благодарность. Руки чешутся, посмотреть, что и как там внутри...
#jarofed
ну так это порядок, когда вызвать конструктор родителя, полезно ведь
IDE жалуется
AntTileMap.as:607
Unresolved variable or type point
@Good,
> а вот меня впечатлило то как фрэймворк состоящий из 9 !!! классов (это я про Ash) позволяет создать структуры данных любой навороченности и разделить логику как этого захочется
крутость в подходе: отделении данных (состояния) от логики, это оборачивается невероятной гибкостью
С этим согласен. Во второй части статьи об ?? я примерно об этом же хочу рассказать — о том как правильно дробить сложные задачи на отдельные части чтобы потом из различных частей собирать, например, разные ??. В создании ?? это оправдано, а вот фреймворк разчелененный на кучу классов склеенных между собой интерфейсами — тут, на мой взгляд, нужно подходить осторожно и с умом :)
Во всяком случае фреймворк задача достаточно тривиальная и я не вижу большой нужды использовать entity подход. Возможно просто потому, что у меня не достаточно опыта и я не очень хорошо понимаю как это может пойти на пользу в случае с фреймворком.
@sovik, про надстройку для Box2D пока ничего не могу пообещать, там серьезно над ней следует еще поработать. Так же теперь еще немного поглядываю в сторону Nape. Но вообще сейчас пока проблема в другом: нет возможности дальше так же активно заниматься наработками на благо общественности, так что скорее всего физика появится не раньше чем в конце осени или даже зимой. В общем время покажет.
@jarofed, при компиляции во FlexSDK с включенным Warning Mode — компилятор ругается на отсутствие вызова родительского конструктора. Если super() не писать, то родительский конструктор все равно будет вызван, но в таком случае разработчик не контролирует когда именно это случится, и это может порой привести к неприятным последствиям (например, попытки обращения к экземплярам классов которые еще небыли созданы в конструкторе). В случае со Sprite и MovieClip как и с многими другими классами можно конечно не писать super(), но у меня редактор когда сам его вписывает при создании класса ;)
@kohver, замените строчку 607 в AntTileMap на:
var point:AntPoint = getCoordinates(aIndex);
Антон, спасибо за фреймворк.
в одном из постов ты писал о вспомогательном классе для push`ов. а в фреймворке он есть?
Антон, спасибо за фреймворк.
в одном из постов ты писал о вспомогательном классе для push`ов. а в фреймворке он есть?
p.s. капча злая
Знаете чего не хватает этому фреймворку. Нормального списка фич, по которым можно сразу сделать вывод подходит тебе этот фреймворк или нет. Я вот так и не понял, что Anthill умеет, кроме растеризации графики на лету?
Есть ли редактор тайловых карт в фреймворке?
Нужно написать о возможностях Anthill в виде перечня пунктов.
Спасибо, на первый взгляд супер.
@Александр, в данной сборке нет ничего для работы с физикой включая надстроек для Box2D. Все это я выложу немного позже.
@Anton, я планировал написать полноценный обзор всех классов, но, к сожалению, не получилось этого сделать из-за нехватки времени. А вот список фич обязательно напишу.
@Ant.Karlov, вы играли в Acorn Story?
@?щущий, я играл =)
@?щущий, нет не играл. Посмотрел видео ролик — похоже на слабенький клон/ремейк Limbo, как по графическому исполнению так и по геймплею.
@Good, Насчет спрайтшитов Старлинг. Например Genome2D прекрасно умеет на лету собирать текстурные атласы из картинок. Так что полностью согласен с мнением Антона об ресурсоемкости Старлинга.
Антон, спасибо большое за ваше творчество и труды.
Подскажите, как лучше реализовать с помощью вашего фреймворка меню паузы в игре?
Спасибо ОГРОМНОЕ. Спасибо!
Класс - теперь нужен цикл статей о том как им пользоваться )
@Pasha, меню паузы делается так же как и везде:
1. Обрабатываете клик на кнопку "пауза".
2. Устанавливаете флаг о том, что ваш игровой мир на паузе (по которому игровой мир определяет живет он или нет).
3. Создаете окно паузы и добавляете его по верх игрового мира. Окно паузы может быть создано как средствами фреймворка так и средствами обычных Sprite и MovieClips.
@shaman4d, примеры плохо отражают то как можно использовать фреймворк?
эх
еще бы физику
и вообще бы было золото
>.nodoxi
чем вам уже существующие не угодили?
Список фич так и не появился. Печально. :(
>и.о. Капитан Очевидность
я не прошу автора написать свой физический движок :D
обертку такую же удобную для box2d или nape
вроде собирался же
P.s. можно капчу не вводить? О_о
@Anton,
> Список фич так и не появился. Печально. :(
Простите, но я не очень понимаю такие печальные комментарии. Об основных особенностях я достаточно подробно написал в анонсе, так же подготовил демки чтобы вы могли увидеть ключевые возможности наглядно. Снабдил исходники демок достаточно подробными комментариями. ? я думаю, что если бы у вас было желание, то вы бы уже давно заглянули в исходники и сделали бы для себя выводы... Но на деле вас останавливает только отсуствие какого-то списка фич — вот это как раз пичаль.
@.nodoxi,
> P.s. можно капчу не вводить? О_о
Ах, техническая неполадка. Спасибо что заметили :)
Понял что - Я НЕ ПРОГРАМ?СТ... v_v``
Только дизайнер.. ^_<
@Crash, это ничево, я когда читаю статьи по программированию или пытаюсь прочитать чужой код — тоже понимаю что я дизайнер :D
>Ant.Karlov
Помните как в славном мультфильме — Делай добро и бросай его в воду.
=)
Русскоязычное коммюнити подвержено нескольким степеням разочарования.
Степень первая — отсутствие списков фич.
Степень вторая — отсутствие заточенности на конкретной задаче (а где в вашем движке кнопка - создать платформер? и тд и тп)
Степень третья — "как вы опять не объяли необъятное" (тут список разочарований начинается с "оберток" ко всем другим фреймворкам и движкам и заканчивается разочарованием, что оказывается отсутствует коннектор для управления телескопом Хаббл)
Степень четвертая — "подождите так мне что все же придется программировать?" (рисовать, работать, думать и тд и тп нужное подчеркнуть)
Все эти степени разочарований странным образом мешают некоторым людям просто сказать автору — "Спасибо".
? предложить автору свою скромную помощь в реализации:
списка фич,
коннекторов,
оберток,
и прочего чего так жизненно не хватает.
Спасибо.
=)
@и.о. Капитан Очевидность: Как же Вы правы, Капитан!
Я пару вечеров посвятил беглому изучению фреймворка, и некоторые идеи очень сильно понравились. Да, сразу видно, что в основе лежит Flixel, но значительно переработанный и это просто здорово! Я попытаюсь внедрить некоторые куски в свою библиотечку. Так что Антону глубочайшее уважение и благодарность.
:) это не я ленивый, это вы ленивый. список фич не критичная вещь, фиг с ним. но то, что вы не нашли 1 час свободного времени чтобы его написать и встроить в сайт говорит о том, что обновления фреймворка будут безнадежно нескоро и оооочень редко. Неужели он так уж идеален, что ему больше ничего не потребуется? А если критичный баг найдется? А если я начну проект, а критичный баг обнаружится на стадии релиза? Сколько ждать исправлений? Править самому? Правильно, я лучше сразу все сам напишу.
Русскоязычное комьюнити состоит на 50 процентов из школоты, на 49 процентов из сумашедших снобов и на 1 процент из всех остальных категорий. Привыкайте. Ваша школота.
@Anton, лучшая защита — это нападение! Вы все правильно делаете. Проходите мимо.
@и.о. Капитан Очевидность, порадовали! Спасибо! :)
Ant. Karlov, Вы славный представитель русского комьюнити, и вам не болеть.
to --> "Anton"
Поделитесь пожалуйста вашим фреймворком или чем нибудь, ведь, если вам верить, вы образец трудолюбия и предусмотрительности.
Конечно, хотелось бы взглянуть на список фич.
=)
Но даже без него я точно скажу вам спасибо.
А если он будет полезен, то скажу спасибо дважды.
А может вы на хуй пойдете господин очевидность?
мне почему "обертки" интересны для box2d или nape
не совсем понятно
после box2d, C++ и HGE
как во флеше делать апдейт физического мира.
в какой момент?
в AntState::update ? а дельта времени?
я честно продолбался с этим во фликселе
и хочется посмотреть как вы реализовали
при похожей структуре
@.nodoxi, для физики лучше использовать фиксированный шаг. Во всяком случае для Box2D точно, а про Nape не уверен. Но где-то в демках видел, что динамический временной степ в Nape используется для стресс-теста.
В Anthill.as есть закомментированный код в основном enterFrame в котором апдейтилась физика, там она и обновлялась у меня, там же я считал сколько времени уходит на её аптдейт :) Частично код так и остался поскольку я его еще верну в доработанном виде.
to--->Anton
С удовольствием проследую в указанном вами направлении, если вы составите мне компанию.
@Ant.Karlov
то есть
AntG.physics.update()
будет делать апдейт мира на фиксированное время.
и в нем же будут обходиться каждый кадр все физические тела и выставляться соответствующим активным AntActor`ам координаты и повороты?
ок
разобрался уже
попробую Nape с Anthill`ом подружить
вообще мне антхилл очень нравится
особенно крута растеризация мувикоипов
Ant.Karlov, огромное спасибо.
Клянусь, я сожру свою шляпу, если я увижу хоть парочку игр, сделанных с использованием "этого".
@Boyarskiy
наверное придётся шляпу всё таки есть.
движок то хорош
@Ant.Karlov
Nape мне больше понравился чем Box2d
http://games.sothoth.ru/antnape.swf
как планируется дальше развивать Anthill?
to-->Boyarskiy
Ничего личного, но очевидно же, что как минимум оба Зомботрона на "этом" и работают.
P.S.
Приятного аппетита.
=)
Антон, а можешь объяснить как работает у тебя TileMap и как создаются фоновые "слои"? В теории. Конкретный код мне не нужен.
Я так понимаю что ты рисуеш во Flash IDE, несколько MC, затем все это растрируется и разбивается на набор картинок, создается TileMap? Так? В демке где показана работа TileMap зеленый квадратик отображает размер тайлов?
Если нет - то скажи пожауйста какой ты используеш.
Спасибо.
? еще вопрос: а насколько ниже будет производительность если перевести графику в растр, но не рендерить все это самому, а просто разместить в дисплйлисте битмапы? Нетестировал?
?ли такой подход не имеет смысла?
Спасибо еще раз.:)
@.nodoxi,
> как планируется дальше развивать Anthill?
Планирую сделать надстройку для Box2D, и может быть для Nape. Сейчас тоже заинтересовался Nape, так как народ прав: Box2D можно сказать "мертвый движок". По мимо этого буду думать о мелких переработках и оптимизациях. Но особых планов пока не строил кроме надстроек над физическими движками. Слабые места и недоделки чаще всего вылезают при создании игр, поэтому буду думать по ходу использования.
@и.о. Капитан Очевидность
> Ничего личного, но очевидно же, что как минимум оба Зомботрона на "этом" и работают.
Нет, на самом деле на этом работает только Zombotron 2. Первый Зомботрон использует еще Sprite и MovieClip`s с использованием классов для кэширования вектора которые я выкладывал ранее :)
@Dmitriy Yermak,
> Антон, а можешь объяснить как работает у тебя TileMap и как создаются фоновые "слои"?
Вся графика для уровней рисуется или расставляется во Flash IDE — это как правило большой клип с кучей вложенных векторных клипов представляющих собой оформление. Каждый уровень обычно состоит из двух больших клипов: задний слой (что позади героя) и передний слой (что перед героем и всеми объектами). Далее во время игры перед тем как запустить игрока на игровой уровень создаются оба клипа из библиотеки клипов и быстро растеризируются и нарезаются на тайлы. Как это выглядит с точки зрения кода я показл в примере работы с AntTileMap. Далее с полученными тайлами мы работаем как с обычными актерами (или вообще с ними не работаем).
Сам процесс работы заключается в том, что мы создаем AntTileMap задаем количество тайлов в карте по высоте и ширине, а так же размер тайлов, потом указываем клип из которого нам нужно получить карту и запускаем процесс кэширования. На выходе у нас получается сущность с кучей вложенных в неё актеров которые используют одну анимацию (AntAnimation) каждый кадр которой представляет собой битмап с определенным тайлом карты. Вот собственно и все.
Чтобы создать передний и задний план, вам понадобится две тайловых карты.
Но по мимо этого я предусмотрел возможность создания классической карты где тайлы заранее нарисованы и для каждого тайла карты определяется только его разновидность. Все это есть в примере показывающим работу тайловой карты.
Зеленый квадрат — это актер показывающий тайл карты над которым находится курсор мыши. В примерах он не несет смысловой нагрузки, я его использовал для отладки, ну и для того чтобы показать как можно получать позицию текущего тайла :) А в примере с классической картой кликая по тайлам можно переключать их разновидность.
Все, так что рано пока шляпу жрать. Работайте больше!
@Dmitriy Yermak,
> ? еще вопрос: а насколько ниже будет производительность если перевести графику в растр, но не рендерить все это самому, а просто разместить в дисплйлисте битмапы?
Я не очень понял суть вопроса. Но скажу сразу что Anthill сделан таким образом, что единственный способ засунуть в него графику — это использовать клипы на кадрах которых должно быть какое-то графическое наполнение. Но по факту движку уже не важно что там в кадрах, растр или вектор, оно в любом случае еще раз будет пересохранено в формат движка (отпечатано в битмапы) и работа будет происходить непосредственно уже с этими битмапами. То есть если вы рассчитываете повысить производительность пересохранив всю векторную графику в растр, а потом растр вновь разместить в кадрах клипов — то это будет пустая трата времени (мартышкин труд)! :)
В общем-то вопрос не по движку, а просто по скорости рендера. Я так понял что ты делаешь из вектора растр, а потом собираешь все это в одну BitmapDat`у c помошью copypixels.
А если растеризовать, но потом просто добавить получившиеся растровые объекты в DisplayList:
stage.addChild(Bitmap1),
stage.addChild(Bitmap2),
т.е. не собирать все это вместе самому, а позволить это делать рендеру флеша. Насколько хуже будет произодительность?
Нисколько не хуже. Не надо думать, что внутренние механизмы флеш плейера работают медленнее чем его же экспортные функции, вроде bitmapdata.draw или copypixels, которые вы вызываете в своих скриптах (да да, байт-код это скрипты для флеш плейера).
По логике если вы позволите флешу самостоятельно просмотреть displaylist и отрисовать его, то он выполнит это с помощью тех же draw и copypixels или использует внутренние функции, которые все равно не потребуют дополнительной трансляции (они уже транслированы в ассемблерный код).
@Dmitriy Yermak,
> Я так понял что ты делаешь из вектора растр, а потом собираешь все это в одну BitmapDat`у c помошью copypixels.
На деле в памяти это все так и хранится разрезанным, собирается это все в кучу только когда камера видет эту кучу.
> А если растеризовать, но потом просто добавить получившиеся растровые объекты в DisplayList:
Об этом я уже писал и не раз, просто так добавить в stage все битмапы можно, но не стоит, т.к. потом надо следить за тем что выехало за пределы камеры и удалять невидимые объекты, а потом вновь добавлять когда они опять видимы игроку ну и т.п.
@Anton,
> Нисколько не хуже. Не надо думать, что внутренние механизмы флеш плейера работают медленнее чем его же экспортные функции, вроде bitmapdata.draw или copypixels, которые вы вызываете в своих скриптах (да да, байт-код это скрипты для флеш плейера).
А я и не думал и прежде чем залазить во все эти "ручные рендеры", я взял и сравнил насколько это будет полезно по сравнению со стандартным рендером флеша который по вашему утверждению сам использует copyPixels(), и о своих эксперементах достаточно подробно и с примерами написал здесь. Обязательно почитайте если вы пропустили.
:) Глупый вы, старайтесь думать в следующий раз, и не писать статьи, которые вводят людей в заблуждение.
Даже ваш последний комментарии немного с "лжецой", я не говорил что там обязательно используется copyPixels, я лишь перечислил возможные варианты.
@Anton, в отличии от ваших высказываний мои статьи подкреплены наглядными примерами и практикой. Поэтому я не согласен с вами.
Если вы уверены в том, что стандартный рендер флеша единственно верный и самый быстрый рендер — это ваше право.
to --->Anton
Какой операции, деление или умножение, вы отдаете предпочтение в ваших приложениях?
Чем отличается использование одного и того же кода в конструкторе и в теле класса?
Прошу простить если чем то оскорбил вас и буду признателен если вы ответите на эти простые вопросы.
как? кэп, вы еще не ушли на х#$? а ведь обещали!
Так вроде и вы мне компанию не составили, "а ведь обещали" =)
Держите для развития кругозора.
==== Слон и Моська ===
?.А. Крылов
По улицам Слона водили,
Как видно напоказ —
?звестно, что Слоны в диковинку у нас —
Так за Слоном толпы зевак ходили.
Отколе ни возьмись, навстречу Моська им.
Увидевши Слона, ну на него метаться,
? лаять, и визжать, и рваться,
Ну, так и лезет в драку с ним.
«Соседка, перестань срамиться»,
Ей шавка говорит: «тебе ль с Слоном возиться?
Смотри, уж ты хрипишь, а он себе идет
Вперед
? лаю твоего совсем не примечает».—
«Эх, эх!» ей Моська отвечает:
«Вот то-то мне и духу придает,
Что я, совсем без драки,
Могу попасть в большие забияки.
Пускай же говорят собаки:
«Ай, Моська! знать она сильна,
Что лает на Слона!»
оставьте свои сексуальные мечты при себе, кэп. я вам ничего не обещал.
Не обольщайтесь.
Вы и не могли мне ничего обещать по одной простой причине.
У вас ничего нет.
Ни знаний, чтоб аргументированно отстоять свою точку зрения.
Ни юмора, чтоб достойно ответить на чей нибудь стеб.
Ни сарказма, чтоб оборжать сложившуюся ситуацию.
Одни потуги на уровне физиологии.
Но все еще предлагаю вам договор.
Я — перестаю топтать вашу тушку, а вы переводите дискуссию в область аргументированной доказательности.
да ты же быдло-дурачок, кэп :)
@Ant.Karlov
Об этом я уже писал и не раз, просто так добавить в stage все битмапы можно, но не стоит, т.к. потом надо следить за тем что выехало за пределы камеры и удалять невидимые объекты, а потом вновь добавлять когда они опять видимы игроку ну и т.п.
Гм. Всегда считал что рендер Флэша достаточно умный чтобы не рендерить то что за пределами экрана. ОК, спасибо, буду учиться на чужом опыте. :)
@Dmitriy Yermak, проведите простой эксперимент:
1. Создайте клип и разместите в нем произвольно 100-150 других клипов не важно каких (вектор или растр), или больше если у вас компьютер мощный.
2. Двигайте этот большой клип произвольно попутно замеряя fps.
3. Потом попробуйте удалить большую часть (например 90-140) клипов из основного клипа методом removeChild() — оставив, например, только то количество которое реально может попадать в экран. Не обязательно их совсем удалять, просто удалите из структуры и подвигайте вновь этот клип попутно замеряя производительность.
Уверен, вы удивитесь.
Рендер флеша действительно умен — он умеет рендерить даже только те части экрана которые изменились, но подвох там где его мы его совсем не ждем :(
Скажи мне, Антон.
Ты такой талантливый, человек-пароход я бы сказал. Я тебя очень уважаю как человека.
Почему не публикуешь свои игры на gamedev.ru?
Люди там хорошие, следующие игры обязательно там посвети.
Обязательно, будешь очень в тему смотреться рядом с гульменом, онанорыцарем и "сабераю камманду для саздания ММОРПГ, мне 8 лет, Вася ".
Там хороших 3.5 человека осталось и те теперь рисуют Гнума.
>Там хороших 3.5 человека осталось
Было 4 но вы ушли?
=)
to--->Ant.Karlov
меня терзают смутные сомнения © что выражение
if("Какой-то хомяк" == "Anton")
вычисляется в true;
> и.о. Капитан Очевидность
Проверил.
Возвращает false.
AS3. FS4.
ЧЯДНТ?
Таак таак :) У кэпа едет крыша по параноидальному сценарию.
заюзай обертку - IP(rest...);
to ---> Какой-то хомяк
? для развития кругозора.
?нструкция if ничего не возвращает учите мат часть.
О боже, дикая попоболь такая дикая. Пациент бросается на окружающих, нужно его усыпить.
Констатация фактов для вас всегда равнозначна — "бросается на людей"?
вот троллей то )
@Ant.Karlov
начал делать на Anthill и Nape игрульку ) скоро покажу, очень интересно мнение
сделал себе типа обертки для Nape
запихал в AntPhysics
и она доступна через
AntG.physics
:)
в enterFrameHandler вызывается расчет физики как полагается.
http://lumbergame.sothoth.ru/phystest.swf
(клик мышкой - добавить бабку, d - просмотр debug-draw nape)
правда еще сделать много чего нужно.
но в целом довольно все рабоче и радует.
возник вопрос как двигается и прыгает герой в Zombotron (скорость, импульсы, силой) и как выглядит его шейп.
/** Запускает воспроизведение текущией анимации. */
public function play():void
{
_playing = (!_playing) ? true : _playing;
}
А зачем в этом месте такая конструкция?
Вот я бы написал:
_playing = true;
Расскажите чем это хуже?
@.nodoxi, да производительность Nape впечатляет, я уже тоже серьезно задумался над тем чтобы в будущих проектах использовать именно его. Одна беда только, перекрыть его отладочную отрисовку немного накладно. Но это конечно не повод чтобы его не использовать :)
Физическая модель героя из Зомобтрона выглядит вот как здесь на фото снимке. А вообще рекомендую вам почитать у хитри про особенности создания персонажей в платформерах.
@Kickerua,
> _playing = (!_playing) ? true : _playing;
Такая конструкция используется для безопасного изменения значения переменной при определенном условии. В данном случае она конечно же не нужна :)
@Ant.Karlov
о спасибо
за линк на хитри
@Ant.Karlov
а если возможность AntActor развернуть?
допустим персонаж пошел в другую сторону
во flixel в этом месте facing
@.nodoxi, если имеется в виду отражение, то scale.
@Ant.Karlov
млин, точно
Здравствуй Антон. Будут ли остальные две части по искусственному интеллекту?
@vacsa, будут, но немного позже. Сейчас готовлю большой материал по другой не менее интересной теме :)
продолжаю эксперименты с физикой :D
http://grandmanomad.nodoxi.org/280912-testcontrol.swf
Антон, скажите зачем несколько камер? ? каждую обновлять?
Спасибо.
@Ant.Karlov
>Одна беда только, перекрыть его отладочную отрисовку немного накладно.
А зачем её перекрывать?
и еще вопрос такой, а как работать с вложенными объектами.
допустим есть герой и он состоит из ног, туловища, головы и оружия. это разные анимации.
хотелось бы естественно менять координаты самого героя просто, как мувиклип с вложенными мувиклипами. как решается это?
@q13, несколько камер — это такой задел на будущее. С использованием нескольких камер можно делать режим игры Split Screen — это когда несколько игроков могут играть за одним компьютером и у каждого свой игровой экран. Стандартными средствами такую штуку весьма проблематично сделать. Есть и другие вещи для которых можно использовать более чем одну камеру.
Кроме того отделив сущность камеры от общего игрового мира, можно наделять её дополнительными возможностями, например типами слежения или применение постэффектов и т.п. В данной сборке стандартных возможностей у камеры пока никаких не предусмотрено.
@.nodoxi,
>>Одна беда только, перекрыть его отладочную отрисовку немного накладно.
> А зачем её перекрывать?
А иначе приходится двигать отладочный битмап Nape в соответствии со скроллом камеры, нет? Да и с несколькими камерами могут неудобства возникнут, хотя дебажная отрисовка физики для всех камер наверное не так уж и нужна.
> и еще вопрос такой, а как работать с вложенными объектами.
Так же как с обычными спрайтами или клипами. Делаете какой-то один спрайт героя основным который привязывается к его физическому телу, а все остальные графические части героя вкладываете в него. AntActor унаследован от AntEntity, а значит может содержать в себе любые другие сущности.
@Ant.Karlov
да, приходится двигать Nape`вский битмап. я так по крайней мере сделал.
ну меня пока устраивает такой путь.
AntEntity.add
точно, спасибо.
а есть ли возможность отрисовывать спрайт не прямоугольником, а произвольно задав 4 вершины?
например как тут:
http://hge.relishgames.com/doc/index.html?hgesprite_render4v.html
это надо _matrix как-то преобразовать в drawActor по идее.
это бы очень пригодилось для отображения ткани, например.
@Ant.Karlov
спасибо за движок
я его уже люблю!
Можно как-то применять маску?
@Ant.Karlov
Во первых, хотел поблагодарить Вас за труды (Зомботронов это тоже касается).
Ну и конечно вопрос: почему AntCamera расширяет Sprite, когда самое важное творится в Bitmap? Я не придираюсь, просто интересно, было ли это машинальным решением или все же есть какая нибуть причина.
Пэ.Эс.: хорошим примером использования множества камер в однопользовательском режиме есть игра Fahrenheit (http://ru.wikipedia.org/wiki/Fahrenheit). Думаю Вы, как человек творческий, с легкостью найдете применение подобным эффектам в своих работах. Ну а я, как поклонник Ваших трудов,буду рад испробовать их на себе :)
@.nodoxi,
> а есть ли возможность отрисовывать спрайт не прямоугольником, а произвольно задав 4 вершины?
Нет, такой возможности к сожалению нет. Matrix нельзя преобразовать таким образом чтобы отрисовывать, например, такань (меш). В документации написано, что все преобразования Matrix являются аффинными, а при аффинных преобразованиях сохраняется прямолинейность линий, то есть параллельные линии остаются параллельными.
Для отрисовки мешей можно использовать drawTriangles(), но к сожалению данный метод не имеет отношения к растру и может быть вызван только для объекта graphics какого-нибудь спрайта или клипа.
@q13,
> Можно как-то применять маску?
Можно кэшировать клипы в которых используется маска. А в самом движке нет никаких инструментов для создании маски программно.
@elder_Nosferatu,
> Ну и конечно вопрос: почему AntCamera расширяет Sprite, когда самое важное творится в Bitmap?
Единственный спосб отобразить растровое содержимое — это вложить битмап в клип или спрайт. ?значально был просто растровый буффер в который рендерилось содержимое мира камерами и который так же был вложен в один единственный спрайт. Но потом было решено, что унаследовав камеру от Sprite можно легко и понятно устанавливать положение камеры на экране флеш приложения. Поэтому в итоге получилось так что камеры — это как бы спрайты-окна в визуальный мир Anthill.
@Ant.Karlov
>...унаследовав камеру от Sprite можно легко и
>понятно устанавливать положение камеры на
>экране флеш приложения.
Если были бы в Вашем редакторе смайлики, я бы использовал тот, который репу чешет и смотрит как баран на новые ворота... Короче, "спрайты-окна" звучит красиво, но на счет позиционирования я не понял.
По сути Bitmap и Sprite отличаются тем, что у первого точка привязки всегда в левом верхнем углу, а у второго зависит от положения "внутренностей". В общем случае такая Sprite`овая фишка усложняет размещение.
@
> По сути Bitmap и Sprite отличаются тем, что у первого точка привязки всегда в левом верхнем углу, а у второго зависит от положения "внутренностей". В общем случае такая Sprite`овая фишка усложняет размещение.
По умолчанию битмап камеры добавляется в нулевую точку, тут только если вы его сами подвигаете, поэтому не вижу проблемы о которой вы говорите. Конечно можно было бы напрямую работать с Bitmap минуя спрайт (добавить вместо спрайта его на сцену). Но тогда, если вдруг вы захотите его повернуть или изменить масштаб, а еще возможно понадобится добавить какие-нибудь другие текстовые поля или клипы, то с битмапом вам это не удастся уже сделать.
@Ant.Karlov
Вот черт! Я об этом не подумал. А раньше это написать не могли? Я сейчас собираю идеи с чужих библиотек и Вашу камеру забраковал. Теперь понимаю, что лишний спрайт даст больше преимуществ, чем излишеств. Пошел вносить правки в своей либе.
Спасибо!
Антон, можете написать короткий код чтоб камера следила за объектом?
Спасибо.
Антон, а как вы решали вопрос мультиязычности во втором зомботроне? Вы хранили тексты каждого из языков в отдельных внешних файлах, или просто в самом коде игры у вас были несколько вариантов для строковых переменных, которые вы присваивали в зависимости от выбора пользователем языка?
@Grizzly
Осмелюсь предположить, что в игре хранится две коллекции всех реплик и подписей для каждого языка. А так как переключения языка "на лету" не предусмотрено, то скорее всего все строковые переменные, которые отвчают за вывод текста инициализируются на старте той коллекцией, которая соответствует выбраному языку.
Антон, можете написать короткий код чтоб камера следила за объектом?
Выдрал код из Flixel. Надо было немножко повозиться с ним. Так как в Flixel scroll, как я понял, работает в плюс для смещения. В Anthill - наоборот, в минус.
@Grizzly, данный вопрос немного выходит по объему ответа за пределы одного комментария. Поэтому решил вынести данную тему в отдельную запись. Сегодня опубликую свое решение ;)
@Ant.Karlov, отлично. Большое спасибо!
@Ant.Karlov
а какие рекомендуемые размеры для растеризованной AntTileMap?
иными словами - насколько большой уровень можно сделать?
@.nodoxi,
> а какие рекомендуемые размеры для растеризованной AntTileMap?
Если честно, то сам не замерял. Думаю, что рекомендуюемые размеры должны зависить от следующих факторов:
1. Размер карты в пикселях и количество таких карт (задний план, передний план, может быть фоны для параллакса).
То есть если планируется много слоев, то размер карты следует уменьшать чтобы вдруг не занять всю память.
2. Размер тайлов.
Например, если тайлы будут очень маленькие и их будет очень много, то на их процессинг может уходить много времени.
Подобным образом я создавал карты до 9000 pix в длину и в высоту 640 pix из двух слоев — это в грузовиках. В Зомботроне, например, уровни 3000x2500 pix (примерный размер), и состоят из двух слоев.
В общем надо пробовать :) Главное чтобы памяти не много занимало и кэшировалось быстро, а так же не тормозил процессинг, но с этим пока не доводилось мне сталкиваться.
@Ant.Karlov
спасибо за ответ!
Anthill на Flashdaily.net! =)
Помогите пожалуйста с несколькими вопросами)
Первый касается экспорта в SWC - нужно чтобы у меня на первом кадре всё было, или создать набор символов?
Второ насчёт структуры. В движке в описании anthill указано что это ядро - значит ли это, что нужно от него наследовать main? ?ли его нужно подключать?
С графикой сам разобрался, дальше изучаю примеры)
Ещё вопрос, из-за этого я не подружился с флэшпанком... Размеры экрана предустанавливаются только в начале? ?ли можно их динамически менять? Хочется, чтобы игра реагировала на изменение размеров экрана, переход в фулскрин - хотя бы центрировала изображение) В идеале, конечно, иметь элементы экрана, которые автоматически распределятся при переключении размеров...) Например, какие-то элементы распологаются на 50пикселей от нижней границы, на четверть ширины слева, и эти элементы при изменении размеров окна автоматом переместятся в нужные координаты по изменившимся рассчётам.
Привет
нравится этот фреймворк
такой вопрос можно ли как то сделать,
что бы
actor.addAnimation(`mc`,[0,1,10,5,3,5,0,1,1])
массив кадров записать? что бы не кешекировать повторяющие кадры??
@horror812, можно конечно реализовать возможность чтобы задавать массив кадров которые необходимо кэшировать. Но почему бы вам не удалить ненужные кадры непосредственно из клипа чтобы они не мешались? Какая может быть польза от того что вы указываете только нужные кадры?
@Владимир, в данной версии ферймворка размеры экрана задаются изначально, да. Но теоретически их можно произвольно изменять динамически (на практике не пробовал может быть вылезут какие-то моменты с этим).
Но в любом случае я пока не сталкивался с такими движками которые бы автоматически обрабатывали изменения экрана. Например, обработка изменения экрана логична для каких-то внутренних событий движка и его элементов, но реакция элементов пользовательского интерфейса (а конкретно спрайтов) и т.п. — такое обычно всегда отдается в руки разработчику. Откуда разработчики движка могут знать какие-спрайты могут реагировать на изменения экрана, а какие нет? Тут обычно разработчик может подписаться на событие изменения экрана и подвинуть элементы исходя из новых размеров.
На днях я проверю динамическое изменение экрана и при необходимости внесу правки в код. Все самые свежие обновления на GitHub.com
#Ant.Karlov
Я не много не про это.
Вот смотри
Я кешекирую все кадры (с 1-5)
теперь хочу что бы у меня было несколько последовательностей анимаций
1) [1,2,3]
2) [4]
3) [1,3,5,2]
а таким способом (как у тебя в двиге) мне придется подготовить 3 независимых Мувиклипа и кешекировать этиже кадры снова по -отдельности
Вот во фликселе можно было сделать
addAnimaton(stand,[1,4,5,2]) и тд
мне кажется это очень удобно
былобы классно, если бы и ты добавил нечто подобное
спасибо
@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
Да, но ведь так он и битмапу будет клонировать?
если нет - то отлично!
мне кажется можно так
actor.addAnimFromCache(`my_hero_mc`,`stand`,[1,2,3])
actor.addAnimFromCache(`my_hero_mc`,`jump`,[3,3,5])
actor.playSeq(`stand`)
#Ant.Karlov
Еще мне кажется я баг нашел
когда у кнопки стоит флаг чекбокса - тогле (и 4 фрейма)
при "выбранном" состоянии не работают события овер и оут!
#Ant.Karlov
Сорри за назойливость ^__^
также когда чекбокс
события от клика по другой кнопке вызывает повторно клик у чекбокса
потомучто не работает это условие
(в методе onMouseUp у AntButton)
if (!exists || !visible || !active || status != DOWN) return;
ведь
if(toggle) trace(userData,status);
говорит что status - 3
#Ant.Karlov
Нет, я имел в виду не контроль движка над игровыми элементами, просто сейчас, если нажать "развернуть" экран разворачивается, а рабочее окно игры остаётся заданных размеров в верхнем левом углу флэша. В ВК-приложениях это реализовано отдельной кнопкой в игре, которая, видимо, отправляет команды на ресайз и новые положения объектов.
За размером окна флэша же можно следить, насколько я знаю? Сегодня, если буде время, посмотрю...
Чтобы это не сказывалось плачевно навнешнем виде, я думаю, надо просто элементы интерфейса делать динамическими, в координатах относительных размеров экрана, а камеру, которая "отображает" окно в игру менять в размере.
Антон, а есть что-то для "красивых" переходов между состояними?
@horror812,
> Да, но ведь так он и битмапу будет клонировать?
Копировать битмапы из оригинальной анимации или использовать прямые указатели — думаю, что это можно сделать опциональным при вызове метода клонирования. Так как если использовать указатели, а потом вдруг удалить оригинальную анимацию, то и клон не сможет больше работать.
А вот отдавать воспроизведение только указанных кадров на откуп актеру — это на мой взгляд не самое рациональное решение, так как, тогда в коде акетра появятся дополнительные условия и усложнят его работу, что для такой редко используемой фичи не самое хорошее решение.
Думаю, что завтра закоммичу на гитхаб доработанный AntAnim.as с учетом ваших пожеланий.
@horror812,
> когда у кнопки стоит флаг чекбокса - тогле (и 4 фрейма)
Это такая недоделка. Базовая кнопка работает только с четырьмя кадрами, а чтобы реализовать полноценно работающий CheckBox, нужно для зажатого состояния кнопки рисовать отдельные состояния наведения и т.п.
Базовая возможность toggle у кнопки больше планировалась для того чтобы делать что-то вроде палитры: кликнули на кнопку — выбрали объект какой-то, кнопка обозначилась как зажатая, кликнули на карте — кнопка выправилась и т.п.
За баг репорт спасибо! Класс кнопки проверю на ошибки. Думаю, что немного позже добавлю еще классов для работы с пользовательским интерфейсом, включая полноценные CheckBox`ы.
@Владимир, такие вещи как обработка изменения положения объектов при изменении размеров окна — обычно остаются за разработчиками, так как именно им лучше всего известно как правильно объекты должны реагировать на изменения.
Чтобы правильно реагировать на изменения окна, следует задавать положение по X и Y в процентах от центра игрового окна, либо от краев экрана. Таким образом зная положение объекта в процентах, при получении нового размера окна вы можете вычислить новое положение объекта в пикселях исходя из размеров нового окна. Как-то так в общем :)
Чтобы перехватить событие изменения сцены, согласно справке по AS3, следует подписаться на событие Event.RESIZE для stage. Только убедитесь в том, что для stage не установлена опция:
stage.scaleMode = StageScaleMode.NO_SCALE;
Если вы используете Anthill, то удалите либо закомментируйте строку 43 в AntPreloader.as
@NightmareZ ^___^, в данный момент никаких эффектов для переходов между состояниями не предусмотрено, к сожалению.
Спасибо, надо будет поэкспериментировать)
Ещё вопрос возник, изучаю встроенные возможности движения, и что-то не понимаю.
через velocity.set(); я задаю скорость и направление, через drag и acceleration могу менять эту скорость со временем, но указать скорость я могу, а вот изменения не работают, что я делаю не так?
Понял, слишком малыми цифрами оперировал, пытался проверить воздействие добавляя по единичке)
#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
и все круто
Отлично ! Замеряли производительность на ios ? Можно добавить поддержку stage3d и будет scaleform - я бы за такой движок 150$ заплатил бы
@Константин, данный движок не пойдет для iOS и вообще для мобильных платформ. У мобильных платформ все более менее впорядке с аппаратным ускорением, а Anthill работает на софтваре. Так что он никак не годится для мобильников. Вообще на мобилках Flash себя чувствует очень слабо, поэтому используйте лучше нативные движки или что-то мульти-платформенное, что отлично работает с аппаратным ускорением. Anthill категорически не рекомендую в качестве движка для мобильных игр.
Аппаратная поддержка в Anthill пока не планируется :) Разработка игр для меня приорететнее чем развитие фреймворка. Фреймворк развивается только по ходу разработки игр на нем.
#Ant.Karlov
У Мука написано что для слежения за Event.RESIZE наоборот нужно чтобы обязательно было включено
stage.scaleMode = StageScaleMode.NO_SCALE;
что-то я запутался...
Не знаю баг ли это
когда создаешь сущность, которая
имеет родители не в координатах 0,0
то ставя
ant.x = XX ant.y = YY
он их не учитывает
только, если делать
ant.reset(XX,YY)
может так и задуманно?
Антон поясни разницу между методами в 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;
}
@Владимир,
> У Мука написано что для слежения за Event.RESIZE наоборот нужно чтобы обязательно было включено
stage.scaleMode = StageScaleMode.NO_SCALE;
что-то я запутался...
Просто нужно проверить. Сейчас точно не скажу, но по моему при NO_SCALE изменяется рабочая область stage, но содержимое не меняет размеры и сохраняет положение относительно левого верхнего угла.
@king, ваш комментарий немного не внятный, поэтому я не понял при каких условиях не учитывается смещение, если будет возможность то поясните пожалуйста.
Но предположу, что скорее всего проблема вызвана кэшированием положения родительской сущности и смещение для вложенных объектов в том числе и для нового не пересчитываются до тех пор, пока вы не сдвинете или не «сбросите» родительскую сущность. Проверю это, и если это действительно так, обязательно поправлю.
Спасибо!
@ani526, бывает. clone() появился первым и должен был быть удален, так как copyTo() созвучен с copyFrom(). Забыл убрать повторяющийся метод после того как убрал его использование из кода.
буду использовать и по возможности улудшать твой фреймворк
Да, именно)
я сам не мог долго понять почему так происходит
ситуация такая создал актера на смещенном родителе на состоянии "Меню", и было все замечательно!
далее перешел на другоее состояние - "?гра", по возвращению
в это же состояние - "Меню"
уже было все сдвинуто не правильно!
и долго не мог понять почему, ведь я создаю новое состояние...
Видимо, действительно гдето кешекиркюется позиция! !
Антон, подскажи как ты делаешь различные состояния героя(стоит, движется, стреляет и т.п.) Просто я привык делать один клип с соответствующими состояниями(причем со вложенными клипами, в кадрах которых так же могут быть определенные состояния) так вот как все это перевести в набор AntAnimation с именами соответствующим меткам кадра мувиклипа?
насколько я успел разобраться нужно сделать отдельные мувиклипы всех состояний, кешировать их и запускать тот который тебе необходим. Пример:
_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);
Привет, Антон.
Почему-то при вращении сущности, если она одновременно является и потомком и предком, ей устанавливается только угол. А позиция остается старой.
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, вы имеете в виду, что сущности с вложениями не вращаются если они вложены в другие сущности?
Проверю этот момент.
Anthill обновлен до версии 0.1.2 — исправлены недочеты и внесены улучшения. Узнать об изменениях более подробно можно на github.
@Ant.Karlov
Вращаются. Принимают угол предка. Но остаются на месте, а позиция обновляется только у того потомка, который не группа :)
http://megaswf.com/file/2514784
Жёлтое потомок красного, красное потомок синего.
Кстати в новой версии (0.1.2), как я понял, если в группе есть потомки, то метод reset() для следующих добавляемых потомков нужно ставить в относительных координатах. А первый по-прежнему добавляется по абсолютным.
:)
@Ant.Karlov
Да, я про вложенные сущности.
Только почему-то называю их предками с потомками.
@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 и я взял его за основу. Очень простой и удобный. Спасибо, Антон!
Антон привет,
когда же будет физика?
nape или box2d? )
@Андрей, толком не понял зачем нам ещё по две переменных на сущность :)
Я думаю, что решение проблемы с вложенными сущностями довольно простое на первый взгляд, правда сильно я его не тестировал.
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
....
А да, управление стрелками.
Номера - иерархия вложенности, 1 - корень.
@fred, да, сама проблема вращения решается легко.
Основная причина, почему я ввел дополнительные переменные - это сохранение локальных координат.
Если вложить сущность с координатами (0, 0) в корневую сущность, затем повернуть/сдвинуть корневую, то вложенная сущность уже не будет иметь координаты (0, 0), а хотелось бы. Это упрощает управление внутренней сущностью.
Напр., внутренняя сущность постоянно двигается влево-вправо (x++, x--). Затем поворачиваем корневую сущность. Чтобы продолжить двигать внутреннюю сущность, простым x++ не обойдешься.
Это касается и масштабирования вложенных сущностей. Но, у себя я это тоже не делал - пока не надо.
Но если игру не усложнять такими объектами, то, конечно, без этого можно обойтись.
Если 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);
Здравствуйте Антон, у меня к вам маленький вопрос.
Как я понимаю, свойство axis в AntEntity задает точку, вокруг которой, будет вращаться сущность.
Задаю точку:
ent.axis = new AntPoint(100, 100);
? потом вращаю:
ent. angle += 10;
Но сущность вращается по прежнему вокруг левого верхнего угла, что как я понимаю соответствует точке (0; 0). Что я делаю не так, или что я не так понял? Версия фреймверка 0.2.0, но и в предыдущей версии тоже не получалось. Заранее благодарен.
@Sanchez, там с осями немного непросто все пока получилось. Сейчас деталей и причин точно уже не помню, но axis.x/y не используется в расчетах оси — эти координаты используются в потомках для хранения смещения кадров относительно центра. (Думаю переменную надо переименовать чтобы не вводила в заблуждение :))
Сейчас в Anthill работа с осями идентична тому как это работает в MovieClip или Sprite — вы не можете задать ось вращения так как она всегда считается нулевой точкой. Но чтобы получить нужный вам эффект вы можете сдвигать вложенные объекты (содержимое) относительно нулевой точки и таким образом вы получите «эффект смещения оси».
@king, извиняюсь что сразу не ответил на ваш комментарий. В версии Anthill 0.2 (и выше) проблемы с выравниванием текстов исправлены.
Антон, спасибо за ответ!
Добрый день!
@Ant.Karlov
Наверное это вопрос тебе уже поднадоел, но народ жаждет надстройку над Box2D/Nape :) Она будет в ближайшее время, или сейчас вообще не до неё? :)
@Alex R., я сейчас немного в авральном режиме, даже блог вот опять немного забросил.
Надстройка Box2D будет где-нибудь ближе к концу февраля как отдельный плагин — отрефакторю старую свою работу и выложу. А про Nape пока ничего не могу сказать, совсем не до него пока. В феврале планирую очередное обновление Anthill — появятся новые возможности.
Привет, Антон.
Не мог ты объяснить или какой-нибудь туториал написать, как реализовать игровое меню и плавные анимационные переходы из одного меню в другое при помощи фреймворка.
Спасибо.
@Виталий, сейчас готовлю мини туториалы — статьи по Anthill для Вики которые станут доступны вместе с Anthill Alpha 0.3.0, там будут объяснены все эти базовые возможности. Так же в новой версии появится простой твиннер который упростит создание простых анимаций и переходов между меню.
Но в кратце скажу: идеология такова, что все игровые меню должны находится в одном состоянии (AntState) и унаследованы от AntEntity — только так можно будет создавать красивые переходы между окнами. Далее в AntEntity складываем актеры с бэками, текстовые метки и кнопки — вот и получается игровое меню. Сейчас вопрос анимации появления и исчезновения меню ложится на ваши плечи, а в ближайшем обновлении будут новые инструменты которые упростят эти задачи :)
@Ant.Karlov, было бы здорово видеть мини-туториалы или описание, например, различного рода полезных игровых практик как: так называемый Backdrop, мини карта с отображением миниатюры мира с игроком в риал-тайм, загрузку достаточно больших уровней. Как-то так (раскатал губу) :)
Здравствуй труженик ?нди!
Антон, не мог бы ты рассказать про AntLabel, какие шрифты можно использовать, как их добавлять - растровые или векторные, типы, методы класса. Просто это очень востребованная часть игр. Заранее спасибо!
@Alex R., да, я думал о таких тотуриалах, но все больше в рамках серии уроков, например по тому же TowerDefence. Возможно имеет смысл сделать серию таких мини статей и в блоге — подумаю об этом.
По поводу миникарты я вам и так могу сказать в двух словах: миникарта делается достаточно просто. Берете позицию каждого юнита и высчитываете её в процентном соотношении с размерами уровня. Например уровень у вас 1000 пикселей по ширине и высоте, а юнит находится в 100 пикселях — значит юнит находится в 10% уровня по ширине. Далее, предположим что мини карта у вас 100 на 100 пикселей, при этом мы знаем что юнит находится в позиции по x = 10%, а 10% от 100 — это 10 пикселей на миникарте, таким образом зная позицию юнита на основной карте, мы можем через проценты узнать позицию на мини карте. Аналогично делается и для вычисления координат по высоте. Данный способ хорошо работает независимо от размеров и пропорций карт.
Как рисовать карту — это уже зависит от частного случая, можно заранее нарисовать фигурки юнитов для миникарты, а можно ручками рисовать пиксели — это уже как больше нравится. Миникарту обновляем раз в 2-5 кадров и при обновлении перебираем все объекты на основной карте которые должны быть видимы на миникарте и пересчитываем их положение на миникарте.
Что подразумевается под загрузкой очень больших уровней — я не очень понял.
@Vacsa, AntLabel — это обертка для TextField. Суть AntLabel заключается в том, что когда туда передается какой-то текст, то он тут же растеризируется в битмапу и на экран выводится уже пикселями — этот подход не только оптимизирует работу рендера и позволяет работать с текстами как с актерами, но и дает дополнительные плюшки: возможность скэйлить и вращать тексты. А так возможности у AntLabel такие же как и у TextField. Шрифты для AntLabel используются так же как и для TextField.
В будущем планирую добавить поддержку битмаповых шрифтов — это когда текст формируется из картинок с буквами.
@Ant.Karlov под загрузкой больших уровней я имел ввиду, что ты где-то в блоге уже писал про то как ты подгружал уровень графика которого не влазила в холст флэша и ты разбивал его на несколько частей и потом подгружал. Было бы здорово выделить такие советы и много чего интересного в комментариях пишется, с той же миникартой вот в комменте. А так бы человек зашел на страничку твоего фрэймворка а там еще и faq по игровым фичам.
Здравствуй Антон!
Спасибо за ответ. У меня возник еще небольшой вопрос?
В твоём движке используется обертка для стандартных классов мыши, клавиатуры и других.
А есть ли у тебя оптимизации для класса Timer, а если нет то какие бы ты дал советы по улучшению его работы?
@Alex R., вот по этой ссылке можно скачать примеры для Anthill, там есть пример загрузки больших карт из разных клипов, все с достаточно подробными комментариями.
А что до фака по отдельным вопросам, то это конечно можно сделать, причем прямо в Wiki Anthill — я не против, главное чтобы времени на все хватало. Впрочем все желающие могут принимать в этом участие.
@vacsa, а что нужно оптимизировать в работе Timer? :) В состав Anthill входит AntTaskManager — в нем можно задавать цепочки задач с различными интервалами которые будут выполняться по кругу или по порядку и т.п. — это то что нужно?
Ant.Karlov, для различного рода игровых меню (например MenuState, RatingState), где по сути бэкграунд клип и камера статичны, оптимальным решением будет:
1. Добавить растровый бэкграунд в мувиклип и экспортировать его в swc.
2. В самом MenuState (например) сделать
AntG.cache.addClips([BackgroundMenu_mc]);
и после кэширования уже добавить через add()
_background = new AntActor();
_background.addAnimationFromCache("BackgroundMenu_mc");
add(_background);
?ли для таких статичных фонов в игровых меню есть какое-то другое решение (возможно проще добавить через addChild() ? )
? еще вопрос, для AntButton есть возможность наподобие useHandCursor (buttonMode)? Т.е. чтобы автоматически отображался при наведении дефолтный курсор руки?
? так же получается, что нельзя применить фильтры (GlowFilter) с того же TweenLite к AntButton.
@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 и для вложенных в нее объектов.
>> А вот использовать классический способ добавления фонов для AntState к сожалению невозможен, так как холст камеры куда рендерится весь контент, не может быть прозрачным.
Ну т.е. если я хочу сделать окна меню и рейтинга, где используются кастомные контролы и эффекты (например TweenLite), мне нужно будет целиком на этом AntState использовать возможности чистого AS3 через addChild без функционала движка (AntButton, AntLabel и тп). Так я делал на flashpunk (различного рода меню, и тп, сделаны через Sprite, а игра через игровой движок)
Сейчас попробовал, бэкграунд добавил через AntActor а поверх него кнопки через addChild(), вроде бы все работает.
P.S. feature request - Level Manager (В Citrus Engine вроде неплохой). Понятно уж что и ручками его не сложно сделать самому, просто написал :)
Немного оффтоп, никто не пробовал?
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, да, в AntState можно добавлять обычные клипы, спрайты и кнопки, и работать с ними как обычно — это никак не отражается на работе Anthill.
> feature request - Level Manager (В Citrus Engine вроде неплохой)
Посмотрю. Спасибо!
@broken, Flump годится только для игр использующих аппаратное ускорение. А так то в флеше все так и работает (если вы не растеризируете анимации). Такой подход без аппаратного ускорения создает дополнительную нагрузку на процессор.
Ant. Karlov не знаю, какого рода ты планировал надстройку сделать над Box2D, но может быть сможешь что-то интересное увидеть в Level Editor для Citrus Engine. Там тоже делается левел с расстановками объектов в CS, а потом это всё конвертится в физические объекты.
Здравствуйте Антон!
Скажите пожалуйста, в Вашем движке возможно ли применять масштабирование через камеру для кэшированой тайловой карты? Например, когда грузовик подпрыгивает на холмах вся карта отдалялась, а когда он падает на землю маштаб возвращался 1:1 ?
С Уважением.
Добрый день, спасибо за фреймворк!
Вопрос: есть ли встроенный в фреймворк способ определять столкновения объектов/наведение мыши на кешированные растеризованные объекты?
Простой getHitTestPoint даже при третьем параметре true работает по прямоугольнику вокруг кешированного объекта, а если смотреть цвет пикселя под курсором - это бьет по производительности.
@Вача, если ваши объекты можно представить в форме круга, то проще высчитать сумму их радиусов и сравнить с расстоянием между центрами. Если расстояние меньше суммы радиусов, то объекты столкнулись.
Для прямоугольных объектов тоже можно рассчитать с помощью угла, ширины и высоты.
@Ant. Karlov, просьба создать новый топик с выходом новой версии фрэймворка :)
@broken, сейчас готовлю вступительные мануалы для новой версии на вики, после того как большая их часть будет готова, обязательно отдельно напишу об этом в блоге еще :)
Я тут искал, как передвигать камеру при отрисовке дебага 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 и располагаю выше спрайта с игрой =)
Надеюсь вам это поможет чем нибудь ;)
Антон что-нибудь слышно про надстройку Box2D? С нетерпением жду, когда смогу попробовать ее в действии.
@Владимир, слышно! В начале марта планирую опубликовать надстройку для Box2D в виде отдельного плагина для Anthill.
@pSi_X, я пока не писал еще надстройку для Nape, поэтому не пытался реализовывать смещение дебажной отрисовки относительно положения камеры. Поэтому вдвойне благодарен за предоставленную вами информацию — пригодится! :)
Перекрыть методы отрисовки в Nape будет весьма проблематично, там много специфичных объектов отрисовываются (пружины, спирали и т.п.), поэтому писать свой рендер дебаг отрисовки не рационально, т.к. его прийдется еще и поддерживать и при обновлении Nape (а это происходит намного чаще чем у Box2D), поэтому я от этой идеи отказался совсем :)
@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 и думаю вы увидите схожесть с вашими наработками ;)
Если что, обращайтесь, помогу чем смогу ;)
Антон, когда будет надстройка Box2D?
Привет, Антон. Не мог бы сказать, когда планируешь выпустить надстройку для Box2D? Просто ты говорил, что в начале марта выпустишь, а уже апрель на носу. Не обязательно документацию писать, хотя бы посмотреть как эта надстройка выглядит. Спасибо.
Антон пропал :)
@Владимир, зима затянулась, детишки болеют, да и работы много. Хотел написать небольшой пост с новостями о том, что у меня происходит и как я ничего не успеваю. Но потом момент отчаяния прошел и решил ничего не писать :) Надеюсь в ближайшее время чуть разгружусь и вернусь к блогу.
Про надстройку ничего пока сказать не могу. Слишком много я всего на себя взвалил и, к сожалению, все обещания держать не получается, поэтому такие вещи как надстройка Box2D и развитие Anthill идут весьма заторможенными темпами по ходу разработки своих проектов. Поэтому пока у меня со временем полный трэш — не буду ничего обещать повторно (примерные сроки и планы). ?звините :)
Добрый день Антон.Не могу запустить ваш Framework с FLASH IDE:( Вот такие ошибки -
http://www.saveimg.ru/pictures/13-04-13/44176e0348e12e80abd0181fde2eb0a0.PNG
Не могли бы вы более подробно описать процесс запуска?Я вроде все делаю правильно .Указываю ,где находяться файлы swc в папке bin.Не могу только понять - Что за flex.swc.?звиняюсь,пока туповат я с этим.Спасибо
@silvvver, судя по ошибкам, вы скачали только примеры, а сам Anthill не скачали. Чтобы все заработало, необходимо скачать Anthill и положить его классы к исходникам примеров. В состав примеров не входит сам фреймворк, так как он обновляется чаще чем примеры :)
Flex.swc должен автоматически прописаться и подключится, но если возникнут какие-либо проблемы с ним здесь можно почитать подробно о настройке.
не могу понять как работает отображение(
я пишу:
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, без более полного кода я не смогу подсказать почему у вас ничего не отображается на экране. Могу лишь предположить что растеризированный клип (если это так), скрывающийся под именем `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. А в случае вопросов или проблем, можете писать мне на почту.
да действительно круто и просто)
вводный курс очень много раз прочел и мало что понял.
а не отображалось потому что если при создании отправить null в aInitialState, то отрисовка не запускается, и потом после смены state необходимо вызвать anthill.start();
спасибо большое)
@flac, вики достаточно молодая поэтому статьи пока не охватывают всех тонкостей.
Хорошо, что вы сообщили о том где у вас возникла проблема и как вы её решили. Я добавил пояснение по этому поводу в Вики, а в следующей версии сделаю чтобы при добавлении состояния, Anthill автоматически стартовал если еще не запущен.
Если у вас возникнут еще какие-либо вопросы по Антхилл или замечания по поводу наполнения Вики — буду рад вашим комментариям, т.к. активность пользователей — это, пожалуй, единственный способ сделать лучше как сам фреймворк так и документацию к нему :)
Наконец-то. Я долго ждал))) Как найдется время - обязательно протестирую и попробую твою библиотеку в новых проектах.
12 Сентября 2012
— 22:59
#