`

flex调用swf——swf可以转成具体的对象,而非MovieClip

    博客分类:
  • flex
阅读更多

flex builder中新建一个ActionScript工程,代码如下

package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.events.*;
	import flash.geom.*;
	import flash.text.*;
	
	import mx.core.SpriteAsset;
	[SWF(width="80",height="100",frameRate="24")]
	public class action extends SpriteAsset
	{
		var player:Player=new Player;
		public function action()
		{
			this.addChild(player);
			
		}
		public function startGo(){
			player.startGo();
			
		}
		public function stopWalk(){
			player.stopWalk();
		}
		//根据整数调整角度
		public function setDirection(derection:int){
			player.setDirect=derection;
		}
		//计算出角度再调整角度
		public function walkAndle(radians:Number){
			player.setDirection(radians);
		}
		public function moveToNextFrame(currentFrame:int,direction:int){
			player.setCurrentFrame=currentFrame;
			player.setDirect=direction;
			player.moveToNextFrame();
		}
		public function setDisdata(simpleBitmapdata:BitmapData){
			player.simpleBitmapdata=simpleBitmapdata;
		}
		public function setAlpha(bitmap:Bitmap){
			player.simpleBitmap=bitmap;
		}
	}
}

 

  

package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.net.*;
	public class Player extends Sprite
	{
		
		[Embed(source="image/h1.png")]
		private var role:Class;
		
		private var playerBit:Bitmap;//整张图的
		private var playerBitData:BitmapData;//整张图的data
		
		private var simpleBit:Bitmap;//单个动作的bitmap
		private var simpleBitData:BitmapData;//单个动作的data;
		private var simpleWidth:int=80;// 人物的宽度
		private var simpleHeight:int=91;//人物的高单
		private var simpleRect:Rectangle;//单张图片的矩形范围
		private var simplePoint:Point=new Point(0,0);//截图开始点
		private var woffset:int=simpleWidth/2; //宽度 偏移
		private var hoffset:int=simpleHeight-10;//高度偏移
		private var direction:int;//行走方向
		private var speed:int=12;//行走速度
		private var xSpeed:int=0;//x轴行走速度
		private var ySpeed:int=0;
		private var radians:Number;//目标点与原点的角度
		private var distance:Number;//当前点与目标点的剩余距离
		private var currentFrame:int=2;//当前行走动画针
		private var frameCountInWalk:int=8;//该方向上最后一针
		public function Player()
		{
			super();
			
			init();
		}
		
		private function init(){
			initAll(new role as Bitmap);
			initSimpleBit();
		}

		private function initAll(bit:Bitmap):void{
			this.playerBit=bit;
			this.playerBitData=playerBit.bitmapData;
		}
		private function initSimpleBit():void{
			this.simpleBitData=new BitmapData(this.simpleWidth,this.simpleHeight);
			this.simpleBit=new Bitmap(this.simpleBitData);
			this.simpleRect=new Rectangle(0,0,this.simpleWidth,this.simpleHeight);
			this.simpleBitData.copyPixels(this.playerBitData,this.simpleRect,this.simplePoint);
			
			//角色注册点在人物脚下,如果不在游戏中用就去掉
//			this.simpleBit.x=this.simpleBit.x-this.woffset;
//			this.simpleBit.y=this.simpleBit.y-this.hoffset;			
			
			this.addChild(this.simpleBit);
			this.addEventListener(Event.ENTER_FRAME,onStart);
		}
		
		public function stopWalk(){
			this.removeEventListener(Event.ENTER_FRAME,onStart);
		}
		private function onStart(event:Event){
			
			this.moveToNextFrame();
		
		
		}
		public function startGo():void{
			this.addEventListener(Event.ENTER_FRAME,onStart);
			this.dispatchEvent(new Event(Event.ENTER_FRAME));
		}
		/**
		 * 移动到下一个frame
		 */
		public function moveToNextFrame():void
		{
			

			//取当前帧
			if (this.currentFrame == this.frameCountInWalk)	//该方向上最后一帧,回到开始
			{
				this.currentFrame = -1;
			}
			this.currentFrame = this.currentFrame + 1;
			
			//根据frame和方向取动作图片
			this.simpleRect.x = this.currentFrame * this.simpleWidth;	//在原图片中的像素位置
			this.simpleRect.y = this.direction * this.simpleHeight;		//在原图片中的像素位置
			//拷贝该frame的图片
			this.simpleBitData.copyPixels(this.playerBitData, 
			this.simpleRect, this.simplePoint);
		}
		/**
		 * 取得行走方向,水平向右为0,顺时针旋转
		 * (注意:在tile的宽=2*高时,右下 左下 左上 右上并非是45度)
		 * 0 -- 右		0度
		 * 1 -- 右下		45度
		 * 2 -- 下		90度
		 * 3 -- 左下		135度
		 * 4 -- 左		180度
		 * 5 -- 左上		-135度
		 * 6 -- 上		-90度
		 * 7 -- 右上		-45度
		 */
		public function setDirection(radians:Number):void
		{
			/**
			角度(degrees)和弧度(radians)之间的转换关系式是:
			radians = (Math.PI / 180) * degrees
			**/
			var degrees:Number = radians * 180 / Math.PI;	//角度
			
			//八方向 360/8=45,左上角为元点,右向为横轴,逆时针角度为负,顺时针为正  
			// 也可用弧度直接算
			this.direction = Math.round( degrees / 45 );	
//			this.direction=2;
			if (degrees < 0)	//角度为负
			{
				this.direction = Math.abs(this.direction + 8);
			}
			
			//转成跟图片一致的
			switch (this.direction)
			{
				case 0:
					this.direction = 2;
					break;
				case 1:
					this.direction = 5;
					break;
				case 2:
					this.direction = 0;
					break;
				case 3:
					this.direction = 4;
					break;
				case 4:
					this.direction = 1;
					break;
				case 5:
					this.direction = 6;
					break;
				case 6:
					this.direction = 3;
					break;
				case 7:
					this.direction = 7;
					break;
			}
		}
		public function getSimpleBit():Bitmap{
			return this.simpleBit;
		}
		public function set setDirect(direct:int){
			this.direction=direct;
		}
		public function set setCurrentFrame(cf:int){
			this.currentFrame=cf;
		}
		public function set simpleBitmapdata(bitdata:BitmapData){
			this.simpleBitData=bitdata;
		}
		public function set simpleBitmap(bitmap:Bitmap){
			this.simpleBit=bitmap;
		}
		
		
		
	}
}

    运行上边action.as,生成一个action.swf,可以看见一个人物一直在动。

 flex--->新建一个flex project,代码如下

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="testLoaderLeverType(),loa()">
	
	
		
		<mx:Script>
			<![CDATA[
				import mx.controls.Alert
				private var content:Object;//为了方便,不再用action类型,这样就不用把原来的action,和player类拷贝到这个工程下。
				private function loa(){
//					
//					Alert.show(hello.content is action);//输出true
					content=Object(hello.content);
				}
				
				var loader:Loader=new Loader;
				private function testLoaderLeverType(){
					
					loader.load(new URLRequest("action.swf"));
					loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
					
				}
				private function onComplete(event:Event){
					Alert.show(((loader.content) is action)+""); //输出true; //把上边两个类拷过来测试一下,是否为true
				}
			]]>
		</mx:Script>
		<mx:VBox>
			<mx:SWFLoader x="50" y="60" source="action.swf" width="80" height="91" id="hello">
			
			</mx:SWFLoader>
			<mx:HBox>
				
			<mx:Button click="content.stopWalk()" label="停止">
			
			</mx:Button>
			<mx:Button click="content.startGo()" label="行走">
			
		    </mx:Button>
		    <mx:Button click="content.setDirection(0)" label="向下">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(1)" label="向左">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(2)" label="向右">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(3)" label="向上">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(4)" label="左下角">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(5)" label="右下角">
		    	
		    </mx:Button>
		    <mx:Button click="content.setDirection(6)" label="左上">
		    	
		    </mx:Button>
		     <mx:Button click="content.setDirection(7)" label="右下">
		    	
		    </mx:Button>
		    </mx:HBox>
		</mx:VBox>
		
		
</mx:Application>

 

分享到:
评论
1 楼 zjmantou 2012-06-25  
最近正在学习这方面的方法,参考一下

相关推荐

    Flex控制SWF播放

    例如,要调用SWF中的公共函数,我们可以这样写: ```actionscript swfPlayer.content.myPublicFunction(); ``` 3. **控制播放**: `MovieClip`类提供了一些内置的方法来控制SWF的播放状态,如: - `play()`:...

    Flex控制swf简单源码

    一旦定义了接口,你就可以在加载的SWF对象上调用这些方法,传递参数,实现交互。 此外,为了确保安全性和性能,Flex和SWF之间的通信可能会受到沙箱限制。通常,加载的SWF文件会位于不同的安全域中,这可能会影响...

    Flex控制外部引用SWF的播放进度源码

    在提供的案例文件“Flex控制外部SWF播放案例”中,可能包含了一个具体的实现示例,你可以通过研究这个案例来学习如何在实践中操作。通常,这样的案例会演示如何建立通信机制,调用外部SWF的API,或者使用`Timer`类来...

    调用swf中导出的类,按钮,MC,图片等

    当我们需要在应用程序中重用或集成这些SWF资源时,就需要知道如何调用SWF中导出的类、按钮、MovieClips(MC)和图片。以下将详细介绍这一过程。 首先,要调用SWF中的导出类,我们需要确保该类在SWF文件中被正确导出...

    flex与flash的交互

    1. **嵌入Flash内容到Flex项目**:Flex项目可以嵌入SWF格式的Flash内容,这允许开发者在Flex应用中利用已有的Flash资源。通过使用`mx.controls.MovieClip`或`mx.controls.VideoDisplay`组件,可以轻松地在Flex界面中...

    flex趣味拼图及其源码

    例如,拼图的每个部分可能是一个MovieClip,而移动和旋转操作则是通过ActionScript函数实现的。 6. **学习路径**:对于初学者,可以先通过阅读源码理解整体架构,然后逐个研究ActionScript函数,理解它们的功能和...

    Flex 3 3d源码

    通过ActionScript,我们可以操控显示列表(Display List)中的对象,如Sprite或MovieClip,来实现3D旋转效果。 `.actionScriptProperties` 文件是Eclipse或Flash Builder等IDE的工作空间配置文件,它存储了关于...

    flash builder 4.7加载外部swf文件

    在Flash开发领域,Flash Builder 4.7是一个重要的集成开发环境(IDE),它主要用于构建基于Adobe Flex和ActionScript的应用程序,包括SWF文件。SWF是Adobe Flash Player用于展示交互式内容、动画以及应用程序的标准...

    flex加载资源_loader类使用实例

    在Flex开发中,Loader类是用于加载各种类型资源的核心组件,包括图像、视频、SWF文件等。Loader类是ActionScript 3中的一个关键部分,它使得动态加载内容成为可能,提高了应用程序的灵活性和响应性。下面我们将深入...

    Flash与Flex3结合学习心得体会

    通过以上心得分享,我们可以看出Flash与Flex3的结合使用需要理解两者之间的兼容性和接口调用方式,同时充分利用Adobe提供的工具类来优化代码和提高开发效率。在实际项目中,灵活运用这些技巧和工具,能够更好地实现...

    flex游戏开发

    - 使用`Bitmap`而非`Vector`图形,减少GPU负载。 - 合理管理游戏对象的生命周期,避免不必要的对象创建和销毁。 - 利用`SpriteBatch`技术批量渲染多个对象,减少绘图调用次数。 - 实施细节层次(LOD)策略,根据视距...

    使用FLEX 和 Actionscript 开发FLASH 游戏3-1

    1. **嵌入资源**:使用`[Embed]`元标签可以将图像、声音等资源嵌入到SWF中。例如: ```actionscript [Embed(source="assets/player.png")] private var PlayerClass:Class; ``` 这样,`PlayerClass`就可以作为...

    Flex Flash的关系分析

    在Flex应用启动时,它的根对象是SystemManager,这是一个特殊的MovieClip,负责管理整个应用的生命周期。SystemManager有两个帧:preloader和Application。preloader帧用于显示应用程序的加载进度,一旦加载完成,...

    flash转盘抽奖程序

    【Flash转盘抽奖程序】是基于ActionScript 3(AS3)开发的一种...解压后,开发者可以研究源代码,了解具体实现细节,或者根据需要进行定制和修改。此外,如果包含SWF文件,可以直接在支持Flash的环境中运行查看效果。

    as3TweenLite-master_builtcgn_as3TweenLite_

    AS3TweenLite还支持链式调用,可以方便地创建复杂的动画序列,并提供了大量的内置缓动函数供选择,如easeInOut、easeInQuad等,以创建不同风格的运动效果。 总的来说,AS3TweenLite是一个强大的AS3动画工具,对于...

    ActionScript开发人员指南中文版

    使用ActionScript创建MovieClip对象 加载外部SWF文件 影片剪辑示例:RuntimeAssetsExplorer 第章:使用补间动画 补间动画基础知识 在Flash中复制补间动画脚本 合并补间动画脚本 描述动画 添加滤镜 将补间动画与其显示...

    as3中引用组件的包

    在ActionScript3 (AS3) 中,开发Flash应用程序或Flex应用时,我们经常需要引用各种组件,如Button、Label等,这些组件使得用户界面的构建变得更加便捷和灵活。本篇文章将详细探讨如何在AS3中引用这些组件,以及与之...

    as 3.0 进度条(附带源码)

    创建进度条时,我们通常会创建一个自定义类,该类继承自`Sprite`或`MovieClip`,这两个都是内置的显示对象类。 1. **初始化进度条** - 创建一个新的类,如`ProgressBar`,继承自`Sprite`。 - 在类中定义进度条的...

Global site tag (gtag.js) - Google Analytics