суббота, 18 июня 2011 г.

UAFPUG#26 в Донецке - "Flash для игроделов"

Привет всем флешелюбам и любителям флеша!
26 Матра 2011 года в Донецке состаялся UAFPUG#26, основная тема для докладов была "Flash для игроделов" (eсли кто не знает, то UAFPUG расшифровывается как Ukrainian Adobe Flash Platform User Group). И я там был, мёд пиво пил!) Ну а если серьёзно, то из этой встечи я вынес для себя много нужно и полезного! Я тоже выступал там с докладом, доклад был на тему: 
"Основные этапы создания rpg игры"
1. Передвижение ГГ по сцене
2. Определение столкновения ГГ с препятствиями
3. Отталкивание от стен
4. Создание врагов
5. Создание мини-карты
6. Чего можно добиться А вот и сама презентация: P.S: ПРЕЗЕНТАЦИЯ РАСЧИТАНА НА ТО, ЧТО ВЫ ИМЕЕТЕ ХОТЯ-БЫ ОБЩЕЕ ПРЕДСТАВЛЕНИЕ О ACTIONSCRIPT 3.0!!
Основные этапы.
Слайд 1 На этом слайде показаны этапы по которым которым будет презентация.
 Выбор уравления и его программирование.
Слайд 2, 3, 4, 5, 6. Управление является немаловажным аспектом любой игры, я решил остановиться на передвижение на WASD и повороте на AD. На пятом слайде написан код для передвижения персонажа на примере двух кнопок W и D. (P.S: код можно прокручивать колёсиком мышки).
Проверка столкновения персонажа с препятствиями.
Слайд 7,8,9. Первое, что нужно сделать, это добавить вспомогательные маркеры (как это делается показано на слайде 8). На слайде № 9 написан код для проверки столкновения ГГ с препятствиями.
Отталкивание персонажа от препятствий.
Слайд 10, 11, 12. Теперь в код проверки столкновение ГГ с препятствиями добавляем код для отталкивания персонажа от препятствий. Код проверки столкновений вместе с кодом отталкивания будет выглядеть так:
for (var i:Number=1; i<17; i++)
{
 if ((stena.hitTestPoint(hero["p"+i].x+hero.x,hero["p"+i].y+hero.y,true)))
 {
 var ugol = Math.atan2(hero["p" + i].y,hero["p" + i].x);
 for (var i2:Number=1; i2<30; i2++)
 {
 hero.x -=  0.3 * Math.cos(ugol);
 hero.y -=  0.3 * Math.sin(ugol);
 if ((stena.hitTestPoint(hero["p"+i].x+hero.x,hero["p"+i].y+hero.y,true)==false))
 {
 i2 = 31;
 }
 }
 }
}
Создаём врагов.
Слайд 13, 14, 15, 16, 17, 18. На слайде 14 видно, как нужно оформлять врагов. На слайде 15 представлен код для размещения врагов на сцене случайным образом. На слайде 17 показано, как заставить врага перемещатся вслед за персонажем.
Создание мини-карты.
Слайд 19, 20, 21. На слайде 20 предоставлен код, который я подобрал старым, добрым методом профессора Тыка, и который подходит только под радиус моей мини-карты, но на днях обязуюсь исправить код длямини-карты любого рамера :)
Чего можно добиться.
Слайд 22, 23. Немного посидев и пошаманив, можно добиться такого результата как на слайде 22.
Управление:                   
                  Передвижение: WASD                   
                  Удар (выстрел магией): щелчек мышкой.           
                  Переключение оружия (магии): 1 2 3 4.
                  Переход на следующую локацию:  Подойти к краю локации и нажать пробел.

Вот и презентации конец, а кто слушал - Молодец!)
P.S.S.: Если вам кажется, что вы уже где-то ведели эту презентацию, то не спешите кричать на меня, мол я вор :). Это моя презентация, просто решил закинуть её еще и на блог.
                                                                                                  Рабочий исходник.

