Разработка и ромхакинг > Разработка игр

[SMD] Battle City (форк от battlecity-md от KRIKzz)

<< < (2/7) > >>

Scarabay:
Werton, в последней версии с самого начала появляются только мигающие вражеские танки, причем они могут брать все "пауэр апы". В опциях стоит режим "батл сити". К тому же, есть просадки фпс, заметны рывки, даже на выезжающем титульном экране. Может я придираюсь, но мне так играть некомфортно. :neznayu:

Werton:
Мда, глюкодром, буду чинить

Добавлено позже:

--- Цитата: Scarabay от 21 Март 2018, 07:47:29 ---К тому же, есть просадки фпс, заметны рывки, даже на выезжающем титульном экране.
--- Конец цитаты ---
А вот этого не вижу, на каком эмуле тестил? Перепроверил на Fusion и Regen, игра идет в стабильных 60 fps.

Добавлено позже:

--- Цитата: Scarabay от 21 Март 2018, 07:47:29 ---с самого начала появляются только мигающие вражеские танки
--- Конец цитаты ---
Это я сам забыл отключить, тестил бонусы  :lol:

Scarabay:
Werton, проверил еще раз в Mednaffen, Fusion и Gens. В первых двух все отлично, а вот в Gens заметны подтормаживания, хотя по фпс вроде стабильно.
Еще при старте уровня, когда идет заполнение серым, видно вот такое:



 :lol: лишний кусочек)

Virtanen:
Werton, на 6 уровне Battle city (mode: Battle city; pack: Battle city) не разрушается бетонная стенка с правой стороны карты. Играю на android, md emu 1.5.34.
Update: такой же баг появляется на 17 уровне, но уже с кирпичной стенкой. Но в обоих случаях это происходит при стрельбе по ним слева направо, как на скриншоте. Если же вести огонь по ним снизу или сверху экрана, то они разрушаются.

Sharpnull:
Werton, не забудьте протестировать на самом точном эмуляторе Exodus.
Баги/неточности:
1. Разрыв снаряда у белой стены смещён слева и сверху (первый скриншот, поймал обе стороны), это касается и узких блоков. На других блоках не замечал, нужно проверить. Это похоже связано с других багом: наездом танка на правую и нижнюю границы поля.
2. Снаряд появляется поверх танка ближе к центру (второй скриншот). В оригинале снаряды летят поверх танков, это видно по врагам и появляются над пушкой, но не так близко от центра (проверьте сами на всякий случай).
3. Звуки должны прекращаться во время паузы.
4. В оригинале анимация взрывов медленнее.
5. Взрывы о границы поля в оригинале появляются чуть дальше и это варьируется (сравнение на последних двух скриншотах). Это если вы собираетесь в точности переносить.
6. Game Over на поле должно рисоваться примерно на 16 пикселей выше. Количество жизней также смещено.
7. Иногда игрок пробивает сразу половину кирпичной стены вместо четверти, причём зависит это от текущей позиции. Я встаю как на последнем скриншоте и стреляю в орла, пробивает сразу по половине, но срабатывает не всегда. Такое получается и из других положений, как минимум если стрелять сверху-вниз.


--- Цитата: Scarabay от 21 Март 2018, 11:12:58 ---Werton, проверил еще раз в Mednaffen, Fusion и Gens. В первых двух все отлично, а вот в Gens заметны подтормаживания, хотя по фпс вроде стабильно.
Еще при старте уровня, когда идет заполнение серым, видно вот такое:
(Ссылка на вложение)
 :lol: лишний кусочек)

--- Конец цитаты ---
Неверно реализован "эффект штор", также в конце открытия мерцание.
Лишний кусок из 8 тайлов (64 пикселя по ширине) потому что рисуется не 32 тайла (256 пикселей по ширине), начиная слева, а 40 тайлов (320 пикселей) для другого режима (у SMD либо 320, либо 256 ширина). Память расположена слева-направо, сверху-вниз, вот и залезает вниз.
Мерцание из-за того, что поле рисуется обычно на слое A, но для эффекта рисуется на B, а серые блоки "открываются" на A, после слои резко меняются. Возможно стоило всегда рисовать на B (он дальше), либо что-то делать с прерываниями. Вспомнил: ведь можно просто приоритет у тайлов заднего слоя выставить выше и рисовалось бы поверх, тогда слои B и A не пришлось бы менять.

