![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Приветствую.
Не знаю как правильно реализовать бесконечное движение фона по 2м осям. Пока попробовал так, но результат не нравится. Создал текстуру bgr и копировал ее 9 раз для замещения, тех участков, что выходят за границы видимости. Движение текстуры вызывает обьект obj, который сам тоже движется. Чувствую,что все должно быть намного проще. Еще хочу спросить, как убрать резкий переход при смене направления движения фона? Смотрел через диспетчер: флешка эта жрет 300 мб памяти.Для изображения 1920*1080 это нормально? Может растрировать как-то или еще что-то? stage.displayState = StageDisplayState.FULL_SCREEN; import flash.display.MovieClip; ///// var flag:String = null; var speedbg:int = 5; var bg:MovieClip = new bgr ; var bg1:MovieClip = new bgr ; var bg2:MovieClip = new bgr ; var bg3:MovieClip = new bgr ; var bg4:MovieClip = new bgr ; var bg5:MovieClip = new bgr ; var bg6:MovieClip = new bgr ; var bg7:MovieClip = new bgr ; var bg8:MovieClip = new bgr ; addChildAt(bg,0); addChildAt(bg1,0); addChildAt(bg2,0); addChildAt(bg3,0); addChildAt(bg4,0); addChildAt(bg5,0); addChildAt(bg6,0); addChildAt(bg7,0); addChildAt(bg8,0); bg.x = 0; bg.y = 0; bg1.x = -1920;//stage.stageWidth-stage.stageWidth*2; bg1.y = 0; bg2.x = 1920;//stage.stageWidth; bg2.y = 0; bg3.x = 0;//stage.stageWidth; bg3.y = -1080; bg4.x = 0;//stage.stageWidth; bg4.y = 1080 * 2; // и так далее bg8.x = 1920; bg8.y = 1080; ////////////////////////////////////////////// var fnX = -500; var fnY = 0; var dir:Number = Math.atan2(mouseY-obj.y, mouseX-obj.x) / Math.PI * 180; dir += 180; var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI)); stage.addEventListener(MouseEvent.CLICK, fnGetXY); addEventListener(Event.ENTER_FRAME, enterFrame); function enterFrame(e:Event):void { // при положительной скорости идем за курсором // при отрицательной - от курсора var speed:Number = -1; //fnGetXY(); var p:Point = new Point(fnX - obj.x, fnY - obj.y); p.normalize(speed); obj.x += p.x; obj.y += p.y; if (bg.x + 1920 < 0) { startPosition(); } if (bg1.x + 1920 < -1920) { startPosition(); } if (bg2.x + 1920 == 0) { startPosition(); } if (bg.x == 1920) { startPosition(); } if (bg1.x == 0) { startPosition(); } if (bg2.x == 1920 * 2) { startPosition(); } if (bg.y==-1080) { startPosition(); } if (bg.y==1080) { startPosition(); } // и так далее //////////////////////////////// // Влево if (obj.x < fnX) { bg.x = bg.x - speedbg; bg1.x = bg1.x - speedbg; bg2.x = bg2.x - speedbg; bg3.x = bg3.x - speedbg; // и так далее flag = "left"; } //Вправо if (obj.x > fnX) { bg.x = bg.x + speedbg; bg1.x = bg1.x + speedbg; bg2.x = bg2.x + speedbg; bg3.x = bg3.x + speedbg; // и так далее flag = "right"; } //Вверх if (obj.y < fnY) { bg.y = bg.y - speedbg; bg1.y = bg1.y - speedbg; bg2.y = bg2.y - speedbg; bg3.y= bg3.y - speedbg; bg4.y= bg4.y - speedbg; // и так далее flag = "up"; } // Вниз if (obj.y > fnY) { bg.y = bg.y +speedbg; bg1.y = bg1.y +speedbg; bg2.y = bg2.y +speedbg; bg3.y= bg3.y +speedbg; bg4.y= bg4.y +speedbg; // и так далее flag = "down"; } } function fnGetXY(event:MouseEvent):void { fnX = stage.mouseX; fnY = stage.mouseY; } function startPosition():void { bg.x = 0; bg1.x = -1920; bg2.x = 1920; bg3.x = 0; bg4.x = 0; bg.y=0; bg1.y =0; bg2.y =0; bg3.y = -1080; bg4.y = 1080 * 2; // и так далее bg5-bg8; } |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
Что-то многовато однако. У меня размер двигающейся платформы 3000х3000, помимо функций и других объектов которые потребляют память, флеш потребляет всего лишь 80мбайт)
|
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Только что нашел. Говорят, можно как-то использовать метод scroll() для прокрутки изображения? Можете примерчик дать?
|
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
http://help.adobe.com/en_US/FlashPla...inBitmapFill()
смотри параметр repeat |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Спасибо.Я так понял, этот параметр задет повтор тайла. Но как им пользоваться не понимаю. Как им имитировать движение, включать/выключать?
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вот как-то делал классик, не пинайте, 2011 год..
package { import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Graphics; import flash.display.IBitmapDrawable; import flash.display.Sprite; import flash.geom.Matrix; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public class TiledBackground extends Sprite { private var _tile :BitmapData; private var _offsetX :Number; private var _offsetY :Number; private var _tileAngle :Number; private var _areaW :Number; private var _areaH :Number; private var _matrix :Matrix; private var _smooth :Boolean; private var _graphics :Graphics; public function TiledBackground(areaWidth:Number, areaHeight:Number, tile:IBitmapDrawable, offsetX:Number = 0, offsetY:Number = 0, tileAngle:Number = 0, smooth:Boolean = true) { _offsetX = offsetX; _offsetY = offsetY; _tileAngle = tileAngle * Math.PI / 180; _smooth = smooth; _areaW = areaWidth; _areaH = areaHeight; _graphics = this.graphics; if (tile is BitmapData) { _tile = (tile as BitmapData).clone(); } else { var t:DisplayObject = tile as DisplayObject; _tile = new BitmapData(t.width, t.height); _tile.draw(tile); } _matrix = new Matrix(); fill(); } private function fill():void { _matrix.identity(); _matrix.rotate(_tileAngle); _matrix.tx = _offsetX; _matrix.ty = _offsetY; _graphics.clear(); _graphics.beginBitmapFill(_tile, _matrix, true, _smooth); _graphics.drawRect(0, 0, _areaW, _areaH); } public function get offsetX():Number { return _offsetX; } public function set offsetX(value:Number):void { if (_offsetX != value) { _offsetX = value; fill(); } } public function get offsetY():Number { return _offsetY; } public function set offsetY(value:Number):void { if (_offsetY != value) { _offsetY = value; fill(); } } public function get smooth():Boolean { return _smooth; } public function set smooth(value:Boolean):void { _smooth = value; fill(); } public function get tileAngle():Number { return _tileAngle; } public function set tileAngle(value:Number):void { _tileAngle = value; fill(); } } } package { import flash.display.Sprite; import flash.events.Event; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public class Main extends Sprite { private var _ts:TiledBackground; [Embed(source='../lib/Drop_by_Drop_by_youngmoons___2.jpg')] private var _img:Class; private var _timer:Timer; private var _top:Sprite; private var _bottom:Sprite; private var _left:Sprite; private var _right:Sprite; private var _dirX: int = 0; private var _dirY: int = 0; private var _speed:int = 1; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.showDefaultContextMenu = false; // entry point _ts = new TiledBackground(500, 500, new _img(), 0, 0, 45, true); addChild(_ts); _ts.x = 100, _ts.y = 100; // кнопки управления _top = scrollButton(_ts.width, 30); _bottom = scrollButton(_ts.width, 30); _left = scrollButton(30, _ts.height); _right = scrollButton(30, _ts.height); addChild(_top); addChild(_bottom); addChild(_left); addChild(_right); _top.x = 100, _top.y = 65; _bottom.x = 100, _bottom.y = _ts.height + 105; _left.x = 65, _left.y = 100; _right.x = _ts.width + 105, _right.y = 100; _top .addEventListener(MouseEvent.ROLL_OVER, overHandler); _bottom.addEventListener(MouseEvent.ROLL_OVER, overHandler); _left.addEventListener(MouseEvent.ROLL_OVER, overHandler); _right.addEventListener(MouseEvent.ROLL_OVER, overHandler); _top.addEventListener(MouseEvent.ROLL_OUT, outHandler); _bottom.addEventListener(MouseEvent.ROLL_OUT, outHandler); _left.addEventListener(MouseEvent.ROLL_OUT, outHandler); _right.addEventListener(MouseEvent.ROLL_OUT, outHandler); // таймер "движения" _timer = new Timer(12); } private function outHandler(event:MouseEvent):void { _timer.removeEventListener(TimerEvent.TIMER, enterFrameHandler); _timer.stop(); } private function overHandler(event:MouseEvent):void { var targ:Sprite = event.currentTarget as Sprite; switch(targ) { case _top : _dirX = 0; _dirY = _speed; break; case _bottom : _dirX = 0; _dirY = -_speed; break; case _left : _dirX = _speed; _dirY = 0; break; case _right : _dirX = -_speed; _dirY = 0; break; } _timer.addEventListener(TimerEvent.TIMER, enterFrameHandler); _timer.start(); } private function enterFrameHandler(event:TimerEvent):void { _ts.offsetX += _dirX; _ts.offsetY += _dirY; //_ts.tileAngle += 0.005;// тест поворота event.updateAfterEvent(); } private function scrollButton(width:Number, height:Number):Sprite { var s:Sprite = new Sprite(); s.graphics.beginFill(0xDDDDDD); s.graphics.drawRect(0, 0, width, height); return s; } } }
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Спасибо, Wolsh
Буду разбираться в твоем правильном способе Я уже кое-как заставил работать по-своему, но возникла проблема в связывании классов. Можно, в принципе, код записать в классе GG, но хочется сделать раздельно. Думал обойти проблему, определив в главном классе срабатывание на событие в GG, но что-то опять так. Обьясните, пожалуйста, как пользоваться диспатчером. А может он мне и не нужен вовсе. Задача- получить из GG для главного класса координаты GG и переменные fnX и fnY. Вот класс GG: var fnX:int; var fnY:int; var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180; dir += 180; var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI)); stage.addEventListener(MouseEvent.CLICK, fnGetXY); addEventListener(Event.ENTER_FRAME, enterFrame); function enterFrame(e:Event):void { // при положительной скорости идем за курсором // при отрицательной - от курсора var speed:Number = -1; //fnGetXY(); var p:Point = new Point(fnX - this.x, fnY - this.y); p.normalize(speed); this.x += p.x; this.y += p.y; this.dispatchEvent(new Event("GG_MOVE"));// Как правильно пользоваться диспатчером? } function fnGetXY(event:MouseEvent):void { fnX = stage.mouseX; fnY = stage.mouseY; } stage.displayState = StageDisplayState.FULL_SCREEN; import flash.display.MovieClip; //public var fnX:int; //public var fnY:int; //trace(fnX,fnY); var gg_x_array:Array= new Array; var gg_y_array:Array= new Array; var gg:GG=new GG; addChild(gg); gg.x=550; gg.y=550; stage.addEventListener(Event.ENTER_FRAME,fn_gg_xy_array); function fn_gg_xy_array (event:Event):void { gg_x_array.push( Math.round(gg.x)); gg_y_array.push( Math.round(gg.y)); if (gg_x_array.length>2) { trace("x= "+gg_x_array); gg_x_array=new Array; } if (gg_y_array.length>2) { trace("y= "+gg_y_array); gg_y_array= new Array; } } if (gg_x_array.length>2) trace(gg_x_array); var speed:int = 10; ////////////////////////////////////////// var bg:Object=new Object; //var bg:BGR=new BGR; for( var i=0; i<9; i++) { bg[i]= new BGR; addChildAt(bg[i],0); } fn_start_position (); //// Движение фона после срабатывания на изменения в gg gg.addEventListener("GG_MOVE",fn_move_bg);// Я не знаю как пользоваться диспатчером( function fn_move_bg(event:Event):void { if(gg_x_array[0]>gg_x_array[gg_x_array.length]) { var i:int; for (i=0 ; i<9; i++) { bg[i].x=bg[i].x+speed; } fn_check_xy(); } if(gg_x_array[0]<gg_x_array[gg_x_array.length]) { for (i=0 ; i<9; i++) { bg[i].x=bg[i].x-speed; } fn_check_xy(); } if(gg_y_array[0]>gg_y_array[gg_y_array.length]) { for (i=0 ; i<9; i++) { bg[i].y=bg[i].y+speed; } fn_check_xy(); } if(gg_y_array[0]<gg_y_array[gg_y_array.length]) { for (i=0 ; i<9; i++) { bg[i].y=bg[i].y-speed; } fn_check_xy(); } } ////////////////////////////////////////// function fn_check_xy():void { //Проверка фона по X if(bg[4].x<0-bg[0].width||bg[4].x>bg[0].width) { //0 bg[0].x =0-bg[0].width; //1 bg[1].x =0; //2 bg[2].x =bg[0].width; //3 bg[3].x =0-bg[0].width; //4 bg[4].x =0; //5 bg[5].x =bg[0].width; //6 bg[6].x =0-bg[0].width; //7 bg[7].x =0; //8 bg[8].x =bg[0].width; } // Проверка фона по Y if(bg[4].y<0-bg[0].height||bg[4].y>bg[0].height) { //0 bg[0].y =0-bg[0].height; //1 bg[1].y =0-bg[0].height; //2 bg[2].y =0-bg[0].height; //3 bg[3].y =0; //4 bg[4].y =0; //5 bg[5].y =0; //6 bg[6].y =bg[0].height; //7 bg[7].y =bg[0].height; //8 bg[8].y =bg[0].height; } } ////////////////////////////////////////// function fn_start_position ():void { // Начальные координаты фона //0 bg[0].x = 0-bg[0].width; bg[0].y = 0-bg[0].height; //1 bg[1].x =0; bg[1].y =0-bg[0].height; //2 bg[2].x =bg[0].width; bg[2].y =0-bg[0].height; //3 bg[3].x =0-bg[0].width; bg[3].y =0; //4 bg[4].x =0; bg[4].y =0; //5 bg[5].x =bg[0].width; bg[5].y =0; //6 bg[6].x =0-bg[0].width; bg[6].y =bg[0].height; //7 bg[7].x =0; bg[7].y =bg[0].height; //8 bg[8].x =bg[0].width; bg[8].y =bg[0].height; } Это пришлось добавить, т.к. не знаю как связать классы( stage.addEventListener(Event.ENTER_FRAME,fn_gg_xy_array); function fn_gg_xy_array (event:Event):void { gg_x_array.push( Math.round(gg.x)); gg_y_array.push( Math.round(gg.y)); if (gg_x_array.length>2) { trace("x= "+gg_x_array); gg_x_array=new Array; } if (gg_y_array.length>2) { trace("y= "+gg_y_array); gg_y_array= new Array; } |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Привет.
Получилась у меня такая вот штука(прикрепляю архив) Работает не очень гладко и, согласно диспетчеру, кушает 50% процессора. Если не сильно лень, посмотрите пожалуйста, какие я допустил ошибки и напишите как оптимизировать. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:50. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|