Показать сообщение отдельно
Старый 30.11.2011, 17:43
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 16  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Можно как-то этот урок лабиринта прикрутить
http://www.demiart.ru/forum/index.php?showtopic=84805
http://www.demiart.ru/forum/index.php?showtopic=46096

Ещё можно сделать четыре точки (или три), которые будут ездить по контуру, вращаясь друг относительно друга, при изменении пиксела битмапы менять точку вращения, таким образом можно перемещаться по границе, всё время цепляясь за неё одной из четырёх точек (лап)
Небольшой пример
Код AS3:
package  
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import flash.utils.*;
	import flash.geom.*;
	/**
	 * ...
	 * @author Lexcuk
	 */
	public class Doc extends Sprite
	{
		private var spiderArr:Vector.<Point>, spiderTrans:Vector.<Point>;
		private var spiderMatrix:Matrix = new Matrix();
		private var angle:Number = 0, angleStep:Number = 0.5;
		private var i:int;
		private var sprite:Sprite;
		private var cenRotX:Number = 0, cenRotY:Number = 0, startX:int, startY:int;
		private var spiralDiam:Number = 0, spiralAngle:Number = 0, spiralAnStep:Number = 0.1;
		private var spiTag:Boolean = false;
		private var curHand:int, contactStr:String = '';
 
		private var bmd:BitmapData;
 
		public function Doc() 
		{
			var sh:Shape = new Shape();
			sh.graphics.beginFill(0xFF0000);
			sh.graphics.drawCircle(230, 200, 100);
			sh.graphics.drawCircle(100, 150, 40)
			sh.graphics.drawCircle(250, 100, 40)
 
 
			addChild(new Bitmap(bmd = new BitmapData(550, 400, false)));
 
			//фото в битмапдату
			bmd.draw(sh);
 
			addChild(sprite = new Sprite());
			spiderArr = Vector.<Point>([
			new Point( -5, -5), new Point(5, -5), new Point(5, 5), new Point(-5, 5)
			]);
			spiderTrans = new Vector.<Point>();
 
			cenRotX = spiderArr[0].x;
			cenRotY = spiderArr[0].y;
 
			//точка сброса
			startX = 50;
			startY = 50;
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		private function showSpider():void {
			sprite.graphics.clear();
			sprite.graphics.lineStyle(0);
			for (i = 0; i < spiderArr.length; i++) 
				sprite.graphics.drawCircle(spiderTrans[i].x, spiderTrans[i].y,2);
		}
 
 
		private function enterFrameHandler(e:Event):void {
			//если не нашли, то ищем
			if (!spiTag) spiderTagertLookFor();
			else spiderGo();
			showSpider();
		}
 
		//режим первоначального поиска цели
		private function spiderTagertLookFor():void {
			//крутиться по возрастающей спирали
			spiderMatrix.identity();
			//смещение на длину спирали
			spiderMatrix.translate(spiralDiam += angleStep, 0);
			//вращение на угол спирали
			spiderMatrix.rotate(spiralAngle += spiralAnStep);
			//смещение на точку сброса
			spiderMatrix.translate(startX, startY);
			//применение матрицы к лапам
 
			for (i = 0; i < spiderArr.length; i++) 
				spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]);
			//тестим паука на пересечение лап
			if (pixelTester()) spiTag = true;
		}
 
		//режим перемещения по цели
		public function spiderGo():void {
			//крутится относительно следующей законтаченной лапы
			if (curHand == 3) if (contactStr.charAt(2) == '1') curHand = 2;
			if (curHand == 0) if (contactStr.charAt(3) == '1') curHand = 3;
			if (curHand == 1) if (contactStr.charAt(0) == '1') curHand = 0;
			if (curHand == 2) if (contactStr.charAt(1) == '1') curHand = 1;
 
			cenRotX = spiderTrans[curHand].x;
			cenRotY = spiderTrans[curHand].y;
 
 
			//сместить матрицу паука на текущее положение лапы
			spiderMatrix.translate( -cenRotX, -cenRotY);
			//трансформировать лапы, повернув их относительно текущей лапы
			spiderMatrix.rotate(-angle);
			spiderMatrix.rotate(angle += angleStep);
			//вернуть лапы обратно
			spiderMatrix.translate( cenRotX, cenRotY);
			for (i = 0; i < spiderArr.length; i++) 
				spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]);
 
			//проверка лап
			pixelTester();
		}
 
		private function pixelTester():Boolean {
			var r:Boolean;
			var c:uint;
			contactStr = '';
			for (i = 0; i < spiderArr.length; i++) {
				c = bmd.getPixel(spiderTrans[i].x, spiderTrans[i].y);
				if (spiderTrans[i].x <= 0 && spiderTrans[i].y <= 0) c = 0xFFFFFF;
				if (c == 0xFFFFFF||c==0) {
					contactStr += '1';
				}else {
					r = true;
					contactStr += '0';
				}
			}
			return r;
		}
 
	}
 
}
http://murmadillo.tut.su/m/spider-doc.swf
__________________
Гоночка


Последний раз редактировалось Alex Lexcuk; 30.11.2011 в 17:48.