Показать сообщение отдельно
Старый 09.12.2012, 12:50
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Беспонятия, если честно. Но Вы мне нравитесь. Накидал пример. Управлять стрелками.
Код AS3:
package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.ui.Keyboard;
 
	/**
	 * ...
	 * @author Artem Shlagin
	 */
	[SWF(width="820", height="599", frameRate = "30", backgroundColor="#efefef")]
	public class MyMain extends Sprite {
		//ширина и высота вьюпорта
		public static const VIEWPORT_SIZE:Point = new Point(820, 569);
		private var _background:Sprite;
		private var _gameWorld:Sprite;
		private var _hero:Shape;
		private var _keys:Object = { };
		private var _bitmapData:BitmapData;
		private var _bitmap:Bitmap;
		public function MyMain() {
			super();
			super.stage.align = StageAlign.TOP_LEFT;
			super.stage.scaleMode = StageScaleMode.NO_SCALE;
 
			//рисуем бэкграунд с квадратиками, чтобы было видно где мы ходим
			_background = new Sprite();
			_background.graphics.beginFill(0xCED8E4);
			_background.graphics.drawRect(0, 0, 2000, 2000);
			_background.graphics.endFill();
 
			var i:int = 10 * 10;
			while (i--){
				var obstacle:Shape = new Shape();
				obstacle.graphics.beginFill(0x555555 * Math.random() + 0x555555);
				obstacle.graphics.drawRect(0, 0, 50, 50);
				obstacle.graphics.endFill();
				obstacle.x = 100 * int (i / 10);
				obstacle.y = 100 * (i % 10);
				_background.addChild(obstacle);
			}
 
 
			//рисуем героя
			_hero = new Shape();
			 _hero.graphics.beginFill(0xFFFFFF);
			_hero.graphics.drawCircle(0, 0, 25);
			_hero.graphics.endFill();
 
			//кладем мир и героя в один контейнер
			_gameWorld = new Sprite();
			_gameWorld.addChild(_background);
			_gameWorld.addChild(_hero);
 
 
			//создаём битмапу для камеры
			_bitmapData = new BitmapData(VIEWPORT_SIZE.x,  VIEWPORT_SIZE.y);
			_bitmap = new Bitmap(_bitmapData);
 
			//добавляем не игровой мир, а камеру
//			super.addChild(_gameWorld);
			super.addChild(_bitmap);
 
			//листенеры для клавиатуры, чтобы герой бегал
			super.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
			super.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler);
			super.stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler);
		}
 
		private function keyHandler(event:KeyboardEvent):void {
			_keys[event.keyCode] = event.type === KeyboardEvent.KEY_DOWN;
		}
 
		private function enterFrameHandler(event:Event):void {
			//двигаем героя, если надо
			const speed:Number = 10;
			if (_keys[Keyboard.LEFT]) _hero.x -= speed;
			if (_keys[Keyboard.RIGHT]) _hero.x += speed;
			if (_keys[Keyboard.UP]) _hero.y -= speed;
			if (_keys[Keyboard.DOWN]) _hero.y += speed;
 
			//обновляем камеру
			var centerPoint:Point = new Point(-_hero.x + VIEWPORT_SIZE.x * 0.5,  -_hero.y + VIEWPORT_SIZE.y * 0.5);
 
			//4 условия, чтобы блокировать сдвиг камеры в углах игрового мира
			//(закоменти, если камера должна двигаться всегда)
			if (centerPoint.y > 0) centerPoint.y = 0;
			else if (centerPoint.y < -_gameWorld.height + VIEWPORT_SIZE.y) centerPoint.y = -_gameWorld.height + VIEWPORT_SIZE.y;
			if (centerPoint.x > 0) centerPoint.x = 0;
			else if (centerPoint.x < -_gameWorld.width + VIEWPORT_SIZE.x) centerPoint.x = -_gameWorld.width + VIEWPORT_SIZE.x;
			var matrix:Matrix = new Matrix();
			matrix.tx = int(centerPoint.x);
			matrix.ty = int(centerPoint.y);
			_bitmapData.fillRect(_bitmapData.rect, 0x00);
			_bitmapData.draw(_gameWorld, matrix, null, null, _bitmapData.rect, true);
		}
 
 
	}
 
}
MyMain.swf   (1.7 Кб)
Вложения
Тип файла: swf MyMain.swf (1.7 Кб, 143 просмотров)