动力男孩flash乐园

不抛弃、不放弃,梦想要迂回去实现~!
  • 首页
  • 我的座右铭
  • 我的作品
  • 留言聊天室
  • 动力男孩的诞生

存档

文章标签 ‘教程’
602次浏览↓

为asdoc设定example

2009年12月16日 powerboy 2 条评论

  最近在学习用asdoc生成文档,我们在使用官方API文档的时候,都能看到有些类的底部会有关于这个类是如何使用的例子,他是如何做到的呢,其实用的就是这个指令:@includeExample xxx/example.as,在它后面跟的是例子的路径,但是有一点,我们不能因为想要写个小例子,就把它放在跟类相同的路径下吧,这会非常糟糕的,我们更希望把例子集中在一个文件夹下统一管理,有什么好办法吗,答案是肯定的。我们需要在编译语句后面加上-examples-path [盘符]:\[路径],它指的就是我们存放例子的路径,但是一定要记住,存放example的路径最好跟类文件的路径是一样的,这样管理起来更方便。比如我把框架放在d盘名为powerboy的目录下,框架里有个cn.pboy.control.Button的类,它的路径看起来像这样:d:\powerboy\cn\pboy\control\Button.as,现在我要对这个类添加例子,我想把例子统一放在d盘的examples文件夹下统一管理,那么路径应该是这样的:d:\examples\cn\pboy\control\ButtonExample.as,然后在命令行工具下把当前盘符设为d:\powerboy>,通过以下命名就可以编译了:asdoc -source-path . -doc-sources . -examples-path d:\examples

分类: actionscript3.0学习笔记, flash教程 标签: as3, 教程
1,539次浏览↓

Box2D——入门教程

2009年11月27日 powerboy 3 条评论

声明:以下文章是本人在学习过程中总结的一些个人经验,如果需要复制,请务必注明出处:http://www.p-boy.cn

  现在网上关于as3的物理引擎真是不少,比较之后发现,在开源引擎当中Box2D算是比较不错的了,只可惜他的结构比较复杂,而且国内网站关于Box2D方面的教程真是少的可怜。因为我知道这个最早是c++上面的2D引擎,所以我找到了http://www.box2d.org/manual.html网址,经过几天的研究,总算是入门了,下面我会系统的针对官网给出的HelloWorld程序进行讲解,把个人心得分享给大家(鼓掌)!

  这个引擎是先从创建一个世界对象开始的,他负责管理内部一切对象的内存和模拟过程。要创建一个世界中的对象,首先我们需要为世界定义边界区域,Box2D针对区域内的所有对象进行模拟碰撞,区域的大小并不重要,但更适合的区域将提高程序性能,一般来讲这个区域设置的要比演示区域更大一些,因为一旦对象在运动时到达了边界,它就会被“冻结”并停止一切模拟活动。

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100,-100);//左边界、上边界
worldAABB.upperBound.Set(100,100);//右边界、下边界

  下面我们要为这个世界设置重力了,就是下面这段代码,其实这里面的重力是用向量b2Vec2(x,y);来表示的,x代表水平运动,正数向右,负数向左,y代表垂直运动,正数向下,负数向上。同时我们需要再定义一个布尔型参数(我命名为doSleep),来表示是否允许睡眠,睡眠所代表的含义网上也没有一个明确的介绍,这里我简要讲解一下。因为你在这个世界中生成的一切对象,他们的模拟效果都是实时计算出来的,当doSleep=false的时候,即使物体停止了运动,计算机还是在不停的进行着运算,其实这是完全不必要的,所以一般都设为true,这样当物体停止之后就不会进行无谓的cpu消耗了。

var gravity:b2Vec2 = new b2Vec2(0,10);
var doSleep:Boolean = true;

  以上参数都准备好了,我们可以将它们传入b2World对象中并将其实例化,这样一个物理引擎的模拟区域就做好了。

var world:b2World = new b2World(worldAABB,gravity,doSleep);

  让我们开始在其中加入你想要模拟的对象吧。本来在那个英文网站中给出的是5个步骤,但是我感觉还少点什么,所以我又加了一条:
第一步、创建并定义刚体位置。这里我做一下名词解释,在任何力的作用下,体积和形状都不发生改变的物体叫做“刚体”;

var ground:b2BodyDef = new b2BodyDef();
ground.position.Set(10, 12);//这里的位置也是用向量定义的

