71 123
发新话题
打印

一个3d组件制作的过程(原创)

一个3d组件制作的过程(原创)

其实做组件也不难,只要你跟着我一步一步的就好了,我在这里做的是一个旋转的3d的组件.
1.首先得打开flash(必须是flash8),因为用到BitmapData类,新建一个魔方的影片剪辑元件,在第一帧加入以下代码,这段代码的含义就不考究了,我主要将如何利用这段代码做成想要的组件,然后注意我注释的地方:
Stage.scaleMode = 'noScale';
var rotations = {x:0, y:0, z:0};
//这个dis要作为组件的一个参数,是正方体的边长,在这里没给出它的数值,做成组件后在组件参数里设置它的值
var boxPoints = [{x:-dis, y:-dis, z:-dis}, {x:dis, y:dis, z:-dis}, {x:-dis, y:dis, z:-dis}, {x:-dis, y:-dis, z:dis}, {x:dis, y:-dis, z:dis}, {x:dis, y:dis, z:dis}];
this.createEmptyMovieClip("theScene", 1);
//position是正方体的坐标,决定了正方体在舞台的位置,也作为组件的一个参数
theScene._x = theScene._y=position;
createImages();
theScene.onEnterFrame = function() {
//a和b是正方体随鼠标旋转的速度,也是组件的俩个参数
rotations.x -= this._ymouse/a;
rotations.y += this._xmouse/b;
var points2d = pointsTransform(boxPoints, rotations);
movieClip3PointTransform(this.image0, points2d[2], points2d[0], points2d[3]);
movieClip3PointTransform(this.image1, points2d[5], points2d[1], points2d[2]);
movieClip3PointTransform(this.image2, points2d[0], points2d[2], points2d[1]);
movieClip3PointTransform(this.image3, points2d[4], points2d[3], points2d[0]);
movieClip3PointTransform(this.image4, points2d[3], points2d[4], points2d[5]);
movieClip3PointTransform(this.image5, points2d[1], points2d[5], points2d[4]);
};
function createImages() {
var i = 6;
while (i--) {
  theScene.createEmptyMovieClip("image"+i, i);  
  theScene["image"+i].createEmptyMovieClip("contents", i);
  theScene["image"+i].contents.attachBitmap(flash.display.BitmapData.loadBitmap("image"+i), 1, false, true);
}
}
function pointsTransform(points, rotations) {
var tpoints = new Array();
var sx = Math.sin(rotations.x);
var cx = Math.cos(rotations.x);
var sy = Math.sin(rotations.y);
var cy = Math.cos(rotations.y);
var sz = Math.sin(rotations.z);
var cz = Math.cos(rotations.z);
var x, y, z, xy, xz, yx, yz, zx, zy;
var i = points.length;
while (i--) {
  x = points.x;
  y = points.y;
  z = points.z;
  xy = cx*y-sx*z;
  xz = sx*y+cx*z;
  yz = cy*xz-sy*x;
  yx = sy*xz+cy*x;
  zx = cz*yx-sz*xy;
  zy = sz*yx+cz*xy;
  tpoints = {x:zx, y:zy};
}
return tpoints;
}
function movieClip3PointTransform(mc, a, b, c) {
mc._visible = pointsIsVisible(a, b, c);
if (!mc._visible) {
  return;
}
var m = mc.transform.matrix;
m.tx = b.x;
m.ty = b.y;
m.a = (a.x-b.x)/mc.contents._width;
m.b = (a.y-b.y)/mc.contents._width;
m.c = (c.x-b.x)/mc.contents._height;
m.d = (c.y-b.y)/mc.contents._height;
mc.transform.matrix = m;
}
function pointsIsVisible(a, b, c) {
var db = b.x-a.x;
if (!db) {
  return (a.y>b.y == c.x>a.x);
}
var dc = c.x-a.x;
if (!dc) {
  return (a.y>c.y == b.x<a.x);
}
return ((b.y-a.y)/db<(c.y-a.y)/dc) != (a.x<b.x == a.x>c.x);
}
其它的地方就不要管了,总共四个参数。然后打开库面板,右键点击该元件,选组件定义,将上面的四个参数添加进去,如下:
      名称          变量            值            类型
      dis                            70          Number
       a                             1000        Number
       b                             1000        Number
    position                      200          Number