27 комментариев:

  1. помойму классно и понятно сделано, я еще плохо ориентируюсь во флэш, еле освоил хит-тест для отталкивания от стены с четырех сторон. Да и сижу пока во флэш 8, но впринципе я понял как можно перевести на ас2, тут ничего трудного. Кстати а по какому принципу мини карта, я понял что там идет деление чтобы уменьшить героя и т.п, но просто интересно почему именно 15-18? как это зависит от размера комнаты?

    ОтветитьУдалить
  2. ща буду пробовать такую штуку как миникарта из презентации. Мне пока столкновения такого уровня не требуются. А массив противников я вроде освоил раньше из книги.

    ОтветитьУдалить
  3. А у вас будет как создать камеру следующую за персонажем?

    ОтветитьУдалить
  4. Здавствуйте, Виталий. Насчет мини-карты скажу так, она делалась на скорую руку, и если честно "методом тыка".В скором времени переделаю код, что бы работало на любых экранах (сейчас по идее будет правильно работать только на 550*400).
    Камеру следящую за персонажем можно сделать разными способами:
    1). Прокрутка заднего фона вместо персонажа (по моему самый адекватный вариант).
    2). Написать код "камеры". Это мувик который будет имитировать камеру, и привязать его по координатам к персонажу. (Если будет нужно, пишите, объясню подробно как это сделать).

    ОтветитьУдалить
    Ответы
    1. Smitg9 как с вами связаться? Мой ящик dim_ok_23@mail.ru

      Удалить
  5. Спасибо за презентацию...все очень круто!!! .Один вопрос, почему у меня не происходит столкновения? у меня герой проходит под препятствием(( как сделать?

    ОтветитьУдалить
  6. скинуть свой исходник, я гляну.

    ОтветитьУдалить
  7. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  8. Строго, не судите...я ещё новичек в этом....))

    ОтветитьУдалить
  9. Не заметил, в коде есть ошибки...при объявление экземпляра..Stena..там по идеи везде..переменная stena...но и исправлиными ошибками так же нет столкновения..

    ОтветитьУдалить
    Ответы
    1. прошу прощения за долгое молчание (не было интернета) Вот рабочий исходник с картой и врагами: http://portofolo-downl.ucoz.ru/files/UAFPUG06.zip
      P/S: Ссылка прикреплена к теме.

      Удалить
  10. У меня CS4 и он не открывает исходник((((

    ОтветитьУдалить
  11. А как сделать чтобы враги толкали ГГ как в 18 слайде?

    ОтветитьУдалить
    Ответы
    1. засунуть их в мувик с землёй, и передвигать)

      Удалить
  12. Ссылка а исходник битая, дайте рабочую пожалуйста

    ОтветитьУдалить
  13. Простите за вопрос не в тему,мне нужна помощ по коду,неодин час ломаю голову над своим кодом.Что в нем неверно?

    var hp1:int=50;
    text1.text=hp1;
    var hp2:int=50;
    в нужных мне кадрах я прописал:
    hp2-=5+Math.random()*5;
    text2.text=hp2;

    мне выдает ошибку "Неявное приведение значения типа int к несоответствующему типу String."

    ОтветитьУдалить
    Ответы
    1. Попробуй так:
      var hp1=50;
      text1.text=hp1;
      var hp2=50;

      hp2-=5+Math.random()*5;
      text2.text=hp2;

      Удалить
  14. Мне нужно чтобы оно считало целыми числами,int убирать нельзя.

    ОтветитьУдалить
  15. я решил задачу сам:
    var hp1=50;
    var hp2=50;
    text1.text=hp1;
    text2.text=hp2;
    и в некоторых кадрах:
    var i:int=5+Math.random()*5;
    hp2-=i;
    text2.text=hp2;

    ОтветитьУдалить
  16. а где прогу эту скачать можно?

    ОтветитьУдалить
  17. А как сделать задержку между выстрелами?

    ОтветитьУдалить
  18. Почините ссылку на исходник, пожалуйста!

    ОтветитьУдалить
    Ответы
    1. или отправите *.fla файлом на mihaildulcev@mail.ru... это меня многому научит. Тема очень классная, РПГ очень хороший стиль, лично, как мне.

      Удалить
  19. Спасибо за уроки. А не могли бы вы более подробно обяснить код отталкивания от стен

    ОтветитьУдалить
  20. import flash.events.Event;
    import flash.text.engine.EastAsianJustifier;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    var hero_speed=5;
    stage.addEventListener(Event.ENTER_FRAME, gameF);
    function gameF(e:Event):void
    {
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownF);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyUpF);
    function keyDownF(e:KeyboardEvent):void
    {
    if(e.keyCode==Keyboard.D)
    {
    right=1;
    }
    if(e.keyCode==Keyboard.W)
    {
    up=1;
    }
    }
    function keyUpF(e:KeyboardEvent):void
    {
    if(e.keyCode==Keyboard.D)
    {
    right=0;
    }
    if(e.keyCode==Keyboard.W)
    {
    up=0;
    }
    }
    if(right==1)
    {
    hero.rotation+=7;
    }
    if(up==1)
    {
    hero.x=Math.cos(hero.rotation*(Math.PI/180)-90)*hero_speed;
    hero.y=Math.sin(hero.rotation*(Math.PI/180)-90)*hero_speed;
    }
    }

    Ругается на ваш "right" и "up"
    Пишет:"Обращение несуществующего свойства".
    Подскажите как исправить!?

    ОтветитьУдалить