Flash处理XML文档数据教程
“VerneZ”通过精心收集,向本站投稿了7篇Flash处理XML文档数据教程,以下是小编帮大家整理后的Flash处理XML文档数据教程,仅供参考,大家一起来看看吧。
篇1:Flash处理XML文档数据教程
xml|教程|数据
准备:首先你得有台电脑,其次是要装上Windows系统和Flash8,
XML基础:
既然是处理XML文档,就要先来了解下XML文档。下面是我所了解的,有些是在Flash中用不到的。
XML扩展标记语言(Extensible Markup Language)是SGML(Structured Generalized Markup Language)的子集,由World Wide Web Consortium(W3C)的XML工作组定义。
下面开始了解XML的结构。XML是由序言和文档元素组成的。
序言包括:
1.声明(declaration):文档的第一行,它说明这是一个XML文档。 [可选]
2.注释:增强文档的可读性。 [可选]
3.文档类型声明 (document type declaration):XML文档类型定义必须在XML声明之后,文档元素之前,中间可以插入XML处理指令,它说明文档的类型和结构。[可选]
4.处理指令(processing instruction):在XML声明之后,处理XML信息的指令。 [可选]
注:文档类型声明(document type declaration)需要用到xml词汇表。如果想了解详细信息请访问www.w3c.org.
文档元素:
元素说明了文档的逻辑结构,元素包函起始标签、元素内容、元素属性和结束标签。一个xml文档必须有一个顶层元素,所有的元素都嵌套在这个顶层元素中。文档元素名、属性名全部都是自定义的。
说明:
先看代码:
<元素>元素>
<子元素 属性=“子元素”>信息子元素>
上面是一个加了文档类型声明,处理指令的简单xml文档。下面一一解释。
这句是xml 的声明信息。version 是版本号,encoding 是字符编码,如果有中文就需要用gb2312 编码,standalone 属性可以取yes和no,属性值yes,说明文档没有外部声明。属性值no,说明文档有外部声明。
这句是xml的注释。
这句是文档类型声明,DOCTYPE标记是声明类型用的,ChooseFlash是类型,这里的类型是指xml中的词汇表。
这句是处理指令,xml-stylesheet是一个处理指令,type是类型,href是地址。这个处理指令把CSS链接到XML文档,跟html中应用css差不多一样。
<元素>元素>
<子元素 属性=“子元素”>信息子元素>
这是文档元素(Flash用节点表示)。<元素>是顶层元素,<子元素>是嵌套在顶层元素中的元素,“属性”是一个属性,“信息”是字符串,也可以这样写:子元素>元素>
<子元素 信息=“信息” 属性=“子元素”>子元素>
如果用了文档类型声明,顶层元素命名最好跟声明的类型一至。否则会出错(要有词汇表时,像这个ChooseFlash这不会出错,因为没有这个词汇表。)
下面是一个完整xml文档:
xml方面就到这里,下面就是怎么在Flash中调用XML文档和处理XML中的数据。
Flash方面::
在Flash中调用xml文档需要用到XML类和XMLNode类中的一些方法和属性。这里我们就不需要用到那么多。把用到的方法和属性列出来:
XML类:
XML.ignoreWhite;//处理xml文档中的空白,设为true时,忽略空白,默认值为false.
XML.load(“xml文档的地址”);//加载指定的xml文档.
XML.onLoad=function(success:Boolean){};//成功加载了xml文档时调用.
XML构造函数.
XMLNode类:
XMLNode.attributes;//用来指定xml文档的属性.
XMLNode.childNodes;//返回指定xml文档对象的子级的数组.
XMLNode.firstChild;//引用父级节点的子级列表中的第一个子级.
XMLNode.nodeValue;//返回XML对象的节点值.
XMLNode.nodeName;//XML 对象的节点名称
开始实验:
首先说明:在xml声明处加上encoding=“gb2312”,使用gb2312编码;Flash中如果有中文需要在加载代码前面加上System.useCodepage = true;使用系统编码,防止乱码。
实验1:
一个简单的实验,把xml文档中的节点在Flash输出来。新建一个xml文档,在记事本输入下面的代码。保存为 xml-001.xml 。
上面是一个简单的xml文档,结构是一个顶层节点中嵌套三个子级节点。
现在在Flash中如何读出来呢?来看操作:打开Flash,新建一个Flash文档,保存到刚才的xml文档中的目录中,命名 xml-001.fla。在第一帧输入下面代码:
//xml-001.fla.
//实例化一个xml对象.
var myxml:XML = new XML;
//分析时忽略xml文档中的空格.
myxml.ignoreWhite = true;
//加载xml-001.xml文档.
myxml.load(“xml-001.xml”);
//调用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//如果加载成功,success=true;否则success=false;
if (success) {
trace(“加载成功!”);
//输出顶层节点的节点名和顶层节点中属性name的值.
trace(myxml.firstChild.nodeName+“:”+myxml.firstChild.attributes.name);
//用一个数组来引用顶层节点中子级节点的数组.
var child_arr:Array = myxml.firstChild.childNodes;
//用嵌套for语句遍历出xml文档中的所有数据.
//这个for遍历的是顶层节点下的子级节点.
for (var i = 0; i //输出顶层节点下的子级节点的节点名和顶层节点下的子级节点中属性name的值. trace(child_arr[i].nodeName+“:”+child_arr[i].attributes.name); } } else { trace(“加载失败!”); } }; 实验2: 现在做的是把一个多层嵌套节点的xml文档在Flash中输出来。新建一个xml文档,在记事本中输入下面的代码,然后保存为 xml-002.xml。 上面是一个多层嵌套节点的xml文档,结构是一个顶层节点中,嵌套3个子级节点,3个子级节点分别嵌套3个子级节点。现在又应该怎样在Flash中读出来呢?其实原理跟上面一样,在for中嵌套一个for就可以了。 打开Flash新建一个Flash文档,保存到刚才的xml文档的目录中,命名为 xml-02.fla。在第一帧中输入以下代码: //xml-002.fla. //实例化一个xml对象. var myxml:XML = new XML(); //分析时忽略xml文档中的空格. myxml.ignoreWhite = true; //加载xml-002.xml文档. myxml.load(“xml-002.xml”); //调用XML.onLoad事件. myxml.onLoad = function(success:Boolean) { //如果加载成功,success=true;否则success=false; if (success) { trace(“加载成功!”); //输出顶层节点的节点名和顶层节点中属性name的值. trace(myxml.firstChild.nodeName+“:”+myxml.firstChild.attributes.name); //用一个数组来引用顶层节点中子级节点的数组. var child_arr:Array = myxml.firstChild.childNodes; //用嵌套for语句遍历出xml文档中的所有数据. //这个for遍历的是顶层节点下的子级节点. for (var i = 0; i //输出顶层节点下的子级节点的节点名和顶层节点下的子级节点中属性name的值. trace(child_arr[i].nodeName+“:”+child_arr[i].attributes.name); //这个for遍历的是顶层节点下的子级节点下的子级节点. for (var j = 0; j //输出顶层节点下的子级节点下的子级节点的节点名 和 顶层节点下的子级节点下的子级节点中属性name的值.不要晕.看看输出面板就会明白它们之间的关系了哦. trace(child_arr[i].childNodes[j].nodeName+“:”+child_arr[i].childNodes[j].attributes.name); } } } else { trace(“加载失败!”); } }; 实验3: 利用xml文档数据做用户登录, 新建一个xml文档,在记事本中输入下面的代码,然后保存为 xml-003.xml。 首先分析下结构: 这次也需要用到嵌套for。 打开Flash新建一个Flash文档,大小为300*100,保存到刚才的xml文档的目录中,命名为 xml-03.fla。 新建3个图层分别命名Actions 、cont 、 bg 。 bg层在第一帧画三个文本框大小的虚线框。cont层在第一帧拉二个输入文本框,实例名分别为username_txt和password_txt,在拉一个动态文本框,实例名为 status_txt。将这三个文本框对齐须虚线框,再点窗口->公用库->按钮,拉一个按钮出来。实例名为login_btn。如图: Actions层在第一帧中输入以下代码: //xml-003.fla. //使用系统编码.防止乱码. System.useCodepage = true; //实例化一个xml对象. var myxml:XML = new XML(); //分析时忽略xml文档中的空格. myxml.ignoreWhite = true; //加载xml-002.xml文档. myxml.load(“xml-003.xml”); //调用XML.onLoad事件. myxml.onLoad = function(success:Boolean) { //如果加载成功,success=true;否则success=false; if (success) { trace(“加载成功!”); login_btn.onRelease = function() { //用一个数组来引用顶层节点中子级节点的数组. var child_arr:Array = myxml.firstChild.childNodes; //用UserData指定xml文档节点的attributes对象. var UserData:Object; //这个for遍历的是顶层节点下的子级节点. for (var i = 0; i //这个for遍历的是顶层节点下的子级节点下的子级节点. for (var j = 0; j //用UserData指定child_arr[i].childNodes[j].attributes对象 UserData = child_arr[i].childNodes[j].attributes; //判断用户名和密码. //这里的UserData.username其实就是child_arr[i].childNodes[j].attributes.username的简写.UserData.password同理. //username和password是xml文档节点中的属性.因为xml和Flash区分大小写.所以在输入时要注意大小写. if ((username_txt.text == UserData.username) && (password_txt.text == UserData.password)) { //Post这个是顶层节点下子级节点的Post属性. status_txt.text = child_arr[i].attributes.Post+“:”+UserData.username+“登录成功”; //如果用户名和密码正确就退出for.这个重要.如果不用这个,就会一直重复判断用户名和密码.直到将xml文档节点遍历完.那样就不是我们想要的.所以一有正确的就退出for; return; } else { status_txt.text = “用户名或密码错误”; } } } }; } else { trace(“加载失败!”); } }; 实例4: 利用List组件做个mp3播放列表。 新建一个xml文档,在记事本中输入下面的代码,然后保存为 xml-004.xml。 xml结构: 打开Flash新建一个Flash文档,大小为200*150,保存到刚才的xml文档的目录中,命名为 xml-04.fla。新建2个图层分别命名Actions、cont ,cont层中拉一个List组件到第一帧.大小为200*150,实例名为mp3_list,Actions层第一帧输入下面代码: //xml-004.fla. //使用系统编码.防止乱码. System.useCodepage = true; //实例化一个xml对象. var myxml:XML = new XML(); //分析时忽略xml文档中的空格. myxml.ignoreWhite = true; //加载xml-004.xml文档. myxml.load(“xml-004.xml”); //调用XML.onLoad事件. myxml.onLoad = function(success:Boolean) { //如果加载成功,success=true;否则success=false; if (success) { trace(“加载成功!”); //用一个数组来引用顶层节点中子级节点的数组. var child_arr:Array = myxml.firstChild.childNodes; //这个for遍历的是顶层节点下的子级节点. for (var i = 0; i //将歌曲添加到List组件中. //child_arr[i].firstChild.nodeValue这个是xml节点的节点值. //child_arr[i].attributes.path这个是xml节点下的path属性. mp3_list.addItem({label:(i+1)+“.”+child_arr[i].firstChild.nodeValue, data:child_arr[i].attributes.path}); } } else { trace(“加载失败!”); } }; //listEvent函数是执行List组件中change事件 function listEvent():Void { //这个就是歌曲地址.用Sound类的loadSound方法就可以播放歌曲了.例:mysound.loadSound(mp3_list.selectedItem.data);详细请看帮助文档. trace(mp3_list.selectedItem.data); } //添加帧听器. mp3_list.addEventListener(“change”, listEvent);
篇2:Flash教程:连连看数据生成AS代码
比如连连看的数据生成,
比较简单,这里不包括判断是否一定有解的部分,只是一个随意生成地图(给定行,列,每种图片的生成个数),没有思路的可以参考一下,高手也可以指正。
//生成地图的类
package src.ww.llk.map
{
import mx.collections.ArrayCollection;
public class MakeMap
{
private var mapParam:MapParam = null;
private var types:ArrayCollection = null;
//保证取得的数据不被重取
private var flags:ArrayCollection = null;
public function MakeMap(param:MapParam):void {
mapParam = param;
initData();
}
// 初始化必要的数据
private function initData():void {
types = new ArrayCollection();
var typeNum:int = Math.floor(mapParam.cols*mapParam.rows/mapParam.numberPerType);
for(var i:int=1;i<=typeNum;i++) {
for (var j:int=0;j
types.addItem(i);
}
}
var yushu:int = mapParam.cols*mapParam.rows - typeNum*mapParam.numberPerType;
for (var yI:int = 0; yI
types.addItem(1);
}
}
//随机生成地图
public function make():Array {
flags = new ArrayCollection();
for(var i:int=0;i
flags.addItem(i);
}
var mapData:Array = new Array();
var rowData:Array = null;
var col:int = 0;
rowData = new Array();
rowData.push(0);
for(col = 0;col
rowData.push(0);
}
rowData.push(0);
mapData.push(rowData);
for(var row:int = 0;row
rowData = new Array();
rowData.push(0);
for(col = 0;col
rowData.push(getType());
}
rowData.push(0);
mapData.push(rowData);
}
rowData = new Array();
rowData.push(0);
for(col = 0;col
rowData.push(0);
}
rowData.push(0);
mapData.push(rowData);
return mapData;
}
// 随机取得单个数据
private function getType():int {
var ran:int=-1;
var ret:int = 0;
ran = randomIndex();
var index:int = int(flags.getItemAt(ran));
flags.removeItemAt(ran);
ret = int(types.getItemAt(index));
return ret;
}
private function randomIndex():int {
return Math.random() * (flags.length - 1);
}
}
}
参数类,就是一个bean,
package src.ww.llk.map
{
public class MapParam
{
public var rows:Number=0;
public var cols:Number=0;
public var numberPerType:int=4;
}
}
测试类:
public function test():void {
var param:MapParam = new MapParam();
param.rows = 6;
param.cols = 6;
param.numberPerType = 4;
var maker:MakeMap = new MakeMap(param);
var map:Array = maker.make();
for each(var rowData:Array in map) {
var rowStr:String = “”;
for each(var cell:int in rowData) {
rowStr += cell + “ ”;
}
trace(rowStr);
}
}
运行结果:
0 0 0 0 0 0 0 0
0 3 3 1 1 7 6 0
0 6 8 9 7 9 5 0
0 2 4 4 4 1 7 0
0 5 8 4 9 5 8 0
0 2 6 2 3 1 7 0
0 6 2 5 3 8 9 0
0 0 0 0 0 0 0 0
更多内容进入:
精品学习网IT教育频道
篇3:Flash MX 数据绑定
数据
上篇文章:www.webjx.com/htmldata/-03-09/1110356957.html
格式化
好了!我们已经知道怎样从一个组件中得到一个值并且把这个值放在另外一个组件中,但是这通常是不够的。有时我们需要在组件中的数据以不同方式展现;有时需要两个组件展示不同的数据。
我们用格式化来实现这个目标。有几个内建的格式化工具你可以选择,同时你也可以自定义的格式,用AS2类。你可以选择在选择绑定时选择格式化工具并且从列表中选择它们。选择自定义的格式需要用到你自己的类。
我们以内建的格式开始,比如
Boolean(布尔值)
也许是最简单的内建格式化方式。它仅仅是一个布尔值(或真或假)并且输出一个字符串。你可以通过真或假来选择要描述的值――在格式化选项中。
Bool_formatter.fla
Compose String(排列字符串)
转换一个对象的域,形成单个字符串。你可以结合任何数量的域,也可以插入其他的字符。建立一个字符串模板,选择格式化选项并键入字符串。你也可以放置任何文本在这里,但是任何在””表示符中的内容将被做为一个域来处理。如果对象有子对象(比如XML)那么,你可以使用它们――通过点语法来获得它们的路径。字符串模板的例子如下:
Compose_formatter.fla
Date(日期)
把日期转换成字符串,简单的模板如“MM/DD/YYYY”。允许的格式“M”(月份),“D”(日期),“Y”(年份),“H”(小时),“N”(分钟)和“S”(秒)。你可以用格式化工具反向格式化字符串为日期,但是由于某种原因,这种做法仅仅用在双向绑定中。
Date_formatter.fla
Number (数字)
非常简单的格式化选项。可以显示十进制的数字。
Number_formatter.fla
Rearrange Fields (重新排列的域)
让你可以协调域,比如一个组件的数据源中的域名和另一个组件数据源的域名不同的情况下。域是以列表的形式成对出现在格式化选项中。比如一个简单的字符串:”label=name;data=colour;otherField=yetAnotherField”。这对于显示数据很有用,比如以下拉列表框和列表框显示数据;相应改变组件标签域属性,可以用重新排列的域格式化你想显示的作为标签的域。在这个例子中,一些XML文件已经加载了,用来移植到下拉列表框和它的域(重新排列的),所以名称属性被用作标签。
Rearrange_formatter.fla
要自定义格式,需要定义一个很简单的类,它有两个方法:格式化和非格式化,为每种类型提供一个依据,并且可以返回任何东西。在这个例子中,类格式化数字为英镑符号:
代码:// class used to convert numbers to sterling currency and back again
class SterlingFormatter {
// turns a number into a string
function format (data:Number) : String{
var currency:String;
var pounds:Number = Math.floor(data);
var pence:Number = Math.round((data - pounds)*100);
var poundsStr:String = String(pounds);
var penceStr:String;
if(pence<10){
penceStr = “0” + String(pence);
}else{
penceStr = String(pence);
}
currency = “£” + pounds + “.” + penceStr;
return currency;
}
// removes sterling format and returns a number
function unformat (data:String) : Number {
var str:String = data.substr(1);
var num:Number = parseFloat(str);
return num;
}
}
键入一个数值在左边,看看有边会有什么格式产生
局限、防范、实践
创作时的数据绑定是基于mc路径的,这将带来一些局限和危险,
主要的问题是当你建立一个在两个组件之间的绑定时,这两个组件的实例必须被唯一的标识,而且这也依赖它们的路径。因此,如果你改变了一个组件的路径,之后再提供绑定,将会丢失这个绑定。尽管我已经注意到你可以安全的改变组件实例的名字不必改变它们的绑定。
通常,在运行时,组件可以从绝对路径上解决绑定问题。但是如果你提供到一个舞台上不存在的mc的绑定,绑定将从可以被识别的mc中选择“最远的”。问题是同样的mc将被不同的解释,如果该mc是在舞台上编辑过的或者在库中编辑的。要避免混乱、冲突、遗失已完成的内容,你需要遵循如下的指导方针:
1、 不要对这样的mc使用绑定:即在创作过程中加到舞台上,又使用了动态附加的;
2、 不要对舞台上选择了“编辑”过的符号提供数据绑定。使用“本地编辑”保护mc的内部结构关系;
3、 在加入绑定之前,谨慎的规划你的应用程序,如果程序很复杂的话。当你觉悟到因为所有的组件嵌套在一个mc里而使所有的绑定失去了作用,将是一件无法启齿的错误。
4、 如果要将应用程序动态的加载到其他的影片里,使用 _level替代影片的target。
总的说来,以上的讲解只是引导你用窗体建立最简单的应用程序的开始,你还要添加很多的场景和组件。使场景都这场运转起来后再加入数据绑定。最后一点要说明(有点讨厌但它也确实是个尖锐的问题,在很多情况都会发生)。
如果你已经看过源文件,你就会发现我在引导层加入了一些箭头符号。这对于简单的绑定来说无关紧要,但是一些复杂的系统绑定是很难跟踪的,所以我提倡这样做:用最原始的“文档”来说明你在做着什么。用语言来描述你所做的绑定是比较困难的,但是图示可以很只管的表达绑定的意思。如果一些东西需要比较详细的说明,那么在一个引导层用文本来注释是很有帮助的。这些箭头不是正是的符号,重要的是可以保留一些对将要发生的事情的暗示。
结束
数据绑定在MX2004中是个重要的主题,并且有很多方面我还没有涵盖到,包括运行时的API和身份认证。这本身就是个主题,但是很值得掌握――它涵盖了很多的功能,你可以节省很多的时间和精力,不用重新构建它。
然而你也许不会选择数据绑定面板来开发企业级应用程序,你也许直接会用运行时的API。但是数据绑定面板可以快速的提供一个原型或小型应用程序,因为它们提供了非常简单的方法来构建复杂的数据交互。身份认证和格式化都可以通过AS2实现可扩展功能,是没有限制的。
附源文件下载:
fmx2004-databinding.zip
fmx2004-databinding1.zip
fmx2004-databinding2-1.rar
fmx2004-databinding2-2.rar
篇4:Flash教程:鼠标绘制
知识点:
1、添加鼠标监听事件MouseEvent;
2、规定画布大小;
3、moveTo和lineTo;
4、绘制开始与结束判断,
代码:
var huabu:Sprite=new Sprite;
huabu.graphics.beginFill(0xFFFFFF);
huabu.graphics.drawRect(20,20,510,360);
huabu.graphics.endFill();
addChild(huabu);
var _drawing:Boolean;
var quxian:Sprite=new Sprite();
quxian.graphics.lineStyle( 2, 0xFF0000 );
huabu.addChild(quxian);
_drawing = false;
huabu.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
huabu.addEventListener( MouseEvent.MOUSE_MOVE,moving);
huabu.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);
function startDrawing( event:MouseEvent ):void {
quxian.graphics.moveTo( mouseX, mouseY );
_drawing = true;
}
function moving( event:MouseEvent ):void {
if ( _drawing ) {
quxian.graphics.lineTo( mouseX, mouseY );
}
}
function stopDrawing( event:MouseEvent ):void {
_drawing = false;
}
(2):直线
知识点:
1、添加鼠标监听事件MouseEvent;
2、规定画布大小;
3、moveTo和lineTo;
4、绘制开始与结束判断。
难点:
绘制多条直线
代码:
var huabu:Sprite=new Sprite();
huabu.graphics.beginFill(0xFFFFFF);
huabu.graphics.drawRect(20,20,510,360);
huabu.graphics.endFill();
addChild(huabu);
var _drawing:Boolean=false;
var zhixian:Sprite=new Sprite();
huabu.addChild(zhixian);
var _color:Number=0xFF0000;
var zx:int=1;
var ys_x:Number;
var ys_y:Number;
huabu.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
huabu.addEventListener( MouseEvent.MOUSE_MOVE,moving);
huabu.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
ys_x=mouseX;
ys_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
huabu.removeChild(zhixian);
zhixian=new Sprite();
zhixian.graphics.lineStyle( zx, _color );
zhixian.graphics.moveTo(ys_x,ys_y);
zhixian.graphics.lineTo(mouseX,mouseY);
huabu.addChild(zhixian);
}
}
function stopDrawing( event:MouseEvent ):void {
zhixian=new Sprite();
huabu.addChild(zhixian);
//没有以上两句,只能画一条直线
_drawing = false;
}
(3):圆
知识点:
1、添加鼠标监听事件MouseEvent;
2、绘制过程中显示半径(两点间的距离Point.distance(坐标1,坐标2));
3、drawCircle、moveTo和lineTo;
4、绘制开始与结束判断。
难点:
绘制多个圆
代码:
var _drawing:Boolean;
var yuan:Sprite=new Sprite();
addChild(yuan);
var banjing:Sprite=new Sprite();
addChild(banjing);
var yuanxin_x:Number;
var yuanxin_y:Number;
var zuobiao1:Point;
var zuobiao2:Point;
var bj:Number;
_drawing = false;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,yd);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
yuanxin_x=mouseX;//鼠标按下的位置就是圆心的位置
yuanxin_y=mouseY;
_drawing = true;
}
function yd( event:MouseEvent ):void {
if ( _drawing ) {
zuobiao1 = new Point(yuanxin_x,yuanxin_y);
zuobiao2 = new Point(mouseX, mouseY);
bj= Point.distance(zuobiao1, zuobiao2);//显示两点之间的距离即为半径
removeChild(yuan);
yuan=new Sprite();
yuan.graphics.lineStyle( 2, 0xFF0000 );
yuan.graphics.drawCircle(yuanxin_x,yuanxin_y,bj);
addChild(yuan);
removeChild(banjing);
banjing=new Sprite();
banjing.graphics.lineStyle(2,0xFF0000,0.5);
banjing.graphics.moveTo(yuanxin_x,yuanxin_y);
banjing.graphics.lineTo(mouseX,mouseY);
addChild(banjing);
}
}
function stopDrawing( event:MouseEvent ):void {
removeChild(banjing);//绘制结束时半径线消失
banjing=new Sprite();//每次画圆过程中都显示半径
addChild(banjing);
yuan=new Sprite();//可绘制多个圆
addChild(yuan);
_drawing = false;
}
(4):椭圆
知识点:
1、添加鼠标监听事件MouseEvent和键盘监听事件KeyboardEvent;
2、椭圆的宽与高;
3、drawEllipse;
4、绘制开始与结束判断;
5、按下Shift键绘制正圆,
难点:
按下Shift键绘制正圆
代码:
var _drawing:Boolean=false;
var ellipse:Sprite=new Sprite();
addChild(ellipse);
var kaishi_x:Number;
var kaishi_y:Number;
var w:Number;
var h:Number;
var _max:Number;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,moving);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
kaishi_x=mouseX;
kaishi_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
w=mouseX-kaishi_x;
h=mouseY-kaishi_y;
removeChild(ellipse);
ellipse=new Sprite();
ellipse.graphics.lineStyle( 2, 0xFF0000 );
ellipse.graphics.drawEllipse(kaishi_x,kaishi_y,w,h);
addChild(ellipse);
}
}
function stopDrawing( event:MouseEvent ):void {
ellipse=new Sprite();
addChild(ellipse);
_drawing = false;
}
stage.focus=this;
stage.addEventListener(KeyboardEvent.KEY_DOWN, shift);
function shift(event:KeyboardEvent):void {
if (event.charCode==0) {
if (_drawing) {
w=mouseX-kaishi_x;
h=mouseY-kaishi_y;
_max=Math.max(Math.abs(w),Math.abs(h));
if (w<0 && h<0) {
w=-_max;
h=-_max;
}
if (w>0 && h>0) {
w=_max;
h=_max;
}
if (w<0 && h>0) {
w=-_max;
h=_max;
}
if (w>0 && h<0) {
w=_max;
h=-_max;
}
removeChild(ellipse);
ellipse=new Sprite();
ellipse.graphics.lineStyle( 2, 0xFF0000 );
ellipse.graphics.drawEllipse(kaishi_x,kaishi_y,w,h);
addChild(ellipse);
}
}
}
(5):矩形
知识点:
1、添加鼠标监听事件MouseEvent和键盘监听事件KeyboardEvent;
2、椭圆的宽与高;
3、drawRect;
4、绘制开始与结束判断;
5、按下Shift键绘制正方形。
难点:
按下Shift键绘制正方形
代码:
var _drawing:Boolean=false;
var _drawrect:Sprite=new Sprite();
addChild(_drawrect);
var yx_x:Number;
var yx_y:Number;
var w:Number;
var h:Number;
var _max:Number;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,moving);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
yx_x=mouseX;
yx_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
w=mouseX-yx_x;
h=mouseY-yx_y;
removeChild(_drawrect);
_drawrect=new Sprite();
_drawrect.graphics.lineStyle( 2, 0xFF0000 );
_drawrect.graphics.drawRect(yx_x,yx_y,w,h);
addChild(_drawrect);
}
}
function stopDrawing( event:MouseEvent ):void {
_drawrect=new Sprite();
addChild(_drawrect);
_drawing = false;
}
stage.focus=this;
stage.addEventListener(KeyboardEvent.KEY_DOWN, shift);
function shift(event:KeyboardEvent):void {
if (event.charCode==0) {
if (_drawing) {
_max=Math.max(Math.abs(w),Math.abs(h));
if (w<0 && h<0) {
w=-_max;
h=-_max;
}
if (w>0 && h>0) {
w=_max;
h=_max;
}
if (w<0 && h>0) {
w=-_max;
h=_max;
}
if (w>0 && h<0) {
w=_max;
h=-_max;
}
removeChild(_drawrect);
_drawrect=new Sprite();
_drawrect.graphics.lineStyle( 2, 0xFF0000 );
_drawrect.graphics.drawRect(yx_x,yx_y,w,h);
addChild(_drawrect);
}
}
}
更多内容进入:
精品学习网IT教育频道
篇5:Flash教程三维引擎初探
本文将介绍的是一个简单的实时3D引擎,并以此向大家阐明一种用Action Script在Flash二维的世界里表现三维对象的方法,先看看一个线描的简单实例,这是一个三棱锥绕自己的一条棱旋转的动画。
基本原理:我们所生活的世界是一个由x,y,z轴(也就是长宽高)组成的三维世界,要在一个二维平面上表现出三维的信息,我们首先必须要去掉三个坐标轴中的一个,z轴(表示物体深度的轴)。此外,我们还必须要选择一个视点,也就是代表观察者眼睛的一个点,和一个用于投影三维物体所有点的视平面,也就是我们所看见的那个面。然后,从三维物体上每个点到视点之间连线和视平面的交点就是该点在视平面上所应在位置。看了上面的一长串话是否有点头晕?没关系,请看看下面的那张图。
从图中我们可以看出当视点和物体AB位置不变,如果视平面S离物体AB越近,那么物体AB在视平面S上的投影A'B'(即我们所看到的对象)就越大。
实例:知道大致原理后,我们来看个三棱锥的例子。为了简单起见,我们假设视点,也就是眼睛的位置,是处于z轴之上的;另外,视平面S平行于x,y轴。
预备
新建一个Flash文件,并新建两个层,分别命名为actions和modal。新建一个图形元件(Graphic Symbol)并将之命名为line,在此元件中画一条沿45度角斜向右下方的直线并将之长宽皆设为100。
在actions层中插入9帧空白关键帧,并依次命名为modal info,init,start,loop,drawline,draw,rotx,roty和rotz。在modal层上插入4帧,然后将line元件从Library中拖到舞台上并将此实例命名为baseline。
一、 模型定义
使用某种编码方式将我们所要进行操作的三维对象表示出来的就是本步骤要做的。在这里,我们只建立简单的框架三维模型,所以只定义模型顶点以及点与点之间的线就够了。
1.1 定义点
在三维坐标系中的每个点都对应维一的一组x,y,z坐标量。因此,我们可以建立一个变量,比如叫points,并使用下面的编码方式来存放各点的坐标值:
“
”
其中
代表第n个点的坐标,每个坐标值以三位数字来表示,即,12编码为012;1编码为001;点(33,1,0)编码为(033,001,000)。
然后,为了让每组坐标看起来清晰点,将每个点的坐标之间以一个字符R(其实随便什么都可以)来分隔。此外,还要定义一个变量,比如说叫totalpoints,来确定总的点数。
1.2 定义线
很早以前老师就告诉我们两点确定一条直线这个道理。根据这个老道理,我们只要确定两个端点的坐标值便能确定一条线段。所以,我们可以生成一个变量,比如叫lines,并使用跟上面定义点相类似的编码方式来存放各条线的定义:
“
”
其中
代表第n条线段的两个端点坐标,每个端点以两位数字来表示。例如,从顶点1到顶点5的线段就被编码为0105。这里你可能会发现,这个简易3D引擎只能最多定义99个点。如果你需要添加点数的话其实也很简单,只要增加用以表示每个端点的数字的位数即可。
同样的,你得建立一个用来确定总线段数的变量,比如叫totallines。
1.3 其它的变量
定义完了点和线,我们还得告诉引擎眼睛的位置(比如说eyez)以及视平面所处的深度(zorder)。视点(eyez)离物体越远,物体的透视效果就会越差。
1.4 构建三棱锥
用于构建模型的变量差不多都介绍完了,下面就在modal info帧中输入以下这段定义一个三棱锥模型的代码:
totalpoints=4;//四个顶点
points=“010,010,000R090,000,000R090,090,090R000,090,000”;//四个顶点的坐标
totallines=6;//六条边
lines=“0102R0103R0104R0203R0204R0304”;//六条边的定义
eyez=-500;//视点的位置
zorder=100;//视平面深度
二、 构建引擎
这一步是整个程序的核心,完成了引擎差不多就等于完成了全部。
2.1 初始化
在开始真正的引擎前我们先来做一些初始化的工作——将所定义模型的信息转存到一个个单独的变量中。在init帧中输入以下代码:
setProperty (“/baseline”, _x, 1000);//隐藏原来的那条线
//下面的循环转存所有点的信息
for (i=1; i<=totalpoints; i++) {
set (“x” add i, substring(points, Number((i-1)*12+1), 3));
set (“y” add i, substring(points, Number((i-1)*12+5), 3));
set (“z” add i, substring(points, Number((i-1)*12+9), 3));
}
//下面的循环转存所有线的信息
for (i=1; i<=totallines;i++) {
set (“pt1” add i, substring(lines, Number((i-1)*5+1), 2));
set (“pt2” add i, substring(lines, Number((i-1)*5+3), 2));
}
//下面两个变量分别表示显示中心点的x和y
centerx=190;
centery=215;
2.2 创建基本循环
完成了初始化,下面我们来建立程序中最基本的循环,
选中loop帧,并在其中输入:
gotoAndPlay (“start”);
2.3 绘制模型
绘制模型的过程可分为两个部分,第一部分将三维物体的各点坐标值转换为投影到视平面S上的相应二维坐标;第二部分根据转换完毕的二维坐标在视平面S上绘制出图像。在这个例子里我们在帧draw里面进行三维坐标的二维化,然后使用帧drawline来进行绘制工作。所以,在帧draw里输入以下的代码:
//下面的循环根据公式进行三维坐标的二维化
for (i=1; i<=totalpoints; i++) {
u = (zorder-eyez)/(eval(“z” add i)-eyez);//二维化公式
if (i<=9) {
set (“2Dx0” add i, u*eval(“x” add i)+centerx);
set (“2Dy0” add i, u*eval(“y” add i)+centery);
} else {
set (“2Dx” add i, u*eval(“x” add i)+centerx);
set (“2Dy” add i, u*eval(“y” add i)+centery);
}
}
//下面的循环负责复制线段并将之显示出来
for(i=1;i<=totallines;i++){
duplicateMovieClip(“/baseline”,“line” add i,i);
call(“drawline”);
}
在帧drawline里输入以下的代码:
pt1 = eval(“pt1” add i);
pt2 = eval(“pt2” add i);
setProperty (“line” add i, _x, eval(“2Dx” add pt1));
setProperty (“line” add i, _y, eval(“2Dy” add pt1));
setProperty (“line” add i, _xscale, eval(“2Dx” add pt2) - eval(“2Dx” add pt1));
setProperty (“line” add i, _yscale, eval(“2Dy” add pt2) - eval(“2Dy” add pt1));
至此绘制模型的工作大致就做完了,在start帧中输入:
call(“draw”);
按Ctrl+Enter后就可以看到你所定义的模型的模样了。
2.4 旋转
旋转其实也很简单,只要将坐标根据不同旋转角度重新映射一次就可以了,下面是一组用于旋转计算的公式:
沿x轴旋转:
沿y轴旋转:
沿z轴旋转:
由于篇幅有限,这里就只介绍一种旋转方式——沿x轴旋转。
根据上面的这些公式,我们还需要设置一些变量来满足要求。在init帧中追加以下的代码:
basecos=0.9848; //cos10的值
basesin=0.1736; //sin10的值
cos=basecos;
sin=basesin;
axis=“x”;//沿哪个轴旋转,这里是x也就是说沿x轴旋转
在rotx中输入如下的代码:
//根据不同的角度值重新计算二维坐标
for (i=1; i<=totalpoints; i++) {
set (“tmp”, (sin*eval(“y” add i))+(cos*eval(“z” add i)));
set (“y” add i, (cos*eval(“y” add i))-(sin*eval(“z” add i)));
set (“z” add i, tmp);
}
接下来只要在start帧中call(“draw”);的上面插入一句
call(“rot” add axis);//根据axis的值调用不同类型的旋转
这样,整个引擎基本上就可以算是完工了。另外两帧roty 和rotz大家只要参照相应的公式填一下应该是没什么大问题的。
如开头所说,这个引擎在功能上其实是相当简陋的,甚至是有相当多BUG的。但本文只是想抛砖引玉,向各位展示一种思路,引擎的完善与实用化留待各位有兴趣的朋友自己慢慢研究了。
篇6:Excel教程:处理折线图表的缺失数据
当在Excel中创建了一个折线图表时,如果数据区域有些单元格数据缺失,也就是该单元格为空白,则折线图中就会出现缺口,这样就导致折线图不美观,或者不太能够直观地反映出数据的变化趋势,
如图1所示为存在缺失数据的一个折线图,可以看到折线上的缺口。
图1
Excel提供了两种方法来处理折线图中的缺失数据:
以零值代表:将空白单元格作为零处理,对于零值数据点,行跌落至零。
以内插值替换:用内插值数据点代替空白单元格,填充空距以连接行。
我们先来看一下这两种方法所实现的效果。如图2所示为以零值代表的折线图。如图3所示为以内插值替换的折线图。
图2
图3
是怎么实现的呢?请按照如下步骤进行操作,
1.在Excel中选中要处理缺失数据的折线图表。
2.选择菜单命令“工具>选项”,打开“选项”对话框。
3.单击“图表”选项卡。
4.选择“空单元格的绘制方式为”中的“以零值代表”或“以内插值替换”,如图4所示。
图4
5.单击“确定”按钮,就可以看到图表的变化了。以上选择会作用到所选图表的所有数据系列。
还有一种办法是在空白单元格中输入公式=NA。这样一来图表就会为包含该公式的单元格使用内插值,而不管在“选项”对话框中选择的是什么。
篇7:Excel教程:处理折线图表的缺失数据
当在Excel中创建了一个折线图表时,如果数据区域有些单元格数据缺失,也就是该单元格为空白,则折线图中就会出现缺口,这样就导致折线图不美观,或者不太能够直观地反映出数据的变化趋势,
为存在缺失数据的一个折线图,可以看到折线上的缺口。
Excel提供了两种方法来处理折线图中的缺失数据:
以零值代表:将空白单元格作为零处理,对于零值数据点,行跌落至零。
以内插值替换:用内插值数据点代替空白单元格,填充空距以连接行。
我们先来看一下这两种方法所实现的效果。为以零值代表的折线图。为以内插值替换的折线图,
是怎么实现的呢?请按照如下步骤进行操作。
1.在Excel中选中要处理缺失数据的折线图表。
2.选择菜单命令“工具>选项”,打开“选项”对话框。
3.单击“图表”选项卡。
4.选择“空单元格的绘制方式为”中的“以零值代表”或“以内插值替换”。
5.单击“确定”按钮,就可以看到图表的变化了。以上选择会作用到所选图表的所有数据系列。
还有一种办法是在空白单元格中输入公式=NA()。这样一来图表就会为包含该公式的单元格使用内插值,而不管在“选项”对话框中选择的是什么。
【Flash处理XML文档数据教程】相关文章:






文档为doc格式