2、给刚体定义皮肤(注意这里的皮肤并不具备物理引擎的属性,因此才有了第四步);

bodyDef.userData = _mc;//我们自己绘制的图形
addChild(bodyDef.userData);

3、用世界对象添加刚体实例,需要注意的是世界对象里并没有保存body定义的引用;

var body:b2Body = world.CreateBody(bodyDef);

4、根据皮肤形状创建模拟图形类:摩擦力、密度、弹力等等;当密度为0的时候,物体是不会动的,相当于障碍物。摩擦力和弹力取值范围是0~1,形状的区域是由SetAsBox定义的,因为模拟图形和刚体都要求以中心点为注册点,因此这里的宽和高的值都是一半,同时需要注意,这里数值单位并不是像素,而是米,1米=30像素,大家在传值的时候可别忘记换算哦。

var box:b2PolygonDef = new b2PolygonDef();//创建多边形
box.density = _density;
box.friction = _friction;
box.restitution = _restitution;
box.SetAsBox(_halfWidth , _halfHeight);

5、在刚体上添加模拟图形实例;

body.CreateShape(box);

6、根据刚体的密度和面积计算出质量,密度*面积=质量。

body.SetMassFromShapes();

  这里有两个重要的参数需要我们自己定义一下。一个是迭代次数,这里我定义为m_iterations,建议迭代次数为10,这时一个比较合理的值,使用较少的迭代可以提高性能,但模拟质量受到影响。同样,使用更多的迭代性能有所下降,但提高了你的模拟质量。另外一个参数是游戏的刷新频率,我定义为m_timeStep,根据英文教程上记载,它采用的是1/60秒刷新一次,但因为它的平台是c++,性能比AVM2虚拟机高出数倍,完全可以这么做,而在flash中我们一般设置成1/30就可以了。

var m_iterations:Number = 10;
var m_timeStep:Number = 1 / 30;

  现在一切都准备好了,我们要让所有对象模拟运动。其实他也是通过侦听帧频率而不断刷新实现的,把上面那两个参数传入世界对象的Step方法中即可,同时我们需要遍历世界中的一切对象,并对每个对象的坐标和角度进行更新。

addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
function Update(e:Event):void
{
	world.Step(m_timeStep, m_iterations);
	for (var bb:b2Body=world.m_bodyList; bb; bb=bb.m_next)
	{
		if (bb.m_userData is Sprite)
		{
			bb.m_userData.x=bb.GetPosition().x * 30;//这里获取的变量单位是米,乘以30转换成像素单位
			bb.m_userData.y=bb.GetPosition().y * 30;
			bb.m_userData.rotation=bb.GetAngle() * (180 / Math.PI);
		}
	}
}

  好了,现在相信大家已经对Box2D有了一定了解,赶快尝试制作一些效果吧。

  本文出自动力男孩博客:http://www.p-boy.cn/?p=473

分类: Box2D, flash教程 标签: as3, 教程
416次浏览↓

图像列表(色彩变换+双击+滚动+投票展示)

2008年4月1日 powerboy 没有评论

一、需求决定功能

下面是最终演示效果:

这里我之所以先把演示效果放到第一位,目的是为了让大家看过之后先有个印象,这样当我后面叙述到某些东西的时候,大家就不会那么陌生,不知所云了。

其实设计这个效果的初衷,是想实现一种类似Ajax的效果,像大家经常在视频网站中见到的那样,当你看完一部片子之后,可以实时对其进行评分、留言等等,所见即所得。这些flash当然也做得到,我们完全可以通flash+js来实现。但是我没有把它和js交互的部分放上来,这里我只讲解flash展现的效果部分。可是如果单纯把信息罗列出来,就和普通页面没什么分别了,没有把flash的特点发挥出来,所以我想要在效果上显出她的与众不同。这个程序里面所设计到的功能在题目当中已经给出,但其实还有很多,我们完全可以把这个小程序的功能做的很强大,不过这要看一个人的思维方式和创意了,而我就作为抛砖引玉吧。

这里面的元素可以完全用AS来写,我这里为了方便,所以偷了个小懒,有的元件是用图形画的。

二、设计思路

