LINUX.ORG.RU

Алгоритм арканоида

 , ,


0

2

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

//Ошибка тут, ибо velocity глобальна для всех агентов
//но если делать ее непосредственно в рендре для текущего
//агента, то не происходит отсковов от границ дисплея...
Vector2 velocity(200,500);

Render::draw() {
foreach (MovableObj agent in Agents) {
agent.pos() += velocity;

if ((agent.pos().x > Display.width()) || (agent.pos().x < 0)) {
velocity.x = velocity.x * -1;
}

if ((agent.pos().y > Display.height()) || (agent.pos().y < 0)) {
velocity.y = velocity.y * -1;
}
}
}

В каждом объекте можно установить свой таймер (причём таймеры могут быть с разными интервалами), вызывающий callback-функцию, в которой это всё и реализовать для каждого объекта, а не в foreach.

Можно ещё реализовать через потоки: каждый агент в своём потоке. Но это сложнее, да и не особо нужно для этой задачи, думаю.

aureliano15 ★★
()

//но если делать ее непосредственно в рендре для текущего
//агента, то не происходит отсковов от границ дисплея...

Вопрос «а почему не происходит» у вас не возникал?

И зачем в рендерере вообще что-либо апдейтить? Его задача только отображать.

andreyu ★★★★★
()

Добавь velocite полем для agent'а.

но если делать ее непосредственно в рендре для текущего

Это оно? Покажи код, наверняка что-то не то обновляешь.

Вангую следующий вопрос: «почему у меня „агенты“ замедляются когда я двигаю мышку?»

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

это то да - множителя нету

я ваще подумал, что «арканоид» - нарицательное

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

Добавь velocite полем для agent'а.

Не помогло, добавил в класс агента переменную типа вектор2, куда записывается velocity, но результат тот же - синхронное движение.

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