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

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

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

Регистрация: Jul 2012
Сообщений: 48
По умолчанию Столкновения

Проблема в том, что когда player врезается в wall(Down, Left, Up, Right),то он не останавливается а продолжает проезжать, но как бы рывками, внизу вложен swf файл, подскажите что нужно изменить, что бы код заработал, Заранее благодарен.
Код AS3:
import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.display.DisplayObject;
	import net.flashpunk.graphics.Text;
 
		 var player:MovieClip;
 
		 var playerSpeed:Number = 4;
 
		 var movingUp:Boolean = false;
		 var movingDown:Boolean = false;
		 var movingLeft:Boolean = false;
		 var movingRight:Boolean = false;			
 
			stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);			
			stage.addEventListener(KeyboardEvent.KEY_DOWN, myOnPress);
			stage.addEventListener(KeyboardEvent.KEY_UP, myOnRelease);	
			this.addEventListener(Event.ENTER_FRAME, chekim);		
 
		 function enterFrameHandler(event:Event):void
		{
			if ( movingLeft && !movingRight )
			{
				player.x -= playerSpeed; 
			}
			if ( movingRight && !movingLeft )
			{
				player.x += playerSpeed; 
			}
			if ( movingUp && !movingDown )
			{
				player.y -= playerSpeed; 
			}
			if ( movingDown && !movingUp )
			{
				player.y += playerSpeed; 
			} 
		}
 
		 function myOnPress(event:KeyboardEvent):void
		{
			switch( event.keyCode )
			{
				case Keyboard.UP:
					movingUp = true;
					movingDown = false;
					movingLeft = false;
					movingRight = false;
					break;
 
				case Keyboard.DOWN:
					movingUp = false;
					movingDown = true;
					movingLeft = false;
					movingRight = false;
					break;
 
				case Keyboard.LEFT:
					movingUp = false;
					movingDown = false;
					movingLeft = true;
					movingRight = false;
					break;
 
				case Keyboard.RIGHT:
					movingUp = false;
					movingDown = false;
					movingLeft = false;
					movingRight = true;
					break;
			}
		} 
 
		 function myOnRelease(event:KeyboardEvent):void
		{
			switch( event.keyCode )
			{
				case Keyboard.UP:
					movingUp = false;
					break;
 				case Keyboard.DOWN:
					movingDown = false;
					break; 
				case Keyboard.LEFT:
					movingLeft = false;
					break; 
				case Keyboard.RIGHT:
					movingRight = false;
					break;
			}
		}
 
 
function chekim (e:Event):void
{
if (wallUp.hitTestObject(player as DisplayObject))
{
movingUp = false;
}else if (wallDown.hitTestObject(player as DisplayObject)){
	movingDown = false;
} else if (wallRight.hitTestObject(player as DisplayObject)){
	movingRight = false;
} else if (wallLeft.hitTestObject(player as DisplayObject)){
	movingLeft = false;
}
}
Вложения
Тип файла: rar Cub.rar (410.6 Кб, 37 просмотров)

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
решение просто - надо проверять столкновение до того, как добавлять какие-либо значения к x и y

Старый 19.09.2012, 00:37
Riki вне форума Посмотреть профиль Отправить личное сообщение для Riki Найти все сообщения от Riki
  № 3  
Ответить с цитированием
Riki

Регистрация: Jul 2012
Сообщений: 48
Спасибо, помогло, но выявилась проблема другого характера, теперь квадрат останавливается только при некоторых стенах, и некоторые простно игнорит, хотя название у стен одинаковое wallLeft(чисто как пример), что тут может быть????

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
хотя название у стен одинаковое wallLeft(чисто как пример),
Этого быть не должно. Все названия должны быть уникальны.

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Лучше бы проверяли с использованием растровой карты уровня, тогда стены хоть кисточкой рисовать можно и не нужно городить кучу "hitTestObject".
__________________
hauts.ru

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

Регистрация: Jul 2012
Сообщений: 48
Цитата:
Сообщение от Hauts Посмотреть сообщение
Лучше бы проверяли с использованием растровой карты уровня, тогда стены хоть кисточкой рисовать можно и не нужно городить кучу "hitTestObject".
А можно пример, а то я не очень Вас понял. Как в данной ситуации это использовать?

Старый 19.09.2012, 18:46
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 7  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Берете положение и размеры вашего движущегося квадратика и с этими же свойствами отрисовываете кусочек карты под ним в битмапдату. Потом с помощью BitmapData.getColorBoundsRect проверяете, есть ли непрозрачные пиксели. В итоге, если есть (то есть квадратик наехал на стенку), вы получите Rectangle области пересечения, а значит будете знать, с какой стороны пересечение и насколько "глубоко".

Вот еще есть схожая тема: http://xitri.com/2008/09/29/simple-e...iew-part2.html
__________________
hauts.ru

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

Регистрация: Jul 2012
Сообщений: 48
Цитата:
Сообщение от Hauts Посмотреть сообщение
Берете положение и размеры вашего движущегося квадратика и с этими же свойствами отрисовываете кусочек карты под ним в битмапдату. Потом с помощью BitmapData.getColorBoundsRect проверяете, есть ли непрозрачные пиксели. В итоге, если есть (то есть квадратик наехал на стенку), вы получите Rectangle области пересечения, а значит будете знать, с какой стороны пересечение и насколько "глубоко".

Вот еще есть схожая тема: http://xitri.com/2008/09/29/simple-e...iew-part2.html
Не хочется быть навязчивым, но не могли бы вы показать реализацию "этого" на моем примере?

Добавлено через 38 часов 4 минуты
Up Up

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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