LINUX.ORG.RU
ФорумGames

Luxor 3


0

0

Скачал Luxor 3 ( http://zloyteam.com/news/2007-10-21-62 ), работает отлично, за исключением анимации шариков - постоянно изображение дергается. У кого нибудь есть идеи, как от этого избавиться?

anonymous

Wine 1.1.6, Ubuntu 8.04 Если быть точнее -- анимация шариков постоянно "дрожит", похоже, будто кадры анимации идут не по порядку и сменяются слишком быстро.

anonymous
()
Ответ на: комментарий от anonymous

Я тоже себе скачал эту игру, она мне показалась довольно симпатичной. Анимация шаров у меня тоже несколько "быстрая". Мне показалось, что шары либо крутятся слишком быстро, либо попросту пропускают кадры, причем второе вероятнее. Я запускал Luxor на Linux Slackware 12.1, версия wine - 1.1.2, видеокарта NVidia GeForce MX440 с проприетарными драйверами.
Для того, чтобы улучшить производительность, я поменял в опциях Fullscreen на Window и уменьшил разрешение с 1024х768 на 800х600. При запуске из WindowMaker в полноэкранном режиме почему-то остался виден Dock, а при запуске из KDE заметно было, что изображение рисуется чересстрочно и неприятно мерцает. Разрешение в оконном режиме на производительность влияет мало.
Для того, чтобы избавится от неприятного эффекта, который производят катящиеся шарики, я решил воспользоваться решением, выбранным создателями игры Zuma Deluxe. Там, при выключенной опции "3D Hardware Acceleration" просто не показывается анимация шариков и по экрану просто движутся неподвижные спрайты. Причем я это даже не сразу заметил и на общее впечатление это игрового процесса это никак не влияет! Поэтому я решил просто выбрать более-менее подходящий српайтик и заменить этим изображением все остальные, чтобы движующиеся шарики не резали глаза.
Далее я написал скрипт, который выполняет описанную мной выше функциональность. Вам нужно будет только изменить переменную LUXOR_PATH, которая указывает местоположение игры. Но прежде чем запускать, убедитесь в том, что сделана резервная копия игры если что-то вдруг пойдет не так.

Краткое описание:
Нужно зайти в каждую из девяти директорий, содержащихся в четырех категориях и там выбрать один файл в качестве образца. Содержимое этого файла копируется во все файлы, содержащиеся в этой директории.
Алгоритм:
1) Путь с игрой пользователь в переменной LUXOR_PATH. Затем мы собираем путь из четырех частей: LUXOR_PATH + GFX_PATH (путь к графическим данным) = BASE_PATH.
Две остальных части собираются из двух массивов: категории и цвета шара (BALL_CATEGORY и BALL_COLOR соответственно), значения которых добавляются в BASE_PATH.
2) Когда мы вошли в нужную нам директорию, мы:
а) проверяем какой файл там есть - ball0015.png или ball_0015.png, используя для этого шаблон VERIFICATION. Если нужный файл найден, мы переписываем его содержимое в файл образца (SAMPLE_FILE). ВНИМАНИЕ! Если файл не найден, мы немедленно завершаем программу, т.к. при дальнейшей работе в файл образца будет записано ноль байт и этим содержимым заполнится все файлы в директории;
б) мы находим все файлы, удовлетворяющие шаблону *.png и создаем файл, в каждой строчке которого записана команда cat pattern > file.png (где file.png - найденный файл). Затем временный файл становится исполняемым, мы выполняем его из текущего места, после чего удаляем образец и инструкции для выполнения (SAMPLE_FILE и TEMP_FILE);
в) цикл повторяется. Скрипт переходит в следующий каталог до тех пор, пока не "обойдет" все цвета и все категории, указанные в массивах BALL_COLOR и BALL_CATEGORY.

