直播别人能看到你吗:FLASH动画场景制作

来源:百度文库 编辑:中财网 时间:2024/04/30 14:01:38
先看看最终效果:
步骤:
1、打稿
我比较喜欢在纸上打稿,个人觉得在纸上比较容易看清整个画面,
不需要重复的使用“放大”和“缩小”来作画,错误率比较低,速度比较快 (仅仅个人观点)。

2、描线分层
在上色前就必须构想好成品的模样,而不是你画成什么就是什么,都是要事先在头脑里规划好的,
这样才能避免做无用的功和无用的层,层多了比较容易乱,该放在一起的就放在一起,
不该放的就要分开,每一层的任务很明确(仅仅个人观点)。

3、打底色
这一点很重要,这一部错了后面就会有问题,而且很难校正。因为你的眼睛是不能看的很准的,
举个简单的例子,在一张白纸上,你画上红60,绿30,蓝0的线条,很容易误以为是黑色,
但是当你把背景画成深色的时候,你就会发现,其实这是一条棕色的线条,
然后,你又要很麻烦的去改色,让线条看起来更深一些。所以,为了避免这类情况,
必须提前做好正确的对比,打底,应该排在前面(文笔不好,不知大家能不能看懂,仅仅个人观点)。

4、上色
有了前面的对比,这时候就可以大胆的上色,当然,所有的颜色也尽量是事先想好的,
最好不要即兴创作,那样容易出现配色不协调不好看(仅仅个人观点)。

5、后处理
我们要的是效果,而不是死脑筋的只用一种软件做,(仅仅个人观点)
所以,PS加工一下更好看,在这个场景里,我仅仅只是添加了阳光。