Обновление: добавил гифку с открытием "штор", там видны разрывы в начале и конце. Попробуйте использовать SYS_disableInts() и SYS_enableInts().
Обновление 2: Scarabay, на счёт fps, которые показывает эмулятор - они бесполезны, так как отображают способность вашего компьютер справляться с эмуляцией. Нужен вывод fps через код игры, который может опускать хоть до 1, если нагрузить вычислениями.
Обновление 3: добавил ещё багов.

Werton:
какой ужас :lol: С пробитием 2х стен сам столкнулся, но даже еще не разбирался. у самого еще 8 багов в туду листе, наверное оформлю кноунбагс в шапке, чтобы не дублировать. Спасибо парни за дотошный тест, буду фиксить потихоньку  :thumbup:

Добавлено позже:

--- Цитата: Sharpnull от 22 Март 2018, 03:28:17 ---Это если вы собираетесь в точности переносить.
--- Конец цитаты ---
Дотошную до пикселя копию делать не буду, не вижу в этом смысла, это же не репродукция Джоконды.

Werton:

--- Цитата: Sharpnull от 22 Март 2018, 03:28:17 ---Неверно реализован "эффект штор", также в конце открытия мерцание.
Лишний кусок из 8 тайлов (64 пикселя по ширине) потому что рисуется не 32 тайла (256 пикселей по ширине), начиная слева, а 40 тайлов (320 пикселей) для другого режима (у SMD либо 320, либо 256 ширина). Память расположена слева-направо, сверху-вниз, вот и залезает вниз.
--- Конец цитаты ---
Да, все действительно так и оказалось, круто конечно, как ты нашел баг и его причину даже не глядя в код  o_0 :thumbup:

Добавлено позже:

--- Цитата: Sharpnull от 22 Март 2018, 03:28:17 ---Мерцание из-за того, что поле рисуется обычно на слое A, но для эффекта рисуется на B, а серые блоки "открываются" на A, после слои резко меняются. Возможно стоило всегда рисовать на B (он дальше), либо что-то делать с прерываниями. Вспомнил: ведь можно просто приоритет у тайлов заднего слоя выставить выше и рисовалось бы поверх, тогда слои B и A не пришлось бы менять.
--- Конец цитаты ---
Да, и тут тоже все верно, обломало меня менять везде слои, вот и решил сделать "по-хитрому", а получилось по-кривому, а про приоритеты я на тот момент и не знал :lol:

Sharpnull:
Werton, про смещение - это единственное объяснение :)
Про открытие "штор" немного ошибся, мерцание всё-таки скорее из-за лишней отрисовки серых блоков, их же вроде не должно было остаться, после очищения.
Про известные баги, тоже была мысль, чтобы не искать по сообщениям форума о найденных.
После ещё заметил очередной баг связанный со столкновениями: в мой танк попадали, когда вылезал на линию огня только на четверть блока. Проблемы столкновений критические, остальные можно не трогать.

varezhkin:
добавьте больше апгрейдов, когда берешь иконку с пистолетом или звездочкой...

bugmenot:

--- Цитата: Томахомэ от 20 Март 2018, 12:35:42 ---Есть желание запилить более соответствующую мегадрайву графику и звук (фамикомовские удалять не буду, все опционально), с нуля я ее конечно рисовать не хочу :lol: , как вариант видится мне использовать графику от логического продолжения Tank Force с аркады, но к сожалению не могу найти рипы этой графики. Может кто сможет помочь, или предложит другой вариант графики?

--- Конец цитаты ---

Могу предложить взять спрайты танков от игры Metal Max Returns на snes, те которые 16х16.
https://www.spriters-resource.com/snes/metalmaxreturns/





Sharpnull:
bugmenot, они же изометрические (перепутал) под углом, а не сверху.

Werton:
Приветствую товарищи :drinks: позвольте продемонстрировать вам очередные результаты лоботомии нашего с вами пациента :lol:  Первый пост не редактируется, потому оставляю пока здесь.

