воскресенье, 29 января 2012 г.

Numpty Physics: PSP порт. Часть 1

    Numpty Physics - интересная логическая игра, цель которой собрать все желтые звездочки на уровне. Но "брать" их способны лишь красные объекты, которые способны двигать только что нарисованные игроком различные фигуры. Нарисованные фигуры ведут себя по всем законом физики, благодаря физическому движку Box2D. Для вывода графики игра использует библиотеку SDL.


    Порт на Motorola EM30 был сделан достаточно быстро, картинка уменьшалась с исходных 800х480 до 320х240 и выводилась на экран. Для симуляции курсора был добавлен свой SDL_PollEvent, в котором кнопки 2,4,6,8 отвечали за движение, а 1 и 3 - за левый и правый клик.

    С PSP по простому не получилось. Хотя на нее и есть порт SDL, стабильностью он не отличается, да и сколько я не пытался, так и не удалось заставить его работать. В связи с этим  было решено полностью отказаться от SDL, переписать движок игры таким образом, что-бы вся картинка рендерилась в битмап, а затем это все копировать в фрэймбуффер.

    Но из-за сложности кода (по 3 - 4 класса в одном файле) было решено произвести рефакторинг кода, все классы разместить по одному в своем файле (.cpp), также сделать заголовочные файлы (.h).

    Примерный ход действий:
  1. Рефакторинг;
  2. Замена SDL специфичных функций своими, платформонезависимыми;
  3. Собрать работающую (в том виде, в каком будет) версию для PSP, отсчитать 100 кадров, записать битмап в файл, если все нормально, двигаться дальше;
  4. Рендеринг, работа кнопок;
    Вот и все действия, сейчас я нахожусь на 1.

4 комментария:

  1. Я в нее кажется на simbian'е играл.
    А графика там в картинках хранится или генерируется?

    ОтветитьУдалить
    Ответы
    1. Да, на Symbian ее портировал Summeli.
      Картинка там одна, для фона. Остальные объекты загружаются из файла-уровня, на их основе создаются объекты для физического движка. Рендерится все линиями, координаты которых выдает движок.

      Удалить
    2. Движок сам высчитывает координаты в зависимости от размера экрана?

      Удалить
    3. Размер экрана там фиксированный 800х480, все объекты, которые попадают за пределы экрана удаляются (но сложные объекты могут состоять из нескольких линий, в таком случае удаляются линии). Сейчас изменил размер уровня в движке на 512х272, старые уровни придется переписывать, т.к. большинство объектов при создании уже находятся за пределами экрана. Хотя можно при создании уровня пересчитать координаты, так и сделаю.
      x=x*(512/800);
      y=y*(272/480);

      Удалить