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

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

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
Неа Может, и добьюсь своего.
Третьего плюса? :о)
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
Третьего плюса? :о)
А я и не развожу флейм.
Я просто говорю, что хватит писать костыли, лучше пользуйтесь движком.
И я советую Nape (можно +Citrus).

Старый 20.12.2013, 16:27
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 23  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от fd96 Посмотреть сообщение
По баундсу проверять тоже нельзя мне надо коллизию прямо по форме фигуры с точностью до микрона... плохо....
ПОПИКСЕЛЬНО, ДА , СПАСИБО ЗА СОВЕТ, в самом первом сообщении я ведь писал, что сделал попиксельно, но ОНА ОЧЕНЬ ТОРМОЗИТ, много процессорного времени жрёт...
1.Просто перед тем как проверять попиксельно - надо делать проверку по баундсам и уже если они пересекаются - проверять попиксельно.

2.Попиксельно можно проверять через наложения битмап.
Название: collision.gif
Просмотров: 274

Размер: 8.1 Кб
Берём пересечение баундсов - создаём битмапу такого размера копируем альфу 1 объекта в канал R, альфу другого в канал B, потом вызываем http://help.adobe.com/ru_RU/FlashPla...orBoundsRect() для цвета 0xffff00. Если результирующий прямоугольник пустой, значит пересечения альф не было.
Альфа должна быть ff/0 без полупрозрачностей. Если есть полупрозрачности надо предварительно сделать theresold.
__________________
Отряд Котовскага

Старый 20.12.2013, 16:30
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 24  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
А я и не развожу флейм.
Я просто говорю, что хватит писать костыли, лучше пользуйтесь движком.
И я советую Nape (можно +Citrus).
Если нужны только проверки на коллизии, зачем забивать гвозди микроскопом?
Да и приятно разобраться в сложном вопросе самостоятельно, тем более, что для конкретной задачи решение может быть на порядки оптимальнее, чем универсальное.
__________________
Отряд Котовскага

Старый 20.12.2013, 17:35
fd96 вне форума Посмотреть профиль Отправить личное сообщение для fd96 Найти все сообщения от fd96
  № 25  
Ответить с цитированием
fd96
 
Аватар для fd96

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
Если иметь в виду такие баундсы, то я уже делал, прыжок всё равно притормаживает на моменте получение битмапы и пересчёт всех возможных пересечений писелов. наверно я кривой. А на счёт движков и такой простой игры поддерживаю, как гвозди микроскопом забивать.

А можно в битмап дате получить пикселы только определённые, проверять не всю дату, а только четверть или как - то так, по координатам, но не getPixel и hitTest?
__________________
...Nothing can't be coded...

Старый 20.12.2013, 18:05
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 26  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
ну я же написал как проверять без getPixel
__________________
Отряд Котовскага

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

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
А на счёт движков и такой простой игры поддерживаю, как гвозди микроскопом забивать.
Я не поддерживаю. По-моему, как раз все будет нормально.
Движок не большой, в будущем пригодится.