源文件下载:catoonbj01.rar
用flash制作简单的鼠标跟随文字
[效果]:
[步骤]:
1、拉一动态文本,实例名为_txt;转为影片剪辑,实例名为_mc。
2、在帧上写如下代码:
txt_array = ["琴", "者", "工", "作", "室"];
//跟随鼠标的文字定义为数组中的元素
for (j=0; j<5; j++) {
_mc.duplicateMovieClip("_mc"+j, j+100);
this["_mc"+j]._txt.text = txt_array[j];
//复制影片剪辑并使动态文本中的内容为对应数组中的元素
this["_mc"+j]._txt.autoSize = true;
this["_mc"+j]._txt.selectable = false;
//设置动态文本
this["_mc"+j].vx = this["_mc"+j].vy=0;
//初始化影片剪辑的变量vx、vy值均为0
}
onEnterFrame = function () {
mcxy(_mc0, _xmouse, _ymouse);
for (j=1; j<5; j++) {
mcxy(this["_mc"+j], this["_mc"+(j-1)]._x, this["_mc"+(j-1)]._y);
用fiash制作游戏得分显示递增的效果
效果演示:
原代码下载地址:http://www.mygamemylove.com/t_html/620.html
//显示数字
//要定义的对象名,电影实例,数字长度,递加的步长,起始分数
function ini_objShowNum(objShowNum:Object, mcTarget:MovieClip, numLen:Number,
numStep:Number, numStar:Number) {
//目标电影实例
objShowNum.mcTarget = _root;
//最终结果
objShowNum.numEnd = 0;
//当前数字变化显示的分数
objShowNum.num = 0;
//递增的步数
objShowNum.numStep = 1;
//是否开始变化
objShowNum.isGo = false;
//显示数字的长度
objShowNum.numLen = 0;
//初使化
objShowNum.ini = function(mcTarget:MovieClip, numStep:Number, numStar:Number,
numLen:Number) {
this.mcTarget = mcTarget;
this.numStep = numStep;
this.num = numStar;
this.numStar = numStar;
this.numLen = numLen;
this.mcShowNum();
};
//增加分数
objShowNum.addNum = function(num:Number) {
this.isGo = true;
this.numEnd += num;
};
//放在循环的onEnterFrame中。用于递增显示的效果
objShowNum.go = function() {
if (!this.isGo) {
return 0;
}
if (this.num+this.numStep>=this.numEnd) {
this.num = this.numEnd;
this.isGo = false;
} else {
this.num += this.numStep;
}
this.mcShowNum();
};
//显示一组数字
objShowNum.mcShowNum = function() {
var mc:MovieClip = this.mcTarget;
var num:Number = this.num;
var _l5:Number = this.numLen;
var strNum = String(num);
var str = "";
for (var i = 1; i<=(_l5-strNum.length); i++) {
str += "0";
}
strNum = str+strNum;
// end if
var numI:Number = 0;
while (numI<_l5) {
var numTem:Number = Number(strNum.substr(numI, 1));
if (numTem == 0) {
mc["mc"+(numI+1)].gotoAndStop(10);
} else {
mc["mc"+(numI+1)].gotoAndStop(numTem);
}
// end if
numI++;
}
// end while
};
//执行初使化
objShowNum.ini(mcTarget, numStep, numStar, numLen);
}
////////////////
//游戏得分显示递增的效果
//smallerbird 2008-9-4
//flash原创教程 尽在自娱自乐www.mygamemylove.com  
//原代码下载地址:http://www.mygamemylove.com/t_html/620.html  
//操作步骤
//1.要一个电影实例:条件:里面有代表每一位数字的元件(这个元件里有10帧,分别入以下数字
1,2,3,4,5,6,7,8,9,0)。
//要显示几位就放几个,排列好。命名为:mc1,mc2,mc3...;例如:要三位数:好就要用三个mc1,mc2,mc3
(mc1表示百位,mc2表示十位,mc3表示个位)
//2.初使化:
var objShowNum_1:Object = new Object();
var mcNum:MovieClip;
ini_objShowNum(objShowNum_1, mcNum, 9, 1, 0);
//3.检测函数,为什么不放在mcNum的onEnterFrame,我觉得所有的循环放在一个地方比较好管理。
_root.onEnterFrame = function() {
objShowNum_1.go();
};
//当前的步长
var mcBtn1:MovieClip;
txt1.text = objShowNum_1.numStep;
mcBtn1.onRelease = function() {
//步和不能大于要加的数
if (_root.objShowNum_1.numStep+1<_root.objShowNum_1.numEnd) {
_root.objShowNum_1.numStep++;
}
_root.t
xt1.text = _root.objShowNum_1.numStep;
};
var mcBtn3:MovieClip;
mcBtn3.onRelease = function() {
////步和不能小于0
if ((_root.objShowNum_1.numStep-1)>0) {
_root.objShowNum_1.numStep--;
}
_root.txt1.text = _root.objShowNum_1.numStep;
};
//游戏得分显示递增的效果
//smallerbird 2008-9-4
//flash原创教程 尽在自娱自乐www.mygamemylove.com  
//原代码下载地址:http://www.mygamemylove.com/t_html/620.html  
//结果数
var mcBtn2:MovieClip;
txt2.text = "0";
mcBtn2.onRelease = function() {
_root.objShowNum_1.addNum(10);
_root.txt2.text = _root.objShowNum_1.numEnd;
};
var mcBtn4:MovieClip;
mcBtn4.onRelease = function() {
//增加
_root.objShowNum_1.addNum(100);
_root.txt2.text = _root.objShowNum_1.numEnd;
};
}
};
//运行每一帧时影片剪辑的坐标执行如下自定义函数
function mcxy(_mc, a, b) {
_mc.vx += (a-_mc._x)*.5;
_mc.vy += (b-_mc._y)*.5;
_mc.vx *= .5;
_mc.vy *= .5;
_mc.vx += 4;
_mc._x += _mc.vx;
_mc._y += _mc.vy;
}
用fiash程序优化
第一章 AS3的一些优化计算方法
用乘法来代替除法(当除数可转化为有限数的时候)。 比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差别并不是很大。只有在需要大量计算情况下,比如3D引擎中差别才比较明显。 用位运算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几乎比乘除快一倍,但是一般情况下,我们不能选择位运算,比如我们就不能用13>>1来代替13/2,尽管前者比后者运算速度更快,但2者的运算结果却不一样。所以还是要看具体情况。 用unit()或int()代替取整运算Math.floor()和Math.ceil()。比如var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。如果是Math.floor(),还可以用位运算(>>0)来代替。比如var test:uint =1.5>>0,比unit()或int()更快。 用乘-1来代替Math.abs()方法。比如var nn:Number = -23;var test:Number= nn < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。当然还有更多的优化计算的方法。一般来说,低级运算要比高级运算速度;内部方法比调用其他方法速度快。另外要注意的是,这些方法有的时候可能并一定适用。
第二章 Actionscript 优化指南
原著 Marco Lapi,alias Lapo, aw译
在这篇文章中,我们将讨论多种优化 Actionscript 代码的方法.
此外我们也针对一些典型的游戏代码进行了系列测试,来最大限度的发掘、提高Flash播放器的性能。
何时进行优化对现有程序进行优化的过程,有时十分的冗长与困难,这与原始代码的非优化程度有关,
所以在投入大量时间进行代码优化之前,最重要的是要估计出要在什么地方对代码做出修改或替换。
一个游戏代码的最重要的部分就是主循环体,通常情况下该循环体要在flash的每一帧上执行,
并控制游戏中的角色属性和重要的数据参数。而对于主循环体以外的部分,也可能是次要循环部分,
同样要注意是给其否分配了过多的资源,而没有分配给那些更需要资源的核心部分。
通过积累在各处节约出来的时间(可能每处仅仅是几个毫秒),
您会明显发现自己的swf运行得更加稳定,并且游戏感也大大加强。
简洁与高效的代码
书写出十分简洁、可以再次调用的代码(有时可能是面向对象的)是一项精细的工作,
但这需要多年的编程经验。对于OOP(object oriented programming,面向对象的程序设计),
有些场合根本利用不到它的优势,这使得它显得十分奢侈。在有限的资源条件下
(可能是flash播放器的原因),通过更先进的方法,像刚刚提到的OOP,
就可能反而导致令人不满意的结果。
我们并不是说OOP对游戏编程不好,只是在某些场合它显得过于奢侈和多余。
毕竟有时候“传统的方法”却能得到更好的结果。大体而言,用OOP是比较好的,
因为它让代码维护更加简单。但在后文中,你会看到有时为了充分发挥flashplayer性能,
而不采用OOP技术。例如:处理快速滚动或者计算十分复杂的数学问题。
基本的优化一提及代码优化,我们马上会联想到执行速度的改进,
而很少去考虑系统资源的分配。这是因为当今,即使是将被淘汰的计算机,
都有足够的内存来运行我们大部分的flash游戏(128M的内存足以满足大多数情况的需要,
况且,512M的内存是当今新电脑的基本配置)
变量
在各种重要的代码优化手段中,有这么一条:在定义局部变量的时候,
一定要用关键字var来定义,因为在Flash播放器中,局部变量的运行速度更快,
而且在他们的作用域外是不耗占系统资源的。
aw附:var变量仅仅在花括号对中才有“生命”,个人认为没有系统学过编程的人容易出错的一个地方:
awMC.onLoad = function(){
var aw = 1;
}
awMC.onEnterFrame = function(){
//不存在aw这个变量
}
一段非优化代码:
function doSomething()
{
mx = 100
my = 100
ar = new Array()
for (y=0; y < my; y++)
{
for (x=0; x < mx; x++)
{
i = (y * mx) + x
arr[i] = i
}
}
return arr
}
这段代码中,并未声明函数体内的那些变量(那些仅仅在函数内使用的变量)为局部变量,
这使得这些变量被播放器调用的速度更慢,并且在函数执行完毕的时候仍然耗占系统资源。
下面列出的是经过改进的同样功能的代码:
function doSomething()
{
var mx = 100
var my = 100
var ar = new Array()
for (var y=0; y < my; y++)
{
for (var x=0; x < mx; x++)
{
var i = (y * mx) + x
arr[i] = i
}
}
return arr
}
这样一来所有的变量均被定义为了局部变量,他们能够更快地被播放器调用。
这一点在函数大量(10,000次)循环运行时显得尤为重要!当一个函数调用结束的时候,
相应的局部变量都会被销毁,并且释放出他们占有的系统资源。
用fiash火焰文字效果制作