这样组件就初步成功了,然后把它拖入主场景里,左对齐。上对齐到舞台,选中该实例,发现它的名字变为组件了,然后在参数面板里也有了以上设置的东西了,接下来导入六张图片(图片一定不能太大,否则cpu会吃不消),链接名为image0到image5,按ctrl+enter测试影片,如果你觉得有什么地方不合适,可以调整参数。


[ 本帖最后由 tiger_0309 于 2006-9-10 00:03 编辑 ]

TOP

第一步完成了,但是你的组件只能在这个文件里被你用,如果你想什么时候想用就用,并且其他人也可以用就得做成mxp文件,然后其他人下载后也可以安装;
首先还是打开库面板,右键点击该组件,现在已经成为组件了,选导出swc文件,以mofang.swc为名;
然后再建一个组件安装文件,新建一个文本文当,加入以下代码。同样不要管它的意思,只是个公式,会套就行
<?xml version="1.0" encoding="UTF-8"?>
<macromedia-extension name="mofang" version="1.0.0" type="flash component" requires-restart="false">

<!-- Describe the author -->

<author name="tiger_0309" />//我的资料

<!-- List the required/compatible products -->

<products>
<product name="Flash" version="6" primary="true" />
</products>

<!-- Describe the extension -->

<description>
<![CDATA[this is made by tiger_0309.<br>www.flash8.com<br>e-mail:haofeng_guo@sina.com]]>
</description>//这是我把我的资料加进去,你可以换成你的

<!-- Describe where the extension shows in the UI of the product -->

<ui-access>
<![CDATA[you can use mouse to control a square with picture in the six plane rotate.]]>//对该组件的描述
</ui-access>

<!-- Describe the files that comprise the extension -->

<files>
<file name="mofang.swc" destination="$flash/Components" />
</files>//mofang.swc是我的swc文件的名字

</macromedia-extension>
然后把它保存为mofang.mxi的文件,记得把我的注释去掉!要和mofang.swc文件保存在同一目录下,然后打开该mxi文件,生成mofang.mxp文件,这个是自动的,按提示操作就行了,当然你必须安装有Macromedia Extension Manager。
现在组件就成功了,这个mofang.mxp文件就可以在任何flash中安装了
下面是我的swf文件和mxp文件,如果你不想做mxi文件和swc文件也有现成的,你可以下载我的。mxp文件下载后可以直接安装,怎么安装我就不讲了,瞌睡了,先到这里吧,有什么不明白的地方可以尽管发问。


[ 本帖最后由 tiger_0309 于 2006-9-9 23:56 编辑 ]

TOP

这是swf文件和mxp文件

附件

魔方(组件).swf (28.62 KB)

2006-9-9 23:59, 下载次数: 431 , 阅读权限: 10

文件swf

mofang.rar (32.42 KB)

2006-9-9 23:59, 下载次数: 205 , 阅读权限: 10

文件mxp

TOP

这是swc文件mxi和文件

附件

mofang1.rar (547 Bytes)

2006-9-10 00:02, 下载次数: 355

mxi文件

mofang2.rar (31.63 KB)

2006-9-10 00:02, 下载次数: 325

swc文件

TOP

效果不错,赞一个.
提几个小建议:
1 a和b换别的名字,如果不看着你的代码,我还不知道这两个参数是用来干嘛的呢.
2 我找来找去,都没发现你的代码里介绍实时预览的部分,是不是应该补充下呢?
欢迎大家来浏览我的参赛作品,有空支持下,没空也按下投票键,谢谢.
[url]http://kp.flash8.net/Flash/275.html[/url]

TOP

受教了!
我的全flash小站http://www.ourme.cn

TOP

我发现你的代码里面都没有写路径名,是不是组件里面都是这样的?
_parent._root.this这些用了会有影响吗?
我的全flash小站http://www.ourme.cn

TOP

引用:
原帖由 HBrO 于 2006-9-10 20:40 发表
效果不错,赞一个.
提几个小建议:
1 a和b换别的名字,如果不看着你的代码,我还不知道这两个参数是用来干嘛的呢.
2 我找来找去,都没发现你的代码里介绍实时预览的部分,是不是应该补充下呢?
是的,a和b应该说明是正方体旋转的速度,不过也可以把它换成不受鼠标控制的速度,这样可能更好一点,
很菜的问一句,你说的实时预览是不是在安装mxp文件时在下面的注释,用来说明该组件的功能

