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

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

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

Регистрация: Mar 2007
Адрес: Киев
Сообщений: 96
Question Пересечение объектов произвольной формы.

Подскажите пожалуйста как определить пересечение объектов произвольной формы например таких как здесь http://my-rezerv.jino-net.ru/cross.swf

Если кто-то сможет, покажите на примере.
http://my-rezerv.jino-net.ru/Cross.rar

Старый 25.11.2007, 19:38
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
У класса BitmapData, тоже есть метод hitTest, но работает он на пиксельном уровне, что дает возможность определять соприкосновения фигур с произвольной формой.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 26.11.2007 в 02:03.
Старый 26.11.2007, 01:59
bjd вне форума Посмотреть профиль Отправить личное сообщение для bjd Найти все сообщения от bjd
  № 3  
Ответить с цитированием
bjd

Регистрация: Mar 2007
Адрес: Киев
Сообщений: 96
Спасибо iNils за совет, и отдельное спасибо за перевод.
С BitmapData почти получилось, но есть одно но. В приведённом в хелпе примере

Код:
 import flash.display.BitmapData;
import flash.geom.Point;

var myBitmapData:BitmapData = new BitmapData(100, 80, false, 0x00CCCCCC);

var mc_1:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth());

var mc_2:MovieClip = createRectangle(20, 20, 0xFF0000);

var destPoint:Point = new Point(myBitmapData.rectangle.x, myBitmapData.rectangle.y);
var currPoint:Point = new Point();

mc_1.onEnterFrame = function() {
    currPoint.x = mc_2._x;
    currPoint.y = mc_2._y;
    if(myBitmapData.hitTest(destPoint, 255, currPoint)) {
        trace(">> Collision at x:" + currPoint.x + " and y:" + currPoint.y);
    }
}

mc_2.startDrag(true);

function createRectangle(width:Number, height:Number, color:Number):MovieClip {
    var depth:Number = this.getNextHighestDepth();
    var mc:MovieClip = this.createEmptyMovieClip("mc_" + depth, depth);
    mc.beginFill(color);
    mc.lineTo(0, height);
    mc.lineTo(width, height);
    mc.lineTo(width, 0);
    mc.lineTo(0, 0);
    return mc;
}
всё замечательно работает, но если например повернуть mc_1

Код:
mc_1._rotation = 90;
то почему-то происходит hitTest области до поворота.

Что и как необходимо делать, что-бы после поворота mc_1 хиттестилась уже повёрнутая область?

Старый 26.11.2007, 02:15
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Изображение надо поворочивать с помощью Matrix, а не мувиклип.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.11.2007, 00:28
bjd вне форума Посмотреть профиль Отправить личное сообщение для bjd Найти все сообщения от bjd
  № 5  
Ответить с цитированием
bjd

Регистрация: Mar 2007
Адрес: Киев
Сообщений: 96
Поворачиваю Matrix,
но все равно почему-то происходит hitTest области до поворота.

Код:
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.geom.Transform;
//--------------------------------------------------------------

var myBitmapData1:BitmapData = new BitmapData(100, 80, false, 0x00CCCCCC);

var mc_1:MovieClip = this.createEmptyMovieClip("mc1", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData1,this.getNextHighestDepth());
//--------------------------------------------------------------

var myBitmapData2:BitmapData = new BitmapData(20, 20, false, 0x0055111);

var mc_2:MovieClip = this.createEmptyMovieClip("mc2", this.getNextHighestDepth());
var mc_in2:MovieClip = mc_2.createEmptyMovieClip("mcin2", this.getNextHighestDepth());
mc_in2.attachBitmap(myBitmapData2,this.getNextHighestDepth());
//--------------------------------------------------------------

mc_y = 50;
mc_x = 50;
mc_rotation = Math.floor(Math.random() * 360) * 0.0174;

var myMatrix:Matrix = new Matrix();
myMatrix.rotate(mc_rotation);

var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(mc_y,mc_x);

myMatrix.concat(translateMatrix);

var rectangleTrans:Transform = new Transform(mc_1);
rectangleTrans.matrix = myMatrix;
//--------------------------------------------------------------

var destPoint:Point = new Point(myBitmapData1.rectangle.x, myBitmapData1.rectangle.y);
var currPoint:Point = new Point();

onEnterFrame = function () {
	currPoint.x = mc_2._x;
	currPoint.y = mc_2._y;
	if (myBitmapData1.hitTest(destPoint, 250, myBitmapData2, currPoint)) {
		trace("// Collision at x:" + currPoint.x + " and y:" + currPoint.y);
	}
};

mc_2.startDrag(true);
help me, please...

Старый 28.11.2007, 00:34
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
mc_rotation
Тут ошибка видимо, либо mc_1._rotation, либо mc_2._rotation (и двумя строчками выше тоже). Но в любом случаи, никакх поворотов мувиклипов не должно быть, только поворот BitmapData.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Регистрация: Mar 2007
Адрес: Киев
Сообщений: 96
поворот BitmapData возможен только через BitmapData.draw ?

Старый 28.11.2007, 00:43
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Да.///
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.11.2007, 01:34
bjd вне форума Посмотреть профиль Отправить личное сообщение для bjd Найти все сообщения от bjd
  № 9  
Ответить с цитированием
bjd

Регистрация: Mar 2007
Адрес: Киев
Сообщений: 96
Получилось, но...
Код:
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.geom.Transform;
//--------------------------------------------------------------

var myBitmapData0:BitmapData = new BitmapData(120, 80, false, 0x00CCCCCC);

var myBitmapData1:BitmapData = new BitmapData(550, 400, true, 0x00CCCCCC);

var mc_1:MovieClip = this.createEmptyMovieClip("mc1", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData1,this.getNextHighestDepth());
//--------------------------------------------------------------

var myBitmapData2:BitmapData = new BitmapData(20, 20, false, 0x0055111);

var mc_2:MovieClip = this.createEmptyMovieClip("mc2", this.getNextHighestDepth());
mc_2.attachBitmap(myBitmapData2,this.getNextHighestDepth());
//--------------------------------------------------------------

mc_y = 250;
mc_x = 150;
mc_rotation = Math.floor(Math.random() * 360) * 0.0174;

var myMatrix:Matrix = new Matrix();
myMatrix.rotate(mc_rotation);

var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(mc_y,mc_x);

myMatrix.concat(translateMatrix);

myBitmapData1.draw(myBitmapData0,myMatrix);

//--------------------------------------------------------------

var destPoint:Point = new Point(myBitmapData1.rectangle.x, myBitmapData1.rectangle.y);
var currPoint:Point = new Point();

onEnterFrame = function () {
	currPoint.x = mc_2._x;
	currPoint.y = mc_2._y;
	if (myBitmapData1.hitTest(destPoint, 250, myBitmapData2, currPoint)) {
		trace("// Collision at x:" + currPoint.x + " and y:" + currPoint.y);
	}
};

mc_2.startDrag(true);
...но как в таком случае задать точку поворота не в верхнем левом углу, а в центре вращаемого BitmapData

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

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
тут на форуме вроде были примеры как это реализовать без битмапдата...однако ресурсов такая попиксельная проверка хавает немерянно
__________________
Flash Developer
Папа TDP4 Team Battle

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

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

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


 


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


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