Самое главное что было сделано, это добавлен режим Mad Mode (что собственно и было самоцелью данной поделки). В нем, при старте каждого уровня, активируются случайным образом различные модификаторы, которые вносят небольшие изменение в правила игры, усложняя тем самым жизнь игроку (по задумке, играть должно было стать веселее, но что уж получилось я хз  :lol: ). Количество одновременно действующих модов увеличивается каждые 3 уровня (в Custome Mode настраивается), пока не достигнет 6ти.
Из-за нехватки времени, некоторые, особо вредные из описанных ранее багов так и не были устранены, сделано только то, что описано ниже. Но в целом, считаю, задачу выполненной и на этом хочу закончить издевательство на данной игрой развитие данного мода, но возможно еще будут кое-какие фиксы особо вредных багов или мелкие правки. :surrender:


--- Код: ---===== версия 1.08 =====
-добавлены новый режим игры - Mad Mode
-добавлены следующие модификаторы для Mad Mode и Custome Mode:
"enemy's armor increased"              -броня врага увеличивается
"enemy's speed increased"              -скорость врага возрастает
"enemy crushes concrete walls"            -снаряды врага пробивают бетон
"enemy's shells speed increased"          -скорость снаряда врага увеличивается
"player's speed decrease"                 -игрок замедляется
"rubber concrete walls"                   -снаряды рикошетят от бетона и границы поля
"enemy goes through walls"                -враг ездит сквозь стены
"enemy's spawn speed increased"           -враг респаунится быстрее
"number of enemies increased"             -количество врагов х2
"player used enemy skin"                  -игрок ездит на вражеских танках
"enemy used player skin"                  -враги ездят на танках игрока
"player kills player"                     -игроки убивают друг друга
"no bonuses"                              -нет бонусов
"enemies on map increased"                -количество врагов на карте увеличено
"enemies start with shield"               -враг стартует с щитом
"player start without shield"             -игрок стартует без щита
"player is ass killer"                    -врага возможно уничтожить только сзади
"the enemy is invulnerable"               -врага возможно уничтожить только гранатой
-добавлены предустановленные режимы: Battle City, Tank1990 и Custome Mode (большинство настроек перенесены из опций)
-добавлены в Custome Mode настройки: number of mods - количество модификаторов на старте,
inc mods each lvl - число уровней, через которое будет возрастать количество активных модификаторов
-добавлено срезание кустов снарядом при взятии пистолета (в режиме Tank1990)
-исправлено кривой эффект "шторки" при старте уровня
-исправлено мигание экрана при старте уровня
-исправлено надпись пауза рисовалась позади танков
-исправлено звук двигателя играл во время паузы
-исправлено не сбрасывалась заморозка игрока после его уничтожения
-исправлено при взрыве противника гранатой, взявшего каску, следующий появлялся уже с каской
-исправлено снижение скорости быстрых танков после заморозки часами
-удалены лишние настройки в опциях

--- Конец кода ---


 battlecity-md_1.08.zip (158.14 КБ - загружено 442 раз.)





Sharpnull:
Werton, если это конец, то что там с исходным кодом?
Напомню, из важных багов, которые остались: пробивка двух кирпичей вместо одного и смещение обработки столкновений справа и снизу. Из-за последнего ещё травка не вся уничтожается.
--------
Mad Mode напомнило Test Your Luck из Mortal Kombat (2011), только там были и бонусы для игрока.

Werton:
Sharpnull, про те баги в курсе, просто с наскока не удалось с ними разобраться :neznayu: , доп. бонусы не стал делать, так как показалось и так легко. А про исходник думал раз тема стухла значит никому не интересно, но если есть желание поковырять то вот:

 battlecity-md_1.08-0_src.7z (904.98 КБ - загружено 404 раз.)

в файле history.txt так же описаны известные на тот момент баги.

Sharpnull:
Werton, я указал баги для других, другие не следят же. Посмотрю исходник, если что-то смогу исправить, то напишу в эту тему или вам.
--------
Кажется добавился баг, после завершения уровня остаются случайные тайлы на экране подсчёта очков.
Обновление: В Kega Fusion их нет, но это убогий эмулятор, у него ещё скорость эмуляция выше, чем должна быть. В старом Gens есть. В Exodus не пробовал.
Второй баг: после завершения уровня (смерти), не получается выбрать другой режим, кроме Mad Mode.

