Pergunta

Estou escrevendo um jogo de texto e preciso de um sistema de combate simples, como em lama, você emite comandos e, de vez em quando, "tick" acontece, quando todos esses comandos executam, jogadores e monstros causam dano acontece. Como faço para implementar esse conceito? Pensei em fazer uma variável que mantém a hora do último tick, e uma função que apenas coloca eventos na pilha e quando esse tempo é (tempo +x) os executa simutanamente. Existe alguma variante mais fácil ou mais limpa para fazer isso?

Qual seria a sintaxe possível para isso?

double lastTickTime;
double currentTime;

void eventsPile(int event, int target)
{
// how do i implement stack of events? And send them to execute() when time is up?
}

void execute(int event, int target)
{
     if ((currentTime - lastTickTime) == 2)
     {
         eventsHandler(event, target);
     }    
     else 
     { // How do I put events on stack?
     }
}
Foi útil?

Solução

O problema com a pilha de ação simples é que a ordem das ações provavelmente será baseada no tempo - quem digita mais rápido será o primeiro golpe. Você provavelmente deve introduzir prioridades na pilha, para que, por exemplo, todos os eventos globais acionem primeiro, depois os eventos de ação das criaturas, mas esses eventos de ação são ordenados por algum atributo como agilidade ou nível. Se uma criatura tem maior agilidade, isso recebe o primeiro golpe.

Outras dicas

Pelo que vi, a maioria desses motores é o evento, e não o tempo, baseado. com um novo tick sendo desencadeado algum intervalo após o último tick terminou. (assim, principalmente evitando a questão de tickestá demorando mais do que o intervalo)

Isso também simplifica a implementação; você simplesmente tem um loop de jogo que desencadeia um tick evento, então sleeps/yields para o intervalo necessário. Qual é trivial.

Pode ser ainda simplificado modelando o mundo como uma árvore, onde cada elemento gerencia eventos de propagação (como ticks) para seus filhos. Desde que você evite / gerenciar 'loops', isso funciona bem (eu fiz isso).

Isso reduz efetivamente o tick sistema para algo assim (psudocode):

while (isRunning) {
    world->tick();
    sleep(interval);
}

Na maioria dos casos, há pouca necessidade de ficar muito mais sofisticado do que ajustar a duração anterior.

Quaisquer ações de entidades individuais fariam parte de sua própria fila de ação e lidadas durante seus próprios eventos de "carrapato".

Geralmente, os comandos do usuário seriam divididos nos comandos "ingame" e "meta", qualquer coisa que o ing apenas alteraria a fila de ação de seu personagem, a ser processada em seu próximo tick, conforme normal para qualquer outra entidade.

O combate simples baseado em rodada segue naturalmente a partir desta base. O tempo real pode ser modelado com uma divisão mais fina de ticks, com 'tempo de tempo' opcional.

Use um timer executando todos os x ms (enquanto x é o seu ticktime), execute quaisquer ações colocadas na pilha nesse método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top