SkyRiver Forum
http://forum.skyriver.ru/

Механоиды 2D
http://forum.skyriver.ru/viewtopic.php?f=26&t=3932
Страница 1 из 7

Автор:  Krogoth [ Пн 11 июл 2011 1:55 ]
Заголовок сообщения:  Механоиды 2D

О концепции много рассказывать не буду. Пока что в планах просто продвинутая стрелялка. Вот скриншот:
Изображение
Скриншот наглядно демонстрирует, что пока что почти ничего не сделано (тем не менее над тем, что уже сделано, я старался), но версию я выложил для того, чтобы вы опробовали:
1. насколько вам нравится управление. У меня, например, есть проблемы с зажатием клавиш. Вот клавиши:
- вверх, вниз - вперед, назад;
- влево, вправо - влево, вправо;
- Q, E - слайд влево, слайд вправо;
- SPACE - прыжок (само нажатие немножко инертно, но это потом исправлю);
- CTRL - огонь (меня включительно интересует, есть ли проблемы с правым CTRL).
Реализовано элементарное перепрыгивание глайдера, но не более того. Столкновения пока что реализованы достаточно убого. Кстати, вражеский глайдер неуничтожим.
2. очевидные утечки, если они есть. Если вы вдруг заметите, что ваш комп начинает виснуть, это значит, что я где-то наплужил.
3. в Data лежит Game.cfg. Это - игровые настройки. Названия параметров, я думаю, достаточно ясно описывают значения, поэтому можно осознанно что-нето подкрутить.
4. неплохо, если кто-то знает, где можно взять хорошие спрайты для взрывов.

Скачать.

На семерке скорее всего не пойдет, но, может, и пойдет (во всяком случае, щупайте совместимость). Сейчас работаю под ХР, на семерку перекомпилю, когда будет что-то посерьезнее.
Надеюсь, что тестеры найдутся, потому что мне в будущем надо будет много тестеров.

(Пост обновлен)
Тестовая версия 2:
- полная,
- дополнительный модуль,

- exe-файл для Windows 7. (могут быть глюки)

Автор:  Shaman [ Пн 11 июл 2011 2:44 ]
Заголовок сообщения: 

Krogoth писал(а):
О концепции много рассказывать не буду. Пока что в планах просто продвинутая стрелялка.
Если хорошо будет идти, то продвинутая стрелялка обрастёт торговалкой, и в итоге может кончится стратежкой/экономическим симулятором. Маны тебе! :supercool:
Krogoth писал(а):
Скриншот наглядно демонстрирует, что пока что почти ничего не сделано
А по мне, так начать - пол дела сделано. Уже зашибато. Уже впечатляет.
Krogoth писал(а):
1. насколько вам нравится управление.
Ну разумеется оно не нравицца! Мышу можешь обрабатывать? Если да, то предлагаю на стрелки забить вперёд-назад и стрейфы, повороты - на мышку. Если юзер двинул мышь вправо/влево на Х пикселов, глайдер повернулся на s*X градусов. То, что управление идёт относительно текущей ориентации глайда, а не монитора, вполне сносно - как машинкой на радиоуправлении управлять. Пара минут привыкания - и ты в глайдере. Тут ОК.
Стрельбу на левую мышу забубень. Прыжок желательно на правую мышу, если не собираешься её под Тяжёлое оружие забивать.

Автор:  Krogoth [ Пн 11 июл 2011 2:48 ]
Заголовок сообщения: 

Шаман писал(а):
Если юзер двинул мышь вправо/влево на Х пикселов, глайдер повернулся на s*X градусов.
Хм, действительно. Это же очевидное решение, но как-то мне и в голову не пришло. :shock:

Автор:  Shaman [ Пн 11 июл 2011 2:49 ]
Заголовок сообщения: 

Кстати, насчёт анимации взрыва. Мне показалось, что последний кадр анимации взрыва рисуется первой картинкой (последним виден ровный яркий кружок после затухающего черного облачка). Проверь - баг, походу.

Автор:  Krogoth [ Пн 11 июл 2011 2:51 ]
Заголовок сообщения: 

Шаман писал(а):
Кстати, насчёт анимации взрыва. Мне показалось, что последний кадр анимации взрыва рисуется первой картинкой (последним виден ровный яркий кружок после затухающего черного облачка). Проверь - баг, походу.
У меня нема. Поставь в конфиге DELTA_TIME, скажем, 100, так будет нагляднее.

