powersnake - пререлиз ;) (простая SDL игра, но с графикой Ayo)

Нативные и в Wine/Cedega - проблемы, настройка, обсуждение

Модератор: Модераторы разделов

Аватара пользователя
powerfox
Сообщения: 458

powersnake - пререлиз ;)

Сообщение powerfox »

На днях часть кода, жуть, сколько нашёл там бреда(неужели это я писал?). Игра очень проста, но благодаря графике Ayo(73lab.com), в ней есть нечто, делающее её особенной. Можно вставить в привод по умолчанию муз. диск, тогда при запуске игры с него будет воспроизводиться музыка. Если хочется, замените ./sounds/bg.wav - при отсутствии диска музыка воспроизводится оттуда.



Прикреплённые далее файлы добавлять в исходник не надо!

Скачать исходник

rpm для Mandriva 2006

deb пакет!

rpm для OpenSUSE

Скорее всего, rpm от Mandriva 2006 заработает на 2005, если будут неразрешённые зависимости:

Код: Выделить всё

su
rpm -ivh --nodeps --force powersnake-0.9pretry3-1pfox.i586.rpm
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Исправил несколько багов. Ссылку изменил.
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: powersnake - пререлиз ;)

Сообщение Shura »

ну а скриншотик хотябы...
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Сейчас(в течении 5 минут) сделаю + загружу нормальную версию.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

<...>
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Хм... А где вышеознаеченный driver.cpp? И, кстати, у меня с SEGFAULT вывалилось... Обидно... :(
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Наверное, забыл нажать "добавить". Прикрепляю(естественно, txt нужно убрать из имени)
Предыдущая версия тоже не должна падать. Какая у вас версия SDL(можно проверить, используя "sdl-config --version"?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Тэкс, файл обновил - всё равно падает. Я потом покручу, посмотрю на чём. Версия SDL - 1.2.8 (Mandriva 2006 LinuxCenter Edition 1DVD). Если чего накопаю - сообщу.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Старый код я собирал на Mandriva 2006(только PowerPack), всё работало + SDL там нормальная версия. Может глючить из-за компилятора. А вы не сможете посмотреть дебугером, где приложение падает, был бы очень благодарен?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Да зачем дубаггером - я и сам всё понял.

Вот мои изменения в main:

Код: Выделить всё

//SDL_TimerID move_timer_id = SDL_AddTimer(speed, move, move_callback_param);
//SDL_TimerID clock_timer_id= SDL_AddTimer(one_second,clock,clock_callback_param);


 for(;;)
 {
    SDL_Delay(speed);
    move(speed,0);
    clock(speed,0); // Это вместо таймеров.
 };

 //SDL_RemoveTimer(move_timer_id);
 //Тут, кстати, у вас ещё не хватает "SDL_RemoveTimer(clock_timer_id);"


Просто таймеры выполняются в своих собственных нитях (процессах, если нет нитей), а их нужно синхронизировать (семафоры там всякие и т.д.). Но в случае вашей игры (да и большинства других игр) можно сделать так, как сделал я, только поприличнее - я так, пропатчил на скорую руку. Так у меня работает, но, боюсь, не очень корректно (clock() должна, судя по всему, вызываться раз в секунду). Да и SDL_Delay() в зависимости от ОС может работать с погрешностями +-10-20 милличекунд. Поэтому часто действия в игре привязывают ко времени. Да и, кстати, пустой бесконечный цикл в игре - это тоже зло. В таких циклах ВСЕГДА нужно использовать хоть какой, но SDL_Delay (что приводит, обычно, к системному вызову sleep()). Винду, например, от таких циклов крючит (98 точно, причём сильно. XP в меньшей мере, да и линукс тоже не шибко такое любит).
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 15 2006, в 23:52) писал(а)://Тут, кстати, у вас ещё не хватает "SDL_RemoveTimer(clock_timer_id);"

Всё, что стоит за бесконечным циклом не будет выполнено ;) Поэтому у меня выход идёт через gameover(), где удаляются оба таймера и закрывается воспроизведение музыки.
(powerfox @ Jun 15 2006, в 23:31) писал(а):clock(speed,0); // Это вместо таймеров.

При таком подходе, каждая последующая функция зависит от скорости выполнения вышестоящих. Причём move() вызывает неповоротливую функцию makefood(). Таймеры и бесконечный цикл(либо цикл с флажком, который меняется на false в конце) наиболее часто используются в играх.
Задержка не так явно отражает суть происходящего. Я думаю(точнее уверен), что дело не в цикле, а в чём-то другом. Попробуйте в Makefile убрать -O3.

Segfault выдаётся при обращении за пределы памяти.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

И, кстати, почему пингвинов в игру кушают? Птичку жалко... ;)

