Вход

Просмотр полной версии : отталкивание шара из шара


Wadimir
07.06.2012, 15:29
Добрый день!

Имеется на сцене два круглых мувика. Захватываем один мувик на курсор и тянем на другой при отпускании мышки второй должен оттолкнуть первый.

Как можно реализовать такое отталкивание?

Hauts
07.06.2012, 15:35
Это можно реализовать программированием захвата мувика курсором, программированием его движения и программированием столкновения и отскока мувиков.

Ну а если серьезно, покажите код, который у вас есть и объясните, что не получается.

strangedk
07.06.2012, 15:44
Используйте физический движок Box2D или Nape
Лично мне больше нравится Box2D.

1. Создаете мир с нулевой гравитацией, два динамических круга c1 и c2.
2. Физические объекты привязываете к графике через свойство UserData
3. Привязываете графику к событиям мыши
4. При отпускании кнопки мыши рассчитываете силу импульса
5. Придаете импульс физическому объекту c1 с помощью метода ApplyImpulse
6. enjoy. остальное сделает Box2D

Hauts
07.06.2012, 16:00
strangedk, зачем же такие сложности ради двух шариков? Это же совсем не рационально.

Wadimir вот вам простой пример, если я правильно понял вашу задачу:
import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.*;

function getBall(radius:Number):Sprite {
var sprite:Sprite = new Sprite();
var gr:Graphics = sprite.graphics;
gr.lineStyle(1,0);
gr.beginFill(0xFF0000,0.5);
gr.drawCircle(0,0,radius);
gr.endFill();
return sprite;
}

var radius:int = 20;
var ball_1:Sprite = getBall(radius);
var ball_2:Sprite = getBall(radius);

addChild(ball_1);
addChild(ball_2);

ball_1.x = ball_1.y = 250;
ball_2.x = ball_2.y = 300;

ball_1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ball_1.addEventListener(Event.ENTER_FRAME, updateBallPosition);

var draging:Boolean = false;
var startDragX:Number;
var startDragY:Number;
var ballVx:Number = 0;
var ballVy:Number = 0;
var ballFriction = 0.9;// or bounce ?

function mouseDownHandler(e:MouseEvent):void {
draging = true;
ballVx = 0;
ballVy = 0;
startDragX = ball_1.mouseX;
startDragY = ball_1.mouseY;
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
function mouseMoveHandler(e:MouseEvent):void {
ball_1.x = stage.mouseX - startDragX;
ball_1.y = stage.mouseY - startDragY;
e.updateAfterEvent();
}
function mouseUpHandler(e:MouseEvent):void {
draging = false;
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
checkCollision();
}
function checkCollision():void {
var dx:Number = ball_1.x - ball_2.x;
var dy:Number = ball_1.y - ball_2.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
var collisionDepth:Number = radius * 2 - dist;
if (collisionDepth > 0) {
var collisionAngle:Number = Math.atan2(dy,dx);// in radians
ballVx = collisionDepth * Math.cos(collisionAngle);
ballVy = collisionDepth * Math.sin(collisionAngle);
}
}

function updateBallPosition(e:Event):void {
if (draging) {
return;
}
ball_1.x += ballVx;
ball_1.y += ballVy;
ballVx *= ballFriction;
ballVy *= ballFriction;
}

strangedk
07.06.2012, 17:32
strangedk, зачем же такие сложности ради двух шариков? Это же совсем не рационально.


Не уверен я что там будет только два шарика.

Добавлено через 3 минуты
Насколько я понял - задача как в бильярде, чтобы ведущий шар мог ударить какой-то другой.

Wadimir
07.06.2012, 18:06
Не уверен я что там будет только два шарика.

там будет именно два шарика.

Hauts, большое спасибо!!!