![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
В примере пять точек, остальные генерятся автоматически через константу, для плавности хода и контролируемости траектории и скорости перемещения.
Вот пример попроще package { import flash.display.*; import flash.events.*; import flash.geom.*; /** * ... * @author Alex Lexcuk */ public class DocMoveCurve extends Sprite { public var debSp:Sprite; public var lastM:Point = new Point(); public var curM:Point = new Point(); public var b:Point = new Point(); public var speedStep:int = 10; public var curveArr:Vector.<Point> = new Vector.<Point>(); public var persSp:Sprite; public var frameCount:int; public function DocMoveCurve() { addChild(debSp = new Sprite()); addChild(persSp = new Sprite()); debSp.graphics.lineStyle(0); persSp.graphics.beginFill(0xFF0080); persSp.graphics.drawCircle(0, 0, 5); curveArr.push(new Point()); stage.addEventListener(MouseEvent.CLICK, stageClickHandler); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } public function enterFrameHandler(e:Event):void { persSp.x = curveArr[frameCount].x; persSp.y = curveArr[frameCount].y; frameCount++; if (frameCount >= curveArr.length) frameCount = 0; } public function stageClickHandler(e:MouseEvent):void { drawMousePath(); } public function drawMousePath():void { var mx:Number = debSp.mouseX; var my:Number = debSp.mouseY; var bt:Point = new Point(lastM.x - b.x,lastM.y - b.y); var mt:Point = new Point(lastM.x - mx, lastM.y - my); bt.normalize( mt.length / 2); b = bt.add(lastM); debSp.graphics.moveTo(lastM.x, lastM.y); debSp.graphics.curveTo(b.x, b.y, mx, my); debSp.graphics.drawCircle(b.x, b.y, 4); curM = new Point(mx, my); addToArrPosCurve(); lastM = new Point(mx, my); } public function addToArrPosCurve():void { var i:int; var p:Point = new Point(); var lp:Point = lastM.clone(); var ps:Point; for (i = 0; i <= 100; i++) { p.x = myCurveTo(lastM.x, b.x, curM.x, i / 100); p.y = myCurveTo(lastM.y, b.y, curM.y, i / 100); ps = p.subtract(lp); if (ps.length > speedStep) { curveArr.push(lp = p.clone()); debSp.graphics.drawCircle(p.x, p.y, 4); } } } public function myCurveTo(n1:int, n2:int, n3:int, n4:Number):Number{ return (1 - n4) * (1 - n4) * n1 + 2 * n4 * (1 - n4) * n2 + n4 * n4 * n3; } } } ![]() Привязать коробку не сложно.
__________________
Гоночка |
|
|||||
|
А я тормоз :о)) Только непонятно как будет скорость объекта на траекторию влиять, или она одинакова для двух объектов с разной скоростью? По любому с меня +.
Нашел решение, выложу попозже, когда допилю.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Если не использовать функцию киллОртогоналВелосити и сделать большую скорость, то объект не будет следовать траектории, там будут большие заносы, вылеты за траекторию, пролёты чекпоинтов и пр. А с другой стороны с киллОртогоналВелосити вообще заносов нет и немного не интересно.
__________________
Гоночка |
|
|||||
|
Своего почти добился :о)
private function updateBody():void { if(!_lastPoint) //Если нет точки, куда лететь return; _body.SetAwake(true); //Вектор от центра самолетика до нужной точки var pointVec:b2Vec2 = b2Vec2.Make(_lastPoint.x - _body.GetPosition().x, _lastPoint.y - _body.GetPosition().y); //Угол между осью X и pointVec var pointAngle:Number = getAngle( _body.GetPosition().x, _body.GetPosition().y, _lastPoint.x, _lastPoint.y, true); //Угол поворота самолета var bodyAngle:Number = _body.GetAngle(); //Вектор движения cамолетика var vec:b2Vec2 = b2Vec2.Make(_speed * Math.cos(bodyAngle), _speed * Math.sin(bodyAngle)); trace(toDegrees(pointAngle).toPrecision(5), toDegrees(bodyAngle).toPrecision(5), toDegrees(pointAngle-bodyAngle).toPrecision(5)); var sign:int = 1; //Если самолетик не "смотрит" на точку, то поворачиваем его на _angleStep (pointVec и vec не сонаправленны) if(Math.abs(pointAngle-bodyAngle) > _angleStep) bodyAngle += _angleStep * sign; else { //Доворачиваем самолетик bodyAngle = pointAngle; //TODO calc distance //_lastPoint = null; } redraw(); _body.SetAngle(normAngle(bodyAngle)); _body.SetLinearVelocity(vec); } Вот, что получилось Исходник Добавлено через 16 минут [IMG]http://dl.************/u/6132064/plane_angle2.png[/IMG] Вот картинка, как работает, сравните с предыдущей :о))
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|