2013-05-23 3 views
1

Скажем, у меня есть 2-й мир, полный различных движущихся объектов. Мир - простая матрица, и каждая «плитка» может содержать только одну сущность за раз. Мир будет обновляться в тиках, где все объекты будут иметь возможность принимать разные действия. Во всяком случае, я пытаюсь получить некоторые идеи для изящных способов борьбы с ситуациями столкновения:Способы изящно использовать мир 2d

Например, скажем, у меня есть сущность в (5,4), и я хочу переместить ее в (5,3) , Когда я проверяю, может ли он законно перемещаться туда, я нахожу объект уже в (5,3). Однако позже, обновляя этот тик, объект в (5,3) переходит к (5,2). Таким образом, первая сущность действительно должна была бы двигаться, если вторая перенести в первую очередь. Существуют различные ситуации, подобные этому (два вопроса пытаются переместиться в разные квадраты, четыре - все в скоплении, пытаясь каждый раз перейти на другой занятый квадрат круговым способом). А также ситуации, подобные двум, которые пытаются переместиться на одну и ту же площадь (разная ситуация).

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

+1

Удивительно, но ваша проблема идентична типичных проблем многопоточности управления памятью! –

+0

Могут ли объекты перемещать более одной плитки за галочку? – Behe

+0

В настоящее время у меня есть только перемещение одной плитки за галочку, но я могу быть открыт, чтобы позволить несколько движений. – Nathan

ответ

1

Во-первых, если два объекта пытаются переместиться в одно и то же пространство, которое оно получает?

Как проверить, может ли что-то двигаться: если что-то мешает, вызовите функцию перемещения, прежде чем пытаться переместиться туда. Его функция перемещения должна также вызывать функцию перемещения чего угодно. Если он движется, занять свое место.

EDIT: Псевдо-код для перемещения с приоритетом, и в кругах

List entities (in order of speediest, biggest, ect.) 

moveGroup(startingIndex, limitingSpeed) 
{ 
    for(i=startingIndex; i<length && limitingSpeed <= entities.get(i).getSpeed(); i++) 
    { 
     if(entities.get(i).hasntMoved()) { entities.get(i).move() } 
    } 
} 

Entity.move(tail) 
{ 
    entityInWay = nextBlock.getEntity(); 

    //if nothing in way or thing in way will move with nothing in its place if this does 
    if(entityInWay == null || entityInWay == tail) 
    { move it, set hasMoved to true} 

    else 
    { 
     //everything faster than entity in way gets to move before it does 
     moveGroup(entityInWaysIndex, entityInWay.speed()); 

     //then start entity move chain, with this as the tail 
     entityInWay.move(entities.get(i)); 
    } 
} 
+0

Я думаю либо случайный, либо имеющий характеристику скорости для сущности, которая разрешает расы (в случае равной скорости, имея ее просто случайную). – Nathan

+0

Метод, который я вам дал, - это просто приоритет, однако вы проходите список сущностей. Если вы хотите, чтобы какая-либо логика стояла за ней (например, скорость), просто перемещайте список объектов с максимальной до самой низкой скоростью. – Thumbz

+0

Я думал о сортировке списка сущностей по скорости, и я думаю, что ваше расширение на это может быть хорошим решением. Я мог бы иметь значение для «уже перемещенного» для каждого объекта и перемещаться по списку entites с максимальной скорости до самой низкой скорости. Если я столкнулся с столкновением (сущность в пространстве - перемещение в занятое пространство b), я пытаюсь вызвать функцию перемещения для объекта в пространстве b, а затем установить b на «перемещение», поэтому, когда я встречу его позже в списке, я пропущу его (и я могу сделать это рекурсивно). Единственная проблема заключается в том, что некоторые проблемы (например, 4 entites в квадрате 2 на 2, которые все хотят переместиться в квадраты eachothers). Идеи? – Nathan

Смежные вопросы