[ 本帖最后由 tiger_0309 于 2006-9-11 11:05 编辑 ]

TOP

引用:
原帖由 ourme 于 2006-9-11 10:00 发表
我发现你的代码里面都没有写路径名,是不是组件里面都是这样的?
_parent._root.this这些用了会有影响吗?
我没有试过,不过组件里主要是构造一些函数,都写在帧里面,不需要用吧,一般_parent._root写在影片剪辑里用吧,这个组件的制作是是无意中看了另外一个组件的制作过程,试着把它也做成元件,没想到还成了,所以制作组件我也是第一次

[ 本帖最后由 tiger_0309 于 2006-9-11 10:33 编辑 ]

TOP

晕`!原来是高人呀
我的全flash小站http://www.ourme.cn

TOP

我把a.b俩个参数重新改为不受鼠标控制的速度vx(沿x轴的速度)vy(沿y轴的速度)

[ 本帖最后由 tiger_0309 于 2006-9-11 10:58 编辑 ]

附件

mofang.rar (32.42 KB)

2006-9-11 10:55, 下载次数: 284

mxp文件

魔方(组件).swf (28.66 KB)

2006-9-11 10:58, 下载次数: 323

swf文件

TOP

引用:
原帖由 tiger_0309 于 2006-9-11 10:05 发表

是的,a和b应该说明是正方体旋转的速度,不过也可以把它换成不受鼠标控制的速度,这样可能更好一点,
很菜的问一句,你说的实时预览是不是在安装mxp文件时在下面的注释,用来说明该组件的功能
不是,其实你的组件已经实现了,就是像BUTTON组件那样,更改了文本参数后,在IDE下就可以看到组件里头的文字跟着变化.只是我在你教程里头没发现有这一部分.
欢迎大家来浏览我的参赛作品,有空支持下,没空也按下投票键,谢谢.
[url]http://kp.flash8.net/Flash/275.html[/url]

TOP

xuexi,我怎么把控件加入,测试,看不到3d图啊

TOP

来顶一下

TOP

引用:
原帖由 allenj0928 于 2006-10-15 14:10 发表
xuexi,我怎么把控件加入,测试,看不到3d图啊
你装的是flash8吗?

TOP

好好好!
向大家学习!

TOP

怎么我把组件加到我的flash里面,不可以看到3d的部分

TOP

引用:
原帖由 allenj0928 于 2006-10-17 11:55 发表
怎么我把组件加到我的flash里面,不可以看到3d的部分
首先你的flash必须是flash8,并且安装有macromedia extention manager,然后解压按照提示安装,打开组件面板,将新装的组件拖入场景,导入六张图片(不要太大),连接标识符分别是image0--image5j就可以了

TOP

原来是这样啊,谢谢

TOP

说到底还是不代透视的3D

这种3D的用处不大……

TOP

为什么不能下载?

TOP

AS3,flex等等...技术博客: www.RiaHome.cn
rss阅读地址: http://feed.feedsky.com/youngboy

TOP

楼主请帮我看看哪里错了。谢谢。。

感觉我已经按照楼主的说法作了,可是就是没有效果。。一片空白。请楼主帮我看看。

附件

魔方2.fla (188.5 KB)

2007-8-3 10:07, 下载次数: 119

TOP

最最喜欢组件教程了,最头痛的就是做Flash的组件~~

TOP

顺便提问一下,要做个组件控制 N (由用户决定) 个层里的图片以不同的速度移动,有什么好办法!

TOP

怎么都犯同样的错误
x = points.x;
  y = points.y;
  z = points.z;


[ 本帖最后由 tiger_0309 于 2007-8-3 10:47 编辑 ]

附件

魔方2[1].fla (192 KB)

2007-8-3 10:45, 下载次数: 192

001.gif (1.65 KB)

2007-8-3 10:47

001.gif

TOP

谢谢 。。。终于可以了。。。

太感谢你了。

TOP

高手,好好向你们学习

TOP

TO:26楼,被论坛过滤了部分代码。如果用DIZCUS模式应该就不会吧

TOP

没有远近透视的3D


可是我怎么做的时候 创建魔方 加代码 拖入场景 .....导入6张pic 连接名image0  -   ...5  


照着做了

就是没有效果 不知道是为什么
众志成城

TOP

 71 123
发新话题