PS: Да пробовал, пробовал O2 - падает. Точно вам говорю, из-за неправильного использования таймеров. IMHO, их вообще лучше не пользовать. И выходы за границы памяти при работе с несинхронизированными нитями - это радость и головная боль всех, кто с ними работает, не понимая что это такое. А в SDL таймеры именно так и реализованны - даже в доке по этому поводу что-то написано было (причём под Линуксом - даже, кажется, отдельными дочерними процессами - радость ещё та :)).

PPS: Падает в draw.cpp -> print_time(). Причём в TTF_RenderText_Blended(). Самое простое решение - НЕ пользуйте таймеры. Ну плохо, плохо они в SDL реализованны. Да и нитей под линуксом до последнего времени нормальных не было.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 16 2006, в 00:09) писал(а):И, кстати, почему пингвинов в игру кушают? Птичку жалко...

Их не кушают, а собирают. :)
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

А, понятно... :) Предидущий пост подправил - там более подробно моё мнение расписано по поводу таймеров.

А, ну да... Или print_time() вызывайте вне таймера - так тоже работает. :) В нём вся загвоздка.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 16 2006, в 00:25) писал(а):А, ну да... Или print_time() вызывайте вне таймера - так тоже работает. В нём вся загвоздка.

Оба таймера должны работать нормально... :)
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Во нафлудили... Но не суть. Нормально или нет - будут новые версии - буду для себя патчить. :D
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Я думаю, что вы правы относительно SDL таймеров. Интересно, а так заработает(новый draw.cpp) с моим driver.cpp(у меня пашет)?

Alxn1, сейчас мельком просмотрел исходники SDL:

Код: Выделить всё

...
static int RunTimer(void *unused)
{
    while ( timer_alive ) {
        if ( SDL_timer_running ) {
            SDL_ThreadedTimerCheck();
        }
        SDL_Delay(1);
    }
    return(0);
}
...


Таймеры(как и следовало ожидать) реализованы через SDL_Delay, так что, в принципе, всё равно, что использовать... Практически один набор проблем.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Нет, всё так же. Синхронизация не помогла. Определённо, там ещё траблы в том, что происходит обращение к графике из дочернего процеса (в котором таймер запущен), а он доступа с ней не имеет, или что-то там не реинтерабельное. Лучше, IMHO, эту функцию вызывать раз или три в секунду из бесконечного цикла for, и в нём же SDL_Delay поставить - это просто для того, чтобы систему бесконечными циклами не грузить - не всякой системе, повторяюсь, это нравится - под 98-й виндой даже мышь переставала иногда отзываться.

Да, это здорого, что в бесконечном цикле внутри SDL стоит SDL_Delay - это даёт продых остальным процессам. Вот только сама эта функция вызывается из ДРУГОГОЙ нити, как минимум. А, часто, и из другого процесса, правда дочернего. Как доказательство - как иначе бы это работало, если ваша программа состоит из одного бесконечного цикла? Да и смотрю сейчас на исходники - одни нити... Вот в них и проблемма:

Код: Выделить всё

/* This is only called if the event thread is not running */
int SDL_SYS_TimerInit(void)
{
        timer_alive = 1;
        timer = SDL_CreateThread(RunTimer, NULL); // <- Тут создаётся нить!
        if ( timer == NULL )
                return(-1);
        return(SDL_SetTimerThreaded(1));
}


В общем, тема, как кажется закрыта. По-моему доходчиво обьяснил в чём проблеммы. Ждём новых версий! :)
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Я всё это понимаю, просто при использовании Delay для самого движения и *Timer для часов вполне может возникнуть ситуация, когда возникнет одновременное обращение к функции вывода шрифтов. Попробую посмотреть в чём дело(на ранних этапах SDL_ttf тоже часто было источником ошибок). Меня больше всего интересует, почему у вас не работает, а у меня работает, SDL одной версии, компилятор тоже не должен таких различий вызывать. Может быть у вас машина быстрее, поэтому и вызовы на библиотеку идут одновременно. Попросил друга посмотреть, у него Mandriva 2006 PowerPack на Pentium D 3000(930). Сегодня, наверное, поставлю Мандриву и соберу rpm.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Выложил немного подправленную версию, пока ещё с использованием таймеров.
http://powersnake.narod.ru/powersnake-0.9pre1try3.tar.bz2

В первом сообщении подправил линк.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

powerfox писал(а):
16.06.2006 15:30
Я всё это понимаю, просто при использовании Delay для самого движения и *Timer для часов вполне может возникнуть ситуация, когда возникнет одновременное обращение к функции вывода шрифтов. Попробую посмотреть в чём дело(на ранних этапах SDL_ttf тоже часто было источником ошибок). Меня больше всего интересует, почему у вас не работает, а у меня работает, SDL одной версии, компилятор тоже не должен таких различий вызывать. Может быть у вас машина быстрее, поэтому и вызовы на библиотеку идут одновременно. Попросил друга посмотреть, у него Mandriva 2006 PowerPack на Pentium D 3000(930). Сегодня, наверное, поставлю Мандриву и соберу rpm.


