2013-02-27 3 views
2

Я пытаюсь сделать shmup и попытаться создать конкретный «шаблон пули». В принципе, у меня есть вражеский огонь, и несколько пуль вытесняются вокруг круга. Предположим, что этот круг пуль направлен вправо. Затем, я хочу, чтобы круг обрушился на себя, поэтому я добавляю второй импульс к скоростям стрелки x &. По существу, так что форма пули увольняет выглядит примерно так, как он путешествует (я надеюсь, что это дрянная символизация имеет смысл):AS3 дополнительное движение по линейному пути

O o • o O 

Это работает.

Тогда я просто хочу, чтобы свернуть его вертикальное положение, а не по горизонтали, так это будет выглядеть следующим образом:

O — O 

Я также могу это сделать. НО, если я попытаюсь снять этот круг по диагонали или в направлении, отличном от горизонтально или вертикально, он немного сломается.

Вот код, с которым я работаю, раздел с clusterGrowthX & Y - это та часть, с которой я столкнулся. Решение, вероятно, смотрит мне прямо в лицо, но я не могу понять это сейчас. Любые вопросы, просто спросите. Благодарю.

  for(var j:int = 0; j < _info.clusterAmount; j++) 
      { 
       var around : Number = _info.angle - (_info.clusterRange/2) + (_info.clusterRange/_info.clusterAmount/2) + j * (_info.clusterRange/_info.clusterAmount); 
       var xOff : Number = (Math.cos(around) * _info.clusterRadius); 
       var yOff : Number = (Math.sin(around) * _info.clusterRadius); 

       var bullet = new _info.bulletShape(_info); 
       bullet.x = startPoint.x + xOff; 
       bullet.y = startPoint.y + yOff; 
       if(_info.dParent is PlayerControl) 
       { 
        bullet.x += Math.cos(_info.angle) * 40; 
        bullet.y += Math.sin(_info.angle) * 40; 
       } 
       var sign : Number = (_info.angle < 0) ? -1 : 1; 

       trace(Math.cos(around),Math.sin(around)); 

       bullet.info.vx += Math.cos(around) * _info.clusterGrowthX; 
       bullet.info.vy += Math.sin(around) * _info.clusterGrowthY; 

       bullet.rotation = _info.angle * 180/Math.PI; 
       _info.dLevel.addChild(bullet); 
      } 
+0

Я думаю, это должно помочь вам: http://math.stackexchange.com/questions/17246/is-there-a-way-to-rotate-the-graph-of-a-функция (после применения первого вращение преобразуется в соответствии с круговым рисунком, вы не можете вращать с помощью sin cos больше, вам нужно использовать матрицы вращения). Я столкнулся с этой проблемой: таким образом, я создал новый объект матрицы ->, переведенный x | y ->, повернул матрицу со встроенной функцией -> plug back x | y или вы могли сами вникать в матричные вычисления. – chadiik

+1

Ха-ха, +1 для обучения меня термину [shmup] (http://en.wikipedia.org/wiki/Shoot_'em_up). Я почти всю свою жизнь мучился и даже не знал об этом. –

+0

Если он работает, когда он совершенно горизонтальный, просто положите его в контейнер Sprite и поверните и переместите его так, как вам нужно, ваши вычисления тогда не будут затронуты им, потому что пуля всегда будет относительно ее контейнера. – M4tchB0X3r

ответ

1

Что вам нужно сделать, так это увеличить и уменьшить скопление скорлупы под любым углом.

Как мы проектируем точку под произвольным углом?

var amountOfOffset:Number = 10// how far along the angle you want to go. 
var angleInDegrees:Number = 45; // this is the angle you want it to expand on. 
var angleInRadians:Number = angleInDegrees * 0.0174532925; 
clusterGrowthX = amountOfOffset * cos(angleInRadians); 
clusterGrowthY = amountOfOffset * sin(angleInRadians); 

Это должно сделать вас.

Что вы спрашиваете, очень так же, как найти точку на окружности: Find the point with radius and angle

+0

Спасибо, никогда не думал об этом хаха –

0

твин/TweenLite библиотеку. Устраняет все ваши проблемы^_^простой, легкий, чистый, оптимизированный для небес.

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