|
|
|||||
flazher, такой вот pixelcheck будет медленно работать. Думаю для задачи с линией, как в твоём первом посте, он ещё подойдёт, но проигрывает аналитическим методам. Представь что будет, если захочешь проверить на столкновение два очень больших объекта.
По поводу оптимизации в твоём примере. Два объекта сталкиваются, если хотя бы один пиксель у них общий. Так что после нахождения первого общего пикселя, нужно заканчивать циклы.
__________________
while(1) {} Последний раз редактировалось Division; 22.11.2008 в 13:34. |
|
|||||
Регистрация: Nov 2007
Сообщений: 1,723
|
Это вовсе не его пример, он его взял с форума, в исходниках
|
|
|||||
Регистрация: Sep 2006
Сообщений: 32
|
на первой странице, я привел пример кода пересечения квадрата линией(бесконечной).
теперь же вот код пересечения квадрата отрезком: ловите //точки отрезка: var p0:MovieClip = createPoint(170,270); var p1:MovieClip = createPoint(300,100); //точки квадрата: var a:MovieClip = createPoint(200,200); var b:MovieClip = createPoint(300,200); var c:MovieClip = createPoint(300,300); var d:MovieClip = createPoint(200,300); onEnterFrame = function() { _root.clear(); var hit:Boolean = true; var dx:Number = p1._y-p0._y; var dy:Number = p0._x-p1._x; var s0:Number = (a._x-p0._x)*dx+(a._y-p0._y)*dy; var s1:Number = (b._x-p0._x)*dx+(b._y-p0._y)*dy; var s2:Number = (c._x-p0._x)*dx+(c._y-p0._y)*dy; var s3:Number = (d._x-p0._x)*dx+(d._y-p0._y)*dy; if( (s0> 0&&s1> 0&&s2> 0&&s3> 0)|| (s0<=0&&s1<=0&&s2<=0&&s3<=0))hit=false; s0 = Math.min( (a._y-d._y)*(p0._x-d._x)+(d._x-a._x)*(p0._y-d._y), (a._y-d._y)*(p1._x-d._x)+(d._x-a._x)*(p1._y-d._y)); s1 = Math.min( (b._y-a._y)*(p0._x-a._x)+(a._x-b._x)*(p0._y-a._y), (b._y-a._y)*(p1._x-a._x)+(a._x-b._x)*(p1._y-a._y)); s2 = Math.min( (c._y-b._y)*(p0._x-b._x)+(b._x-c._x)*(p0._y-b._y), (c._y-b._y)*(p1._x-b._x)+(b._x-c._x)*(p1._y-b._y)); s3 = Math.min( (d._y-c._y)*(p0._x-c._x)+(c._x-d._x)*(p0._y-c._y), (d._y-c._y)*(p1._x-c._x)+(c._x-d._x)*(p1._y-c._y)); if(hit&&(s0>0||s1>0||s2>0||s3>0)) hit = false; beginFill((hit)?0xff0000:0x00ff00); moveTo(a._x,a._y); lineTo(b._x,b._y); lineTo(c._x,c._y); lineTo(d._x,d._y); endFill(); lineStyle(1); moveTo(p0._x,p0._y); lineTo(p1._x,p1._y); } function createPoint(x:Number,y:Number):MovieClip { var i:Number = getNextHighestDepth(); var p:MovieClip = createEmptyMovieClip("point"+i.toString(),i); p.beginFill(0); p.lineTo(7,0); p.lineTo(0,7); p.endFill(); p._x = x; p._y = y; p.onPress = function(){this.startDrag();} p.onMouseUp = function(){this.stopDrag();} return p; } |
|
|||||
[+3 05.08.09]
Регистрация: Sep 2008
Адрес: Ё∙м∙с∙к
Сообщений: 147
|
вот спасибо. мне это как раз и надо было.
__________________
не прелюбодействуй с мозгом ближнего своего! |
|
|||||
Banned
[+1 16.01.09]
[+1 21.07.08] [+3 08.09.08] Регистрация: Apr 2008
Адрес: Hm...will it blend?
Сообщений: 303
|
Bootaka, вообще-то тему я создал () Но все равно спасибо.
|
Часовой пояс GMT +4, время: 18:52. |
|
« Предыдущая тема | Следующая тема » |
|
|