В разработке RPG для Neo-Geo по мотивам Shaman King
| |
Томахомэ | Дата: Воскресенье, 06 Мая 2018, 16:29 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| ...графической библиотеки DATlib v0.3.
Необычна данная RPG будет прежде всего тем, что в нём не будут использоваться вид сверху и изрядно недолюбливаемые мной chibi-пропорции спрайтов персонажей и прочей графики, игровое пространство будет наиболее близко к характерному для beat-em`up!'ов, плюс встречи с врагом будут не рандомными (как это обычно бывает с 8- и 16-битными RPG), а вызываемыми столкновением со спрайтом противника во время внебоевой прогулки по локации (похожим образом, с поправкой на трёхмерность, это реализовано в играх серии Xenosaga).
На данном этапе программа представляет собой пока что лишь модифицированный (в частности, код отображения спрайтов и фона, ранее разбросанный по разным функциям, теперь объединён в одну - она же теперь является главной в новой программе, плюс скроллинг фона управляется теперь не простым движением джойстика, а движением персонажа к краю экрана, плюс возможность персонажа перемещаться я ограничил соответствующим "полу" куском экрана, как в beat'em-up!'ах) пример работы библиотеки (собственно, этим и объясняется то, что графика в программе с Shaman King'ом вроде никак не связана), но, думаю, код её будет использован в качестве базы для внебоевой части геймплея.
Скачать программу можно здесь, (а для обеспечения возможности протестировать её на MAME кидайте XML-файл по ссылке, где уже заранее прописаны характеристики каждого ром-файла, в папку hash, затем создайте в директории MAME для ромов папку DATdemo и кидайте туда char.bin и fix.bin из папки out внутри директории непосредственно с исходниками плюс dev_p1.rom из этой же директории, а остальные нужные файлы берите из архива DATdemo.zip из папки DATdemo_rom) посмотреть видео геймплея - здесь. Скриншоты прикреплены ниже.
Надо подметить, кстати, что RPGшку свою я планирую делать по мотивам именно анимэ-сериала (по которому ещё с 2008 г. загорелся мечтой сделать RPG именно для Neo-Geo, о самом существовании которой узнал незадолго до этого) - хотя, может быть, и от оригинальной манги кое-какие элементы достанутся. Для начала, раз уж упомянул причину отсутствия оригинальной графики, мне бы хотелось как-нибудь достать спрайт Haohmaru из первой части Samurai Shodown, чтобы с его поз и движений срисовать спрайт Йо, а также спрайт одного из противников в игре Burning Fight по имени Robert Baun (это который гангстер с револьвером) - на него в моей игре должен будет стать похож Рио (да и другие спрайты противников из Burning Fight могут понадобиться - для рядовых членов банды Рио, с которой героям поначалу придётся враждовать).
Добавлено (03 Мая 2018, 07:50) --------------------------------------------- Тем временем я, в ожидании завоза оригинальной графики, решил хотя бы в плане геймплея хоть какого-нибудь прогресса добиться, и решил добавить первого врага. Реализовано это дело, правда, пока что на уровне вражеского спрайта, непосредственно сама функция боя и код её вызова в результате столкновения с этим спрайтом будут добавлены позже.
Добавлено (04 Мая 2018, 17:03) --------------------------------------------- Заодно добавил также зачатки функции боевых сцен (для перехода на "арену боя" спрайты игрока и врага должны столкнуться друг с другом). Правда, есть одна проблема - всё никак не удаётся мне заставить персонажа во время атаки плавно подходить к врагу, а не "телепортироваться", как сейчас. Код, ответственный за ходы противника после игрока, будет добавлен позже.
Кстати, боево-ролевую систему, думаю, лучше всего было бы создать на основе результатов реверс-инжениринга кода Xenosaga Episode II (знать бы только, где приличный дизассемблер PS2 достать).Добавлено (06 Мая 2018, 16:29) --------------------------------------------- Добавил ходы противника с сопутствующей анимацией вражеских атак. Теперь прояснилась причина того, почему, несмотря на то, что в прошлых версиях я четко прописывал команду персонажу плавно подойти к врагу, затем воспроизвести анимацию удара и вернуться на прежнее место, команда эта не работала - что-то мешает программе плавно выполнять всю последовательность операций шаг за шагом (подход героя к врагу -> удар героя -> отход героя на прежнюю позицию -> переход очереди к противнику -> удар противника -> возвращение противника назад -> очередь игрока, и т. д.), и весь результат "выплёвывается" практически сразу, оттого и получается, что игрок с противником друг друга атакуют почти что одновременно. Только вот что именно мешает, и как эту проблему решить?
Сообщение отредактировал Томахомэ - Пятница, 04 Мая 2018, 17:10 |
|
| |
Hobo_Gus | Дата: Воскресенье, 06 Мая 2018, 18:52 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| сколько я уже видел проектов на гцупе от тебя, хоть один то закончить смогеш?
Weedman
|
|
| |
Томахомэ | Дата: Воскресенье, 13 Мая 2018, 18:09 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Цитата Hobo_Gus ( ) сколько я уже видел проектов на гцупе от тебя, хоть один то закончить смогеш?
Прошлые я всё равно рассматривал как некую "площадку для разгона", на создании которых можно потренироваться, прежде чем взяться за исполнение своей вынашиваемой ещё с детства мечты - как раз того, чему и посвящена тема. Так что этот-то проект я просто обязан довести до конца.Добавлено (13 Мая 2018, 18:09) --------------------------------------------- Наконец-таки дошёл своим умом до решения проблемы.
Как выглядят теперь бои, можно посмотреть в видео по ссылке.
Неплохо бы теперь ещё научиться по прошествии определённого времени удалять с экрана только какие-то конкретные надписи, не тронув весь остальной fix layer, а также при анимации ударов выводить непосредственно бьющую часть спрайтов на передний относительно ударенного спрайта план.
Выход из функции битвы после победы или поражения, а также анимации получения ударов, будут добавлены позже.
|
|
| |
TLT | Дата: Воскресенье, 13 Мая 2018, 18:37 | Сообщение # 4 |
Сейчас нет на сайте
| Из видео чет я ничего не понял... В чём смысл такой боёвки?
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
Томахомэ | Дата: Понедельник, 14 Мая 2018, 04:40 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Боёвку я ещё пока что только начинаю делать, до нужного результата там ещё достаточно далеко.
|
|
| |
afq | Дата: Понедельник, 14 Мая 2018, 05:41 | Сообщение # 6 |
Разработчик
Сейчас нет на сайте
| Томахомэ, да кто ж так дерётся. Ты когда нибудь видел, чтобы кто нибудь подойдёт, ударит и уйдёт на своё место, потом другой подойдёт ударит и уйдёт на своё место. Сделай лучше, чтобы они рядом друг с другом стояли и не ходили туда сюда. Тогда будет похоже на драку. И блоки бы сделал ещё, чтобы один заблокировал голову, а ты в живот ударил. Ты заблокировал голову, и он в голову ударил в блок твой.
|
|
| |
Томахомэ | Дата: Понедельник, 14 Мая 2018, 10:29 | Сообщение # 7 |
частый гость
Сейчас нет на сайте
| Цитата afq ( ) Томахомэ, да кто ж так дерётся. Ты когда нибудь видел, чтобы кто нибудь подойдёт, ударит и уйдёт на своё место, потом другой подойдёт ударит и уйдёт на своё место.
Почему-то в Xenosaga и многих других jRPG как раз так и сделали. А я как раз с самого начала и не скрывал, что именно как раз на Xenosaga и ориентируюсь. Блоки также будут добавлены позже.
|
|
| |
afq | Дата: Понедельник, 14 Мая 2018, 22:24 | Сообщение # 8 |
Разработчик
Сейчас нет на сайте
| Томахомэ, ты главное не забрасывай игру. Потом будешь радоваться когда закончишь.
|
|
| |
Томахомэ | Дата: Понедельник, 04 Июня 2018, 17:59 | Сообщение # 9 |
частый гость
Сейчас нет на сайте
| Добавлены возможность проигрыша и анимации реакции на удары (как у врага, так и у игрока).
Добавлено (31 Мая 2018, 11:09) --------------------------------------------- Меня уже давно мучает проблема с камерой во внебоевом режиме. В предыдущей запощенной здесь версии игры, если помните, в самом конце поля справа можно было заметить "двойника" спрайта противника, который, правда, в отличие от "оригинала", на столкновения со спрайтом игрока никак не реагировал. Я попробовал исправить этот баг (код ниже, правда, он немного отличается от того, что лежит в архиве по ссылке), и "двойник" действительно исчез, однако при этом сам спрайт противника стал, если игрок доходил до правого края фона, заметно смещаться вправо. До: После:
Код if((p1&JOY_LEFT)&&((x<=32)&&(x>0))) { scrl_x--; if ((scrl_x>FRONT_MIN_X)&&(enemyX<(320+(enemy_spr.maxWidth*16)))) { clearFixLayer(); enemyX++; aSpriteSetPos(&Enemy,enemyX,enemyY); } } if((p1&JOY_RIGHT)&&((x>=288)&&(x<320))) { scrl_x++; if ((scrl_x<FRONT_MAX_X)&&(enemyX>(0-(enemy_spr.maxWidth*16)))) { clearFixLayer(); enemyX--; aSpriteSetPos(&Enemy,enemyX,enemyY); } }
Интересную вещь также можно заметить в этом видео (в записанной версии добавлено отображение переменной enemyX) - оказывается, убывание переменной enemyX прекращается ещё до того, как игрок успеет упереться в конец скроллинга справа.
В чём тут дело, и какие решения проблемы можете посоветовать?Добавлено (04 Июня 2018, 17:59) --------------------------------------------- Ну что ж, хотя бы уродливую вертикальную тоненькую серую полосу в самом правом конце фона удалось убрать. Тем не менее, мне по-прежнему требуется помощь с камерой. Добавлено (19 Октября 2018, 11:50) --------------------------------------------- До меня уже, кажется, начинает доходить, что зря я внёс в игру вот этот код:
Код if ((scrl_x>FRONT_MIN_X)&&(enemyX<(320+(enemy_spr.maxWidth*16)))) { clearFixLayer(); enemyX++; //aSpriteSetPos(&Enemy,enemyX,enemyY); }
Можете мне посоветовать хоть какой-нибудь другой способ предотвратить сползание вражеского спрайта на противоположный конец карты при скроллинге вправо?Добавлено (07 Ноября 2018, 06:06) --------------------------------------------- Наконец-то додумался решить свою давнюю проблему вот таким способом:
Код aSpriteSetPos(&Enemy,enemyX,((enemyX>(0-(enemy_spr.maxWidth*16)))&&(enemyX<(320+(enemy_spr.maxWidth*16))))?enemyY:400);
Можете проверить результаты - всё отлично работает.Добавлено (12 Ноября 2018, 07:12) --------------------------------------------- Вот вам ещё пока новая версия:
- Добавлен экран Game Over после поражения.
- Больше нет внутриигрового дебаггинга переменных scrl_x и EnemyX в функции main.
- Также удалён код, очищающий fix layer после первого же за игросеанс скроллинга.
Геймплейное видео можно скачать здесь.Добавлено (17 Ноября 2018, 13:11) --------------------------------------------- Добавлены кое-какие новые элементы интерфейса, однако вот в этом вот коде -
Код if(turn==0&&phase==0) { fixPrint(2,22,4,3,"Press 1P A, B"); fixPrint(2,23,4,3,"or C button to"); fixPrint(2,24,4,3,"attack enemy."); } else { fixPrint(2,22,4,3," "); fixPrint(2,23,4,3," "); fixPrint(2,24,4,3," "); }
- условие почему-то не работает, а также по какой-то непонятной причине уже на месте нижеследующего кода -
Код if(turn==0&&phase==0) { fixPrint1(17,22,3,3,"Willy the Buller"); fixPrint1(17,23,3,3,"LIFE: %d", enemy_hp); fixPrint1(17,24,3,3,"SC"); fixPrint1(17,25,3,3,"ZONE: ?"); } else { fixPrint1(17,22,3,3," "); fixPrint1(17,23,3,3," "); fixPrint1(17,24,3,3," "); fixPrint1(17,25,3,3," "); }
- происходит ошибка, компиляции, так что я этот код пока до поры до времени закомментил.
Сообщение отредактировал Томахомэ - Четверг, 31 Мая 2018, 11:15 |
|
| |
drcrack | Дата: Суббота, 17 Ноября 2018, 13:57 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Цитата а также по какой-то непонятной причине fixPrint1 точно не опечатка? в первом случае у тебя fixPrint без 1
|
|
| |
Томахомэ | Дата: Суббота, 17 Ноября 2018, 16:30 | Сообщение # 11 |
частый гость
Сейчас нет на сайте
| Цитата drcrack ( ) fixPrint1 точно не опечатка? в первом случае у тебя fixPrint без 1
Опечаточка-то и впрямь закралась - только не там, где можно подумать: просто функция fixPrint (в отличие от функции fixPrintf, с помощью которой отображается большая часть надписей в игре), оказывается, для отображения переменных не годится. А что до цифр - это просто разные способы реализации fixPrint в DATlib (в чём их отличие, можно посмотреть в мануале по DATlib).
Тем временем версию я всё-таки исправил - сам файл архива на Гугл.Диске я заменил, последнюю ссылку с предыдущего моего сообщения теперь можно считать недействительной.
Добавлено (18 Ноября 2018, 04:44) --------------------------------------------- Ещё раз обновил версию по последней ссылке - на этот раз пришлось сдвинуть элементы интерфейса на одну ячейку 8x8 от краёв экрана - сделано это специально для пользователей ЭЛТ-телевизоров, где верхние и нижние 8 строк скрыты от глаз зрителя.
Добавлено (10 Января 2019, 13:05) --------------------------------------------- Ох ты ж ёлки, в праздничной суматохе совсем забыл рассказать: в игру наконец-таки добавлено стартовое меню, и теперь после game over screen'а игрока переносит уже прямо туда. Правда, пункт load game у этого меню всё ещё неактивен, ибо функции взаимодействия с Neo-Geo'вской картой памяти ещё не завезли.
Добавлено (18 Января 2019, 07:28) --------------------------------------------- Наконец-таки я научился вставлять в игру музыку. В качестве звукового инструментария я в своём SDK использую утилиту NGFX SoundBuilder. Что ж, теперь мне предстоит научиться работать уже со звуковыми эффектами, да и о замене цельных VAW-файлов, которые я пока что использую в качестве BGM, на MIDI- или трекерно-подобные ради экономии места в ROM'е для сэмплов тоже не худо бы. Добавлено (13 Февраля 2019, 08:56) --------------------------------------------- Первая попытка добавить в игру звуковые эффекты (пока что это просто взмахи кулаком или ногой при ударе) обернулась странным багом при их проигрывании (см. видео).
Есть версия, что причина ему - то, что вот в этом условии
Код if(turn==0) { if((p1e&JOY_A)&&phase==0) { phase=1; damage=1; attack_type=4; } if((p1e&JOY_B)&&phase==0) { phase=1; damage=2; attack_type=5; } if((p1e&JOY_C)&&phase==0) { phase=1; damage=3; attack_type=6; } if(phase==1) { if(x!=195) { aSpriteSetAnim(&demoSpr,1); x++; } if(x==195) { aSpriteSetAnim(&demoSpr,attack_type); //aSpriteSetAnim(&Enemy,4); if(attack_type==4) { send_sound_command(ADPCM_BMARY_ATTACK1); } if(attack_type==5) { send_sound_command(ADPCM_BMARY_ATTACK2); } if(attack_type==6) { send_sound_command(ADPCM_BMARY_ATTACK3); } if(demoSpr.currentAnim==0&&demoSpr.stepNum==0) { enemy_hp-=damage; textTimer=0; fixPrintf1(1,26,3,3,"Enemy lost %d HP.", damage); waitVBlank(); phase=2; } } } if(phase==2) { if(x!=87) { flipMode|=FLIP_X; aSpriteSetFlip(&demoSpr,flipMode); aSpriteSetAnim(&demoSpr,1); x--; } if(x==87) { flipMode&=~FLIP_X; aSpriteSetFlip(&demoSpr,flipMode); aSpriteSetAnim(&demoSpr,0); turn=1; phase=0; if(enemy_hp<=0) { send_sound_command(ADPCM_LOCATION); clearFixLayer(); clearSprites(1,192); SCClose(); waitVBlank(); return; } } } }
условии что-то заставляет заключённую в него команду send_sound_command(ADPCM_BMARY_ATTACKX) бесконечно раз за разом выполняться в зацикленном режиме. Что мне сделать, чтобы вызов внутри условия происходил только 1 раз?
|
|
| |
drcrack | Дата: Среда, 13 Февраля 2019, 09:27 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| попробуй в начало вставить attack_type=0;
|
|
| |
Томахомэ | Дата: Среда, 13 Февраля 2019, 10:54 | Сообщение # 13 |
частый гость
Сейчас нет на сайте
| Цитата drcrack ( ) попробуй в начало вставить attack_type=0;
Таким способом не получилось - звук стал воспроизводиться уже нормально, но персонаж игрока едва подойдя к врагу, тут же уходил от него ещё не нанеся даже удар - в том смысле, что анимации удара не происходило.
Чтобы всё заработало как надо, пришлось-таки ввести дополнительную переменную, позволяющую проигрывать звук взмаха только когда равна 0, а после первого же запуска нужного звукового эффекта переключающуюся на 1, а с началом фазы отхода от противника снова переключающуюся на 1.
|
|
| |
|