Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > "живой объект"


Автор: powerfox 24.1.2006, 14:07
У меня есть игра "змейка", можно ли сделать так, чтобы каждый новый сегмент двигался самостоятельно, не добавляя указателей, счётчиков, просто связать событие его образование с какой-то функцией?

Автор: _hunter 24.1.2006, 14:37
Цитата(powerfox @ 24.1.2006, 13:07 Найти цитируемый пост)

событие его образование с какой-то функцией

а теперь еще раз, только медленнее...

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

Автор: Fixin 24.1.2006, 15:00
Обычно при создании и передвижении каждый сегмент коприует инфу о направлении движения от предыдущего элемента с хвоста до головы, и никаких счетчиков и указателей не нужно, если ты конечно не строишь змею по принципу связного списка, тк смысла нет, ну только если поле не ограничено.

Автор: powerfox 25.1.2006, 00:03
У меня есть вектор точек поворота, Идёт проверка координат первого и последнего сегментов, в зависимости от этого изменяется коэффициент движения. Движение происходит по формуле
Код

struct Snake{    
        int xpos;    
        int ypos;    
        int x_direct;    
        int y_direct;    
        Snake(int xpos_=0, int ypos_=0, int x_d=1, int y_d=0) :    
            xpos(xpos_), ypos(ypos_), x_direct(x_d), y_direct(y_d) { }
    };
...
const int width = 50;        //width of the each segment of the snake
Snake first = Snake(150, 0, 1, 0);   //first part of the snake
...
first.xpos += first.x_direct*width;
first.ypos += first.y_direct*width;
...
std::vector<Snake>point_of_reverce(500);
int i=0;                //count_of_points;
int curr_point=0;            //the nearest point of reverce
...        
case SDLK_UP:{
            first.y_direct = -1;
            first.x_direct = 0;
            point_of_reverce[i] = Snake(first.xpos, first.ypos, 0, -1);
            i++;
            break;}

Движение работает, теперь мне надо сделать "game over", если змейка таранит себя. Пока я вижу два пути:
1. Хранить все сегменты.
2. Восстанавливать их координаты из точек поворота, конца и начала.

Автор: _hunter 25.1.2006, 11:14
дык ясен пень -- все сегменты хранить нужно.
потому как при серии поворотов ты все сегменты не востановиш

Автор: powerfox 25.1.2006, 13:51
Восстановить можно, но долго будет выполняться(по сравнению с хранением координат), а хранить - слишком просто, хочется что-то пооригинальнее.

Автор: _hunter 25.1.2006, 14:01
зачем оригинального? ( и чем тогда восстаноновление смущает? -- оригинальнее некуда... )

Автор: powerfox 25.1.2006, 16:46
Восстановление будет работать похуже(испортит ясность кода, дольше будет работать, сложнее будет добавлять потом что-нибудь). Наверное, лучше не заморачиваться и добавить переменные для хранения координат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)