加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash与动画:图片移动

发布时间:2020-12-15 18:29:52 所属栏目:百科 来源:网络整理
导读:?????? ? 有时候,我们需要移动一张图片,让其看起来背景移动的效果,而移动图片的简单做法是不断改变x的坐标值,而有时候,需求是只能用一张图片就要实验滚屏的效果。采用什么办法会好一点,昨晚做了一个小实验,参考传教士一个小程序想法。采用复制像素的

??????? 有时候,我们需要移动一张图片,让其看起来背景移动的效果,而移动图片的简单做法是不断改变x的坐标值,而有时候,需求是只能用一张图片就要实验滚屏的效果。采用什么办法会好一点,昨晚做了一个小实验,参考传教士一个小程序想法。采用复制像素的办法来达到我们的图片移动效果。

???? 实验的内容:

????????????????????? 窗口分辨率是800x480

?????????????????????? 滚动图片是1600x480长度???????????

?

下面是基本的实验过程,new bg()是自定义的位图 继承bitmapdata 的基础类 。

import flash.display.BitmapData;
import flash.display.Bitmap;

var offset:int;
var rect:Rectangle;
var zp:Point = new Point();
var destX:int = 0;
var currentX:int = 0;

var canvas:BitmapData = new BitmapData(800,480,false,0x0);
var bitmap:Bitmap = addChild(new Bitmap(canvas)) as Bitmap;
var targetBmp:BitmapData=new bg();

stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void 
{
 
  currentX+=1;
  render();
 
   });


function render():void
{
	offset = currentX % 1600;
	if (offset+800<=1600)
	{
		rect = new Rectangle(offset,800,480);
	}
	else
	{
		rect = new Rectangle(offset,1600 - offset,480);
	}
	canvas.copyPixels(targetBmp,rect,zp);
	if (offset >800)
	{
		canvas.copyPixels(targetBmp,canvas.rect,new Point(1600-offset,0));
		 
	}
}


至于什么要这样弄?可以参考传教士的做法。而一张图片的滚动效果 不妨试试。

后续还可以继续改写一下程序的运作。 明天继续完善这个小实验。

?

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.geom.Point;

var offset:int;
var rect:Rectangle=new Rectangle(0,1,1);
var zp:Point = new Point();
var pt:Point=new Point();
var destX:int = 0;
var currentX:int = 0;

var canvas:BitmapData = new BitmapData(800,function(e:Event):void 
{
 
  currentX+=1;
  render();
 
   });


function render():void
{
	offset = currentX % 1600;
	if (offset+800<=1600)
	{
		//rect = new Rectangle(offset,480);
		rect.x=offset;
		rect.y=0;
		rect.width=800;
		rect.height=480;
		
	}
	else
	{
		//rect = new Rectangle(offset,480);
		rect.x=offset;
		rect.y=0;
		rect.width=1600-offset;
		rect.height=480;
	}
	canvas.copyPixels(targetBmp,zp);
	if (offset >800)
	{
		pt.x=1600-offset;
		pt.y=0;
		canvas.copyPixels(targetBmp,pt);
		 
	}
}


对比一下第二种写法。 new point 和new Rectangle 都减少了 创建,因为在EnterFrame 里面不断创建 是会产生消耗,而这new Point()这种不起眼的写法对内存消耗效果不是一下子可以看到的,而是累计的。在一次实验当中,同事把这个作为一个优化点更改出来。当时也学到不少细节的东西,至于效果明显不明显,我们肉眼很难看到。只能一点点体验

?再提炼一下。这种做法会有点别扭,减少了创建对象。

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.geom.Point;

var offset:int;
var rect:Rectangle = new Rectangle(0,1);
var pt:Point=new Point();
var currentX:int = 0;

var canvas:BitmapData = new BitmapData(800,run);

function run(e:Event):void
{
	currentX +=  1;
	render();
}

function render():void
{
	offset = currentX % 1600;
	if (offset+800<=1600)
	{
		rect.x = offset;
		rect.y = 0;
		rect.width = 800;
		rect.height = 480;

	}
	else
	{
		rect.x = offset;
		rect.y = 0;
		rect.width = 1600 - offset;
		rect.height = 480;
	}
	pt.x = pt.y = 0;
	canvas.copyPixels(targetBmp,pt);
	if (offset >800)
	{
		pt.x = 1600 - offset;
		pt.y = 0;
		canvas.copyPixels(targetBmp,pt);

	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读