冒险解谜游戏中文网 ChinaAVG

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

作者: clockworkman    时间: 2010-9-18 12:29
标题: wintermute学习笔记[8]--搭建场景步骤七:区域实体、光标、脚本
注意区域Region、实体Entities、区域实体Region entities是不一样的- -' o) X# J4 V+ A5 Q2 r& T

6 x6 `0 B) W) L6 B; o[区域实体]1 l3 Z) s' C. D  h! ]: {/ m
  ^$ j( }8 M4 k: e% p' F* Y! r+ |
; F. u8 h7 U; q& A
如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。' Q/ Y$ m$ r1 B! b3 J( ~9 j2 ^$ G, W
. f7 j. S2 L) S

# s( w. o' l/ E$ ?9 D/ Q6 K我们将添加门、柜子、窗户三个区域实体作为例子。
* T8 n) W- m2 @) Z2 W9 r5 ^$ l  P, P9 d1 S
在SceneEdit中打开MyScene.scene。! z6 G( [/ S( I3 K8 d; D) w

) _6 H5 A$ ^7 Z+ T9 B! `点击下图中的按钮添加区域实体。
8 x1 \! j" }, j& r/ u" n
* v. N; N" x5 j5 N. m2 a  x1 H: L9 F' x) i+ x, C
- s2 B3 q- R( |1 n0 t
你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。+ k8 g. Y3 K" {, y* B( X
+ d/ O( r6 m7 u8 v6 a4 D

* K# ^, B7 L% O. _7 s3 ?4 g0 o这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。0 B+ G0 k& z' a( D6 R

7 r. s( k# q# |* z) l7 u* c* V
* K. C! |+ t9 |9 O. C! I& Q" s2 ?        + N% }, b7 |1 ?6 @5 W, K0 }
- O+ f- N; m: J6 f
注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。
+ @) K# \8 Q4 R/ r在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)8 C' H; Z1 X) \/ O/ `

& v$ j. c1 X) D3 G9 q, g2 f, U
9 a% L* b- {+ x: n- Q2 S
% @) B6 {. G+ C2 q1 d& n" l/ l 7 o8 N; L/ K8 i4 _. Z' y
现在测试一下,门、柜子、和窗户都是可“互动”的了。
  T( U, H+ i$ v! s1 f7 p: S
, [( q) a) _& Q3 w/ ~( ^3 D1 R; D[光标]
+ \+ m$ Y6 z: X; o: C( a9 J
4 M" y  }3 z% P# p& B- g你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
; w9 ^/ p0 N; K$ x8 g
% z& f; w6 ]7 Y返回SceneEdit并选择之前创建的区域实体door。/ Y9 a9 p( K2 C0 i' c) ^5 E
 , d1 H. M. q/ Y, H
提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。$ O, J9 I: ]/ X: L

% l0 a: \3 S' ^在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
8 L3 x) ]9 X1 Q9 [* Q. A* J 
, u5 P3 [" T% Y; Z* ?7 F; |7 J提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。
  |. A9 b5 U+ \) w% P. V1 S" V' P0 [" L
* @# z7 i1 d. h6 S* M
保存并测试,效果应该如下图。) k4 q0 M( k5 C$ x. O- }0 q; [7 V. q
6 {$ v# C8 B8 Z" u/ _. C
& n, _; p, d" P  b* I3 l

! f) }6 l. B! j) B9 U
7 Z5 G. `* c6 L# S2 Y) R- M9 c) g[脚本]) G: P* Q6 P6 O- o/ Q
5 q! J' d0 S- R
现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。
. l! a% D9 ~3 U" F: M- c' `4 s; i3 P8 d
我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。
- m$ Z+ o  _0 }/ N9 \1 {/ y- x
6 a1 L) g( P  G- M- }6 V% M$ H  B7 g& X) t
( ?" {" h: w# D: e$ h  p
在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。9 V  r/ h$ q9 {6 ]1 E2 E& T/ A# h8 {
  D- k2 p0 k% }8 {2 W' W3 o
4 x; w: s* Z* K7 A& U: b; q. A2 D
- b- V; }; I7 N& M7 P+ D
( y3 ^2 \4 p4 L9 K
回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)
6 Q5 P4 ^3 B! y* w( x   
0 g" i7 V' ?& `. d( s! t# c% y) D5 x+ R5 p( E0 G0 o

7 g1 d0 J: m" }6 I4 R, L之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。, H. z* c( r9 Z
现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):
# ^" ~9 q* Y# S" q0 ?" e1 Y9 a4 M7 R- `9 Q$ k4 Y7 k, W

9 c1 O" j0 w2 D2 B4 o
#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]}
2 O. P+ q3 I! r) r
7 ~8 P9 x1 r3 G* v% X1 [% j
因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。, c$ d. n9 o: a6 V

3 t0 P2 i$ b) }9 p" S+ v保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。
7 k$ N6 U2 y, p- _
, `' a4 h! F. v% X1 o/ Q  h' ?: L) \5 R  A. o
! R: R$ E: d1 K4 }9 M
这一章结束了~6 B$ S2 \8 U# G- z' P
4 e& k" Z  c$ l" U* e

- f7 k4 ?. O- L# S: n7 `# v7 G帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。
$ p# ^5 V# K$ H% s关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。
! X" m: W4 Q! p/ K! I步骤8、9内容比较少,下午发完~




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2