上午突然有点灵感,做了一个火焰效果。看看,大家喜欢不?如果感兴趣。请认真看完此篇文章,这样你就能做出这种效果了。演示地址:http://www.taoshaw.com/taoshaw/study/fire_text
噢,如果你感兴趣。就搬个板凳坐起,慢慢看吧。很复杂的。呵呵。
1、新建影片,设置背景为黑色。帧频为50。这里不一定的。大小也不一定,根据你自己的TEXT的大小来。

2、新建一个元件。用于做字体。这里面的字体的制作过程比较复杂。大家要认真看哦。

3、选择静态文本框。设置字体、颜色等属性。当然这里也不固定。大家喜欢即可。而且以后我们还要设置字的色相等。

4、然后在场景中,打上文本。如果你感觉文本不够大。可以使用自定义缩放工具来进行调节。

5、选择墨水瓶工具,然后设置属性。这里的线条粗细可以适当调大点。只要不过份就行了。呵呵。

6、然后给文本描上边框。

7、选择选择工具。把场景中的东东选中吧。。。

8、将线条转化为填充。这一步很关键的。只有这样,我们才能继续加边框。我们现的想法是让文本先出现空心字的效果。如果有不懂的朋友这里要注意了哦。这样可以做空心字的效果哦。。。

9、继续选择墨水瓶工具,设置线条的颜色为红色了。只要跟刚才的线条颜色不一样即可。这样是为了好区分。但建议选择跟文字的颜色一样。不是文字的边框哈。

