Faça a coisa rápida parecer lenta (Box2D)


9

Estou trabalhando em um jogo em que você controla um trabuco para lançar bolas ao adversário.

É como um jogo chamado 'Medieval Siege'. Quando o trabuco está balançando o braço, o jogador precisa aproveitar o melhor momento para pressionar o botão e soltar a bola. Então a bola voará no ângulo tangente. insira a descrição da imagem aqui Meu problema agora é que o braço do trabuco balança muito rápido para o jogador aproveitar o momento certo. Enquanto isso, tem que ser tão rápido, caso contrário não pode jogar longe o suficiente. E há uma corda minúscula conectando a bola e o braço do trabuco, se o braço balançar muito devagar, a bola fica pendurada na corda quando o braço se move.

Eu resolvo o problema alternando o tamanho do passo, sempre que o braço estiver girando, altero o tamanho do passo de 1/60 para 1/200. E quando o jogador solta a bola, ela volta para 1/60.

Isso funciona muito bem, exceto que meu jogo é para multiplayer com rede. Portanto, mudar de passo pode causar problemas.

Outra solução em que posso pensar é permitir que ele gire lentamente, mas quando o jogador solta a bola, adiciono velocidade manualmente à bola, mantendo sua direção. Eu realmente não gosto desta solução, porque ela parece falsa e ainda tenho o problema de que a bola está pendurada no barbante, a menos que eu faça o barbante muito, muito curto ..

Por favor, esclarecer isso, obrigado!


EDITAR

Obrigado pela contribuição de todos, eu resolvo o problema fazendo o braço girar devagar e quando o jogador solta a bola, agarro a velocidade da bola e o tempo duas. Parece exatamente o mesmo que alterar o tamanho da etapa. Há apenas uma coisa extra que preciso fazer. Como o braço está balançando muito devagar, a bola está pendurada na extremidade do braço em vez de balançar. Resolvi isso aplicando uma força igual à força gravitacional na bola durante e somente durante o período de giro. Então ele não fica mais lá, mas balança junto com o braço.

A resposta de @MrCranky é detalhada e parece factível, então eu aceitaria. :)


Talvez você possa mover o trabuco lentamente, mas multiplicar as forças que atuam na bola? Eu não trabalhei com o Box2D antes, então desculpe se isso é uma idéia idiota. Fora isso, meu único palpite seria mexer com a massa da bola para ver se as mais pesadas ou mais leves podem fornecer resultados aceitáveis ​​em velocidades mais lentas. Além disso, pode valer a pena investigar a física dos trabuco da vida real. Eles parecem um pouco lentos, então talvez os dados sobre eles (tamanho, munição, forças etc.) possam lhe dar algumas idéias para a sua simulação.
Christian

2
Fazer com que a física dos computadores se comporte como "a coisa real" é realmente difícil. Quase todos os mecanismos de física simulam corpos rígidos, significando que efeitos como a flexão do braço do trebouchet não são contabilizados, nem a física das cordas nem o comportamento do material são precisos, de modo que uma simulação exata sem "trapaça" é quase impossível. O processo para se aproximar de algo que parece real é mais ou menos assim: tweak, tweak, tweak, fraude, tweak, tweak, fraude, fraude, tweak, recomeçar, tweak, tweak, tweak, tweak, tweak, fraude, tweak, fraude , enganar, ajustar.
LearnCocos2D

4
O Kitten Cannon usa a abordagem mais realista para esse problema: os humanos são realmente tão ruins em manipular a realidade física e precisam de assistência da máquina, se você deseja dar a "sensação" de um trebuchet que se move lentamente o suficiente para que um humano controle manualmente, mas lança mais rápido do que o fisicamente possível, convém criar uma animação puramente artística "disparando" e depois gerar a bola com base em onde o usuário interrompe a animação.
Novelas

Respostas:


3

Instintivamente, eu diria que estamos perdendo uma parte substancial do contexto necessário para responder, que é "por que o aspecto multiplayer impede você de alterar o timestep?"

Se você está tentando compartilhar uma simulação de física através de uma conexão de rede, bem, isso geralmente é uma coisa muito difícil de fazer. As simulações divergem com muita facilidade e, especialmente com conexões de rede que podem perder pacotes, é muito difícil manter as coisas juntas.