Посмотрел код. Убрал все предупреждения компилятора. В основном это неявные объявления, но вот несколько важных:

--- Код: ---if (config.debug & BONUS_GOD == BONUS_GOD) {
//        game_player[player_idx].bonus = BONUS_GOD;
    game_player[0].god = 1024*100;
}
--- Конец кода ---
Здесь выполняется сначала сравнение, а потом &. Переменная god имеет тип s16 и такое значение никак не влезет. Поэтому пока так:

--- Код: ---if ((config.debug & BONUS_GOD) == BONUS_GOD) {
//        game_player[player_idx].bonus = BONUS_GOD;
//    game_player[0].god = 1024*100;
}
--- Конец кода ---

--- Код: ---else if(game_player[player].type == 7){
    game_player[player].hitpoint += 2;
    if(game_player[player].speed == TANK_SPEED_1)game_player[player].speed == TANK_SPEED_2;
    else if(game_player[player].speed == TANK_SPEED_2)game_player[player].speed == TANK_SPEED_3;
    if(game_player[player].bullet_limit == 1)game_player[player].bullet_limit = 2;
    if(game_player[player].bullet_speed == BULLET_SPEED_1)game_player[player].bullet_speed = BULLET_SPEED_2;
}
--- Конец кода ---
Здесь == вместо =.

--- Код: ---VDP_setSpriteFull(sprite_counter++, x + MAP_PIXEL_X, y + MAP_PIXEL_Y, SPRITE_SIZE(2, 2), sprite_atr, sprite_counter+1);
--- Конец кода ---
Такой код имеет неопределённое поведение, так как порядок вычисления аргументов функций не определён. По крайней мере для префиксного инкремента. Исправил на:

--- Код: ---VDP_setSpriteFull(sprite_counter, x + MAP_PIXEL_X, y + MAP_PIXEL_Y, SPRITE_SIZE(2, 2), sprite_atr, sprite_counter+1);
sprite_counter++;
--- Конец кода ---
Если используете русские буквы в тексте, то всегда сохраняйте в UTF-8. Поэтому gamelogic.c и history.txt сохранил в UTF-8. В других файлах кириллицы не нашёл.

Код здесь https://github.com/infval/battlecity-md, разница кода. Лишних файлов в репозитории нет, кроме моих .vscode, .gitignore и батников.
Что за файлы Hold.dat и loss? Они при компиляции не участвуют. Остальные вроде понятно зачем.
--------
Второй баг решается сбросом режима config.game_mode = 0; в modeMenu() перед циклом. Обновил код на github. Прикрепил обновлённый бинарник.

Werton:
Sharpnull, спасибо.

--- Цитата: Sharpnull от 29 Апрель 2018, 12:09:05 ---Если используете русские буквы в тексте, то всегда сохраняйте в UTF-8.
--- Конец цитаты ---
кириллица в исходниках не моя, честно :lol: а пересохранять столько файлов было лень, работало ведь :)

--- Цитата: Sharpnull от 29 Апрель 2018, 12:09:05 ---Что за файлы Hold.dat и loss? Они при компиляции не участвуют.
--- Конец цитаты ---
там еще language.dat лишний, возможно, какие то настройки от эмуляторов остались, некоторые свои конфиги кидали в папку с ромом (первоначально ром в корне был)


Добавлено позже:
еще регрессию выявил, враг размораживается быстро, мой косяк

Sharpnull:

--- Цитата: Werton от 29 Апрель 2018, 18:08:10 ---а пересохранять столько файлов было лень
--- Конец цитаты ---
Остальные без кириллицы, а значит уже формально в UTF-8 :) (valid ASCII text is valid UTF-8-encoded Unicode as well)
--------
Исправил заезд танков за правую и нижнюю границы поля. В collision.c:

--- Код: ---if (x1 < 0 || x1 >= MAP_W - 1 || y1 < 0 || y1 >= MAP_H - 1) return 0;
--- Конец кода ---
меняем на

--- Код: ---if (x1 < 0 || x2 >= MAP_W || y1 < 0 || y2 >= MAP_H) return 0;
--- Конец кода ---
--------
Исправил невозможность уничтожить блоки возле границ поля внизу и справа. В collision.c, detectBulletToWallCollision():

