设为首页收藏本站官方微博

wintermute学习笔记[8]--搭建场景步骤七:区域实体、光标、脚本

[复制链接]
查看: 3154|回复: 0
打印 上一主题 下一主题

wintermute学习笔记[8]--搭建场景步骤七:区域实体、光标、脚本

跳转到指定楼层
楼主
发表于 2010-9-18 12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

wintermute学习笔记[8]--搭建场景步骤七:区域实体、光标、脚本

注意区域Region、实体Entities、区域实体Region entities是不一样的- -  ?# v$ v& ]) _) ?( C

( _6 r5 \9 t# ], l. x3 C) @[区域实体]  S+ u" H0 |0 r" S' \

, z& g9 ^6 N7 m: v% E
7 U: a0 i  `( D5 ]) z' ~如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。
- e8 d  b6 N& c
4 V5 W) T% D$ w/ h4 K+ _- n
  C# [* {# ~8 u6 ^( ^. w; q! S我们将添加门、柜子、窗户三个区域实体作为例子。1 R/ K% D/ j. e
% G* A( N+ }' h; l0 w
在SceneEdit中打开MyScene.scene。; L. A  g+ v' F3 E/ _+ E

" M3 n9 W/ X: S% ?7 ^点击下图中的按钮添加区域实体。/ y5 \3 n5 Z8 p$ n" \: ~2 n
! n7 R, j$ K# m& e) ]
+ ~$ m( T( f) f

4 u" D- G) i3 z! O# y2 x( a你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。5 V* q) W! l, {3 P: u( ^# u

6 H% b+ i8 h- G' a0 j* e9 G
% v. c- }" t" X9 a/ ], v- {  K这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。) C* Q' t, h0 J$ U8 N
3 e9 o: Q. m) Q, ]. c+ h

$ h' ~9 u& }% y( s& t4 c. E! X. e( U        
) v: C: o+ E" O  R- V2 m9 K1 T
$ u) j1 ?: L0 q/ b% t+ v0 I5 C注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。
( J2 m& A* [9 w+ V3 s% D; j0 x在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)4 G/ f/ ]2 x; S& Z" D8 t! q2 U
0 j& C8 h& k  n( h' G. C

, W1 a9 y# K' M- Z) t2 q6 Q: F2 A% M; S9 x8 L& q: k' x5 G; Z
+ G! w# p9 k0 N# P5 P- P1 G) y
现在测试一下,门、柜子、和窗户都是可“互动”的了。
" `! D' D) Y& l0 v# j6 M/ W
( T5 @  ~) d" P0 ?. j- [6 E! k[光标]
' i  k# U) _- n3 Y, O- n/ _6 T; i0 h: H5 R
你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
+ _* L: I3 L5 |3 K& j0 [/ x& v6 g) t
返回SceneEdit并选择之前创建的区域实体door。
" N+ [# Y0 _7 Y 
8 a# z6 F: F5 @; p; ]0 y提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。4 T+ d6 S, [/ B4 z) X( k2 u

  c, c7 {2 R! l在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
; }2 n3 ^, l- e# R6 Y1 L8 Y. R # S. w$ `# J; \5 {- ?& b% Q3 ~/ ~- y
提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。; r/ a& ^' i* g) `' y  {, c
, Y* y0 g9 _1 E, m7 r! y

$ U7 [7 }/ Z9 `% j4 p* B% ^6 K保存并测试,效果应该如下图。% h3 \0 C; \6 }4 j0 j+ I2 I0 O
4 P$ @/ M+ G" A9 q) P4 ?: G. e! i6 F

- I+ N. F4 R* J, i5 j' j  K
) w# O3 W" z, A$ c* W7 _/ E; |% |+ g& u8 T( q
[脚本]9 C& L; H# U  k9 i4 {! ]2 [5 e( i+ R

" T! [' I6 y8 f* V1 ^现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。
9 Y; k; i& M+ T8 |; U9 t+ P
" [: B0 J$ \! R( |$ w/ ~( ^我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。1 V& `- A3 Q6 n

) T$ g6 W% U( P6 k& i& n0 Z2 h
! @3 ?0 Z$ v, W" J* m6 a) v
# ]9 V9 J" j* G. U0 f& v在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
7 y& ~+ U6 |0 q% B4 E$ {8 E' k9 S5 i1 G8 f  L% k" l/ a
" A' L- H- L# h: g

) C; M# u0 H/ _3 v9 u/ {9 n# o( b/ t5 T! ]) l" P  p; k
回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)% M' v! z% ?0 p, h' q; W) D
   