Автор:  Shaman [ Пн 11 июл 2011 2:54 ]
Заголовок сообщения: 

Просьба есть: если просто ехешник допиливаешь, то только его и заливай - а то 3+ метра качать каждый раз... :oops: А своего сайта у тебя нет, чтоб туда заливать? А то файлфронт такой рекламно-тормозно-вируснявый... :angel:

Добавлено спустя 1 минуту 43 секунды:

Krogoth писал(а):
У меня нема. Поставь в конфиге DELTA_TIME, скажем, 100, так будет нагляднее.
Да, стопудово уверен теперь: первый и последний кадр анимации взрыва одинаковые. Ищи баг. :tongue:

Автор:  Krogoth [ Пн 11 июл 2011 2:57 ]
Заголовок сообщения: 

Ок, создам свое ftp.

Добавлено спустя 44 секунды:

А чо оно это слово ссылкой обозначило? O_o

Добавлено спустя 18 секунд:

А-а-а...

Добавлено спустя 1 минуту 4 секунды:

Шаман писал(а):
Да, стопудово уверен теперь: первый и последний кадр анимации взрыва одинаковые. Ищи баг.
А вот это уже СТРАННО, ибо у меня нету.

У тебя, кстати, винда какая?

Автор:  Shaman [ Пн 11 июл 2011 2:58 ]
Заголовок сообщения: 

У меня винда работающая, точнее Х.Работающая. :mrgreen: Ты не к винде цепляйся. Код вываливай - авось я узрею криворукость твою? :shock:

Автор:  Krogoth [ Пн 11 июл 2011 3:02 ]
Заголовок сообщения: 

По идее у тебя еще должен быть глюк с картинкой глайдера, когда он 0 градусов проходит.

Код отрисовки спрайта:
Код:
void DrawSprite(const uint MaskId, uint n, const double UnitSize)
{
    const uint N = sqr(SpriteDeg[MaskId]);
    //Filter
    if (n > N)
        n -= N * int(n / N);

    uint X, Y;
    if (n <= SpriteDeg[MaskId])
    {
        X = n;
        Y = 1;
    }
    else
    {
        X = n % SpriteDeg[MaskId];
        Y = int(n / SpriteDeg[MaskId]);
        if (X == 0)
            X = SpriteDeg[MaskId];
        else
            Y++;
    }

    X--;
    Y = SpriteDeg[MaskId] - Y;
    const double SpriteSize = 1. / SpriteDeg[MaskId];
    //Mask
    glBlendFunc(GL_DST_COLOR, GL_ZERO);
    glBindTexture(GL_TEXTURE_2D, Texture[MaskId]);
    glBegin(GL_QUADS);
        //4 3
        //1 2
        glTexCoord2f( X      * SpriteSize,  Y      * SpriteSize);
            glVertex2f(-UnitSize, -UnitSize);
        glTexCoord2f((X + 1) * SpriteSize,  Y      * SpriteSize);
            glVertex2f( UnitSize, -UnitSize);
        glTexCoord2f((X + 1) * SpriteSize, (Y + 1) * SpriteSize);
            glVertex2f( UnitSize,  UnitSize);
        glTexCoord2f( X      * SpriteSize, (Y + 1) * SpriteSize);
            glVertex2f(-UnitSize,  UnitSize);
    glEnd();
    //Image
    glBlendFunc(GL_ONE, GL_ONE);
    glBindTexture(GL_TEXTURE_2D, Texture[MaskId + 1]);
    glBegin(GL_QUADS);
        glTexCoord2f( X      * SpriteSize,  Y      * SpriteSize);
            glVertex2f(-UnitSize, -UnitSize);
        glTexCoord2f((X + 1) * SpriteSize,  Y      * SpriteSize);
            glVertex2f( UnitSize, -UnitSize);
        glTexCoord2f((X + 1) * SpriteSize, (Y + 1) * SpriteSize);
            glVertex2f( UnitSize,  UnitSize);
        glTexCoord2f( X      * SpriteSize, (Y + 1) * SpriteSize);
            glVertex2f(-UnitSize,  UnitSize);
    glEnd();
}

Автор:  Shaman [ Пн 11 июл 2011 3:02 ]
Заголовок сообщения: 

Нашёл решение (будет тебе подсказкой):
SHOT_EXPTIME = 24
Т.е. изменил с 25 на 24. Уже догадываюсь, где ты напортачил. :wink:

