多媒体课程实训报告.docx
《多媒体课程实训报告.docx》由会员分享,可在线阅读,更多相关《多媒体课程实训报告.docx(15页珍藏版)》请在冰点文库上搜索。
多媒体课程实训报告
CENTALSOUTHUNIVERSITYOFFORESTRYANDTECHNOLOGY
中南林业科技大学
课程实训报告
课程:
多媒体技术及应用
姓名:
朱军
学号:
20094204
专业:
计算机科学与技术
指导教师:
陈宇拓
日期:
2011年6月21日
实训题目一
利用编程实现动画时钟
一.课程设计目的:
希望通过本次课程实训设计能够对多媒体编程有个大致了解熟悉使用一些常用的多媒体编程中常用到的函数插件等等
二.设计方法:
1.主要采用vb6.0在windows平台下实现编程。
三.实训步骤
1.打开vb6.0新建一个项目选择标准EXE.
2.新建一个窗体在窗体中加入timer控件设定interval900.
3.双击进入代码编辑区输入以下代码编写时钟表盘效果。
4.整体效果运行预览。
四、算法
用Load命令建立原始Line控制的14个拷贝(因为表盘有12个点和时、分、秒共15个Line),该控制数组每一个实例的端点坐标属性设置为每条线在时钟表盘上的适当位置。
这些拷贝中大多数只放置一次,而3个Line控制每秒钟更新一次,产生时钟指针移动的感觉。
五、程序代码如下
OptionExplicit
ConstPI=3.1415926
DimBaseXAsInteger,BaseYAsInteger,RAsInteger
Dimr1AsInteger,r2AsInteger,r3AsInteger
PrivateSubInit()
DimiAsInteger
BaseX=Me.ScaleWidth/2
BaseY=Me.ScaleHeight/2
R=IIf(BaseX>BaseY,BaseY*0.8,BaseY*0.8)
r1=R*0.2
r2=R*0.1
r3=R*0.05
Fori=0To360Step6
IfiMod30=0Then'时
Me.DrawWidth=2
DrawLineBaseX+(R-3)*Sin(i*PI/180),BaseY-(R-3)*Cos(i*PI/180),BaseX+(R-8)*Sin(i*PI/180),BaseY-(R-8)*Cos(i*PI/180),3
Else'分
Me.DrawWidth=2
Me.PSet(BaseX+(R-3)*Sin(i*PI/180),BaseY-(R-3)*Cos(i*PI/180))
EndIf
Next
Me.DrawWidth=1
Me.Circle(BaseX,BaseY),R
EndSub
'绘制指针
PrivateSubDrawClock()
DimSecondAsInteger
DimMinuteAsInteger
DimHoursAsInteger
Second=DatePart("s",Time)
Minute=DatePart("n",Time)
Hours=DatePart("h",Time)
IfHours>12Then
Hours=Hours-12
EndIf
Me.DrawWidth=1
Me.Circle(BaseX,BaseY),4
DrawLineBaseX-r1*Sin(Second*PI/30),BaseY+r1*Cos(Second*PI/30),BaseX+(R-10)*Sin(Second*PI/30),BaseY-(R-10)*Cos(Second*PI/30),0
DrawLineBaseX-r2*Sin(Minute*PI/30),BaseY+r2*Cos(Minute*PI/30),BaseX+R*0.8*Sin(Minute*PI/30),BaseY-R*0.8*Cos(Minute*PI/30),1
DrawLineBaseX-r3*Sin((Hours+Minute/60)*PI/6),BaseY+r3*Cos((Hours+Minute/60)*PI/6),BaseX+R*0.6*Sin((Hours+Minute/60)*PI/6),BaseY-R*0.6*Cos((Hours+Minute/60)*PI/6),2
EndSub
'画线函数
PrivateSubDrawLine(x1AsInteger,y1AsInteger,x2AsInteger,y2AsInteger,FlagAsInteger)
StaticOldSX1AsInteger,OldSX2AsInteger,OldSY1AsInteger,OldSY2AsInteger
StaticOldMX1AsInteger,OldMX2AsInteger,OldMY1AsInteger,OldMY2AsInteger
StaticOldHX1AsInteger,OldHX2AsInteger,OldHY1AsInteger,OldHY2AsInteger
SelectCaseFlag
Case0
Me.DrawWidth=1
Me.Line(OldSX1,OldSY1)-(OldSX2,OldSY2),Me.BackColor
Me.Line(x1,y1)-(x2,y2)
OldSX1=x1
OldSX2=x2
OldSY1=y1
OldSY2=y2
Case1
Me.DrawWidth=2
Me.Line(OldMX1,OldMY1)-(OldMX2,OldMY2),Me.BackColor
Me.Line(x1,y1)-(x2,y2)
OldMX1=x1
OldMX2=x2
OldMY1=y1
OldMY2=y2
Case2
Me.DrawWidth=3
Me.Line(OldHX1,OldHY1)-(OldHX2,OldHY2),Me.BackColor
Me.Line(x1,y1)-(x2,y2)
OldHX1=x1
OldHX2=x2
OldHY1=y1
OldHY2=y2
CaseElse
Me.Line(x1,y1)-(x2,y2)
EndSelect
EndSub
PrivateSubForm_Resize()
Me.Cls
CallInit
EndSub
PrivateSubTimer1_Timer()
CallDrawClock
EndSub
六、总结
通过本次实训,初步掌握了模拟动态时钟的设计,对vb时间控件及使用有了大致了解,为进一步学习奠定了基础。
实训题目二
金鱼游水逐食
一.课程设计目的:
希望通过本次课程实训设计能够对flash动画制作有更进一步的认识。
并会利用其制作比较复杂的动画。
二.设计方法:
2.主要采用flash在windows平台下实现。
三.实训步骤
1.打开flash新建一个flash文本
2.首先制作金鱼身体的各个部位。
头部躯部尾部分别做成原件存放在库中供使用
3.选定图层一的第一帧在动作下输入代码实现让金鱼游动。
4.整体效果运行预览。
脚本动画代码如下
varframe=0;
varnum=25;
varfishColors=[0xff0000,0xff9900,0,0x99ff00,0x9900ff,0x9999ff];
functioninitFish(level,fishColor){
varpArray=newArray();
varmyColor;
pArray.dis=2.5;//金鱼身体每节的距离
pArray.direction=-90;//金鱼头的朝向
pArray.v=2;
pArray.v1=pArray.v;
pArray.vibration=0;
pArray.state=1;//自由活动
pArray.distX=random(550);
pArray.distY=random(400);
pArray.targetFishs=newArray();
pArray.targetIndex;
//初始化每节坐标
varrandX=random(550);
for(vari=0;ivarobj=newObject;
obj.x=randX;
obj.y=100+i*pArray.dis;
pArray[i]=obj;
}
//初始化身体每节的图片
for(vari=0;ivarc;
if(i==0){
c=this.attachMovie("head","c"+(level+i),level+i);
c._alpha=100;
c._width=c._height=20;
myColor=newColor(c);
myColor.setRGB(fishColor);
}
else{
c=this.attachMovie("body","c"+(level+i),level+i);
c._alpha=50;
c._xscale=c._yscale=20;
myColor=newColor(c);
myColor.setRGB(fishColor);
}
c._x=pArray[i].x;
c._y=pArray[i].y;
c.gotoAndStop(i+1);
pArray[i].obj=c;
}
for(vari=0;ipArray[i].obj._x=pArray[i].x;
pArray[i].obj._y=pArray[i].y;
}
pArray.addTarget=function(tFish){
pArray.targetFishs.push(tFish);
}
//鱼的动作
pArray.step=function(){
varrand=random(300);
if(rand<=3&&rand>=1){
pArray.state=rand;
if(pArray.targetFishs.length==0&&rand==3)pArray.state=1;//如果只有一条鱼,那么不能追逐其它鱼
if(pArray.state==3){//如果状态转换为追踪其他鱼,那么随机挑选一个目标鱼
pArray.targetIndex=random(pArray.targetFishs.length);
}
}
if(pArray.v==2&&random(200)==1)//欢快
pArray.v=5;
if(pArray.v==5&&random(50)==1)//悠闲
pArray.v=2;
if(pArray.state==1&&random(100)==1){//自由活动时更改移动方向
pArray.distX=random(550);
pArray.distY=random(400);
}
if
(1){
vard,dAngle;
varx1,x2,y1,y2;
x1=pArray[0].x;
y1=pArray[0].y;
switch(pArray.state){
case1:
//自由活动
x2=pArray.distX;
y2=pArray.distY;
break;
case2:
//觅食
x2=seed._x;
y2=seed._y;
break;
case3:
//追逐其它的鱼
x2=pArray.targetFishs[targetIndex][0].x;
y2=pArray.targetFishs[targetIndex][0].y;
break;
}
d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
if(pArray.state==1&&d<20.0)//自由活动时距离目标点很近的时候更换目标点
{
pArray.distX=random(550);
pArray.distY=random(400);
}
if(pArray.state==3&&d<10.0)//离目标鱼足够近的时候
{
pArray.state=1;
//trace("ok");
}
dAngle=-Math.asin((y2-y1)/d)/Math.PI*180;
if(x2-x1<0&&dAngle>0)dAngle+=2*(90-dAngle);
if(x2-x1<0&&dAngle<0)dAngle-=2*(-90+dAngle);
if(dAngle<0)dAngle+=360;
dAngle=360-dAngle;
if(pArray.direction>360)pArray.direction-=360;
if(pArray.direction<0)pArray.direction+=360;
dAngle=dAngle-pArray.direction;
if(dAngle>180)dAngle=dAngle-360;
if(dAngle<-180)dAngle=360+dAngle;
if(pArray.state==1)//自由活动
pArray.direction+=random(10)/50*dAngle;
if(pArray.state==2||pArray.state==3)//觅食或者追逐其它的鱼
pArray.direction+=random(20)/50*dAngle;
}
if(random
(2)==1){//鱼身体抖动pArray.direction+=random(pArray.vibration)-pArray.vibration/2;
}
if(frame%14>=7)pArray.direction+=1*pArray.v;//游泳时有规律的摆动
elsedirection-=1*pArray.v;
if(random(60)==1)//改变速度
pArray.v1=pArray.v+random(pArray.v);
pArray[0].x+=pArray.v1*Math.cos(pArray.direction*Math.PI/180)pArray[0].y+=pArray.v1*Math.sin(pArray.direction*Math.PI/180);
pArray[0].obj._rotation=pArray.direction+90;
//计算身体位置
for(vari=1;ivarx0,y0,x1,y1,d;
x0=pArray[i-1].x;
y0=pArray[i-1].y;
x1=pArray[i].x;
y1=pArray[i].y;
d=Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
pArray[i].x=x0+pArray.dis/d*(x1-x0);
pArray[i].y=y0+pArray.dis/d*(y1-y0);
}
for(vari=0;ipArray[i].obj._x=pArray[i].x;
pArray[i].obj._y=pArray[i].y;
}
for(vari=num-1;i>=0;i--){
pArray[i].obj._x=pArray[i].x;
pArray[i].obj._y=pArray[i].y;
pArray[i].obj._rotation=pArray[i-1].obj._rotation;
}
if(pArray.state==2&&pArray[0].obj.hitTest(seed)){//吃食物
if(random(5)==1){
seed._x=random(550);
seed._y=random(400);
seed.vx=0;
seed.vy=0;
pArray.vibration=0;
pArray.v=2;
}
else{
vardirect;
direct=pArray.direction+random(40)-20;
seed.vx=3*pArray.v1*Math.cos(direct/180*Math.PI);
seed.vy=3*pArray.v1*Math.sin(direct/180*Math.PI);
pArray.vibration=40;
pArray.v=4;
}
}//endif
}//endfunction
returnpArray;
}
varfishs;
functioninitFishs(){
varfishNumber;
fishs=newArray();
for(vari=1;i<1000;i++)
removeMovieClip("c"+i);
fishNumber=int(comFishNum.getValue());
for(vari=0;ivarfish=initFish(i*31+1,fishColors[i]);
fishs[i]=fish;
}
for(vari=0;ifor(varj=0;jif(i!
=j)fishs[i].addTarget(fishs[j]);
}
//食物处理
varseed=this.attachMovie("c","c"+2000,0);
seed._x=random(550);
seed._y=random(400);
seed._width=seed._height=6;
seed.vx=seed.vy=0;
this.onMouseDown=function(){
seed._x=_xmouse;
seed._y=_ymouse;
}
this.onEnterFrame=function(){
frame++;
seed._x+=seed.vx;
seed._y+=seed.vy;
if(seed._x<0)seed.vx=-seed.vx;
if(seed._x>550)seed.vx=-seed.vx;
if(seed._y<0)seed.vy=-seed.vy;
if(seed._y>400)seed.vy=-seed.vy;
seed.vx*=0.8;
seed.vy*=0.8;
for(vari=0;ifishs[i].step();
}
initFishs();
四、总结
通过本次实训,掌握了如何利用flash的脚本命令完成各原件的定义实现各部件的动画。
使动画显示的效果更逼真。