游戏技术电子教案-2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//弹跳运动的循环代码 this.addEventListener(Event.ENTER_FRAME,moveBall); function moveBall(Event) { speedy = speedy+g; newx = this.x+speedx; newy = this.y+speedy; if (newx<radio || newx>550-radio) { speedx = -speedx; } else { this.x = newx; } if (newy<0Байду номын сангаасradio || newy>400-radio) { speedy = -speedy; } else { this.y = newy; }
1,新建文档,帧频率30fps 2,绘制一个弹球,制成影片剪辑 3,双击进入弹球内部,制作具有弹跳运动的 剪辑。 4,其中,ball图层第1~2帧是一个静止不动 的弹球,3~8帧是弹球爆炸时的一个小动画。
5,导入一个分裂小球时的声音特效,并将它 链接为Break类,基类默认。 6,组织游戏的界面。
游戏实例:测测你的反应速度
开始
初始化

重测
测试一次 是 显示结果
达5次
退出
流程图
入口
延迟s
延迟一帧 选择 延迟 单击鼠标
计算时间差并 计数器加1
随机选择
出口 选择变色
变色并记录 开始时间
测试一次流程
具体步骤
(1)新建flash文档 (2)双击图层1命名“小圆与按钮”。单击第2帧, 按F6键插入关键帧。画红色小圆 15帧关键帧,将小圆颜色改为黄色。分别命名实例 名。 (3)设置开始与结束按钮。 (4)将静态与动态的文字部分放在新建的图层上。 (5)新建“成绩图层”,将2,6帧转化为关键帧。 绘制显示成绩的动态文本框。 (6)开始编写程序。
显示结果
stop(); resultScore = resultScore/n/1000; resultShow.text=resultScore+"秒"; if (resultScore<0.22) { comment = "你真牛!"; } else if (resultScore<0.3) { comment = "还不赖"; } else { comment = "要加油啊!"; } commentShow.text=comment; bt_restart.addEventListener(MouseEvent.MOUSE_DOWN, restart); function restart(MouseEvent) { gotoAndPlay("restart"); }
Action代码
第一帧: //给小球一个随机的初始的速度 var speedx:Number = Math.random()*6-3; var speedy:Number = Math.random()*6-3; var newx,newy; //这个弹球的半径 var radio:Number = this.width/2; //模拟重力加速度用,设为0表示无重力加速度 var g:Number = 0; }
第三帧
gotoAndPlay(2);
游戏:点顽石
刚开始,场景中有一个运动着的大弹球, 单击这个弹球,它就会破裂成四个直径只 有原来一半的小弹球。再单击其中一个, 又会破裂成四个更小的弹球。
关键点分析
一是如何实现弹球运动的独立性 二是当鼠标单击后,如何让这个剪辑“分裂” 成四个更小的剪辑。
具体步骤
this.addEventListener(MouseEvent.MOUSE_DOWN,dragB all); this.addEventListener(MouseEvent.MOUSE_UP,dropBall); function dragBall(evt:MouseEvent) { dragging = true; evt.target.startDrag(); } function dropBall(evt:MouseEvent) { dragging=false; evt.target.stopDrag(); }
使用Timer
它允许设置间隔时间以及循环的次数,然 后每过一段间隔时间就触发TIMER事件, 次数完成之后则触发TIMER_COMPLETE 事件。
弹球
利用帧循环一个典型例子。在此游戏中, 最重要的为物理运动现象模拟,它有重力、 空气碰撞损失等现象。
两个关键点: (1)如何实现运动现象模拟 (2)如何实现鼠标抛甩来获得裙运动状态
(2)当弹球处于被拖动状态时: △x=vx, △y=vy,,当处于弹跳状态下 Vx= △x, △yvy= △y,当处于拖动状态下
具体步骤
1,新建文档,设置帧频率 2,图层1制作弹球影片剪辑 3,新建图层action
代码
var dragging:Boolean=false;//状态参数,指明是否正在被拖 动 var g:Number=0.1;//重力参数 var zuni:Number=0.002;//空气阻尼系数 var pzss=0.1;//碰撞损失参数 var speedx=0;//x方向的速度 var speedy=0;//y方向的速度 var newx=this.x;//当前时刻的坐标 var newy=this.y; var oldx=newx;//前一时刻的坐标 var oldy=newy; var stageHeight=600,stageWidth=800;//屏幕的尺寸 var radio=this.width/2;//小圆的半径
随机选择走向
if(Math.round(Math.random()*20)!=1){ gotoAndPlay(currentFrame-1); }
对黄小球的响应
startTime=new Date(); stop(); yellowBall.addEventListener(MouseEvent.M OUSE_DOWN,calDuration);
Flash 游戏典型的延迟循环模式
模式帧跳转 典型的是三帧或四帧模式。第一帧是初始化, 第二帧是被重复执行的代码;第三帧有一 条跳转语句,跳回第2帧并播放 (gotoAndPlay(2)),这样第2帧的代码又 被执行。第四帧是停止帧 (gotoAndStop(4))
使用ENTER_FRAME事件
if (newx<radio || newx>stageWidth-radio) { speedx = -speedx*(1-pzss); } else { this.x = newx; } if (newy<radio || newy>stageHeight-radio) { speedy = -speedy*(1-pzss); } else { this.y = newy; } }
在第二帧
if (dragging) { newx = ball.x; newy = ball.y; speedx = newx-oldx; speedy = newy-oldy; oldx = newx; oldy = newy; } else { speedy=(speedy+g)*(1-zuni); speedx=speedx*(1-zuni); newx =this.x+speedx; newy = this.y+speedy;
function calDuration(MouseEvent) { endTime = new Date(); var currentScore = endTime.getTime()startTime.getTime(); everyResult+="第"+i+" 次:"+(currentScore/1000)+"秒\n"; txtShow.text=everyResult; resultScore+=currentScore; i++; if (i>n) { gotoAndPlay("result"); } else { gotoAndPlay("red"); } }
这两个问题可巧妙地应用帧跳转技术实现。
将Flash帧频率庙宇为50fps,采用三帧循环模 式,则一过0.04秒关键代码就执行一次。
(1)当弹球处于弹跳运动状态时,先以△t 间隔计算出弹球的位移。 △x=vx×γ △t △y=(vy+0.5g △t ) ×γ× △t 如果y坐标到达边界,只要使用: Vy=- Vy
_parent.stop(); stop(); onEnterFrame = function () { byteloaded = _root.getBytesLoaded(); bytetotal = _root.getBytesTotal(); loaded = int((byteloaded/bytetotal)*100); bar._xscale = loaded; text = loaded+"%"; if (byteloaded == bytetotal) { _parent.play(); } };
开始
stop(); bt_start.addEventListener(MouseEvent.MO USE_DOWN,playMovie); function playMovie(MouseEvent){ gotoAndPlay("restart"); }
初始化变量
//初始化过程 var startTime:Date,endTime:Date; var everyResult:String=""; var n:int=5,i:int=1,score:int=0; var resultScore:Number=0; var comment:String="";
多媒体游戏技术
游戏的构造
游戏是集多媒体、人机交互、 人工智能、网络等于一体的调试复 杂的软件系统。
通用下载进度条
几乎所有的FLASH 游戏都有一个下载进度条。
MovieClip类提供了getBytesLoaded方法和 getBytesTotal方法 getBytesLoaded:获得已经下载的字节数 getBytesLoaded:获得总的字节数 只要侦听enterFrame事件来获取信息。
响应红色小圆的单击
redBall.addEventListener(MouseEvent.MOUSE_DOWN,pu nish); function punish(MouseEvent) { var currentScore=5000; everyResult+="第"+i+"次:"+(currentScore/1000)+"秒\n"; txtShow.text=everyResult; resultScore+=currentScore; i++; if (i>n) { gotoAndPlay("result"); } else { gotoAndPlay("red"); } }
第8帧
this.removeEventListener(Event.ENTER_FR AME,moveBall); parent.removeChild(this);
ENTER_FRAME事件是每经过一帧间隔就会 自动触发一次的事件。 var mc:MovieClip; mc.addEventListener(Event.ENTER_FRAM E,doSomething); function do:Something(evt:Event){ //每过一帧间隔执行一遍这里的代码}
使用interval触发器
Interval触发器不依赖于帧频率就重复调用一 个过程
实例
var intervalId:Number; var time:Number = 0; var duration:Number = 1000; function timeCount():Void { time++; if (num == 0) { clearInterval(intervalId); gotoAndStop(3); } } intervalId = setInterval(this, "timeCount", duration);
相关文档
最新文档