А кто его знает, почему у меня падает. Может и из-за скорости моего компа. А может, звёзды так легли. :D Сегодня вечером новую версию дома попробую (на работе под Windows-ом сижу). :)
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 16 2006, в 15:47) писал(а):А кто его знает, почему у меня падает. Может и из-за скорости моего компа. А может, звёзды так легли.

Больше склоняюсь к звёздам, а за скорость компа... сказанул :)
Падает из-за gcc-4*. 100%, когда собирал, пробовал в Mandriva и в OpenSUSE(gcc-4.0.2). Только ребята из Mandriva оставили gcc-2.96, спасибо им за это, а сусовцы... В общем 2.96 всё собирает, и после него всё работает.
Собрал 2 rpm, для Mandrake/Mandriva и SUSE. Всё работает нормально.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Да? Странно... gcc2.96 ставить всё равно не буду. :) А с gcc так это да, на 4-ке половина старого софта не компилируется. Сам свои проги не все собрать за просто так сумел. :)

Последняя версия вашей игры, кстати, тоже падает. Хотя вам, наверное, это уже известно, раз вы разобрались в чём дело. Однако я всё равно думаю о том, что таймеры в SDL - ещё та гадость в плане реализации для Linux. Причём, что интересно, для Windows там, вроде, поприличнее. Ну да это всё моё мнение. :)

PS: Да, и кстати, в играх редко таймер используется, как и нити - только если для проигрывания музыки/звуков. Обычно SDL_Delay() да SDL_GetTicks() пользуются. Или их аналогами, если SDL не используют.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 16 2006, в 23:25) писал(а):Да? Странно... gcc2.96 ставить всё равно не буду. А с gcc так это да, на 4-ке половина старого софта не компилируется. Сам свои проги не все собрать за просто так сумел.

Почему, в Mandriva 2006 он есть. Причём "gcc" и "g++" не перезаписываются, будет g++-2.96. Иначе будет падать. Скачайте rpm + поставьте без зависимостей, всё будет работать.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

powerfox писал(а):
16.06.2006 23:34
(Alxn1 @ Jun 16 2006, в 23:25) писал(а):
Да? Странно... gcc2.96 ставить всё равно не буду. А с gcc так это да, на 4-ке половина старого софта не компилируется. Сам свои проги не все собрать за просто так сумел.

Почему, в Mandriva 2006 он есть. Причём "gcc" и "g++" не перезаписываются, будет g++-2.96. Иначе будет падать. Скачайте rpm + поставьте без зависимостей, всё будет работать.


Да ладно, я всё равно всё пропатчил уже, причём правильно. Работает! Очень даже ничего, мне нравится. :) А два компилятора в системе, IMHO, не нужно.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Не знаю, 4* многое не собирает, например, mplayer.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

powerfox писал(а):
16.06.2006 23:47
Не знаю, 4* многое не собирает, например, mplayer.

Да ладно :blink: Я собирал, даже работало. :blink: Странно... Но вот проблемм с ней, с 4-кой, это да - много, зато она последним стандартам, вроде, пытается следовать, что приятно. А то, что немного где-то не работает - так всё поправить можно, главное не лениться и не парится! :D
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

Alxn1, я прикинул, в следующей версии с меню(1.0) сделаю SDL_Delay в цикле для движения и таймер для часов, это разгрузит main(). Ещё можно использовать для вектора итераторы, а не индекс - вроде бы работает быстрее(правда, я почти не использовал их). Но следующая версия бедет только к концу месяца: экзамен + выпускной... :(.
P.S. у меня с 4* configure не находил компилятор, это в принципе легко исправить, но лень. К тому же, если на таком маленьком приложении появляется Segfault, то на большом... Вы собирали Mplayer 1.0pre7try2?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: powersnake - пререлиз ;)

Сообщение Alxn1 »

Удачи на экзаменах! И нормально провести выпускной! :)

Насчёт Mplayer1.0pre7try2 не помню, но вроде она и стояла раньше. Всё компилилось и работало - я этот MPlayer всю жизнь из исходников ставил, никаких пакетов. Да и не было их раньше. Сейчас стоит try8 - тоже нормально собралось и работает. GCC 4.0.1.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: powersnake - пререлиз ;)

Сообщение powerfox »

(Alxn1 @ Jun 17 2006, в 01:57) писал(а):Удачи на экзаменах! И нормально провести выпускной!

Спасибо!
Добавил deb пакет.
Спасибо сказали: