Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   отталкивание шара из шара (http://www.flasher.ru/forum/showthread.php?t=180739)

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 вот вам простой пример, если я правильно понял вашу задачу:
Код AS3:

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

Цитата:

Сообщение от Hauts (Сообщение 1083551)
strangedk, зачем же такие сложности ради двух шариков? Это же совсем не рационально.

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

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

Wadimir 07.06.2012 18:06

Цитата:

Сообщение от strangedk (Сообщение 1083599)
Не уверен я что там будет только два шарика.

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

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


Часовой пояс GMT +4, время: 12:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.