Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.02.2015, 18:32
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 1  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
По умолчанию Вопрос.Бесконечный движущийся фон по 2м осям

Приветствую.
Не знаю как правильно реализовать бесконечное движение фона по 2м осям.
Пока попробовал так, но результат не нравится. Создал текстуру bgr и копировал ее 9 раз для замещения, тех участков, что выходят за границы видимости. Движение текстуры вызывает обьект obj, который сам тоже движется.
Чувствую,что все должно быть намного проще.
Еще хочу спросить, как убрать резкий переход при смене направления движения фона?
Смотрел через диспетчер: флешка эта жрет 300 мб памяти.Для изображения 1920*1080 это нормально? Может растрировать как-то или еще что-то?

Код AS3:
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;
}

Старый 21.02.2015, 19:01
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 2  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Код AS3:
Смотрел через диспетчер: флешка эта жрет 300 мб памяти.Для изображения 1920*1080 это нормально?
Что-то многовато однако. У меня размер двигающейся платформы 3000х3000, помимо функций и других объектов которые потребляют память, флеш потребляет всего лишь 80мбайт)

Старый 21.02.2015, 20:14
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 3  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Только что нашел. Говорят, можно как-то использовать метод scroll() для прокрутки изображения? Можете примерчик дать?

Старый 22.02.2015, 13:07
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
http://help.adobe.com/en_US/FlashPla...inBitmapFill()
смотри параметр repeat

Старый 23.02.2015, 05:08
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 5  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Спасибо.Я так понял, этот параметр задет повтор тайла. Но как им пользоваться не понимаю. Как им имитировать движение, включать/выключать?

Старый 23.02.2015, 12:44
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вот как-то делал классик, не пинайте, 2011 год..
Код AS3:
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();
		}
	}
}
Тестовый Main:
Код AS3:
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;
		}
	}
 
}
Во флэшке ниже — наводить мышку на серые полоски вокруг картинки
TileScroll.swf   (28.9 Кб)
Вложения
Тип файла: zip TileScroll - FD 2011 Project.zip (57.7 Кб, 59 просмотров)
Тип файла: swf TileScroll.swf (28.9 Кб, 293 просмотров)
__________________
Reality.getBounds(this);

Старый 23.02.2015, 14:40
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 7  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Спасибо, Wolsh
Буду разбираться в твоем правильном способе
Я уже кое-как заставил работать по-своему, но возникла проблема в связывании классов. Можно, в принципе, код записать в классе GG, но хочется сделать раздельно.
Думал обойти проблему, определив в главном классе срабатывание на событие в GG, но что-то опять так.
Обьясните, пожалуйста, как пользоваться диспатчером. А может он мне и не нужен вовсе.
Задача- получить из GG для главного класса координаты GG и переменные fnX и fnY.
Вот класс GG:
Код AS3:
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;
}
Это главный класс:
Код AS3:
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;
}
Добавлено через 3 минуты
Это пришлось добавить, т.к. не знаю как связать классы(
Код AS3:
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;
	}

Старый 29.03.2015, 22:59
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 8  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Привет.
Получилась у меня такая вот штука(прикрепляю архив)
Работает не очень гладко и, согласно диспетчеру, кушает 50% процессора.
Если не сильно лень, посмотрите пожалуйста, какие я допустил ошибки и напишите как оптимизировать.
Вложения
Тип файла: zip вопросы по игре.zip (6.86 Мб, 45 просмотров)

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:34.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.