这个程序虽然不大,但是涉及到的知识点还是挺多的,那么在设计前期我们应该做些什么呢?Lee Brimelow说过一句话,你是第一个能够“看到”这个作品的人,因为在你设计之前,这个实体的最终形态已经呈现在你的脑海中了。从这一点上我们可以看出,编程其实是次要的,关键是前期的策划与设计,如果失误的话,会影响到整个程序进度,你可能会频繁的去修改甚至是重写代码。另一方面,我们的程序要能给用户带来良好的体验,不能只单单自己感觉好用就行,毕竟你是设计者。

对于此程序来说,我希望能够尽自己所能来给用户提供便利,所以首先一点,自动滚屏和手动滚屏是必须的,因为这是两种不同的需求。其次是投票窗口的设计,最初我想到的是像传统的制作方法一样,点击查看之后弹出一个窗口来显示投票结果,你可以关闭,也可以选择查看其他项目的投票结果来更新这个窗口。但是,我想到了一点,这样做缺乏对比性,因为一次只能显示一个窗口,能不能改善一下这种状况呢,其实也不难办到,我们可以把显示结果做成MINI型,就是很小巧的那种,让他们在不同的选项上可以自由弹出,互不干扰,这样用户可以自由选择查看投票结果。这样做,其实就是给用户提供了方便,我们要在细节上多下一些功夫。

不过这个程序目前有一点不太完善的地方,如果只有20多个图像展示区域,效果是可以接受的,但是如果太多了,稍微滑动滚动条,一下就会过去好几张图片,这样带来的用户体验就不是很好,他们可能会因此频繁的调整而失去耐心。解决的方法不是没有,我首先想到了两种。第一种,就是加入分页,我们可以设定一次最多显示20张,然后通过点击分页来进行切换,这样用户是可以接受的;第二种,就是加入快捷键,可以让用户通过键盘切换到不同的显示区,也可以通过方向键来调整滚动的距离。其实解决方案有很多种,我想大家也有自己不同的解决途径,这部分扩展程序我没有写,大家最好能够自由发挥。但是不管怎样,我们都要始终把握住一点
———— 尽最大可能给用户提供方便,以用户体验为中心!

三、双击剖析

对于一般的老手来说,“双击”的实现已经不再陌生,我在这里简单的提一下思路,给更多的学习者以参考,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//双击判断事件;
if (!click) {
	timer = getTimer()/1000;
	click = true;
} else {
	timer2 = getTimer()/1000;
	_root.test2 = timer2-timer;
	if (timer2-timer<0.25) {
		if (the_scroll == true) {
			delete scroll.bar.onEnterFrame;
			the_scroll = false;
			scroll.news.gotoAndStop(2);
		} else {
			the_scroll = true;
			scroll.news.gotoAndStop(1);
			Scroll();
		}
	} else {
		timer = getTimer()/1000;
	}
}

双击的实现主要就是判断连续两次单击时间的间隔,在程序刚开始执行的时候,当鼠标第一次单击时,会进入第一个分支语句,目的就是给timer赋初值,这样,后面再次按下鼠标的时候,就可以用第二次的时间timer2减去timer来计算二者时间间隔,当小于我们设定的值时,则双击成立,再判断滚动是否暂停,否则将第二次单击的值作为timer保存起来,以便于侦听下一次的鼠标操作。

四、色彩变换与滚动的实现

其实这个效果非常的简单,你只需要记住两点就能搞定:

1、通过Transform类来收集颜色转换的相关数据;
2、用ColorTransform类对颜色进行处理。

这样当鼠标移入或者移出图像的时候,才能看到色彩转化的效果。其实当我讲到这里的时候,你已经完全可以编写出此效果,因为它的原理非常简单。不过毕竟教程是以“教”为主,这里我给出了具体实现的方法,不过我仍然希望在你看过之后,能够仔细思考一下这段代码,你会很惊奇的发现,原来很多类似的效果都是触类旁通的。
这里我只以鼠标移入为例,因为其他地方都是一样的,多说无益。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//把亮度偏移加载到当前对象上
var trans:Transform = new Transform(this);
//偏移步长为15
var step:Number = 15;
//偏移量
var offset:Number = 0;
var GT:Number = null;
this.onEnterFrame = function() {
	offset += step;
	if (offset>=150||offset<0) {
		step *= -1;
	}
	picColor(trans,offset);
};
 
// 亮度偏移
function picColor(t:Transform, v:Number) {
	var bt:ColorTransform = new ColorTransform(1, 1, 1, 1, v, v, v, v);
	t.colorTransform = bt;
}