--- Код: ---if (x0 < 0 || x0 >= MAP_W - 1 || y0 < 0 || y0 >= MAP_H - 1) {
--- Конец кода ---
меняем на

--- Код: ---if (x0 < 0 || x0 >= MAP_W || y0 < 0 || y0 >= MAP_H) {
--- Конец кода ---
Обновление: правда тогда взрыв смещён.

Werton:
я там пулреквест кинул фикс на заморозку

Sharpnull:
Werton, принял. Исправил смещение взрыва со всеми стенами. Теперь всё чётко :cool:
--------
Возможно исправил взрыв двух кирпичей вместо одного. В collision.c, detectBulletToWallCollision():

--- Код: ---s16 mod = (((x | y) & 7) - 1) >> 2;
--- Конец кода ---
На основе позиции пули вычисляется mod, который может быть -1, 0, 0, 0, 0, 1, 1, 1. Потом это значение используется в tileAfterHit(tile_idx, rotate, mod), где:

--- Код: ---s16 tileAfterHit(u16 tile_idx, u16 bullet_rotate, u16 dip) {
    u16 mask;
    if (tile_idx == RES_TILE_ARMOR) return tile_idx;
    if (tile_idx == (RES_TILE_GRASS | TILE_ATTR(0, 1, 0, 0))) {
            return RES_TILE_GRASS;
    }
    else {
        if (tile_idx > 16 || tile_idx == 0) return -1;
    }
    if (bullet_rotate & 1) {
        mask = 10 >> dip;
    } else {
        mask = 12 >> (dip << 1);
    }
    if ((tile_idx & mask) == tile_idx) return -1;
    return tile_idx & mask;
}
--- Конец кода ---
Выражение "число >> -1" выдало бы ошибку при компиляции, но если это переменная, то всегда возвращается 0. Возможно поэтому ниже стоит этот код if ((tile_idx & mask) == tile_idx) return -1;(это для другого)
В общем, если написать s16 mod = ((x | y) & 7) >> 2;, то есть будет только 0 или 1, вроде всё работает правильно, но нужно удостовериться, так как я не до конца понимаю что делает этот код.

Причина точно в позиции танка и соответственно стартовой позиции пули. Чтобы воспроизвести баг, я ставил танк перед стеной и пытался сдвинуть его чуть-чуть, чтобы получить неверные координаты.
--------
Выкладываю бинарник, если кто-то хочет потестить.
--------
Про оставшиеся тайлы на экране подведения очков. Как я говорил когда-то раньше, нужно использовать SYS_disableInts() и SYS_enableInts(), в коде их нигде нет. К сожалению, я не знаю все случаи когда нужно отключать прерывания. В документации написано, что например для доступа к VDP, но это не значит, что нужно все функции VDP_* обрамлять. По примерам из SGDK видно, что если устанавливаются палитра или тайлы.
Если в gameover.c добавить отключение прерываний:

--- Код: ---SYS_disableInts();
    VDP_setPalette(0, palette_black);
//    VDP_setPalette(1, palette_black);
    VDP_fillTileMapRect(PLAN_A, 0, 0, 0, planWidth, planHeight);
    VDP_fillTileMapRect(PLAN_B, 0, 0, 0, planWidth, planHeight);
//    VDP_fillTileMapRect(PLAN_B, 0, 0, 0, 32, 28);
SYS_enableInts();
--- Конец кода ---
То не будет кусков тайлов, как на скриншоте №1.
Такое же вроде нужно и в showGameoverWord() написать, но без них не замечал. Всё равно там остаются спрайты танков на доли секунды как на скриншоте №2. Если заменить VDP_updateSprites(1,1); на VDP_updateSprites(1, FALSE);, то такого не будет.
На GitHub пока не вносил, нужно будет позже разобраться.

Werton:
потестил последний билд на андроидовском md.emu и regen, баг с пробитем 2х стенок не обнаруживается, но баг со спрайтами остался, еще надпись gameover при про проигрыше, если на экране куча танков было, остается висеть до титульного экрана (на не фикшенной версии - также).

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии