Флейм
GameDev.ru / Флейм / Форум / Contra Force Advance (8 стр)

Contra Force Advance (8 стр)

Страницы: 17 8 9 1013 Следующая »
emptiness_rainУчастникwww16 фев. 201810:18#105
monobogdan
Неужели так трудно прочесть нулевой пост, там ответы на все вопросы.
monobogdanПостоялецwww16 фев. 201810:31#106
=A=L=X=
Причем тут эмулятор?
Ты сам говорил что у тебя рендерер кроссплатформенный и ничего не мешает его портировать на другие платформы.
Что мешает написать реализацию рендерера PS1 и просто скомпилировать игру тулчейном PS1?
в неё уже можно играть без изменений на огромном числе платформ от андроида до nintendo virtual console

Я имел ввиду чтобы игра спокойно собиралась на этих платформах, а не эмуляторы.

Правка: 16 фев. 2018 10:35

=A=L=X=Постоялецwww16 фев. 201810:44#107
monobogdan
> у тебя рендерер кроссплатформенный и ничего не мешает его портировать на другие
> платформы
Нет,  я сказал только, что можно взять образ игры и играть на почти всех современных платформах - через эмуляторы конечно же.
Поэтому я не имею никакого интереса заморачиваться полным переписыванием рендера, звука, опроса клавиш и т.п.

Правка: 16 фев. 2018 10:45

monobogdanПостоялецwww14 мар. 201815:35#108
=A=L=X=
Как ты там вообще сидишь(на gbx)?
Там же одни олдфаги не адекватные, тему в флейм превратили.

Правка: 14 мар. 2018 15:35

=A=L=X=Постоялецwww22 мар. 20184:22#109
Поработал над проектом.
Переписал существенно систему сборки - теперь все ресурсы, включая исходники, разложены по подпапкам, временные файлы при сборке валятся в out/, так что сборка стала приятнее и опрятнее.
Ввёл концепцию переходных экранов и смерти - теперь игра просит вначале PRESS START... и можно умереть. Анимация смерти пока упрощенная, но уже есть.
Более интересно - ввёл актора "Spawner", который в стиле старой доброй Contra Force порождает на своём месте актора с введенными в TileEd свойствами.
То есть в TileEd мы делаем актора с типом "spawner" (всё маленькими), вбиваем ему все свойства как обычному актору, кроме того, что тип атора вбиваем в свойство spawnType - например как сейчас это "grenader".
Такой спавнер будет порождать актора с введенными в TileEd свойствами на своём месте всякий раз когда попадает на экран.
В оригинальной Contra Force такое поведение "респавна" конечно было вызвано банальной нехватой ОЗУ на консоли - информация о персонажах постоянно считывалась из ПЗУ катриджа, так что они всегда выпрыгивали из-за границ экрана как новенькие.
Здесь же все акторы хранятся в глобальном динамичном списке и чтобы добиться аналогичного аутентичного поведения потребовалось вот вводить актора "породитель (spawner)".
Так что в CFA возможны как спавнящиеся акторы в духе оригинала, так и глобальные акторы умирающие на карте один и раз навсегда.
Архивы как всегда обновлены, так что можно наглядно посмотреть в ресурсах как это делается.

Демонстрация (все акторы глобальны кроме самого правого, который порождается спавнером):

Правка: 22 мар. 2018 4:43

=A=L=X=Постоялецwww3 мая 201810:22#110
Внедрил коллизии, касания и платформы. Обваливающиеся, ездящие и комбинации.

В TileEd платформы имеют тип "platform", в свойстве liveCount можно указать число тиков (1/60 секунды) через которое платформа обвалится если на неё встанет игрок. Если не указано или равно нулю, то платформа не обваливается.
Если задано ненулевое свойство stepCount, то платформа будет ездить такое число тиков вперед, а потом назад в бесконечном цикле со скоростями по вертикали и горизонтали указанными в свойствах vx и vy соответственно. Скорости указываются в 1/256 частях пикселя за тик. То есть если в vy=0, vx=16 а в stepCount=1024, то платформа будет ехать со скоростью 60*16/256=3,75 пикселей в секунду 16*1024/256=64 пикселя вправо, а потом столько же влево и так в цикле. Положительные значения скоростей начинают перемещение вправо или вниз, а отрицательные - влево или вверх, смотря какая ось.