10、描上边框。。

用fiash3D墙面旋转效果相册制作教程
用fiash弄出一个放大效果的实现
更新(加了鼠标滚动放大):
代码如下:
/*---design by whb in 2008-9-1---
参数变量:mc:需要放大的图形*/
package maths{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.events.MouseEvent;
import flash.geom.Point;
public class ZoomImage extends Sprite {
private var sprBitmapData:BitmapData;
private var sprBitmap:Bitmap;
private var Rect:Rectangle;
private var Matr:Matrix;
private var mc:Sprite;
private var Mdown_x,Mdown_y,Mup_x,Mup_y:Number;
public function ZoomImage(_mc:Sprite) {
mc=_mc;
mc.addEventListener(flash.events.MouseEvent.MOUSE_DOWN,Mdown_fc);
mc.addEventListener(flash.events.MouseEvent.MOUSE_MOVE,Mmove_fc);
mc.addEventListener(flash.events.MouseEvent.MOUSE_UP,Mup_fc);
}//end of ZoomImage
private function Mdown_fc(e:flash.events.MouseEvent) {
Mdown_x=e.localX;
Mdown_y=e.localY;
}//end of Mdown_fc
private function Mmove_fc(e:flash.events.MouseEvent) {
}//end of Mmove_fc
private function Mup_fc(e:flash.events.MouseEvent) {
if (e.localX > Mdown_x && e.localY > Mdown_y) {
var localPoint=new Point(Mdown_x,Mdown_y);
if (sprBitmap != null) {
removeChild(sprBitmap);
}
Mup_x=e.localX;
Mup_y=e.localY;
Matr=new Matrix(1,0,0,1,- Mdown_x,- Mdown_y);
sprBitmapData=new BitmapData(Mup_x - Mdown_x,Mup_y - Mdown_y);
sprBitmap=new Bitmap(sprBitmapData);
sprBitmapData.draw(mc,Matr);
addChild(sprBitmap);
this.scaleX=this.scaleY=2;
this.x=mc.localToGlobal(localP).x;
this.y=mc.localToGlobal(localP).y;
//
this.addEventListener(flash.events.MouseEvent.MOUSE_DOWN,MD_fc);
this.addEventListener(flash.events.MouseEvent.MOUSE_UP,MU_fc);
this.addEventListener(flash.events.MouseEvent.MOUSE_WHEEL,MW_fc);
}
}//end of Mup_fc
private function MW_fc(e:flash.events.MouseEvent) {
if (e.target.scaleX>1&&e.target.scaleX<5) {
e.target.scaleX+=0.03*e.delta;
e.target.scaleY+=0.03*e.delta;
}else{
e.target.scaleX=e.target.scaleY=1.1;
}
}//end of MW_fc
private function MD_fc(e:flash.events.MouseEvent) {
e.target.startDrag();
}//end of MD_fc
private function MU_fc(e:flash.events.MouseEvent) {
e.target.stopDrag();
}//end of MU_fc
}//end of class
}//end of package