[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Gravity Defied и Java » Модифицирование Gravity Defied » PHP библиотека для работы с MRG
PHP библиотека для работы с MRG
luethusДата: Воскресенье, 05.06.2011, 18:44 | Сообщение # 1
Сообщений: 20
Репутация: 13
Замечания: 0%
Статус: Вне игры
По желаниям трудящихся выпускаю раз и навсегда для всех, кто не осилил (или кому лень) MRG по моей статье, даже несмотря на то, что это - 3.5 человека.

Возможности (вкратце)

- создание mrg
- загрузка mrg
- сохранение mrg
- добавление, удаление, изменение треков
- получение снимка трека (необходима библиотека GD+расширение на PHP)

В состав входят 5 классов: Mrg, Mrg_Level, Mrg_Track, Mrg_Point и Mrg_Error.

Описание методов и свойств

Класс: Mrg

методы:

open($filename[, $load_all = false[, $stop_on_error = false]])
загружает уровни из .mrg файла.
если необязательный параметр $load_all равен true, в память автоматически загружаются все точки всех треков.
если необязательный параметр $stop_on_error равен true, при возникновении замеченной ошибки при чтении (например, отрицательный адрес трека в результате поврежденного файла) метод возвращает объект Mrg_Error, иначе - игнорирует и читает файл дальше.

save($filename)
сохраняет все данные из памяти в mrg файл, при наличии хотя бы по одному треку на каждом уровне сложности.

clean()
удаляет загруженные уровни из памяти

getLevel($level)
возвращает ссылку на объект Mrg_Level с указанным уровнем.
в качестве аргумента $level принимает либо число от 0 до 2 (easy, medium и hard соответственно), либо строку easy, medium или hard в любом регистре.

loadTrack($level, $track)
если при открытии файла (open()) не были загружены точки всех уровней, с помощью этого метода можно загрузить в память один трек.
$level - уровень сложности (строкой или числом)
$track - трек (порядковый номер или название)
возвращает ссылку на объект Mrg_Track с этим треком

свойства:

levels - массив объектов Mrg_Level

[ro]Класс: Mrg_Level

методы:

addTrack(Mrg_Track $track)
добавляет трек в уровень (в конец списка). в качестве единственного аргумента принимает объект Mrg_Track.
возвращает порядковый номер трека, считая с нуля

getTrack($track[, $clone = false])
возвращает ссылку на объект Mrg_Track. если необязательный аргумент $clone равен true, возвращает не ссылку, а копию объекта.
$track - порядковый номер или название трека (если в уровне несколько треков с указанным названием, возвращается первый совпавший с начала)

removeTrack($track)
удаляет трек.
$track - порядковый номер или название трека

removeAllTracks()
удаляет все треки с уровня сложности

reorder($track, $pos[, $swap = false])
меняет порядок треков.
$track - трек, который нужно сдвинуть (его _текущий_ порядковый номер или название)
$pos - желаемая позиция (число, считая с нуля)
необязательный параметр $swap определяет, делать ли обмен. если $swap равен true, то после обмена текущий трек с позицией $pos займет текущее место $track.

getList()
возвращает массив с названиями треков

свойства:

count - int, количество треков на данном уровне
[ro]tracks - массив объектов Mrg_Track

[ro]Класс: Mrg_Track

методы:

getPoints()
возвращает массив точек - объектов Mrg_Point

getPoint($index)
возвращает точку - объект Mrg_Point. у первой точки индекс 0

addPoint($x, $y)
добавляет точку с координатами $x и $y

addPoints(array $points)
добавляет точки из массива $points.
$points - массив объектов Mrg_Point

setStart($x, $y)
устанавливает старт (позицию игрока) с координатами x и y

setFinish($x)
устанавливает финиш (только координата x)

editPoint($index, $x, $y)
изменяет координаты точки с указанным индексом (индексы считаются с нуля)

removePoint($index)
удаляет точку с указанным индексом

removeAllPoints()
удаляет все точки на этом треке

getImage($width)
рисует изображение трека. $width - ширина, высота определяется автоматически.
возвращает ресурс изображения GD, созданный функцией imagecreatetruecolor()

свойства:

name - имя трека
count_points - количество точек
[ro]start - позиция старта, объект Mrg_Point
[ro]finish - позиция финиша, объект Mrg_Point
[ro]points - массив всех точек трека (объектов Mrg_Point)

[ro]Класс: Mrg_Point

конструктор:

__construct([$x[, $y]])
принимает два необязательных аргумента $x, $y - координаты точки

свойства:

x - координата
y - координата

Класс: Mrg_Error

свойства:

error - текст ошибки

P.S.
[ro]- read-only

Почти все методы возвращают объект Mrg_Error в случае ошибки, и true или что-то другое (каждый метод - своё) в случае успеха.

Примеры, как же без них

Условимся, что "levels.mrg" - файл из первой GD со стандартным набором уровней (их здесь все знают).

для начала создадим объект Mrg
Код
$mrg = new Mrg;


откроем файл
Код
$mrg->open('levels.mrg', true);


получим ссылку на объект Mrg_Level c легким уровнем
Код
$easy = $mrg->getLevel('easy'); // или $easy = $mrg->getLevel(0);


аналогично - на объект Mrg_Track с уровнем Intro
Код
$intro = $easy->getTrack('Intro'); // или $intro = $easy->getTrack(0);


поменяем название
Код
$intro->name = 'Intro O_o';


передвинем финиш на 250 пикселей влево
Код
$intro->setFinish($intro->finish->x - 250);


создадим новый трек, назовем его "Some title", старт сделаем в самом начале, финиш в конце, и добавим три точки - по сути прямую линию. добавим этот трек в легкий уровень
Код
$new_track = new Mrg_Track;
$new_track->name = 'Some title';
$new_track->setStart(0, 100);
$new_track->setFinish(200);

for($i = 0; $i < 3; $i++) $new_track->addPoint($i * 100, 0);

$index = $easy->addTrack($new_track);


поменяем позицию нового трека, поставим его сразу после "Intro O_o"
Код
$easy->reorder($index, 1);


удалим Indoor из Medium-а, добавим его в начало Hard-а
Код
$medium = $mrg->getLevel('Medium');
$indoor = $medium->getTrack('Indoor', true);
$medium->removeTrack('Indoor');

$indoor_index = $mrg->getLevel('hard')->addTrack($indoor);
$mrg->getLevel('hard')->reorder($indoor_index, 0);


сохраним получившееся извращение в файл levels2.mrg
Код
$mrg->save('levels2.mrg');


нарисуем трек Deep из лёгкого уровня сложности и сохраним картинку в файл deep_image.png
Код
$deep_image = $easy->getTrack('Deep')->getImage(600);
imagepng($deep_image, 'deep_image.png');
imagedestroy($deep_image);


очистим память
Код
$mrg->clean();


Бла-бла

Лицензия - свободная лицензия Apache License.

Благодарность Роману аля Няшке ака Shevron-у за мотивацию и что-то ещё, peter-у за наставление на путь истинный по поводу побитовых сдвигов и долей пикселя.

Архив с библиотекой прикреплен к посту.

Всё.

--------------------------------------------------------------
Версия 1.1
Добавлено:
addLevel(new Mrg_Level, $level) - добавление уровня сложности
makeEmptyMrg() - создание ресурса шаблонного файла (пустой levels.mrg)

Исправлено:
Корректный вызов функции setStart() внутри loadTrack()
Пара мелких ошибок кода

http://up.dinedi.net/322
Прикрепления: dist.zip(8Kb)


test
 
luethusДата: Воскресенье, 05.06.2011, 18:47 | Сообщение # 2
Сообщений: 20
Репутация: 13
Замечания: 0%
Статус: Вне игры
Всё, давайте делайте онлайн-редактор, онлайн-сборщик и онлайн-искусственный-интеллект-для-рисования-треков.

test
 
hxДата: Вторник, 07.06.2011, 20:58 | Сообщение # 3
UCTeam Pro Coder
Сообщений: 482
Репутация: 34
Замечания: 0%
Статус: Вне игры
luethus, молодец!
P. S.: зачем ты перезарегался?

Добавлено (07.06.2011, 22:58)
---------------------------------------------
luethus, насчёт искуственного интеллекта - где-то видел о генерации треков для игр генетическими алгоритмами, могу написать. biggrin

 
luethusДата: Вторник, 07.06.2011, 21:09 | Сообщение # 4
Сообщений: 20
Репутация: 13
Замечания: 0%
Статус: Вне игры
я давно уже перезарегался) хз, не помню зачем

test

Сообщение отредактировал luethus - Вторник, 07.06.2011, 21:10
 
AdminДата: Пятница, 29.07.2011, 18:56 | Сообщение # 5
Сообщений: 3838
Репутация: 84
Статус: Вне игры
Версия 1.1
Добавлено:
addLevel(new Mrg_Level, $level) - добавление уровня сложности
makeEmptyMrg() - создание ресурса шаблонного файла (пустой levels.mrg)

Исправлено:
Корректный вызов функции setStart() внутри loadTrack()
Пара мелких ошибок кода

http://up.dinedi.net/322


Motorola T190 -> LG B1300 -> Siemens C72 -> Nokia 3500 -> Nokia E65 -> Huawei U8860 -> Huawei H60-L02
 
Форум » Gravity Defied и Java » Модифицирование Gravity Defied » PHP библиотека для работы с MRG
Страница 1 из 11
Поиск:

Приветствуем, Гость


Гость, предлагаем тебе авторизироваться:



Меню


Статистика

Яндекс.Метрика


© Dinedi.RU, 2007-2017 || Хостинг от uCoz