通过上面的if语句,判断色彩偏移量的状态,如果超过了预设范围之后,就使其步长值取相反数,这样它的值就会在这个区间内不停的变换。然后把每次变化的偏移量传给picColor,让它通过这个值来对色彩进行改变, new ColorTransform(1, 1, 1, 1, v, v, v, v)是指在初始化颜色不改变的情况下,调整红、绿、蓝、alpha四个颜色通道的偏移量,这里面我统一用一个变量v来代替,表明当这些数值同时改变的话,会产生暗淡或者高光的效果。

对于滚动效果,egoldy的教程已经讲的很详细了,一个是滚动公式的应用,另一个是鼠标中键onMouseWheel的应用。不过这里我想强调一点,就是对于细节的处理问题。如果当前状态为自动滚动的时候,滚动条也是随之移动的,此时如果按下鼠标拖拽滚动条,虽然图像也能随之移动,但此时如果不释放鼠标(即触发release事件),滚动条就会移动到鼠标外,而不是停留在鼠标的位置,这样用户在使用的时候,就会有一种“失灵”的感觉。其实这是个很小的问题,解决也很容易,只要移除onEnterFrame事件就可以了,但是从另外一个角度也说明了细节决定成败的道理。

五、整合

这部分整合的功能就是投票显示,主要就是通过xml来获取服务器端的数据,当然如果你对js比较熟悉的话,也可以通过js来实现。我把算法简化了很多,这里我把思路简单的介绍一下。假设我们把总共所有投票的人数进度条设为100%的话,那么“当前投票”和“投票约占百分比”的进度条长度其实是一样的,所以只要进度条随着百分比(当前投票数/总共投票数)的增加而增加就可以了。但是显示总共投票数的时候进度条有个问题,因为不管总共投票人数有多少,进度条都应该保持100%长度以显示总投票数,可是我想要在进度条增长的时候,后面的数字也随之变化,当人数太多的时候,进度条不断增长所需要的时间就会延长,这样效果就不是很好了。所以我的解决方法就是,让显示的总投票数从高位到地位数字依次变化。比如投票总数是5678,我设一个变量votenumtotal_i,让它从0开始累加,再设一个votenumtotal来记录投票总数,然后判断votenumtotal-votenumtotal_i的值,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//显示总共投票数
if (votenumtotal_i<=view.votenumtotal){
	this._parent.board.C_votenumtotal.text=votenumtotal_i;
	if (view.votenumtotal-votenumtotal_i>10000){
		thearea=4;
	}else if (view.votenumtotal-votenumtotal_i>1000){
		thearea=3;
	}else if (view.votenumtotal-votenumtotal_i>100){
		thearea=2;
	}else if (view.votenumtotal-votenumtotal_i>10){
		thearea=1;
	}else if (view.votenumtotal-votenumtotal_i>0){
		thearea=0;
	}
	switch (thearea){
		case 0:votenumtotal_i+=1;break;
		case 1:votenumtotal_i+=10;break;
		case 2:votenumtotal_i+=100;break;
		case 3:votenumtotal_i+=1000;break;
		case 4:votenumtotal_i+=10000;break;
	}
}

当差值大于10000的时候votenumtotal_i每次加10000,大于1000的时候votenumtotal_i每次加1000以此类推,这样就可以实现从高位到地位数字不断变化的效果。唯一的缺点就是,数字变化的效果瞬间显示完毕,而不能随着进度条的增加而增加。当然,如果谁有更好的解决方法,欢迎提供思路。

六、总结

在编程的整个过程中,我个人的感觉是:最枯燥的事情就是写代码,最有趣的事情仍然是写代码。这句话看似很矛盾,其实则不然。俗话说的好,万事开头难,但是一个好的开始就是成功的一半,所以我们多花一些时间在前期的策划和准备上是很值得的。当你把一些事情都考虑好了之后,剩下的事情就水到渠成了,写起代码思路清晰,而且效率也高,等待着你的就是品尝胜利的果实。

人往往是很守旧的,一但某种思想形成一种习惯,就很难再去改变、再去接受新的东西,这会在某种程度上住一个人的潜力。改变一个人的习惯真的很难吗?根据美国科学家对人类的调查结果表明,两个星期完全可以给人重塑一个新的习惯。这能说明什么呢?其实主要原因还是来自于人类的本性——惰性。