Автор:  Krogoth [ Пн 11 июл 2011 3:03 ]
Заголовок сообщения: 

Код обновления выстрела (внутри собственного класса):
Код:
    void Refresh()
    {
        glLoadIdentity();
        glTranslatef(X, Y * CAMERA_ANGLE_COS + Z * CAMERA_ANGLE_SIN, 0);
        //Shot
        if (ExpTime == 0)
        {
            DrawSprite(GetTextureId(Id), round(Dir / dpi * sqr(SHOT_SPRITE_DEG)) + 1, Size);
            X += SHOT_SPEED * cos(Dir);
            Y += SHOT_SPEED * sin(Dir);
            //Removing flown one
            const double Y_ = Y * CAMERA_ANGLE_COS;
            if (X  <WORLD_BOUNDS_X> WORLD_BOUNDS_X ||
                Y_ <WORLD_BOUNDS_Y> WORLD_BOUNDS_Y)
                delete this;
        }
        //Explosion
        else
        {
            DrawSprite(GetTextureId(Id), ExpTime, Size);
            if (ExpTime == SHOT_EXPTIME)
                delete this;
            else
                ExpTime++;
        }
    }


Добавлено спустя 38 секунд:

Шаман писал(а):
Нашёл решение (будет тебе подсказкой):
SHOT_EXPTIME = 24
Т.е. изменил с 25 на 24. Уже догадываюсь, где ты напортачил. :wink:
Не спеши, у меня-то глюка такого нет почему-то!

Автор:  Shaman [ Пн 11 июл 2011 3:05 ]
Заголовок сообщения: 

Krogoth писал(а):
if (n > N)
if(n>=N)
Ага? :hm:

Автор:  Krogoth [ Пн 11 июл 2011 3:08 ]
Заголовок сообщения: 

Шаман писал(а):
Krogoth писал(а):
if (n > N)
if(n>=N)
Ага? :hm:
Да не, там же индексация с 1. Т. е. n = N - это последний элемент.

Автор:  Shaman [ Пн 11 июл 2011 3:12 ]
Заголовок сообщения: 

Krogoth писал(а):
const uint N = sqr(SpriteDeg[MaskId]);
//Filter
if (n > N)
n -= N * int(n / N);
Как я понимаю, N - количество фреймов в спрайте (в нашем случае 5*5=25), так? А n - запрошенный номер спрайта. И ты проверяешь, не великоват ли запрошенный номер, и если да, то врапаешь его. Ну так подставь N=25. Если нумерация начинается с 0, а не с 1, то максимальный номер спрайта - 24, а 25 - уже перебор. Вот где собака порылась, ИМХО.

Автор:  Krogoth [ Пн 11 июл 2011 3:14 ]
Заголовок сообщения: 

Блин, все же должно быть тривиально.
Я начинаю рисовать, когда ExpTime = 1.
Кусок такой:
Код:
            DrawSprite(GetTextureId(Id), ExpTime, Size);
            if (ExpTime == SHOT_EXPTIME)
                delete this;
            else
                ExpTime++;

Т.е. 25-й кадр (гм!!!) отрисовывается, а потом объект сразу же удаляется и быть нарисован еще раз не может, потому что не может быть вызван.

Добавлено спустя 10 секунд:

МИСТИКА.

Автор:  Shaman [ Пн 11 июл 2011 3:14 ]
Заголовок сообщения: 

Krogoth писал(а):
sqr
Это макрос x*x или полноценная функция, погрязшая в плавании запятых? :hm:

Автор:  Krogoth [ Пн 11 июл 2011 3:15 ]
Заголовок сообщения: 

Шаман писал(а):
Если нумерация начинается с 0
Нет.

Добавлено спустя 12 секунд:

Шаман писал(а):
Krogoth писал(а):
sqr
Это макрос x*x
Да.

Добавлено спустя 11 секунд:

Хотя не, функция.

Добавлено спустя 33 секунды:

Кстати, pow(x, 2) работает медленнее или быстрее, чем x * x?

Автор:  Shaman [ Пн 11 июл 2011 3:30 ]
Заголовок сообщения: 

