Director实践报告1.docx
《Director实践报告1.docx》由会员分享,可在线阅读,更多相关《Director实践报告1.docx(17页珍藏版)》请在冰豆网上搜索。
Director实践报告1
一、设计目的
使我们能更好的运用Director、Photoshop这些实用的软件,了解与学好企业形象设计这一门课程,可以做到理论课程与实践操作相结合,提高我们的自学能力、实践能力、创新能力,为自己增添一分能力。
二、设计主题
Director设计主题为“街头格斗游戏”,主要类容是一个Beat-em-up风格的游戏,是人们利用键盘输入来操作游戏人物进行格斗的游戏,看上去很象那些90年代街头格斗的游戏。
三、设计要求
1要求用Director设计一个完整的多媒体类动画产品效果。
2在这个动画效果中需要添加代码来完成。
3在这个作品设计中,要以自主创作为主题,相应的可以借鉴或寻找帮助。
四、设计过程
今年学校布置Director的实践,我贯穿与整个设计,在这个过程中我学到了很多在理论课上很难学到东西.对于Director实用培训教程设计也有了整体的把握。
最初是选定主题,现在有很多制作游戏的教程,它们大多是迷题游戏或太空入侵者(一种著名的电脑游戏),并且都做的非常好玩。
我决定写一个Beat-em-up风格的游戏,看上去很象那些90年代街头格斗的游戏。
开始前的准备
第一件事情就是需要从Macromedia获得Director8或Director8.5(当然,使用DirectorMX也可以),它可以在PC和Mac上工作。
我是在Mac上使用Director8.5。
接着,需要我们相当熟悉行为、精灵、角色成员和影片脚本这些基本概念。
我们将制作什么
在任何游戏中计划编制总是重要的,.所以在这里让我们理清将要做些什么:
两个人通过键盘输入玩的游戏;两个角色;每个角色有踢腿和出拳两个动作;角色没有特殊的动作;每个角色都有一个遭到攻击后会缩短的健康状态栏(就是我们在玩游戏时所说的角色的血),健康状态首先减少到0的那个人是失败者;当角色走到另外一个角色后面时他们都会转身。
这是一个很简单的游戏,将学会制作象在任何娱乐厅中所看到的非常复杂、完整的格斗游戏。
关于脚本
许多人为Director的Lingo脚本感到烦恼,因为有几种不同的脚本类型用于不同的事件。
要改变一个脚本,首先要在角色成员窗口选择这个脚本:
在这里可以看到选择的是角色成员3这个脚本。
接着,在PropertyInspector面板的Script标签下,可以把脚本改变成Movie、Behavior或Parent脚本(注意:
在这里我们不使用Parent脚本)。
当改变了脚本的类型你会看到这个脚本的图标也随着改变了。
按常规惯例,在整个影片中最好由一个Movie脚本来转交事件,例如象一个键盘事件。
通常有几个Behavior脚本,必需把他们拖放到需要行为的精灵上。
.如果某些事件不能工作,可能是没有正确的拖放它们。
装配游戏
在PropertyInspector面板把舞台改为620×240,这会给游戏带来友善、宽广的感觉:
接着,把所有的图像输入到InternalCast窗口:
然后输入DJ和Karin图形的演员表,我已经假设它们是一个演员表,为让影片正确播放我已设置了所有动画的注册点。
这个游戏共有3帧,在第一帧获取大多数的动作。
把背景图像拖放到精灵通道1上。
现在,我们将增加少量的代码。
在第一帧的脚本区双击,并增加这些代码:
onexitframeme
gototheframe
end
将看到那个行为出现在演员表和总谱中第一帧的脚本区。
拷贝并粘贴这个行为到其它两帧:
然后让我们把背景图像从角色成员窗口拖放的精灵通道1上:
下面我们将加入角色。
现在制作这个游戏看上去很令人激动,我们将增加一个“呼吸”循环,也就是说,动画角色除了呼吸之外不作任何事情。
这是在没有按键被按下时发生的事情,其实角色更本没有做任何事情,虽然如此,影片仍然看上去很酷。
拖放Karin的第一个呼吸图像(Karin_breath_01)到精灵通道4上,并拖放DJ的第一个呼吸图像(Dj_breath_01)到精灵通道7上:
然后,我们需要把这两个图像的油墨改为Matte,这样可以去掉角色周围的白色,并且稍后可以让我们容易做碰撞检查。
当你象这样做游戏时,Matte是非常有用的,因为可以以一个像素的级别而不是以一个矩形的级别检测碰撞:
可以看到如果正确的设置了Matte油墨,背景图像会完全显示在角色的后面。
使用FlipHorizontal按钮把DJ翻转到面向另外一个方向,把这个角色安排在远离另外一个角色的地方,但是确保他们的脚线处于同一水平线上,否则,一个角色似乎在空中行走!
这是游戏开始的位置。
看上去有点象这样:
规划战斗
现在我们用合乎逻辑的方法处理战斗。
很多脚本让游戏进行这样的工作:
每当用户按下一个按键,角色收到这个按键消息并在影片中进行处理;操纵(例如象行走、击拳和踢腿)角色;如此看来,我们真正要做的(在简单项目中)是用键盘来控制角色,当我们按下一个出拳的按键,我们的角色将播放一个击拳的动画。
到目前为止,我们必需用心记住,我们必需有在一个新的动画开始前要等到前一个动画播放结束的机制,否则游戏会有跳动。
所以,在按下一个出拳的按键后紧接着按下踢腿的按键,应该先显示击拳的动画,一旦这个动画结束,会播放踢腿的动画。
当击拳的动画播放过程中不能用踢腿的动画取消。
获取按键
我们将制作一个处理按键的影片脚本。
.用这些代码制作一个影片脚本:
onstartmovie
clearglobals
thekeyDownScript="dokeys"
end
ondokeys
ifkeypressed("w")thensendSprite(4,#punch)--callsKarin'sindividualhandler
ifkeypressed("s")thensendSprite(4,#kick)
ifkeypressed("a")thensendSprite(4,#left)
ifkeypressed("d")thensendSprite(4,#right)
ifkeypressed("i")thensendSprite(7,#punch)--callDJ'sspritesindividualhandler
ifkeypressed("k")thensendSprite(7,#kick)
ifkeypressed("j")thensendSprite(7,#left)
ifkeypressed("l")thensendSprite(7,#right)
end
我们从Startmovie处理程序开始,我们必需清除所有全局变量,我们把自定义的dokeys处理程序设置给KeyDownScript,现在,每当按下键盘上的一个按键,它都会访问dokeys处理程序。
在dokeys处理程序中,我们把W、S、A和D设置给Karin,把I、K、J和L设置给DJ。
大家会注意到每个按键都会发送消息给精灵4(Karin)或精灵7(DJ),每个信息让它们做出拳、踢腿、向左移动或向右移动的动作,目前为止相当合乎逻辑。
制作Karin的格斗
我们将为每个角色制作一个行为,.先给Karin制作行为,把这些代码作为一个行为并拖放到Karin所在的精灵通道4上。
propertymycounter--Karinscounterforanimation
propertymyQlist--Karinslistofquedinput
propertyhealth--Karinshealth
propertyspritenum--karinsspritenumber(4)
onbeginspriteme
sprite(spritenum).mycounter=0
sprite(spritenum).myqlist=[#blank,#blank]--Thislisthas2positions,bothblank
sprite(spritenum).health=200--fullhealth,200points
end
--ThiscodeiscalledwhentheKarin'spunchkeyispressed
--ItreplacesablankpositioninthelistwiththePunchcommand
onpunchme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#punch
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#punch
endif
end
--ThiscodeiscalledwhentheKarin'skickkeyispressed
--ItreplacesablankpositioninthelistwiththeKickcommand
onkickme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#kick
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#kick
endif
end
--ThiscodeiscalledwhentheKarin'sleftkeyispressed
--Itreplacesablankpositioninthelistwiththeleftcommand
onleftme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#left
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#left
endif
end
--ThiscodeiscalledwhentheKarin'srightkeyispressed
--Itreplacesablankpositioninthelistwiththerightcommand
onrightme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#right
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#right
endif
end
--hereiswheretheactiontakesplace.
onexitframeme
casesprite(spritenum).myQlist[1]of
#blank:
a=
(1)+sprite(spritenum).mycountermod8--8isthenumberofanimationframes
sprite(spritenum).member=(memberaofcastlib("karin"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1--advancesthecounter
ifsprite(spritenum).mycounter/8=1then
sprite(spritenum).mycounter=0--resetsthecounteraftertheanimationhasplayed
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
endif
#punch:
a=(13)+sprite(spritenum).mycountermod6--6isthenumberofanimationframes
sprite(spritenum).member=(memberaofcastlib("karin"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1
ifsprite(spritenum).mycounter/6=1then
sprite(spritenum).mycounter=0
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
endif
--Collision
ifsprite(spritenum).mycounter/3.0=1then
--the3rdframeofanimationistestedforcollision
ifsprite4intersects7then
sprite(7).health=sprite(7).health-8--takes8pointsoffofDJ'shealth
sprite(7).locz=8--MovesDJbehindKarin
sprite(spritenum).locz=9--MovesKarinaheadofDJ
endif
endif
#kick:
a=(9)+sprite(spritenum).mycountermod4--4isthenumberofanimationframes
sprite(spritenum).member=(memberaofcastlib("karin"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1
ifsprite(spritenum).mycounter/4=1then
sprite(spritenum).mycounter=0
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
endif
--collision
ifsprite(spritenum).mycounter/3.0=1then
--the3rdframeofanimationistestedforcollision
ifsprite4intersects7then
sprite(7).health=sprite(7).health-12--takes12pointsoffofDJ'shealth
sprite(7).locz=8--MovesDJbehindKarin
sprite(spritenum).locz=9--MovesKarinaheadofDJ
endif
endif
#left:
a=(29)+sprite(spritenum).mycountermod10--10isthenumberofanimationframes
sprite(spritenum).member=(memberaofcastlib("karin"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1
--thenextlinemovesKarinback4pixelsperframe
sprite(spritenum).loch=sprite(spritenum).loch-4
ifsprite(spritenum).mycounter/10=1then
sprite(spritenum).mycounter=0
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
--checktoseeifyoushouldturn
ifsprite(spritenum).lochsprite(spritenum).fliph=0
endif
endif
#right:
a=(19)+sprite(spritenum).mycountermod10
sprite(spritenum).member=(memberaofcastlib("karin"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1
--thenextlinemovesKarinforward4pixelsperframe
sprite(spritenum).loch=sprite(spritenum).loch+4
ifsprite(spritenum).mycounter/10=1then
sprite(spritenum).mycounter=0
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
--checktoseeifyoushouldturn
ifsprite(spritenum).loch>sprite(7).lochthen
sprite(spritenum).fliph=1
endif
endif
endcase
end
制作DJ的格斗
这里是DJ的行为脚本,可以看到它非常类似Karin的行为脚本。
这次我把这些代码作为行为并拖放到DJ所在的精灵通道7上。
propertymycounter
propertymyQlist
propertyspritenum
propertyhealth
onbeginspriteme
sprite(spritenum).mycounter=0
sprite(spritenum).myqlist=[#blank,#blank]
sprite(spritenum).health=200
end
---reciveevents
onpunchme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#punch
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#punch
endif
end
onkickme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#kick
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#kick
endif
end
onleftme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#left
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#left
endif
end
onrightme
ifsprite(spritenum).myQlist[1]=#blankthen
sprite(spritenum).myQlist[1]=#right
sprite(spritenum).mycounter=0
else
sprite(spritenum).myQlist[2]=#right
endif
end
onexitframeme
--thisisitsframetikker
---putsinthenextmove
--animation
casesprite(spritenum).myQlist[1]of
#blank:
a=
(1)+sprite(spritenum).mycountermod8
sprite(spritenum).member=(memberaofcastlib("DJ"))
sprite(spritenum).mycounter=sprite(spritenum).mycounter+1
ifsprite(spritenum).mycounter/8=1then
sprite(spritenum).mycounter=0
--shiftlist
sprite(spritenum).myqlist[1]=sprite(spritenum).myqlist[2]
sprite(spritenum).myqlist[2]=#blank
endif
#punch:
a=(16)+sprite(spritenum).mycountermod8
sprite(spritenum).member=(memberaofcastlib("DJ"))
s