Правка: 3 мая 2018 10:23

=A=L=X=Постоялецwww9 мая 201810:07#111
Словил таки мощный и конкретный баг похоже что вызванный порчей стека.
Так как фигачится всё в эмуляторе консоли и никаких средств отладки кроме вывода на экран нет и в помине, то попа полная, доброкачественная.

Изображение

*Lain*Пользовательwww9 мая 201810:10#112
=A=L=X=
Значит пришло время добавить отладчик в эмулятор. Вон всякие досбоксы и прочие - добавили
=A=L=X=Постоялецwww9 мая 201810:13#113
*Lain*

Единственные средства отладки которые я видел в эмуляторах это дизассемблеры. Мягко говоря ни о чём - ни понять в каком месте программа выполняется, ни какие строки кода выполняются, полная жесть.

*Lain*Пользовательwww9 мая 201810:21#114
=A=L=X=
Тебе надо написать декомпилятор)
=A=L=X=Постоялецwww9 мая 201812:58#115
Блин, жесть, такой вот код:
  char buf[ 64 ];
  char *tmp = buf;
  tmp = str2buf( "\nfall: ", tmp );
  tmp = int2hex( (unsigned int)spriteDescFalling, tmp );
  tmp = str2buf( "\nlie : ", tmp );
  tmp = int2hex( (unsigned int)spriteDescLying, tmp );

  /*
  tmp = str2buf( "\ngfall: ", tmp );
  tmp = int2hex( (unsigned int)&commonCorpseFalling, tmp );
  tmp = str2buf( "\nglie : ", tmp );
  tmp = int2hex( (unsigned int)(&commonCorpseLying), tmp );
  */

  fatalError( buf );
отрабатывает нормально - fatalError останавливает все процессы с выводом сообщения об ошибке, в данном случае значения указателей.
но стоит только раскомментировать второй блок (можно закомеентировав первый), то происходит какой то сегфолт, всё просто встаёт колом или ресетится.
то есть просто даже попытка взять адреса глобальных переменных (хранят списки спрайтов для отрисовки) приводит к какому то сегфолу.
при этом spriteDescFalling и spriteDescLying это локальные поля объекта куда из другого куска кода передаются... именно эти же адреса/указатели.
у меня уже такие мысли шевелятся, что это какой то косяк линковки, но скорее всего это конечно не так...

Правка: 9 мая 2018 12:59

emptiness_rainУчастникwww9 мая 201813:24#116
=A=L=X=
Мало информации, описал бы что, какая функция должна делать, какие данные должна принимать, че отдавать.
Есть шанс что в этот момент тебя и озарит)
=A=L=X=Постоялецwww9 мая 201816:10#117
emptiness_rain
> Мало информации, описал бы что, какая функция должна делать, какие данные
> должна принимать, че отдавать.

Да это просто вывод переменных на экран. При попытке прикоснуться к адресам глобальных переменных происходит краш. Даже не к самим переменным, а просто взятие их адресов (!). И это при том, что выше по коду в том же модуле эти адреса в виде указателей передаются спокойно в этот же код и их копии в spriteDescFalling/Lying спокойно выводятся этим же кодом выше.
Жопа короче.

Правка: 9 мая 2018 16:11

eMan.LivedПостоялецwww9 мая 201816:16#118
Крашится даже это?
unsigned int addr = (unsigned int)&commonCorpseFalling;

Правка: 9 мая 2018 16:17

=A=L=X=Постоялецwww9 мая 201816:23#119
eMan.Lived
> unsigned int addr = (unsigned int)&commonCorpseFalling;

Такой код выпилится оптимизатором, поэтому такая вариация:

  unsigned int addr = (unsigned int)&commonCorpseFalling;
  this->takeDamage( addr, nullptr );
ресетит машину.
takeDamage наследуется от общего предка и его тело пусто.

Страницы: 17 8 9 1013 Следующая »

/ Форум / Флейм / ПроЭкты

2001—2018 © GameDev.ru — Разработка игр