注意区域Region、实体Entities、区域实体Region entities是不一样的- -
; A; J$ I4 g) D( W2 f6 D e
/ {9 z" M) `0 ^+ M) `2 G, b[区域实体]
6 g8 m2 E4 G' u/ n7 d$ Y1 J; W z1 Z+ a: u& l/ X! O
: O: W. Q& c9 \/ P
如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。6 y0 Z8 k) f, {" U
* t: l, R+ `& S2 |3 d
4 l3 J5 Q+ E; {# c y8 T, t我们将添加门、柜子、窗户三个区域实体作为例子。
) E" g7 c d, O+ p9 u: T, V; A* }- S' c' M g* s) W
在SceneEdit中打开MyScene.scene。
+ E7 c: K% ~; D5 e9 e5 B$ W0 B
3 Q2 T4 P- n9 K, I7 z: h, }点击下图中的按钮添加区域实体。; e% `+ h$ z9 f" z N2 D! W( y; y4 n
; ~0 d3 @& Z. r& a8 W; s' e) J
![]()
2 R7 R& L8 B% X1 ]# U6 R# r* x# C" Q
0 \ @# G$ r z) A$ n" f" ]0 M T你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。) B, {3 i2 m6 C- m9 C' a
' V- ~: Z/ V6 J. I
; W1 [0 d& ~4 q& X5 v0 V/ S, G
这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。3 I; r; ?0 g3 Y1 @( k# a
! G+ U" O, c4 `2 ?3 V9 _. Y
& g; u, ?) h; T, W% e ![]() ![]() ![]()
/ I2 a! I! i% e6 w7 V ]2 Z8 R) G6 P$ R {4 H- l, o5 k- M
注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。( k& O1 O$ K" v: f2 D# s
在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)
% H9 a$ ?8 @$ z, Q3 F$ j8 d
2 I) m1 T% Y# V! W7 n5 J" f9 _! k" F3 s2 Q9 Q) C2 M {* G
![]()
' A( F5 K$ ^/ I2 Y: I L
% ]2 q9 C2 P! ^) i& {现在测试一下,门、柜子、和窗户都是可“互动”的了。- D2 d1 s# O j
) F* f2 w" S, c4 D8 R
[光标]9 b( S$ t/ k8 ^0 r. j
) M$ m" P) \' C9 a7 e你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
* d9 s. Y \* L* F4 H! J$ Y4 d4 b" ^1 R" e% l! |& r1 x1 D# I+ H4 }
返回SceneEdit并选择之前创建的区域实体door。
8 l/ m; T) p/ u7 t! X7 ]
) M/ O- i( ~3 @8 r7 @! z. J提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。6 {$ |) p/ U: |, v, T; \( u
# B, q% }) e# E$ `) I
在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。8 Z0 g$ F% T m% Z# n9 f
/ s$ O' v% ]7 c" M提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。2 |' }4 Y5 w+ }1 Q9 u! i9 \& q
- D: B3 O5 Q8 u5 C6 o, Y
. _5 `" m) m' o" S9 I5 |) _保存并测试,效果应该如下图。
. J6 e8 K+ Y2 M/ S/ @9 C1 G8 J
; L& S) G7 @$ f% i: @
/ z, [. _8 V# J$ }! K- |![]()
) c( m6 }2 P+ [7 S0 Z% {4 z1 k: b6 @6 x( R; B
[脚本]
& R& t) F* U* W F O% u" s2 r4 B0 `% u7 Q8 A" i, B8 b9 U* H6 G5 k
现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。; [: W7 Y& \* Q0 p, T6 J
+ q8 T7 d( z& T( K+ R
我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。
, X6 I- [6 G' o1 F+ p0 p
' W' t; i; Y9 t + `' k( }* _& s) T) J5 e& |
/ o$ G* S, z; f3 b- E* A8 c) ?在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
1 {2 n; k1 L, {. \
) g8 s& s% A2 F6 O 9 T5 `& X3 {* W
! X" _, v: T4 v7 a: d
' F( E9 e+ Q1 v3 V回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)
/ d) H6 z1 n& q5 |3 _/ c. i
6 N: o9 t: s: k' n( C0 L: V![]() ![]() 3 q4 M6 l2 L& Y9 }8 D
x) L+ |/ E6 ]. f$ Z3 x# @
之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。
( x2 `7 y7 |, P现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):# `7 }5 x1 N6 E4 _2 Y; d: M6 R/ }0 }
3 u4 j9 }, o' @
7 G8 a/ s; l5 @: z& K" O& j. k0 T#include "scripts\base.inc" |
[/table] | //////////////////////////////////////////////////////////////////////////////// |
actor.Talk("Blah"); |
//////////////////////////////////////////////////////////////////////////////// |
actor.Talk("Blah"); |
| 你可以在脚本中看到"on "xxx"{...}"这样的格式,这样的格式代表这样的意思,比如当玩家在游戏中选择要看一张桌子(在桌子上点击鼠标右键,并选择看“Look at”的命令),这时候就会触发脚本中的on "LookAt",执行后面大括号里的{actor.Talk("Blah"); | }两句命令。 | | 接下来看看"LookAt"所执行的内容: | | | | 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.TurnTo(DI_UPRIGHT); |
| | 你也可以改变actor.Talk方法后面括号的内容来改变角色说的话,比如: | | | | actor.Talk("The desk is a bit too heavy for a poor little me..."); | [table=100%,#66ffcc]} |
% \( `) ~" x8 h4 h; V! J f# v- D) P6 ?* d5 f* R! P
因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。
/ a8 V, R, {3 z7 [ P7 r9 l% J1 ^- `9 n# H6 u' i4 s
保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。5 l2 E* F5 K' l) r, i) U o
8 Y2 b" L" M" N2 i5 c, M# b
8 @# v) I' m$ v& S8 h) j6 D4 J
?' b7 N& {1 }7 E, N这一章结束了~
o" P- H- W9 F! E/ I. c
6 o7 z) g& b$ _% B# N
: X& ~; H) f% V6 B- M帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。5 m$ X2 I. N3 f; Z
关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。
9 d, M2 w# |( n, t" o, Y步骤8、9内容比较少,下午发完~ |