一个有惰性的人我们通常叫做他懒人,但是有一句很经典的话:世界是由懒人创造的,由于懒的走路,所以有了汽车;由于懒得上楼,所以有了电梯……正是由于懒人的思想,才推动了社会的发展。很奇怪吗?可事实确实如此,看来懒人往往又是很勤奋的人。其实,这里的”懒人”都是聪明人的代名词,他们的想法能够帮助提高人们的生活效率,他们能够把生活中常见的现象和事物进行总结和归纳,然后产生新的事物,一些常人想都不敢想的事物。所以说,我们不要做真正意义上的懒人,只要你经常善于总结和思考,一样能够创造出更好的东西。
此次总结没有讲解技术方面的东西,而是思想上的总结。

写完程序之余,突然有此一念,因此随笔而写,作为总结以记之。

源文件下载

                               ———————–PowerBoy
                                     2007年12月20日 凌晨

分类: flash教程 标签: as2, flash, 教程
617次浏览↓

flash分页技巧(传统基础上的改进)

2008年4月1日 powerboy 1 条评论

一、建立分页从何下手?

在得到ego老大的支持和其他朋友的鼓励下,通过一段时间的准备,写了这篇继“关于图片切换的制作方法”之后的第二篇教程,之前我在网上看过一些人写的例子,但总感觉像是一个模子刻出来的,这其中不难发现肯定存在着copy,当然我不反对这样。不过在这里我想先岔开个话题,现在网上公开的源代码很多,你完全可以把别人的东西拿来修改然后使用,但是要记住一点,如果代码里面,你编写的东西没有超过50%以上的话,千万别说这个代码是你写的,因为这是做人最基本的道德问题,而且对于学习者来说这也是自欺欺人,水平永远都停留在这个阶段,要知道自己写一遍代码,学到的东西可能不光是代码本身,更重要的是学会了思考,很多人问我同样一个问题,想做一个效果该从哪做起呢?我的回答是“思考+实践”。我通过自己学习,总结出来的经验就是,学习编程其实就是学的一种思想,代码只是一种实现的手段,千万不要为了学代码而学代码。就拿这个贴子的话题来说吧,当你想写一个分页程序的时候,你首先考虑到的是什么呢?我的建议是:

1、先将外部数据调入数组(为什么要使用数组,后面会讲到);
2、设定每页需要显示多少,至少需要这些自定义参数:行、列、(数组)元素总数;
3、将数组中的数据有选择性的输出;
4、增加显示特效。
  
(注:本教程以算法为主,代码不作为主要内容,因为方法不唯一)
下面我们就从第一步做起,有些人可能不习惯使用数组,但是它的优点真的很多,管理方便,而且能帮助我们提高效率,寻找它们就像寻找数据库的记录一样,想要什么数据一目了然。下面这段代码就是把xml节点数据读入数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Load = function () {
	var intro = myXML.firstChild;
	var len:Number = intro.childNodes.length;
	for (i=0; i<len; i++) {
		box[i] = new Array();
		box[i][0] = intro.childNodes[i].attributes.spath;
		box[i][1] = intro.childNodes[i].attributes.path;
		box[i][2] = intro.childNodes[i].attributes.url;
		box[i][3] = intro.childNodes[i].attributes.title;
		box[i][4] = intro.childNodes[i].attributes.description;
	}
	record = len;
	pages = Math.ceil(len/total);
	if (i == len) {
		refreshmenu(page);
	}
};

读取结束以后,下面才是核心问题,如何将图片输出呢,我们可以根据自己预设的行、列参数来让它自动输出,但是单纯这样输出的话是不会分页的,所以我们要从中针对行、列分别进行一下判断,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
refreshmenu = function (page) {
	var i:Number = 0;
	var j:Number = 0;
	var num:Number = 0;
	copy = function () {
		if (i<hang) {
			if (j<lie) {
				if (total1<=total) {
					CreateClip(i, j, num, box[num+(page-1)*total][0], box[num+(page-1)*total][1], box[num+(page-1)*total][2], box[num+(page-1)*total][3], box[num+(page-1)*total][4]);
					thecount = ((page-1)*total)+count;
					count++;
					j++;
					num++;
					total1++;
				}
				if (total1>total) {
					total1 = 1;
					count = 0;
					i = 0;
					j = 0;
					nb.gotoAndStop(1);
					pb.gotoAndStop(1);
					clearInterval(control);
					ListMenu();
				}
			} else {
				j = 0;
				i++;
			}
		}
	};
	var control = setInterval(copy, 50);
};

