Pergunta

Eu tenho jogado este jogo flash e depois que eu 'd superado a inicial de reação (' lol, fogo ') Eu comecei a me perguntar como eu poderia replicar esse comportamento contato com mutação na programação. Eu acho que é um pouco como o honeypot xkcd .

pensava de partida com um cenário em que partículas de deflectir fora um do outro e as paredes que contêm. A seqüência seria começar com um número definido de partículas 'mutantes', e quando estes mutantes colidem com partículas regulares eles se tornaram-se mutantes. Eu poderia trabalhar em mais algumas coisas divertidas mais tarde.

O meu problema é como começar com este. Estou a planear fazê-lo em C # usando os elementos de desenho de .NET (embora eu sou bastante novo para C # - se há uma parte diferente do .NET eu deveria usar deixe-me saber), mas se há quaisquer documentos gerais sobre ele I estaria interessado em ler-los (se eles estão disponíveis on-line, é claro).

Obrigado, Ross

Foi útil?

Solução

Eu acho que você está no caminho certo com o que você está pensando, alguns partículas em uma caixa faria muito bem aqui. Eu não posso imaginar que você iria encontrar papéis em tal específica e caso simples, mas talvez para algumas das técnicas necessárias, mas uma implementação do backend deve ser relativamente simples em comparação com um renderizador.

Para mover as partículas em torno de um método simples é Euler iteração , onde você armazena as posições e velocidades. posição = + posição velocidade * dt; onde dt é a mudança no tempo desde o último quadro. É melhor manter dt fixo, e interpolar entre pontos para o representante se você pode ... isso vai reduzir problemas de estabilidade e detecção de colisão make mais fácil.

Para reflectir uma partícula de fora de uma parede, verificar se os seus componentes de x ou y componentes de posição irão exceder os limites e, em seguida, inverter o sinal de outro componente da velocidade, por exemplo.

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

Se você tem dt constante, isso funciona muito bem, mas se ele varia você vai precisar fazer algo mais complicado. encontrar o ponto de colisão com a caixa e refletir parte dos o vetor fora da caixa na cara que estava colidiu com.

Para colidir partículas com o outro cheque de uma distância é provavelmente melhor, provocando reflexão uma vez que a distância é muito pequena. ou seja, se eles chegarem muito perto eles colidem. Reflectir as componentes de velocidade como se as partículas eram esferas, de modo que o normal para reflexão é a diferença das suas posições.

Você pode encontrar este artigo em gamedev útil também ...

Espero que isso ajude.

Outras dicas

Por que não ter um olhar para o jogo Asteroids clássico como ponto de partida? Aqui está alink para um que não usa DirectX e está em c #

http://www.codeproject.com/KB/GDI-plus /asteroids.aspx

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