Блин, все транцидентные функции работают медленно. Не пользуйся math.h библиотекой если нет крайней необходимости, которой являются косинусы, синусы, степени, корни или логарифмы. Замени просто значком умножения. Приплывёшь с этими запятыми. :blabla: Значок умножения работает быстрее любой библиотечной функции. Чессгря, фраза "delete this" меня пугает. Никогда не юзал классы, удаляющие себя. Помяни моё слово - кончишь утечкой памяти. Динамический массив юзай, и движок, этот массив обрабатывающий.
Но мне кажется, дело не в этом. Подставь значение 25, и проследи, как что куда идёт. Что-то мне кажется, в DrawSprite лажа.

Автор:  Krogoth [ Пн 11 июл 2011 3:51 ]
Заголовок сообщения: 

Шаман писал(а):
Никогда не юзал классы, удаляющие себя. Помяни моё слово - кончишь утечкой памяти.
Не вижу ничего криминального. Хотя на форумах читал, говорят, многие боятся, но если сделать грамотно, то все хорошо. Хотя не факт, что у меня грамотно.

Добавлено спустя 2 минуты 53 секунды:

Шаман писал(а):
Динамический массив юзай, и движок, этот массив обрабатывающий.
Ну, а у меня как?
Самый родительский класс - просто список, потом идет статичный объект, потом идут подвижный объект и тень, дочерние от статичного объекта, потом идут глайдер и выстрел, дочерние от подвижного объекта.

Автор:  Razum [ Пн 11 июл 2011 3:52 ]
Заголовок сообщения: 

http://www.gamedev.ru/code/tip/advfloat - пячте логарифмы, товарищи!

Автор:  Krogoth [ Пн 11 июл 2011 3:55 ]
Заголовок сообщения: 

Кто будет тестить - ОБРАТИТЕ ВНИМАНИЕ НА 25 КАДР. Что-то у меня подозрение, что глюк должен быть далеко не у всех.

Добавлено спустя 3 минуты 35 секунд:

C++ плохо знаю, поэтому только что узнал об inline. Возник вопрос: ее можно тыкать где только можно или надо все-таки предварительно головой думать?

Автор:  Shaman [ Пн 11 июл 2011 4:08 ]
Заголовок сообщения: 

Тебе компиллер врнинг даст, если будет против. А вообще, любую коротенькую функцию инлайнай.

Автор:  Razum [ Пн 11 июл 2011 4:19 ]
Заголовок сообщения: 

У меня не было. Игруха, кстати, очень угарная.

Автор:  Shaman [ Пн 11 июл 2011 4:42 ]
Заголовок сообщения: 

2 Razum: в придачу к логарифмам вот простенькие ассемблерные кусочки для замены син-косинусовых и квадратных функций из math.h:

Как посчитать синус, косинус, корень из float'а "f":

Код:
float f = 0.1,
        sin_f,
        cos_f,
        sqrt_f;

//Так считается синус угла (угол в радианах):
_asm{
 fld dword ptr f;
 fsin;
 fst dword ptr sin_f;
}

//Так считается косинус угла (угол в радианах):
_asm{
 fld dword ptr f;
 fcos;
 fst dword ptr cos_f;
}

//Так считается корень из числа:
_asm{
 fld dword ptr f;
 fsqrt;
 fst dword ptr sqrt_f;
}


Добавлено спустя 19 минут 17 секунд:

Krogoth писал(а):
Кто будет тестить - ОБРАТИТЕ ВНИМАНИЕ НА 25 КАДР. Что-то у меня подозрение, что глюк должен быть далеко не у всех.
Неча задом вилять - давай моск напрягай. Если багов нет, то ни у кого не заглючит.
Вообще, шо за школьная привычка - нумерацию с 1 вести, а не с нуля? Вон ты десять раз +/- 1 туда сюда гоняешь - не мудрено, что дваццать пятый кадр мистически материализовался.

Автор:  Krogoth [ Пн 11 июл 2011 4:50 ]
Заголовок сообщения: 

Нумерация с 0 ничем не лучше, чем нумерация с 1, потому что в конце концов для некоторых операций мне надо будет добавлять единицу, точно так же, как и здесь мне нужно будет иногда вычитать (посмотри первый кусок моего кода, там гораздо удобнее манипулировать с номером, начинающимся с 1; потом я вычитаю, конечно). К тому же класс глайдера у меня будет общим с классом вспомогательных объектов, таких как, например, ремонтная площадка, а у них уже будет конкретная переменная "фрейм", 0 для которой будет обозначать инициализацию, т.е. объект есть, но пока еще не должен быть прорисован. Не знаю, зачем это надо, но мне такая концепция нравится больше.