Старый 20.12.2013, 20:22
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 28  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Набросал примерчик
collision.swf   (18.4 Кб)


Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.BitmapFilter;
	import flash.filters.GlowFilter;
 
	/**
	 * ...
	 * @author k0t0vich
	 */
	public class Main extends Sprite {
		static public const GLOWFILTER:BitmapFilter = new GlowFilter(0xFF0000);
		private var _hero:Bitmap;
		private var _boxes:Array = [];
 
		private var _bitmap:Bitmap;
 
		public function Main():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 	{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			createElements();
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
 
		private function createElements():void {		
			for (var i:int = 0; i < 50; i++) {
				var box:Bitmap = new Resources.Box(); 
				box.x = int(Math.random()*stage.stageWidth);
				box.y = int(Math.random()*stage.stageHeight);
				_boxes.push(box);
				addChild(box);
			} 
 
			_hero = new Resources.Hero();
			addChild(_hero);	
		}
 
		private function mouseMoveHandler(e:Event):void {
				render();
				detectCollision();
		}
 
		private function render():void {
			_hero.x = mouseX;
			_hero.y = mouseY;
 
			var len:uint = _boxes.length;
			for (var i:int = 0; i < len; i++) {
				var box:Bitmap = _boxes[i];
				box.filters = [];
			}
 
			// для отображения в углу пересекающейся битмапы
			/*if (_bitmap && _bitmap.bitmapData) {
				_bitmap.bitmapData.dispose();
				_bitmap = null;
			}
 
			if (Collision.tmp){	
				_bitmap = new Bitmap(Collision.tmp);
				addChild(_bitmap);
			}*/
		}
 
		private function detectCollision():void	{
			var intersects:Array = Collision.detectOneForMore(_hero, _boxes);
			var len:uint = intersects.length;
			for (var i:int = 0; i < len; i++) {
				var box:Bitmap = intersects[i];
				box.filters = [GLOWFILTER];
			}
		}
 
	}
 
}
Код AS3:
package  
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BitmapDataChannel;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	/**
	 * ...
	 * @author k0t0vich
	 */
	public class Collision {
		static public const ZERO_POINT:Point = new Point();
 
		// для отображения в углу пересекающейся битмапы
		//static public var tmp:BitmapData;
 
		static public function detectOneForMore(hero:Bitmap, enemies:Array):Array {
			var result:Array = [];
			var len:uint = enemies.length;
			for (var i:int = 0; i < len; i++) {
				var enemy:Bitmap = enemies[i];
				if (hero.getBounds(hero.parent).intersects(enemy.getBounds(enemy.parent))) {
					if (detectAlphaIntersection(hero, enemy)){
						result.push(enemy);
					}
 
				}
 
			}
			return result;
		}
 
 
		static public function detectAlphaIntersection(hero:Bitmap, enemy:Bitmap):Boolean {
 
			var r:Rectangle = hero.getBounds(hero.parent).intersection(enemy.getBounds(enemy.parent));		
			if (r.width > 0){
				var hRect:Rectangle = new Rectangle(r.x - hero.x, r.y - hero.y, r.width, r.height);
				var eRect:Rectangle = new Rectangle(r.x - enemy.x, r.y - enemy.y, r.width, r.height);
				trace(hRect);
				trace(eRect);
 
				var bmpd:BitmapData = new BitmapData(r.width, r.height, false, 0x00000000);
				bmpd.copyChannel(hero.bitmapData, hRect, ZERO_POINT, BitmapDataChannel.ALPHA, BitmapDataChannel.RED); 
				bmpd.copyChannel(enemy.bitmapData, eRect, ZERO_POINT, BitmapDataChannel.ALPHA, BitmapDataChannel.GREEN); 
 
				// для отображения в углу пересекающейся битмапы
				//tmp = bmpd;
 
				var alphaIntersectionRectangle:Rectangle = bmpd.getColorBoundsRect(0xFFFFFFFF, 0x00FFFF00, true);
				bmpd.dispose();
			 return alphaIntersectionRectangle.width > 0;
			} 
 
			return false;
		}
 
	}
 
}
Код AS3:
package { 
	/**
	 * ...
	 * @author k0t0vich
	 */
	public class Resources  {
		[Embed(source = "../assets/box.png")]
		public static const Box:Class;
 
		[Embed(source="../assets/hero.png")]
		public static const Hero:Class;
 
	}
 
}
Тесты на быстродействие сами уж как-нибудь.

FD проект
collision.zip
Вложения
Тип файла: swf collision.swf (18.4 Кб, 100 просмотров)
__________________
Отряд Котовскага

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

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

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

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
Отлично! Именно так, одну большую битмапдату препятствий и к ним проверку через getColor препятствия красить чёрным - свободу - белым, проверять только 6 пикселов можно даже 4 по углам куба. Никаких циклов и массивов, ура ура, совместный разум победил! =)
__________________
...Nothing can't be coded...

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

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

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


 


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


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