![]() |
|
||||||||||
|
|||||
|
У кого ни будь, есть идеи, как сделать, чтоб при резком перемещении платформы шар не проваливался.
Исходник, прилагается.
__________________
Книги и желание лучшие учителя. Последний раз редактировалось Vektor; 06.06.2008 в 02:05. |
|
|||||
|
Как я понял проблемы возникают при резком движении платформы вверх?
Это из за того, что координата y меняется на слишком большое значение между событиями смены кадров. Если проблема в этом, то я бы попробовал сохранять в отд. свойстве координаты платформы до перемещения и смотреть - если платформа переместилась вверх и шарик должен быть на ней (координата x шарика попадает на платформу и предыдущие координаты были таковы, что шарик был на платформе), то поднимать шарик вместе с платформой. Ну и вариант 2 - существенно увеличить частоту кадров (правда это плохое решение). |
|
|||||
|
Modus ponens
|
Считать перемещение не зависимо от того, как там и чего реально видно на мониторе. Т.е. построить математическую модель того, что должно происходить, и отображать то, что модель насчитала =) Т.е. к примеру, удобнее было бы с точки зрения рассчетов не перемещать нижнюю и верхнюю планку платформы, а растягивать/сжимать платформу по высоте. Соответственно, если мы растянем платформу, то шарик не может быть внутри, если нижний край (который мы зафиксировали еще до начала передвижения платформы) был ниже шарика - двигаем шарик наверх - нет - шарик падает.
__________________
Hell is the possibility of sanity |
|
|||||
|
Советы вроде бы правильные, но решение, не найдено.
Немного, изменил код. var nKol:Number = 3;
var aStartX:Array = [];
var aFinishX_W:Array = [];
var aPerese:Array = [];
var Gravitation:Number = 5;
var bCircle:Boolean = false;
var bHitTest:Boolean = false;
var nPlatform:Number = 15;
for (var i = 0; i<=nKol; i++) {
this.attachMovie("mcLine_"+i,"mcLine_"+i,this.getNextHighestDepth(),{_x:10, _y:10+i*10});
}
this.attachMovie("mcCircle","mcCircle",this.getNextHighestDepth(),{_x:400, _y:10});
this.onMouseDown = function() {
if (this.mcCircle.hitTest(_xmouse, _ymouse)) {
startDrag(mcCircle);
bCircle = true;
}
fLineDown();
};
function fLineDown() {
for (var i = 0; i<=nKol; i++) {
if (this["mcLine_"+i].hitTest(_xmouse, _ymouse)) {
startDrag(this["mcLine_"+i]);
bHitTest = true;
break;
}
}
}
function fLineUp() {
for (var i = 0; i<=nKol; i++) {
if (this["mcLine_"+i].hitTest(_xmouse, _ymouse)) {
aStartX[i] = this["mcLine_"+i]._x;
aFinishX_W[i] = this["mcLine_"+i]._x+this["mcLine_"+i]._width;
break;
}
}
}
this.onMouseUp = function() {
stopDrag();
bHitTest = false;
bCircle = false;
};
this.onMouseMove = function() {
if (bHitTest) {
aPerese.splice(0,aPerese.length);
fLineUp();
fPerese();
}
};
function fPerese() {
for (var i = 0; i<=nKol; i++) {
if (mcCircle._x>aStartX[i]) {
if (mcCircle._x<aFinishX_W[i]) {
aPerese[i] = "mcLine_"+i;
}
}
}
}
this.onEnterFrame = function() {
if (mcCircle._y<=550 && !bCircle) {
mcCircle._y += Gravitation;
}
for (var i = 0; i<=nKol; i++) {
if (aPerese[i] != undefined) {
if (mcCircle._y+mcCircle._height>this[aPerese[i]]._y) {
if (mcCircle._y+mcCircle._height<this[aPerese[i]]._y+nPlatform) {
mcCircle._y = this[aPerese[i]]._y-mcCircle._height;
}
}
}
}
};
__________________
Книги и желание лучшие учителя. Последний раз редактировалось Vektor; 07.06.2008 в 04:01. |
|
|||||
|
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Совет wvxvw это хорошая альтернатива... Если делать все по той схеме что у тебя, то тебе нужно шарик не на 15 поднимать, а на смешение от текущего положение платформы от таго каторое стало... Судя по всему еше чтото придется там проверять добавлять и тп. Не хочется даже особо думать
![]() |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
qazwsx!
Цитата:
Vektor! Уберите вот это if (mcCircle._y+mcCircle._height<this[aPerese[i]]._y+nPlatform) {
mcCircle._y = this[aPerese[i]]._y-mcCircle._height;
}
Результат - после первого onMouseUp на onMouseDown работает все как надо. Поэтому, ищите баг в обработчике onMouseUp и во вложенных функциях.
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
|
|||||
|
СаХаР обьяснил, но не думаю что вектор понял
Обьясню сам:флэш сначала перемещает обьекты на экране, после выполняет скрипты. То есть на примере: Точка с координатой 0 и точка с координатой 5 (пусть будет только ось х) Скорость точки 2 за фрейм. Что будет в реальной жизни и что мы ожидаем увидеть: точка врежется в другую на 2.5 секунде. Что происходит во флэше: 1 кадр) 1 точка - координата 0, вторая - 5. Не пересекаются 2 кадр) 1 точка - координата 2, вторая 5. Не пересекаются 3 кадр) 1 точка - координата 4, вторая 5. Не перескаются. 4 кадр) 1 точка - координата 6, вторая 5. Не пересекаются Джоуб Макар в своей книге это подробно расписал. Вывод один - использовать математику.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
PsychoTiger! Привет! А у Вас есть какие-нибудь конкретные предложения по поводу кода?
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
|
|||||
|
Modus ponens
|
import flash.geom.Rectangle;
import flash.geom.Point;
import mx.utils.Delegate;
import mx.transitions.Tween;
import mx.transitions.easing.Bounce;
var platform:MovieClip = drawRect(this, 200, 20);
var ball:MovieClip = drawRect(this, 20, 20);
platform._y = Stage.height - 40;
platform._x = Stage.width / 2 - platform._width / 2;
ball._y = Stage.height - 80;
ball._x = Stage.width / 2 - ball._width / 2;
var srartPosition:Number;
var ballHitPos:Number;
var ballAmplitude:Number = 100;
var acceleration:Number = 1;
var dir:Boolean;
var tw:Tween = new Tween({i:100}, 'i', Bounce.easeIn, 0, 100, 1, true);
tw.stop();
tw.addListener(this);
platform.onPress = Delegate.create(this, startMovePlatform);
platform.onRelease = Delegate.create(this, stopMovePlatform);
platform.onReleaseOutside = Delegate.create(this, stopMovePlatform);
var platformRect:Rectangle = new Rectangle(platform._x, platform._y, platform._width, platform._height);
var ballPoint:Point = new Point(ball._x, ball._y);
function onMotionChanged():Void {
if(dir) {
ball._y = ballHitPos - tw.position / 100 * ballAmplitude;
acceleration = 1;
} else {
if (ball._y + ball._height + 10 * acceleration < platformRect.y) {
ball._y += 10 * acceleration;
acceleration *= 1.1;
} else {
ball._y = platformRect.y - ball._height;
acceleration = 1;
}
}
ballPoint.y = ball._y;
}
function onMotionFinished():Void {
if (dir) {
ballHitPos = ball._y;
dir = false;
}
tw.start();
}
function startMovePlatform():Void {
srartPosition = platform._y + platform._height;
onEnterFrame = Delegate.create(this, movePlatform);
}
function stopMovePlatform():Void {
platformRect = new Rectangle(platform._x, platform._y, platform._width, platform._height);
delete onEnterFrame;
}
function movePlatform():Void {
var lastPos:Number = platformRect.y + platformRect.height;
platformRect.y = _ymouse;
platformRect.height = lastPos - platformRect.y;
if (ballPoint.y > platformRect.y) { // platform hits the ball
ballPoint.y = platformRect.y;
ball._y = ballHitPos = platformRect.y - 20;
dir = true;
tw.start();
}
platform._y = platformRect.y;
}
function drawRect(mc:MovieClip, w:Number, h:Number):MovieClip {
var _mc:MovieClip = mc.createEmptyMovieClip('mc' + mc.getNextHighestDepth(), mc.getNextHighestDepth());
_mc.beginFill(0);
_mc.lineTo(w, 0);
_mc.lineTo(w, h);
_mc.lineTo(0, h);
_mc.endFill();
return _mc;
}
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 06.06.2008 в 23:15. |
|
|||||
|
Alex_beginner- Такой вариант был рассмотрен, но я думаю, что вы сами догадываетесь, почему он не подходит.
wvxvw - Попробовал ваш код. Получил: There is no method with the name 'OnEnterFrameBeacon'. There is no method with the name 'BroadcasterMX'. Psycho Tiger Цитата:
Vektor - а, ну да это же я. ![]() Эта задача, была поставлена, не потами что она мне нужна. А потому что, мой друг при слове hitTest, начинает доказывать что hitTest, слишком сильно нагружает процессор. А еще мне кажется, что эта задача интересна, тем, кто пишет 2D – Игры. Если, внимательно проанализировать работу кода, то многие поймут, что при большом количестве платформ, расчет кода будет минимальным, а если, еще по _y, разбить на сектора, то вычислять вообще будет нечего. И еще, в коде выше, оптимизировал работу onMouseMove. Это решение данной проблемы, писалось не для того чтоб кому - то, напрягать мозги, а для того чтоб новички в программировании, могли узнать, что одну проблему не всегда стоит решать стандартными методами. Если, Каму-то не нравится код. На это давно, есть ответ. Всегда, смотрите, что делают другие, но делайте по-своему, если Каму-то не нравится, это его проблемы. Если только это не ваш начальник. Если сотне программистов дать одну задачу, то они её решат 99 разными способами. Я чувствую, что после моего душе излияния, 3-страниц будет мало. ![]() Если, модераторы не прикроют эту тему, вовремя. P.S. А эту проблему я решу сам, если результат кому ни будь интересен, пишите, и я обязательно выложу код.
__________________
Книги и желание лучшие учителя. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:18. |
|
|
« Предыдущая тема | Следующая тема » |
|
|