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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию Как правильно остановить шайбу после гола и переместить ее на исходную позицию

Здравствуйте
Есть b2Body (b2CircleShape) это бита. Она управляется зажатой мышкой.
Есть шайба b2Body (b2CircleShape).
При попадании в ворота противника мне нужно остановить и переместить шайбу в центр игрового мира, остановить движение биты (если она по инерции все еще движется).

Для этого мне нужно:
1) остановить world.Step(...) ?
2) как остановить инерционное движение шайбы ?
3) как остановить инерционное движение биты ?
4) переместить шайбу washerBodyDef.position.Set(position) ?
5) запустить заново world.Step(...) ?

Или же будет правильнее эту шайбу удалять и заново создавать ?

Старый 26.08.2012, 22:24
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Решал я как-то точно такую же задачу, когда делал хоккей на бокс2д.
Цитата:
1) остановить world.Step(...) ?
Нет. Этого делать не нужно вообще. Все просто замрет в том состоянии, в котором было на момент остановки.
Просто остановить шайбу без костылей не получится. Это все-таки физический движок.
Я просто применял к ней импульс противоположный ее скорости. Это останавливало шайбу, но не давало совсем уж нужного эффекта. Еще один способ - поменять на время шага тип тела шайбы на статический. Это ее сразу же остановит. Но и тут есть загвоздка. Это нужно делать перед вызовом Step() так как непосредственно после вызова шага мир будет закрыт до его завершения, и все эти телодвижения будут бессмысленными.

Цитата:
Или же будет правильнее эту шайбу удалять и заново создавать ?
Можно и так. Но на это будет тратиться еще больше ресурсов. Хотя от одной шайбы производительность явно не упадет. Так что, возможно, этот вариант тоже стоит рассмотреть.

Старый 26.08.2012, 22:47
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 3  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Нет. Этого делать не нужно вообще. Все просто замрет в том состоянии, в котором было на момент остановки.
Ну, это не проблема, я покажу скрин со счетом, а после выставлю все объекты на исходные позиции

Спасибо, интересные варианты
Как раз думал о удалении, но засада получалась с заново созданной шайбой (ошибка)

Код AS3:
// создание шайбы
protected function createWasher():void
		{
			washerBodyDef = new b2BodyDef();
			washerBodyDef.userData="washer";
			washerBodyDef.type = b2Body.b2_dynamicBody;
 
			washerShape = new b2CircleShape(30 / physicsModel.pixelsPerMeter);
			//var circShape:b2CircleShape = new b2CircleShape(3);
			washerFixtureDef = new b2FixtureDef();
			washerFixtureDef.shape = washerShape;
			washerFixtureDef.density = .1;
			washerFixtureDef.friction = .1;
			washerFixtureDef.restitution = .6;
			washerBodyDef.position.Set(PhysicsHelper.stage.stageWidth/2 / physicsModel.pixelsPerMeter, PhysicsHelper.stage.stageHeight/2 / physicsModel.pixelsPerMeter);
			washerBody = world.CreateBody(washerBodyDef);
			washerBody.CreateFixture(washerFixtureDef); // строка 208
		}
// удаление шайбы
protected function removeWasher():void
		{
			bodyesToRemove.push(washerBody);
 
			if(pm.mouseJoint)
			{
				pm.mouseJoint.SetTarget(null);
				world.DestroyJoint(pm.mouseJoint);
				pm.mouseJoint = null;
			}
		}
 
//  --- ГОЛ !!!
[EventHandler(event="PhysicsContactEvent.CONTACT_BEGIN",properties="data")]
		public function contactBeginHandler(data:String):void
		{
			switch(data)
			{
				case "opponentGoal":
					trace("ГОЛ ОППОНЕНТУ - нужно удалить шайбу и заново создать");
					removeWasher();
					createWasher();
					break;
				case "userGoal":
					trace("USER GOAL");
 
					break;
			}
		}
// обновление мира
private function enterFrameHandler(event:Event = null):void
		{
			if(bodyesToRemove.length>0)
			{
				for(i=0;i<bodyesToRemove.length;i++)
				{
					world.DestroyBody(bodyesToRemove[i]);
				}
				for(i=0;i<bodyesToRemove.length;i++)
				{
					bodyesToRemove.pop();
				}
			}
 
			updateMouseJoint();
			world.Step(physicsModel.timestep, physicsModel.velocityIterations, physicsModel.positionIterations);
			world.ClearForces();
			world.DrawDebugData();
 
			updateAssetsPositions();
		}
Вот такая ошибка вылетает
Код:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at swiz.controllers::PhysicsController/createWasher()[D:\flex  4.6\AeroHockey_2\src\swiz\controllers\PhysicsController.as:208]
При новом создании шайбы она возникает
Возможно, после удаления (в обновлении мира) нужно остановить это самое обновление, создать шайбу и заново запустить обновление ?

Я хотел бы еще один вопрос задать как раз про хоккей.
А как Вы двигали биту, при нажатии или нет ?
Я хотел бы чтобы без нажатия бита двигалась за мышкой моментально.
Это мне просто нужно назначать
Код AS3:
pm.mouseXWorldPhys=PhysicsHelper.stage.mouseX/physicsModel.pixelsPerMeter;
pm.mouseYWorldPhys=PhysicsHelper.stage.mouseY/physicsModel.pixelsPerMeter;
var mousePVec:b2Vec2=new b2Vec2(pm.mouseXWorldPhys,pm.mouseYWorldPhys);
userStickBody.SetPosition(mousePVec);
?
или все-таки с джоинтами нужно это делать ?

..............
вот как заработало:
в обновлении мира если есть объекты для уничтожения я удяляю их, останавливаю обновление мира, создаю шайбу и стартую обновление мира


Последний раз редактировалось djyamato; 26.08.2012 в 23:16.
Старый 27.08.2012, 07:31
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
А как Вы двигали биту, при нажатии или нет ?
У меня был настольный хоккей. Там были хоккеисты крутящиеся вокруг своей оси, и управлялись с клавиатуры. Мышкой вариант интересный, но я его не пробовал.
Цитата:
Вот такая ошибка вылетает
У вас типичная ошибка, которую допускают многие. И я на нее натыкался.
Цикл движется в сторону увеличения индекса (второй цикл), а длина массива сокращается. Естественно он быстро наткнется на объект null. Для удаления тел используйте цикл while
Код AS3:
while (bodyesToRemove.length) {
       world.DestroyBody(bodyesToRemove[0]);
       bodyesToRemove.shift();
}

Старый 27.08.2012, 12:23
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 5  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
ясно, спасибо большое
Правда, ошибка была не при удалении объектов в цикле, а при создании новой биты или шайбы уже после того как все удалено.
Про while это верно, признаться, никогда не использую его, а зря.


Последний раз редактировалось djyamato; 27.08.2012 в 16:01.
Создать новую тему Ответ Часовой пояс GMT +4, время: 03:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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