上面这段代码没有什么难点,都是一些计数器之类的,关键是上面CreateClip自定义函数,通过它把数组里面的数据和图片的计数器变量读取出来,然后对其进行有选择性的输出。
这里是自定义函数的内部结构:

1
2
3
4
5
6
7
8
9
10
CreateClip = function (i:Number, j:Number, num:Number, thespath:String, thepath:String, theurl:String, thetitle:String, thedescription:String) {
	var movie = mc.createEmptyMovieClip("mc"+i+j, num);
	dx = movie.attachMovie("tu", "tu1", 1);
	dx._x += (dx._width+feng_x)*j+x;
	dx._y += (dx._height+feng_y)*i+y;
	dx.msg.selectable = false;
	dx.msg.text = thetitle;
	dx.imgs = thespath;
	dx.link = theurl;
};

上面有两个变量没有用到(thepath、 thedescription),这是为了以后扩展用的,比如做个图片放大读取或者相关信息描述之类的都可以,这里相当于个接口,但是因为他们所涉及到的内容和本教程无关,所以这里不作为研究对象(这里可以当他们不存在)。其中每个图片(dx)里面的第一帧也有一些代码,不过只是限制图片大小和加载图片的简短代码,老声常谈的东西这里就不赘述了。
之后我们再继续添加关于翻页按钮输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ListMenu = function () {
	var menupath = mc.menu.menu1;
	menu._x = x+30;
	menu_y = y+hang*(dx._height+feng_y);
	menu._y = menu_y;
	menupath.up.onRelease = function() {
		if (page == 1) {
		} else {
			page--;
			refreshmenu(page);
		}
		gotoAndStop(1);
	};
	menupath.down.onRelease = function() {
		if (page == pages) {
		} else {
			page++;
			refreshmenu(page);
		}
		gotoAndStop(1);
	};
	menupath.makesure.onRelease = function() {
		if ((menupath.jump.text>pages) || (menupath.jump.text<1)) {
			menupath.jump.text = page;
			makesure = true;
		} else {
			page = menupath.jump.text;
			refreshmenu(page);
		}
	};
	mc.menu.menu1.totaltxt.selectable = false;
	mc.menu.menu1.pagetxt.selectable = false;
	mc.menu.menu1.totaltxt.text = "--共"+pages+"页--";
	mc.menu.menu1.pagetxt.text = "--第"+page+"页--";
};

这样,一个分页展示的雏形基本就已经出来了,下面给出了源文件fenye.rar,但是这样程序是不健全的,我们可以从中看到很多的不完善:

1、最后一页图片出现undefined;
2、狂点翻页按钮,显示会出现问题,因为图片是循环输出的,有时间间隔,当还没完全输出的时候,又点击了另外一组图片,所以显示就会错误了;

在下面我们就继续来分析如何解决上述bug。
fenye.rar

二、如何完善你的程序?

什么样的程序才能算是完善呢,首先你的程序的bug要全部得到解决,所以你可以让别人来帮你一起测试,做到万无一失;第二点是你的程序功能是否可以扩展,如果我们需要做很多程序,而其中有些东西是可以再利用的,如果前期工作没有做好的话,那么很可能你要把代码再重新写一遍,做重复性的工作,所以我们在写程序的时候,要多想想后面你会碰到什么样的问题以方便将来程序的扩展;还有一点,你的想法是否“另类”,能够让你的效果看上去与众不同。
下面我们就来一步步解决这些问题。针对第一点,程序中出现的undefined是因为他们是多余的,没有数据传输过去,所以我们应该想办法把他们屏蔽掉。
我做了如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (total1<=total) {
	if (total1<=flag) {
		CreateClip(i, j, num, box[num+(page-1)*total][0], box[num+(page-1)*total][1], box[num+(page-1)*total][2], box[num+(page-1)*total][3], box[num+(page-1)*total][4]);
		thecount = ((page-1)*total)+count;
		count++;
		j++;
	} else {
		var movie = mc.createEmptyMovieClip("mc"+i+j, num);
		movie.removeMovieClip();
	}
	num++;
	total1++;
}

