Estou criando um atirador de balas muito ao estilo de Touhou. No momento, quero ter um tiro circular muito simples sendo disparado do inimigo.
No entanto, o espaçamento é muito desigual, o que não é muito bom se você quiser sobreviver.
O código que estou usando é o seguinte:
private function shoot() : void
{
const BULLETS_PER_WAVE : int = 72;
var interval : Number = BULLETS_PER_WAVE / 360;
for (var i : int = 0; i < BULLETS_PER_WAVE; ++i)
{
var xSpeed : Number = GameConstants.BULLET_NORMAL_SPEED_X * Math.sin(i * interval);
var ySpeed : Number = GameConstants.BULLET_NORMAL_SPEED_Y * Math.cos(i * interval);
BulletFactory.createNormalBullet(bulletColor_, alice_.center, xSpeed, ySpeed);
}
canShoot_ = false;
cooldownTimer_.start();
}
Imagino que meu erro esteja nas funções sin
& cos
, mas não tenho certeza do que está errado.
Respostas:
Regra de ouro ao trabalhar com qualquer tipo de ângulo: verifique se você está usando a unidade correta. Nesse caso, você deve usar radianos, não graus.
Se você quiser disparar balas diretamente entre o chefe e o jogador, use
atan2
FYI.fonte
*
ou/ Math.PI/180
você vê a céu aberto lá - se não está incluída nas funções de base trig, você tem que fazê-lo sozinho para converter de e para graus).Você está fazendo a divisão da maneira errada e está usando graus em vez de radianos, como fazem as funções matemáticas. Por acaso, isso resulta em um padrão que se parece um pouco com o desejado. Apenas corrija seu cálculo da variável de intervalo.
Edit: Para aqueles que não estão familiarizados com o conceito, esse código produz o ângulo desejado entre os marcadores em radianos, permitindo assim deixar o cálculo de
xSpeed
eySpeed
como ele é, sem outras constantes aplicadas.fonte
period = 2 * pi
funções sin / cos e entãointerval = period / BULLETS_PER_WAVE
.Eu acho que você deve fazer 360 / BULLETS_PER_WAVE em vez disso, que dá no seu caso 360/72 = 5 graus entre cada marcador. Você também tem certeza de que as funções Math.sin e Math.cos desejam sua entrada em graus e não em radianos?
fonte
Enquanto você foi respondido, aqui está uma resposta mais engraçada: aprenda com a natureza.
Use a proporção áurea.
Veja: http://www.mathsisfun.com/numbers/nature-golden-ratio-fibonacci.html
fonte
Além do possível problema de grau / radiano, acho que o principal problema é que você está usando valores inteiros para os cálculos. Você não mostrou
GameConstants.BULLET_NORMAL_SPEED_X
ou sua contraparte Y, mas verifique se eles são representados como números de ponto flutuante, não inteiros. Como alternativa, converta-os em valores de ponto flutuante durante a multiplicação para o cálculo da velocidade.fonte
number
declaradaint
.