Я читал здесь несколько подобных вопросов, но, к сожалению, ни один из них, похоже, не дает точного ответа, который я ищу, или они могли бы, но математика за мной!
Я создаю игру, в которой у вас есть пушка по левому краю экрана. Я хочу иметь возможность стрелять из пушечного ядра по дуге так, чтобы оно пересекалось с указателем мыши на экране.
Я видел несколько примеров, которые перемещают снаряд по дуге из точки a в точку b, но мне нужно, чтобы пушечное ядро сначала двигалось вдоль оси самой пушки, не будет хорошо, если мяч покинет конец пушки под другим углом, на который указывает пушка.
Единственной силой, действующей на шар, будет сила тяжести и начальная скорость.
Также, чтобы усложнить ситуацию, мне нужно изменить угол пушек в зависимости от того, насколько далеко указатель мыши находится от конца пушки, поэтому, если указатель находится далеко, чем пушка будет указывать вверх, скажем, под углом 45 градусов, но если указатель находится очень близко к концу пушки, то пушка будет указывать прямо на указатель, это я более или менее уже получил, просто получив расстояние между ними, а затем разделив его на число и вычесть это из значения вращения пушки, но это немного грубый способ сделать это.
EDIT
Используя приведенный ниже код, я справился со строкой на скриншоте ниже. Но, как вы видите, мне нужна не та траектория, мне нужно нечто большее, чем красная линия, которую я вставил.
![line](https://i.stack.imgur.com/c2h5X.jpg)
А вот как я реализовал код (возможно, неправильно)
public class GameTurretLine2
{
var rt:Object = null;
var lineMc:MovieClip = new MovieClip();
var myTurret:GameMainGun = null;
var pta:Point = new Point(0,0);
var ptb:Point = new Point(0,0);
var ptc:Point = new Point(0,0);
var ptd:Point = new Point(0,0);
public function GameTurretLine2(rt2,turret)
{
rt = rt2;
myTurret = turret;
lineMc.graphics.lineStyle(2, 0x55aa00);
mainLoop();
rt.rt.GameLayers.turretLineMc.addChild(lineMc);
}
function mainLoop()
{
lineMc.graphics.clear();
//get points
var turretEnd:Object = myTurret.rt.Useful.localToGlobalXY(myTurret.mC.turret.firePoint);
var turretStart:Object = myTurret.rt.Useful.localToGlobalXY(myTurret.mC.turret);
var mousePos:Point = new Point(myTurret.rt.rt.mouseX,myTurret.rt.rt.mouseY);
var inbetween:Point = new Point(0,0);
//start
pta.x = turretStart.newX;
pta.y = turretStart.newY;
//mouse end
ptd.x = mousePos.x;
ptd.y = mousePos.y;
// The cannon's angle:
// make the cannon's angle some inverse factor
// of the distance between the mouse and cannon tip
var dist:Number = myTurret.rt.Useful.getDistance(turretEnd.newX, turretEnd.newY, mousePos.x, mousePos.y);
var cAng:Number = dist * (180/Math.PI);
var ptbc:Point = new Point((ptd.x - pta.x) *.5,0);
ptbc.y = Math.tan(cAng) * ptbc.x;
//ptb = new Point(ptbc.x - ptbc.x * .15, ptbc.y);
ptb = new Point(turretEnd.newX, turretEnd.newY);
ptc = new Point(ptbc.x + ptbc.x * .5, ptbc.y);
// create the Bezier:
var bz:BezierSegment = new BezierSegment(pta,ptb,ptc,ptd);
trace(bz);
// define the distance between points that you want to draw
// has to be between 0 and 1.
var stepVal:Number = .1;
var curPt:Point = pta;
//draw circles
lineMc.graphics.drawCircle(pta.x, pta.y, 4);
lineMc.graphics.drawCircle(ptb.x, ptb.y, 4);
lineMc.graphics.drawCircle(ptc.x, ptc.y, 4);
lineMc.graphics.drawCircle(ptd.x, ptd.y, 4);
lineMc.graphics.lineStyle(2, 0x0000ff);
//step along the curve to draw it
for(var t:Number = 0;t < 1;t+=stepVal){
lineMc.graphics.moveTo(curPt.x, curPt.y);
curPt = bz.getValue(t);
trace("curPt = " + curPt.x + "," + curPt.y);
lineMc.graphics.lineTo(curPt.x, curPt.y);
}
trace("pta = " + pta.x + "," + pta.y);
trace("ptb = " + ptb.x + "," + ptb.y);
trace("ptc = " + ptc.x + "," + ptc.y);
trace("ptd = " + ptd.x + "," + ptd.y);
}
}
Кроме того, по какой-то странной причине, строка, созданная кодом, переворачивается, от того, как это показано на снимке экрана, до кода с отступом (перевернуто y), просто слегка перемещая мышь, так что вы перемещаете мышь на строку прыгает везде.