我新引入了一个变量flag,是用来判断本页应该显示几张图片的,var movie = mc.createEmptyMovieClip(”mc”+i+j, num);movie.removeMovieClip();
这两句是用来屏蔽undefined用的。
关于防止用户狂点按钮,我们可以采取当图片正在显示过程中,让按钮失效的做法,再引入一个变量makesure,把按钮代码做如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
menupath.up.onRelease = function() {
	if (makesure == true) {
		makesure = false;
		if (page == 2) {
			menupath.up._visible = false;
		} else {
			menupath.up._visible = true;
			menupath.down._visible = true;
		}
		page--;
		refreshmenu(page);
	}
	gotoAndStop(1);
};
menupath.down.onRelease = function() {
	if (makesure == true) {
		makesure = false;
		if (page == pages-1) {
			menupath.down._visible = false;
		} else {
			menupath.up._visible = true;
			menupath.down._visible = true;
		}
		page++;
		refreshmenu(page);
		gotoAndStop(1);
	}
};
menupath.makesure.onRelease = function() {
	if (makesure == true) {
		makesure = false;
		if ((menupath.jump.text>pages) || (menupath.jump.text<1)) {
			menupath.jump.text = page;
			makesure = true;
		} else {
			page = menupath.jump.text;
			refreshmenu(page);
		}
		if (page == 1) {
			menupath.up._visible = false;
			menupath.down._visible = true;
		} else if (page == pages) {
			menupath.up._visible = true;
			menupath.down._visible = false;
		} else {
			menupath.up._visible = true;
			menupath.down._visible = true;
		}
	}
};

现在来讲,一个分页展示就已经完成了,测试一下吧~~!见(fenye1.rar)

******************************************************************

(进阶教程——-图片飞入)

现在网站上流行的主要是一些比较动感的特效,在这里,我做的是让每张图片按先后次序连续飞入场景的特效,代码如下:

1
2
3
4
5
6
7
PicIn = function () {
	for (i=0; i<hang; i++) {
		for (j=0; j<lie; j++) {
			mc["mc"+i+j]._y += (InTarget-mc["mc"+i+j]._y)*0.2;
		}
	}
};

因为之前我们已经将每个图片在场景中实例化了,所以我们可以利用他们来做出一些效果出来。
这里我突然又有了一个想法,如果能让翻页按钮随着行高的不同而跟随的变化的话,感觉也蛮不错的,但是怎样让他知道当前的高度是多少呢?经过思考,我的算法是这样的:

1
2
3
4
5
if (page == pages) {
	menu_y = y+Math.ceil(flag/lie)*(dx._height+feng_y);
} else {
	menu_y = y+hang*(dx._height+feng_y);
}

经过判断,如果没有到达最后一页的话,高度直接按照规定的行高就可以,否则把当前的行高重新计算再赋值。这样,图片飞入的效果就实现了。代码不算难,关键还是一个思路的问题。
(见fenye2.rar)
fenye1.rar
fenye2.rar

三、我的创意我作主

下面是我加的一些效果,供大家参考。我个人认为,一个好的设计者,最重要的因素就是创造力。

这个程序的扩展性很好,只需很少改动甚至只修改1~2处地方,就可以应用在其他方面,比方说新闻列表,mp3、视频播放器列表等等,因为我已经有成功案例了,节省了大量的时间开发重复性工作,所以这里拿出来和大家一起分享。记住:因为你们快乐,所以我很快乐~!

方法总结:
1、利用数组保存临时数据;
2、通过判断语句的嵌套,达到限制每页图片输出的目的;
3、CreateClip传值方法;
4、缓冲移动效果的运用。

附加小程序:
“动态文本框的调用”:也许大家已经注意到了,范例中的题目是通过调用TextField类来实现的,如果不了解这方面使用方法的话,上面的源文件已经给出了范例的应用,作为你学习本教程的额外收获吧~!

分类: flash教程 标签: as2, flash, 教程
924次浏览↓

关于图片切换的制作方法

2008年2月17日 powerboy 6 条评论