----------------------------------------------------------------------
#!/usr/bin/bash
LUXOR_PATH="/home/eugene/games/Luxor 3"
GFX_PATH="/data/gfx"
BASE_PATH=$LUXOR_PATH$GFX_PATH
CTG_MAX=3
BALL_CATEGORY=(balls balls_energy balls_glass balls_wood)
CLR_MAX=8
BALL_COLOR=(black blue green orange pink red teal white yellow)
SELECTED_FILE1="ball0015.png"
SELECTED_FILE2="ball_0015.png"
VERIFICATION="ball*15.png"
SAMPLE_FILE=sample
TEMP_FILE=temp
for ((ctg=0; ctg <= $CTG_MAX; ctg++))
do
#echo "${BALL_CATEGORY[$ctg]}"
for ((clr=0; clr <= $CLR_MAX; clr++))
do
#echo "${BALL_COLOR[$clr]}"
CURRENT_PATH=$BASE_PATH/"${BALL_CATEGORY[$ctg]}"/"${BALL_COLOR[$clr]}"
cd "$CURRENT_PATH"
case $( ls $VERIFICATION ) in
$SELECTED_FILE1 ) SELECTED_FILE=$SELECTED_FILE1 ;;
$SELECTED_FILE2 ) SELECTED_FILE=$SELECTED_FILE2 ;;
* ) break ;; #If it is another file it will erase all!
esac
cp $SELECTED_FILE $SAMPLE_FILE
find -name "*.png" -exec echo "cat $SAMPLE_FILE >" {} \; > $TEMP_FILE
chmod +x $TEMP_FILE
./$TEMP_FILE
rm $TEMP_FILE $SAMPLE_FILE
done
done
exit 0
------------------------------------------------------------------------

P.S. Вообще, данные упражнения - хороший повод изучить/повторить программирование на командном интерпретаторе. Очень буду рад конструктивной критике.

Astyanax
()
Ответ на: комментарий от Astyanax

Еще немного комментариев:
1) При вставке поехало форматирование (перевставлять уже не буду, там того форматирования раз, два и обчёлся).
2) Забыл удалить свои комментарии с "echo"
3) Для *.png нужно тоже прописать в начале переменную, чтобы не было "магических строковых констант"
4) Можно обойтись и без создания временных файлов. Я где-то видел еще один способ, но, чтобы было быстрее, взял данные из своего старого скрипта.

Astyanax
()
Ответ на: комментарий от Astyanax

Спасибо за скрипт и за подсказку. Мне почему-то даже в голову не пришло, что анимация может храниться в простых картинках png :)

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

#!/bin/bash
LUXOR_PATH="/home/user/games/Luxor 3"
GFX_PATH="/data/gfx"
BASE_PATH=$LUXOR_PATH$GFX_PATH
CTG_MAX=2
BALL_CATEGORY=(placeables/Apep/apep_idle_01 placeables/Geb reflector/idle)
SELECTED_FILE1="idle_0002.png"
SELECTED_FILE2="goose_night_idle_0001.png"
SAMPLE_FILE=sample
TEMP_FILE=temp
for ((ctg=0; ctg <= $CTG_MAX; ctg++))
do
CURRENT_PATH=$BASE_PATH/"${BALL_CATEGORY[$ctg]}"
cd "$CURRENT_PATH"
case $( ls $SELECTED_FILE1 ) in
$SELECTED_FILE1 ) SELECTED_FILE=$SELECTED_FILE1 ;;
* ) case $( ls $SELECTED_FILE2 ) in
$SELECTED_FILE2 ) SELECTED_FILE=$SELECTED_FILE2 ;;
* ) echo "wrong file" && break ;; #If it is another file it will erase all!
esac
esac
cp $SELECTED_FILE $SAMPLE_FILE
find -name "*idle_00*.png" -exec echo "cat $SAMPLE_FILE >" {} \; > $TEMP_FILE
chmod +x $TEMP_FILE
./$TEMP_FILE
rm $TEMP_FILE $SAMPLE_FILE
done
exit 0

Да, с case'ами я конечно намутил, просто скопипастил по-быстрому, лень было заниматься оптимизацией. :)

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за доработку, теперь играть стало еще приятнее :)

Нужно будет его еще потом немного доделать, т.к. если пройтись по пункту "How to play" можно найте еще несколько "дергающихся" анимаций (желтой мумии, паука и еще кого-то). Будет свободная минутка - соединю два этих скрипта в один, добавлю исправления, информационные сообщения (спасибо, что напомнили) и можно будет выкладывать на winehq database (http://appdb.winehq.org/objectManager.php?sClass=version&iId=10607), а то у них по ссылке подозрительно все хорошо работает :)

Astyanax
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.