8 Z5 r# ]& w- c
  N  O/ w: I2 W& Y* Q/ I2 t  Z
  E1 J- }. y4 F" X之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。& b% Z& m+ y3 z' f8 R+ D5 G( i
现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):
6 E- ~- _! U. \+ p
: O( [7 U4 N0 J( e
" n  j2 Q9 g' x: i% y8 W4 f
#include "scripts\base.inc"
[/table]
////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
actor.GoToObject(this);
actor.Talk("Blah");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
actor.GoToObject(this);
actor.Talk("Blah");
}
.
.
.
你可以在脚本中看到"on "xxx"{...}"这样的格式,这样的格式代表这样的意思,比如当玩家在游戏中选择要看一张桌子(在桌子上点击鼠标右键,并选择看“Look at”的命令),这时候就会触发脚本中的on "LookAt",执行后面大括号里的{
actor.GoToObject(this);
actor.Talk("Blah");
}两句命令。
接下来看看"LookAt"所执行的内容:
actor.GoToObject(this);
actor.Talk("Blah");
这两句代码的效果是:
actor.GoToObject(this);调用GotoObject方法,望文生义,也就是让角色走过去,wme提供了很多方法帮助你编辑脚本,至于走到哪,由后面括号里的(this)决定了,this在代码中代表这段代码归属的物体,比如这段代码是桌子的,那this就代表桌子,角色也就会走到桌子边。
actor.Talk("Blah");调用Talk方法,让角色说话,说的内容有后面括号里的("Blah")决定了,效果就是在角色的头上出现一个字幕Blah- -
(新版本中默认还有on"Take"、on"Leftclick"两个方法,代表选择”拿“和左键单击后执行的命令)
这样引擎就知道点击桌子后该做些什么,但有个问题,actor.GoToObject(this)命令让角色走到桌子边,但具体坐标不知道,我们需要自己指定。选择一个实体,你可以在左下角信息栏看到walk to栏,在这里决定执行GoToObject命令后角色具体要去的坐标。
你可以自己填写,三个白框从左到右依次是x轴坐标、y轴坐标、角色方向。你也可以使用角色模型(使用方法见步骤六)来指定,将角色模型放在指定的位置并调整好方向,之后点击Walk to栏最右边的”<“按钮,就会自动填写,而下面”>“按钮则会把角色模型移动到上面指定的坐标。
如下图将角色模型放置好。
再点击”<“按钮就可以了(注意先选择desk实体)。
有时候也可以在代码里直接写上坐标,放置好角色模型后点击工具栏“Actor->Copy actor placement”或者按Ctrl+C就可以复制角色模型所在的坐标。 
这样你就可以在脚本中直接指定坐标:
actor.GoTo(544, 638);
actor.TurnTo(DI_UPRIGHT);
你也可以改变actor.Talk方法后面括号的内容来改变角色说的话,比如:
on "Take"
{
actor.GoToObject(this);
actor.Talk("The desk is a bit too heavy for a poor little me...");
[table=100%,#66ffcc]}

: d" a( P" v7 v' g! d4 r+ I% c8 P5 R, m" K# J% w
因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。
, Q; R6 r1 ~* P: O$ E9 R  J/ x
保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。
% I2 o9 w  n1 R# w+ {
9 D8 z3 e% w. x  D* v. g! ^: r
" L6 Z  l* T& i3 W5 E
( Z/ o  |, r" B; Y这一章结束了~
5 w' M* h+ b9 F& c' `4 D2 Q  }8 x& V2 z/ _
. Q, d* I' Y$ A3 o1 B2 U  Z2 i* f
帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。3 S/ d( F0 M3 c0 ~  t
关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。, a* t5 ]& g0 G$ g0 T
步骤8、9内容比较少,下午发完~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表