A resposta mais simples e robusta à sua pergunta é usar um intervalo de tempo variável. Quando você se aproxima do momento da decisão, em vez de atualizar sua simulação física em um segundo para cada segundo do mundo real que passa, atualize-o em meio segundo ou outro número adequado. Como é um efeito de integração, você provavelmente conseguirá simplesmente reduzir a taxa de atualização para a taxa mais baixa durante a janela de decisão, mas também poderá interpolar rapidamente para baixo para a taxa mais baixa. De qualquer forma, você está essencialmente reproduzindo a simulação de física em câmera lenta. Ele deve se comportar perfeitamente com precisão, apenas lento o suficiente para que o jogador possa tomar sua decisão. Eu não consideraria nenhum outro meio de enganar a física para fazê-la funcionar, eles provavelmente todos darão certo horrível e não parecerão 'certos'.

Então, voltamos à implementação de rede. Sem mais informações, acho que você tem duas opções. Em primeiro lugar, se você estiver operando em sintonia com a outra parte da rede. Portanto, quando um jogador tiver que desacelerar para tomar sua decisão, desacelere os dois jogadores igualmente. Provavelmente isso parecerá irritante e estranho para o jogador que não está atirando, porque confundirá seus próprios tempos de reação.

Para o segundo, imagine dois trebuchets disparando um contra o outro. O trebuchet leva 10 segundos para ser lançado, e a janela de tiro começa em T + 5s. P1 inicia o ciclo de tiro em T + 0s, e em T + 5s diminui a simulação de física local em 50%. Levará 15 anos para jogar durante todo o ciclo. Assim, em T + 5s, P1 diz a P2 para começar a reproduzir o ciclo de lançamento dos 10s em velocidade máxima. Então P1 vê o ciclo de trebuchet levar 15s, P2 vê 10s, mas ambos os jogadores veem o ciclo terminar em T + 15s. Quando P1 realmente é liberado, eles informam ao P2 quando no ciclo nocional foram liberados. Portanto, se o P1 for lançado em T + 10s, na verdade, será de 7,5s até o ciclo de lançamento dos 10s. O P2 pode então mostrar o lançamento em T + 12,5s (7,5s na reprodução local do ciclo), e as simulações de ambos os jogadores devem ter lançado o projétil no mesmo ponto físico do ciclo.

Portanto, nesta segunda abordagem, você não está mais simulando na etapa de bloqueio. Você está executando duas simulações independentes, mas acompanhando as entradas do jogador. Se for dito a ambos que o jogador lançou aos 7,5s no ciclo de lançamento, ambos devem concordar sobre onde o projétil irá pousar. Na prática, porém, é provável que ele diverja muito rapidamente, e você precisará sincronizar os estados da simulação de alguma forma.


0

Por que não copiar / adaptar o que já existe e funciona em casos semelhantes?

insira a descrição da imagem aqui


0

Se o seu trebuchet estiver se movendo muito rápido, a solução óbvia seria escalar o tempo para torná-lo mais lento. Ou seja, a cada segundo de tempo real, faça apenas, por exemplo, 0,1 segundos de passar na sua simulação de física. Agora, do ponto de vista do jogador, a bola estará se movendo 10 vezes mais devagar.

Na verdade, há outra maneira de obter o mesmo efeito: em vez de reduzir o tempo, basta dimensionar todas as constantes de física que estão em unidades, incluindo o tempo. Por exemplo, a aceleração gravitacional tem unidades de velocidade / tempo = distância / tempo², portanto, se a gravidade é a única constante no seu jogo, reduzi-la em um fator de 100 = 10² obtém o mesmo efeito que reduzir a velocidade em um fator de 10 .

Obviamente, se o seu modelo de física incluir outras constantes com unidades de tempo (ou velocidade = distância / tempo, ou aceleração = distância / tempo², etc.), você precisará escalá-las também se quiser manter as trajetórias iguais. .

Observe que há um limite para o quão praticamente você pode ir com isso: se você diminuir o tempo em, digamos, um fator de 100, seu trebuchet será realmente fácil de controlar, mas é provável que seus jogadores fiquem entediados esperando pelo bolas para flutuar lentamente após dispará-las. Se esse é um problema, pode ser necessário recorrer a truques mais avançados, como os sugeridos em outras respostas, como usar uma escala de tempo muito lenta enquanto o trebuchet está disparando, mas mudar para uma escala de tempo mais rápida assim que a bola for lançada.


obrigado, mas você provavelmente não viu minha edição. Sim, eu resolvi com o último método em sua resposta
Arch1tect
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.