一、深思熟虑,点滴做起

  最近有好多人问我关于制作图片切换的问题,感觉这个问题是很多人普遍存在的一个现象。在很多的韩国网站上都有类似的模版,直接拿来可以套用,但是如果想完全自定义一个真正属于自己的,能够灵活运用的一个程序来说,有很多的障碍,即使是破解的,处理起来可能也不是完全满意的。正好今天我在工作中也设计到了这部分的内容,做了一下,由于时间有限,我以后循序渐进讲解,今天先从基础的做起。(注:本教程主要以介绍思路为主,方法可以变通,不作为主要内容) 首先,当我们要实现一个整体效果的时候,要将效果分成若干部分,每个部分都有独立的功能,然后将各部分再整合到一起,一般作为老手肯定都知道,但是新手要养成一个良好的编程习惯。闲话少絮,下面看一下我的设计思路。

  第一、想象一个图片切换的方式(这里以一个简单的淡入淡出效果为例)
  第二、能够让图像自动按一定时间切换(setInterval、clearInterval)
  第三、可以手动控制当前展示的图片(需要根据xml节点动态输出按钮)
  第四、其他的扩展功能(各种特效遮罩、图片滚动、视频特效的嵌入、控制自动循环开关等等)
阅读全文…

分类: flash教程 标签: as2, flash, 教程
RSS 订阅
  • Google
  • 有道
  • 鲜果
  • 抓虾
  • My Yahoo!
  • newsgator
  • Bloglines
  • 哪吒

分类列表

  • actionscript3.0学习笔记 (16)
  • air学习笔记 (6)
  • alternativa3D (3)
  • AS2疑难杂症 (1)
  • Box2D (3)
  • flash教程 (5)
  • flex学习笔记 (3)
  • 心情驿站 (24)
  • 我收集的flash 8.0资料 (3)
  • 我收集的flash 9.0资料 (3)
  • 我收集的文章 (21)
  • 我的AS2实验室 (4)
  • 我的AS3实验室 (9)
  • 我的新闻 (17)
  • 我的相册 (6)
  • 我翻译的英文资料 (7)
  • 日语学习 (2)
  • 英语学习 (2)

最近发表

  • 浅谈工具的意义
  • “小小便利店”终于上线啦
  • 禁止按tab时焦点从flash切换到地址栏
  • 隐藏Flex滚动条的箭头和滑竿
  • 为asdoc设定example
  • 一个测试睡眠的例子
  • Box2D——入门教程
  • Box2D——shoot Demo
  • 一个由单例模式引发的问题
  • 给图像加水印

最近评论

  • 空谷的回响 发表于 一个测试睡眠的例子
    我的QQ:373131285,希... »
  • manyu 发表于 一个测试睡眠的例子
    请给我发一份吧~我也在学习~谢谢... »
  • Brooks 发表于 mp3播放器 beta2.0(开源)
    好像不能下啊,楼主给我发一份吧,... »
  • velika 发表于 Box2D——shoot Demo
    刚开始学Box2d。发一份源码来... »
  • velika 发表于 一个测试睡眠的例子
    我也想要一份源码,谢谢15337... »
  • velika 发表于 一个测试睡眠的例子
    正在学BOX2D,楼主帮了我大忙... »
  • sky 发表于 一个测试睡眠的例子
    房主,你太强了,非常值得我学习,... »
  • GGGG 发表于 Box2D——shoot Demo
    zswrhua@163.com ... »
  • kirahua 发表于 Box2D——shoot Demo
    我也正在学习用BOX2D 做游戏... »
  • sans 发表于 Box2D——shoot Demo
    楼主很厉害哦,正在学box2d呢... »
  • 下一页 »

存档

  • 2010年五月 (2)
  • 2010年二月 (1)
  • 2009年十二月 (2)
  • 2009年十一月 (4)
  • 2009年十月 (1)
  • 2009年九月 (2)
  • 2009年八月 (2)
  • 2009年七月 (4)
  • 2009年五月 (3)
  • 2009年三月 (3)
  • 2009年二月 (2)
  • 2009年一月 (8)
  • 2008年十二月 (10)
  • 2008年十一月 (7)
  • 2008年十月 (4)
  • 2008年九月 (7)
  • 2008年八月 (8)
  • 2008年七月 (4)
  • 2008年六月 (5)
  • 2008年五月 (11)
  • 2008年四月 (14)
  • 2008年三月 (8)
  • 2008年二月 (12)

友情链接

  • alan新浪博客
  • sunbright
  • 云风Blog
  • 嘎嘎在东京
  • 张毅君/工长君
  • 永明则名
  • 海峡IT网
  • 闪界
  • 雷晟的新浪博客
  • 鼠标炸弹
置顶 WordPress
版权所有 © 2008-2010 动力男孩flash乐园 京ICP备09048608号
主题由 NeoEase 提供, 通过 XHTML 1.1 和 CSS 3 验证.Powered by WordPress