Автор:  Shaman [ Пн 11 июл 2011 5:06 ]
Заголовок сообщения: 

Что-то я засмущался. Захакал спрайт на 2х2 тилеса с 4 кадрами, 3х3 тилеса и 9 кадров, 4х4 клетки на 16 кадров - всё правильно рисует. С частотой обновления 400 мс, каждый тилес пометил, мордой в моник впячился - всё правильно рисует. Но когда 5х5 тилесов и 25 кадров - вместо последнего кадра первый показывает. :shock:

Добавлено спустя 3 минуты 31 секунду:

А при растильсовке 5х5 и 24-х кадрах - всё правильно показывает. Ну что за магия с числом 25?! :mad:

Автор:  Razum [ Пн 11 июл 2011 12:34 ]
Заголовок сообщения: 

2 Шаман
Че это за пепяки fsin, и прочее? Это команды? Или функции?

Добавлено спустя 4 минуты 36 секунд:

А, все, позырил - это математический сопроцессор.

Добавлено спустя 2 минуты 54 секунды:

Я думаю, если мат. сопроцессор достаточно долго считает(весьма вероятно, что он вычисляет это дело с хорошей точностью), то лучше будет подобрать квадратичную аппроксимацию, скажем, того же косинуса, и юзать его там, где нужна мега-скорость, но точности особой не требуется.

Автор:  Shaman [ Пн 11 июл 2011 14:09 ]
Заголовок сообщения: 

2 Razum: функции действительно тормозные - сотня таков. :tongue: Однако обращение к незакэшированной ячейке памяти займёт столько же времени. :teeth:
Это проста альтернатива функциям sin, cos, sqrt из мат-библиотеки. В конечном итоге они так или иначе пользуют эти команды мат-сопроцессора, но сперва расковыряют все проверки и эксепшены по всем системным областям связи. В результате, за такое же время можно десяток синусов посчитать. Короче, я предпочитаю ассемблером пользоваться, где можно.

Автор:  Krogoth [ Ср 13 июл 2011 23:16 ]
Заголовок сообщения: 

Сейчас холявой занимаюсь: CFG-шки клепаю. :mrgreen:

Многа думал над столкновениями, решил вот как сделать: для столкновения в плоскости буду изучать пересечения глайдеров, нарисованных отдельной картинкой с видом сверху, а чтоб учесть вертикальное взаимодействие, задам эллипсоид, причем вырежу на нем такой небольшой круг посредине (ну, не круг, а то, что получается в результате пересечения сферы цилиндром), на котором глайдер может спокойно стоять, т.е. в его пределах взаимодействие вообще не происходит (объект воспринимается как поверхность), а за его пределами будет постепенно возрастать плоскостное взаимодействие и переходить в корректное взаимодействие, когда оба глайдера в одной плоскости. Таким образом, на глайдер можно запрыгнуть, а можно и неудачно запрыгнуть, в результате чего глайдеры разлетятся. О как. Но это я долго мутить буду. :]

Добавлено спустя 1 минуту 31 секунду:

И еще печалька с наложением теней: сделать в плоскости это корректно, не затрачивая больших ресурсов компьютера, у меня не получилось. :/

Автор:  Shaman [ Чт 14 июл 2011 0:14 ]
Заголовок сообщения: 

Krogoth писал(а):
И еще печалька с наложением теней: сделать в плоскости это корректно, не затрачивая больших ресурсов компьютера, у меня не получилось.
А разве это не также ресурсозатратно, как рисование самого глайдера? ИМХО, бери в качестве текстуры картинку маски, и рисуй её (т.е. черное пятно) на dx пикселов правее и dy пикселов ниже глайда (dx и dy пропорциональны высоте глайда). Рисовка должна быть в два этапа - сначала рисуются тени, затем рисуются сами глайды. Так в чём, собсно, запара? Эквивалентная работа, как глайд два раза нарисовать, только с разными текстурами. :roll:
Сушь, Кроготь, а зачем тебе в 2D вообще вдаваться в физику столкновений? Вполне сносно было бы упругое столкновение двух шариков. В 3дэшных мехах так было, ну так в двадэ-то чего изголяцца? Лучше б дал повертеться мышкой - это ж вовсе не долго реализовать. :smile:

Страница 1 из 7 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/