Форум 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=211595)

dedede777 26.09.2015 23:40

Реализация физики в игре
 
Помогите понять в чем ошибка. Есть спрайт шар - mc и Спрайт неровной поверхности - kv
Пробую сделать физику отскока шара, от поверхности, без гравитации все работает хорошо, с гравитацией глючит - шар бывает в землю залетает и трясется. Любой помощи буду очень рад.
Код AS3:

//mc - Sprite (Circle)
//kv - Sprite (Platform irregular shape)
import flash.events.Event;
 
var gradus: Number ;
var speed: Number = 1;
var direction: Point;
const gravity: Point = new Point(0, 0.001);
var i: int;
 
direction = getStartDirection(speed, 90);
stage.addEventListener(Event.ENTER_FRAME, ef);
 
function addVector(v1: Point, v2: Point): Point
{
        return new Point(v1.x + v2.x, v1.y + v2.y);
}
 
function getStartDirection(length: Number, angle: Number): Point
{
        var aRad: Number = (angle * Math.PI) / 180;
        var xpos: Number = length * Math.cos(aRad);
        var ypos: Number = length * Math.sin(aRad);
        return new Point(xpos, ypos);
}
function ef(e: Event): void
{
        for (i = 0; i < 10; i++)
        {
                mc.x += direction.x;
                mc.y += direction.y;
                var test: Number = hitTestAngle(kv, mc.x, mc.y, 10);
                if (test)
                {
                        var a1: Number = (Math.atan2(direction.y, direction.x)) * (180 / Math.PI);
                        gradus = test - (360 - 90 - test - (90 - a1));
 
                        if (speed > 0.01)
                        {
                                speed /= 1.05;
                        }
                        else
                        {
                                speed = 0;
                        }
                        direction = getStartDirection(speed, gradus);
                }
                else
                {
                        direction = addVector(direction, gravity);
                }
        }
}
 
function hitTestAngle(shape: Sprite, xPos: Number, yPos: Number, radius: Number): Number
{
        var samples: uint = Math.abs(radius * Math.PI);
        const PI2: Number = Math.PI * 2,
        SAMPLE: Number = 1 / samples;
        var dx: Number, dy: Number, a: Number, tx: Number = 0,
                ty: Number = 0,
                hits: int = 0;
        var i: int = samples;
        while (i--)
        {
                a = PI2 * (i * SAMPLE);
                dx = radius * Math.cos(a);
                dy = radius * Math.sin(a);
                if (shape.hitTestPoint(xPos + dx, yPos + dy, true))
                {
                        hits++;
                        tx += dx;
                        ty += dy;
                }
        }
        if (!hits)
                return NaN;
        return Math.atan2(ty, tx) * (180 / Math.PI);
}


caseyryan 27.09.2015 08:09

Сначала нужно проверять на возможное столкновение в следующем кадре, и уже только после того, как стало понятно, что столкновения не будет, двигать объект. А не наоборот

dedede777 27.09.2015 12:39

Цитата:

Сообщение от caseyryan (Сообщение 1187348)
Сначала нужно проверять на возможное столкновение в следующем кадре, и уже только после того, как стало понятно, что столкновения не будет, двигать объект. А не наоборот

Как проверить? А если будет столкновение в следующем кадре, то что тогда?


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

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