![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2013
Сообщений: 38
|
Привет, помогите написать код для камеры слежения за персонажем, что бы при ресайзе и открытии в фуллскрин ничего не ломалось, если разрешения экрана больше карты , то она должна центрироваться и не двигаться по этому направлению. по возможности хотелось бы что были рамки побокам которые определяли когда не обходимо двигаться, для наглядности пример из блога Anton Karlov. scroll map
сам код для которого нужна камера: package { import flash.display.Sprite; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.KeyboardEvent; [SWF(width="768", height="704", frameRate="30", backgroundColor="#000000")] public class testd extends Sprite { private var map:Sprite; private var hero:Sprite; public function testd() { map = new Sprite(); map.graphics.beginFill(0x8FBC8F); map.graphics.drawRect(0,0,1024,1024); map.graphics.endFill(); map.graphics.beginFill(0xE9967A); map.graphics.moveTo(0,1024); map.graphics.lineTo(1024,0); map.graphics.lineTo(0,0); map.graphics.endFill(); map.cacheAsBitmap = true; addChild(map); hero = new Sprite(); hero.graphics.beginFill(0xA52A2A); hero.graphics.drawRect(0,0,64,64); hero.graphics.endFill(); hero.cacheAsBitmap = true; map.addChild(hero); this.addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { this.removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); stage.addEventListener(Event.ENTER_FRAME, update); stage.addEventListener(Event.RESIZE, resize); moviePix = 16; movie = true; } // Переменные для движения private var nextKeyDown:int; private var currentKeyDown:int; private var moviePix:int; private var movie:Boolean; private function onKeyDown(e:KeyboardEvent):void { nextKeyDown = e.keyCode; } private function onKeyUp(e:KeyboardEvent):void { if(e.keyCode == currentKeyDown && currentKeyDown == nextKeyDown) { nextKeyDown = 0; } } private function update(e:Event):void { if(movie) { if(moviePix == 16) { if(nextKeyDown != 0) { moviePix = 0; currentKeyDown = nextKeyDown; }else currentKeyDown = 0; } switch(currentKeyDown) { case 37: hero.x -= 4; moviePix++; break; case 38: hero.y -= 4; moviePix++; break; case 39: hero.x += 4; moviePix++; break; case 40: hero.y +=4; moviePix++; break; } } updateCamera(); } private function updateCamera():void { //code camera } private function resize(e:Event = null):void { //code resize } }//class } камера не должна выезжать за пределы карты когда сцена меньше карты. проект прикреплен ниже. ужа давно бьюсь ничего путного не получается( Последний раз редактировалось taluks; 18.01.2014 в 18:49. |
|
|||||
|
Регистрация: Jan 2014
Сообщений: 2
|
Вот чем могу помочь(Листинг 2). Применяется для слежения за игроком на футбольном поле.
Примеры применения (Листинг 1) (Листинг 1) Scrolling = new Scrollingdata(SW, SH, W, H); scrollRect = Scrolling.getRect(); private function moveRectWath (gmrInd:int) { Scrolling.updateScrollRect(PlMng.PlArray[gmrInd].x, PlMng.PlArray[gmrInd].y); scrollRect = Scrolling.getRect(); // Прокрутка области } public function changeSkroolRect (SW:int, SH:int) { // изменяем размеры области скролла - вход в полный экран Scrolling.setRectangle(SW, SH, W, H); } (Листинг 2) package Field { import flash.geom.Rectangle; public class Scrollingdata { private var H:Number; // Полная высота окна, по которому скроллим private var W:Number; // Полная ширина окна, по которому скроллим private var itrnlSW:Number; // Ширина прямоугольника для скролла private var itrnlSH:Number; // Высота прямоугольника для скролла private var itcurDltX:Number = 0; // текущее смещение в скроле private var itcurDltY:Number = 0; // текущее смещение в скроле private var maxDltX:Number = 0; // максимальное смещение в скролле private var maxDltY:Number = 0; // максимальное смещение в скролле public function Scrollingdata (SWout:Number, SHout:Number, Wout:Number, Hout:Number) { setRectangle (SWout, SHout, Wout, Hout); } /****************************************************/ public function setRectangle (SWout:Number, SHout:Number, Wout:Number, Hout:Number) { itrnlSW = SWout; // Ширина прямоугольника для скролла itrnlSH = SHout; // Высота прямоугольника для скролла W = Wout; // Полная ширина окна, по которому скроллим H = Hout; // Полная высота окна, по которому скроллим maxDltX = W - itrnlSW; // максимальное смещение в скролле if (maxDltX < 0) maxDltX = 0; maxDltY = H - itrnlSH; // максимальное смещение в скролле if(maxDltY < 0) maxDltY = 0; } /****************************************************/ public function getRect () : Rectangle { var rect:Rectangle = new Rectangle(itcurDltX, itcurDltY, itrnlSW, itrnlSH); // Прокрутка области return rect; } /****************************************************/ public function updateScrollRect (PlX:Number, PlY:Number) { itcurDltX = PlX - itrnlSW*0.5; itcurDltY = PlY - itrnlSH*0.5; if (itcurDltX < 0) itcurDltX = 0; if (itcurDltY < 0) itcurDltY = 0; if (itcurDltX > maxDltX) itcurDltX = maxDltX; if (itcurDltY > maxDltY) itcurDltY = maxDltY; } /****************************************************/ public function get SW () : Number { return itrnlSW; } /****************************************************/ public function get SH () : Number { return itrnlSH; } /****************************************************/ public function get curDltX () : Number { return itcurDltX; } /****************************************************/ public function get curDltY () : Number { return itcurDltY; } /****************************************************/ } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:18. |
|
|
« Предыдущая тема | Следующая тема » |
|
|