+ Ответить в теме
Показано с 1 по 12 из 12
  1. #1

    [Release] PHP Game Engine

    2 дня назад я начал писать PHP Game Engine ( PGE )
    Маленький и простой движок для создания игр в DS.
    Сразу написал маленький пример по использованию.

    Изменения 0.2
    [ Fixed ] Wall Stack
    [ Added ] Direction->xCurrent, Direction->xPrev

    Скачать:
    PGEngine v0.2 - Движок
    PGE_Demo - Демонстрация движка
    PGE_Source - Демонстрация движка (Исходники)














    Как создать игру?
    Требования php_gd2.dll (для нарезки спрайтов)


    1. Нужно создать сцену
    Нам нужна любая форма или компонент в котором мы будет выводить сцену
    Создаем например форму:
    PHP код:
    Global $Form# Сделаем форму глобальной
    $Form = New TForm# Создаем форму
    $Form->640# Ширина
    $Form->480# Высота
    $Form->show(); # Покажем форму 
    Теперь можно создать сцену
    PHP код:
    Global $Scene# Сделаем сцену глобальной
    $Scene = New PGE_Scene$Form ); # Создаем сцену 
    Теперь можно загрузить текстуры
    Нам нужна текстура игрока, пола, и стен

    Закинем их в sprites/ папку с игрой

    Немного раскажу о классе PGE_Sprite
    PGE_Sprite( $SpritePath, $Scene, $Tile, $TileCrop, $TileW, $TileH, $Transparant, $TX, $TY, $StartTileY, $StartTileX )

    $SpritePath = Путь к спрайту в папке sprites/
    $Scene = Сцена (False)
    $Tile = Мозайка (False)
    $TileCrop = Нарезать тайл-сеты на тайлы (False)
    $TileW = Ширина тайла (32)
    $TileH = Высота тайла (48)
    $Transparant = Прозрачность по первому пикселю иначе будет сохранять альфа прозрачность (False)
    $TX = Количество тайлов по ширине (Auto)
    $TY = Количество тайлов по высоте (Auto)
    $StartTileY = Стартовый id тайла по высоте (0)
    $StartTileX = Стартовый id тайла по ширине (0)


    Загрузим их, настроим, и поставим на сцену:
    PHP код:
    /** Создаем пол */

    # Загрузим текстуру и покажем на сцене $Scene
    $Floor = New PGE_Sprite"floor.png"$SceneTrue ); 
    $Floor->Handle->$Scene->Width;
    $Floor->Handle->$Scene->Height;

    /** Создаем стены вокруг сцены */

    # Загружаем тестуру и создаем спрайт
    $Wall = New PGE_Sprite"wall.png"$SceneTrue ); 
    # Меняем ширину стенки
    $Wall->Handle->32
    # Меняем высоту стенки
    $Wall->Handle->$Scene->Height+32
    # Объект сталкивается с другими Solid-объектами
    $Wall->Solid True

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Width+32;
    $Wall->Handle->32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Height-32;
    $Wall->Handle->$Scene->Width+32;
    $Wall->Handle->32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Width-32;
    $Wall->Handle->$Scene->Height+32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->= ($Scene->Width/2)-($Wall->Handle->Width/2)-(32*2);
    $Wall->Handle->= ($Scene->Height/2)-($Wall->Handle->Height/2)-(32*2);
    $Wall->Handle->autoSize True;
    $Wall->Solid True;

    /** Создаем игрока */

    # Сделаем игрока глобальным
    Global $Player;

    # Загружаем тестуру и создаем спрайт
    $Player = New PGE_Sprite"player.png"$SceneFalseTrue3248False );
    # Центрируем ширину
    $Player->Handle->= ($Scene->Width/2)-($Player->Handle->Width/2); 
     
    # Центрируем высоту
    $Player->Handle->= ($Scene->Height/2)-($Player->Handle->Height/2);
    # Объект сталкивается с другими Solid-объектами
    $Player->Solid True
    Теперь нам нужно настроить поведение игрока
    Пока в движке есть 1 стандартное поведение (8 direction movement)

    Создаем функцию KeyHandle и unKeyHandle
    с параметрами $obj, $key
    и подключим функцию в событие "Нажатие кнопки" в ссылке на форму (в главный код игры)
    PHP код:
    Function KeyHandle$obj$key )
    {
      Global 
    $Player;
      IF( 
    $key == VK_UP )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_UPTrue );
      ELSE IF( 
    $key == VK_DOWN )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_DOWNTrue );
      ELSE IF( 
    $key == VK_LEFT )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_LEFTTrue );
      ELSE IF( 
    $key == VK_RIGHT )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_RIGHTTrue );
    }

    Function 
    unKeyHandle$obj$key )
    {
      Global 
    $Player;
      
    $Player->Behavior_edMove_Stop();
    }

    $Form->onKeyDown "KeyHandle";
    $Form->onKeyUp "unKeyHandle"
    Игра готова!
    покажем сцену

    PHP код:
    Global $Scene;
    $Scene->show(); 
    Полный код игры:
    PHP код:
    Global $Scene$Player$Form;
    $Form = New TForm;
    $Form->640;
    $Form->480;
    $Form->show();

    $Scene = New PGE_Scene$Form );

    $Floor = New PGE_Sprite"floor.png"$SceneTrue );
    $Floor->Handle->$Scene->Width;
    $Floor->Handle->$Scene->Height;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Height+32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Width+32;
    $Wall->Handle->32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Height-32;
    $Wall->Handle->$Scene->Width+32;
    $Wall->Handle->32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->32;
    $Wall->Handle->$Scene->Width-32;
    $Wall->Handle->$Scene->Height+32;
    $Wall->Solid True;

    $Wall = New PGE_Sprite"wall.png"$SceneTrue );
    $Wall->Handle->= ($Scene->Width/2)-($Wall->Handle->Width/2)-(32*2);
    $Wall->Handle->= ($Scene->Height/2)-($Wall->Handle->Height/2)-(32*2);
    $Wall->Handle->autoSize True;
    $Wall->Solid True;

    $Player = New PGE_Sprite"player.png"$SceneFalseTrue3248False );
    $Player->Handle->= ($Scene->Width/2)-($Player->Handle->Width/2);
    $Player->Handle->= ($Scene->Height/2)-($Player->Handle->Height/2);
    $Player->Solid True;

    Function 
    KeyHandle$obj$key )
    {
      Global 
    $Player;
      IF( 
    $key == VK_UP )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_UPTrue );
      ELSE IF( 
    $key == VK_DOWN )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_DOWNTrue );
      ELSE IF( 
    $key == VK_LEFT )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_LEFTTrue );
      ELSE IF( 
    $key == VK_RIGHT )
        
    $Player->Behavior_edMove_UpdatePGE_DIRECTION_RIGHTTrue );
    }

    Function 
    unKeyHandle$obj$key )
    {
      Global 
    $Player;
      
    $Player->Behavior_edMove_Stop();
    }

    $Form->onKeyDown "KeyHandle";
    $Form->onKeyUp "unKeyHandle";

    Global 
    $Scene;
    $Scene->show(); 

  2. 12 пользователя(ей) сказали cпасибо:

    133557 (26.04.2011), Acid-UA (26.04.2011), EINSHTEIN (26.04.2011), file_put_contents (28.04.2011), flocker (26.04.2011), ily2811 (03.05.2011), Inlife (29.04.2011), kazer_xxx (26.04.2011), Kiro (28.04.2011), noRoman (27.04.2011), Ruslord1 (28.04.2011), YkRoP (03.05.2011)

  3. #2
    Опытный Аватар для pilip
    Регистрация
    14.12.2010
    Адрес
    Центр Сибири
    Сообщений
    370
    Попробовал маленько, молоток, только есть пару глюков, при встречи со стеной, иногда прилипает к ней, повертевшись отлипает. И еще есть небольшая задержка при смене направления

  4. #3
    Цитата Сообщение от pilip
    при встречи со стеной, иногда прилипает к ней, повертевшись отлипает
    ну тут нужно играться с оффсетами
    PHP код:
    $Sprite->Moving->Offset->cX 0;
    $Sprite->Moving->Offset->cY 0;
    $Sprite->Moving->Offset->cA 0;
    $Sprite->Moving->Offset->dY 0;
    $Sprite->Moving->Offset->dX 0;
    $Sprite->Moving->Offset->dA 0
    у меня вроде не залипает с оффсетами:
    PHP код:
    $Sprite->Moving->Offset->dY 1;
    $Sprite->Moving->Offset->dX 1
    вроде не залипает, вот только 1 минус: его откидывает на 1 пиксель
    т.е. спрайт прыгает в противоположную сторону от направления
    Цитата Сообщение от pilip
    И еще есть небольшая задержка при смене направления
    PHP код:
    $Sprite->Animation->Speed 900# 0-1000 (чем больше тем быстрее реагирует) 

  5. #4
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148
    Времени пробовать нет, но всё равно круто) Потом проверю)
    Как хочу быть красненьким и с надписью "Админ"

  6. #5
    Очень неплохо учитывая то что написано за 2 дня!

  7. #6
    Забанненый
    Регистрация
    09.02.2011
    Адрес
    vkontakte.ru
    Сообщений
    155
    Денфер красавец!

  8. Пользователь сказал cпасибо:

    file_put_contents (29.04.2011)

  9. #7
    Модератор Аватар для ily2811
    Регистрация
    11.04.2010
    Адрес
    Новороссийск
    Сообщений
    438
    Гром меня разрази! Гениально!) Денфер не перестаёт удивлятьне только меня, как я думаю)
    Надо будет Нобелевскую дать)

    что скажешь) крут крут)
    :/
    Код:
    #!/bin/bash
    Tr="Hello World!"
    echo $Tr

  10. #8
    Опытный
    Регистрация
    06.03.2011
    Сообщений
    240
    Перезайлете пожалуйста "Движок".

  11. #9
    Пользователь Аватар для devillom
    Регистрация
    24.02.2011
    Адрес
    Казахстан
    Сообщений
    197
    denfer
    молодца огромный респект
    Мой блог - www.donsoft.gb7.ru

  12. #10
    Опытный Аватар для max95
    Регистрация
    02.11.2010
    Адрес
    Алтайский край.г.Рубцовск
    Сообщений
    323
    Перезалейте
    Не бывает разницы в возрасте, бывает разница в уме.
    Сервер и клиент на сокетах http://community.develstudio.ru/show...B0%D0%BD/page2

    Здесь могла бы быть ваша реклама--->>>>.....<<<<---Но её не будет.

  13. #11
    Да кстати, перезалейте пожалуйста!
    Мой сайт: www.SnAkE.uCoz.ua
    Форум: www.SnAkE.Gip-Gip.Ru

  14. #12
    Мастер Аватар для forumrulez
    Регистрация
    16.10.2010
    Адрес
    Киев
    Сообщений
    1,058
    Перезалейте

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения