luethus | Дата: Воскресенье, 05.06.2011, 18:44 | Сообщение # 1 |
Репутация: 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->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);
очистим память
Бла-бла
Лицензия - свободная лицензия Apache License.
Благодарность Роману аля Няшке ака Shevron-у за мотивацию и что-то ещё, peter-у за наставление на путь истинный по поводу побитовых сдвигов и долей пикселя.
Архив с библиотекой прикреплен к посту.
Всё.
-------------------------------------------------------------- Версия 1.1 Добавлено: addLevel(new Mrg_Level, $level) - добавление уровня сложности makeEmptyMrg() - создание ресурса шаблонного файла (пустой levels.mrg)
Исправлено: Корректный вызов функции setStart() внутри loadTrack() Пара мелких ошибок кода
http://up.dinedi.net/322
test
|
|
| |
luethus | Дата: Воскресенье, 05.06.2011, 18:47 | Сообщение # 2 |
Репутация: 13
Замечания: 0%
Статус: Вне игры
| Всё, давайте делайте онлайн-редактор, онлайн-сборщик и онлайн-искусственный-интеллект-для-рисования-треков.
test
|
|
| |
hx | Дата: Вторник, 07.06.2011, 20:58 | Сообщение # 3 |
UCTeam Pro Coder
Репутация: 34
Замечания: 0%
Статус: Вне игры
| luethus, молодец! P. S.: зачем ты перезарегался?Добавлено (07.06.2011, 22:58) --------------------------------------------- luethus, насчёт искуственного интеллекта - где-то видел о генерации треков для игр генетическими алгоритмами, могу написать.
|
|
| |
luethus | Дата: Вторник, 07.06.2011, 21:09 | Сообщение # 4 |
Репутация: 13
Замечания: 0%
Статус: Вне игры
| я давно уже перезарегался) хз, не помню зачем
test
Сообщение отредактировал luethus - Вторник, 07.06.2011, 21:10 |
|
| |
Admin | Дата: Пятница, 29.07.2011, 18:56 | Сообщение # 5 |
Репутация: 86
Статус: Вне игры
| Версия 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
|
|
| |