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

Contra Force Advance (8 стр)

Страницы: 17 8 9 1017 Следующая »
#105
10:18, 16 фев. 2018
monobogdan
Неужели так трудно прочесть нулевой пост, там ответы на все вопросы.

#106
(Правка: 10:35) 10:31, 16 фев. 2018

=A=L=X=
Причем тут эмулятор?
Ты сам говорил что у тебя рендерер кроссплатформенный и ничего не мешает его портировать на другие платформы.
Что мешает написать реализацию рендерера PS1 и просто скомпилировать игру тулчейном PS1?

в неё уже можно играть без изменений на огромном числе платформ от андроида до nintendo virtual console

Я имел ввиду чтобы игра спокойно собиралась на этих платформах, а не эмуляторы.
#107
(Правка: 10:45) 10:44, 16 фев. 2018

monobogdan
> у тебя рендерер кроссплатформенный и ничего не мешает его портировать на другие
> платформы
Нет,  я сказал только, что можно взять образ игры и играть на почти всех современных платформах - через эмуляторы конечно же.
Поэтому я не имею никакого интереса заморачиваться полным переписыванием рендера, звука, опроса клавиш и т.п.

#108
(Правка: 15:35) 15:35, 14 мар. 2018

=A=L=X=
Как ты там вообще сидишь(на gbx)?
Там же одни олдфаги не адекватные, тему в флейм превратили.

#109
(Правка: 4:43) 4:22, 22 мар. 2018

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

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

#110
(Правка: 10:23) 10:22, 3 мая 2018

Внедрил коллизии, касания и платформы. Обваливающиеся, ездящие и комбинации.

В 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 пикселя вправо, а потом столько же влево и так в цикле. Положительные значения скоростей начинают перемещение вправо или вниз, а отрицательные - влево или вверх, смотря какая ось.

#111
10:07, 9 мая 2018

Словил таки мощный и конкретный баг похоже что вызванный порчей стека.
Так как фигачится всё в эмуляторе консоли и никаких средств отладки кроме вывода на экран нет и в помине, то попа полная, доброкачественная.

Изображение
#112
10:10, 9 мая 2018

=A=L=X=
Значит пришло время добавить отладчик в эмулятор. Вон всякие досбоксы и прочие - добавили

#113
10:13, 9 мая 2018

*Lain*

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

#114
10:21, 9 мая 2018

=A=L=X=
Тебе надо написать декомпилятор)

#115
(Правка: 12:59) 12:58, 9 мая 2018

Блин, жесть, такой вот код:

  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 это локальные поля объекта куда из другого куска кода передаются... именно эти же адреса/указатели.
у меня уже такие мысли шевелятся, что это какой то косяк линковки, но скорее всего это конечно не так...
#116
13:24, 9 мая 2018

=A=L=X=
Мало информации, описал бы что, какая функция должна делать, какие данные должна принимать, че отдавать.
Есть шанс что в этот момент тебя и озарит)

#117
(Правка: 16:11) 16:10, 9 мая 2018

emptiness_rain
> Мало информации, описал бы что, какая функция должна делать, какие данные
> должна принимать, че отдавать.

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

#118
(Правка: 16:17) 16:16, 9 мая 2018

Крашится даже это?

unsigned int addr = (unsigned int)&commonCorpseFalling;

#119
16:23, 9 мая 2018

eMan.Lived
> unsigned int addr = (unsigned int)&commonCorpseFalling;

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

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

Страницы: 17 8 9 1017 Следующая »
ФлеймФорумПроЭкты