Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.06.2008, 01:34
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 1  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
По умолчанию При движении шар проваливается.

У кого ни будь, есть идеи, как сделать, чтоб при резком перемещении платформы шар не проваливался.
Исходник, прилагается.
Вложения
Тип файла: rar Without _hitTesta.rar (5.8 Кб, 86 просмотров)
__________________
Книги и желание лучшие учителя.


Последний раз редактировалось Vektor; 06.06.2008 в 02:05.
Старый 06.06.2008, 02:07
CaXaP вне форума Посмотреть профиль Отправить личное сообщение для CaXaP Найти все сообщения от CaXaP
  № 2  
Ответить с цитированием
CaXaP

Регистрация: May 2008
Адрес: Кострома, Россия
Сообщений: 22
Отправить сообщение для CaXaP с помощью ICQ
Как я понял проблемы возникают при резком движении платформы вверх?
Это из за того, что координата y меняется на слишком большое значение между событиями смены кадров.

Если проблема в этом, то я бы попробовал сохранять в отд. свойстве координаты платформы до перемещения и смотреть - если платформа переместилась вверх и шарик должен быть на ней (координата x шарика попадает на платформу и предыдущие координаты были таковы, что шарик был на платформе), то поднимать шарик вместе с платформой.

Ну и вариант 2 - существенно увеличить частоту кадров (правда это плохое решение).

Старый 06.06.2008, 02:28
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Считать перемещение не зависимо от того, как там и чего реально видно на мониторе. Т.е. построить математическую модель того, что должно происходить, и отображать то, что модель насчитала =) Т.е. к примеру, удобнее было бы с точки зрения рассчетов не перемещать нижнюю и верхнюю планку платформы, а растягивать/сжимать платформу по высоте. Соответственно, если мы растянем платформу, то шарик не может быть внутри, если нижний край (который мы зафиксировали еще до начала передвижения платформы) был ниже шарика - двигаем шарик наверх - нет - шарик падает.
__________________
Hell is the possibility of sanity

Старый 06.06.2008, 04:55
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 4  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Советы вроде бы правильные, но решение, не найдено.
Немного, изменил код.
Код:
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.
Старый 06.06.2008, 11:47
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 5  
Ответить с цитированием
qazwsx
Banned
[+5 15.02.09]
[++5 15.02.09]

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Совет wvxvw это хорошая альтернатива... Если делать все по той схеме что у тебя, то тебе нужно шарик не на 15 поднимать, а на смешение от текущего положение платформы от таго каторое стало... Судя по всему еше чтото придется там проверять добавлять и тп. Не хочется даже особо думать

Старый 06.06.2008, 12:36
Alex_beginner вне форума Посмотреть профиль Отправить личное сообщение для Alex_beginner Найти все сообщения от Alex_beginner
  № 6  
Ответить с цитированием
Alex_beginner
 
Аватар для Alex_beginner

Регистрация: May 2008
Сообщений: 476
qazwsx!
Цитата:
Судя по всему еше чтото придется там проверять добавлять и тп. Не хочется даже особо думать
Отличный пост!)) И информативный такой.!))

Vektor! Уберите вот это
Код:
if (mcCircle._y+mcCircle._height<this[aPerese[i]]._y+nPlatform) {
					mcCircle._y = this[aPerese[i]]._y-mcCircle._height;
				}
Вместо него просто вот это оставьте:
Код:
mcCircle._y = this[aPerese[i]]._y-mcCircle._height;
Результат - после первого onMouseUp на onMouseDown работает все как надо. Поэтому, ищите баг в обработчике onMouseUp и во вложенных функциях.
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Старый 06.06.2008, 15:44
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
СаХаР обьяснил, но не думаю что вектор понял Обьясню сам:
флэш сначала перемещает обьекты на экране, после выполняет скрипты.
То есть на примере:
Точка с координатой 0 и точка с координатой 5 (пусть будет только ось х)
Скорость точки 2 за фрейм. Что будет в реальной жизни и что мы ожидаем увидеть: точка врежется в другую на 2.5 секунде. Что происходит во флэше:
1 кадр) 1 точка - координата 0, вторая - 5. Не пересекаются
2 кадр) 1 точка - координата 2, вторая 5. Не пересекаются
3 кадр) 1 точка - координата 4, вторая 5. Не перескаются.
4 кадр) 1 точка - координата 6, вторая 5. Не пересекаются
Джоуб Макар в своей книге это подробно расписал. Вывод один - использовать математику.

Старый 06.06.2008, 18:27
Alex_beginner вне форума Посмотреть профиль Отправить личное сообщение для Alex_beginner Найти все сообщения от Alex_beginner
  № 8  
Ответить с цитированием
Alex_beginner
 
Аватар для Alex_beginner

Регистрация: May 2008
Сообщений: 476
PsychoTiger! Привет! А у Вас есть какие-нибудь конкретные предложения по поводу кода?
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Старый 06.06.2008, 23:09
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
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.
Старый 07.06.2008, 04:44
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 10  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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