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

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

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

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

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

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

注意区域Region、实体Entities、区域实体Region entities是不一样的- -
- m' n8 }* B% O& I6 k
4 z5 a5 A4 q1 |* p, f! h" D[区域实体]& n; |9 l7 H% G( O6 v- N  ?/ o/ R

$ a$ j6 I) }0 k7 R7 `3 q4 L0 P. D; ?" f+ p' e! ~: M3 z) L, Z, Q8 y: g
如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。
- J9 `! l5 l+ o: \) Y- x- ~: ?
/ x* `3 }5 X$ k& W# {9 w' R" X9 H' N# k, q
我们将添加门、柜子、窗户三个区域实体作为例子。
1 }2 Q. I/ T8 n7 v& J+ O: V
/ ?0 T0 c, _7 a8 z8 }# Q在SceneEdit中打开MyScene.scene。' j7 T2 W) P" z5 z

2 X3 ^8 t  M6 r* ]! C( x$ o点击下图中的按钮添加区域实体。9 d. U0 H; t  d- p5 l7 A% q; R. B
, E8 e# Z9 {# h. q9 d# c

/ @& i, _- }0 ]  [0 s$ R 8 H4 v$ G" o4 b4 l% E% M6 d4 W5 r
你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。
( t5 F& |& w" s' ]* f4 c, V7 S# O9 G

- Y9 |8 T9 q7 ?! k* d2 E4 e1 B0 G5 J这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。
# t. l0 ?9 p- n9 }9 s( F4 @
6 @2 e. }, d6 D8 @( u
' w4 G7 z! v' W& R7 K, `, `        ! G7 d/ H' ?1 O2 E/ v1 Y9 o7 Y( h

" P% [) b( Z6 Y( N! S4 s注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。
/ J  D1 r2 F5 r9 p- ~+ C' E1 s在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)
7 B# S7 S7 `" m5 d( I' H2 M4 B' q5 [, [% X) A$ _4 {
% H/ x9 j0 S+ O3 J: s

2 r# T0 r3 l; x0 `/ i* ?; ]/ Q+ \- @
+ d4 q1 ~2 J& n. @' j; |8 T) C现在测试一下,门、柜子、和窗户都是可“互动”的了。
% k. A4 S& q0 c5 _) W
5 X! v+ |; a4 P! ?5 X& D0 w4 R[光标]7 l- _- `* m8 D+ W' r# _. S" S
# ]7 h9 }# Y6 M0 J
你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
4 ?8 i3 \$ k9 _. ~# R2 y7 J5 j1 V$ j5 l
返回SceneEdit并选择之前创建的区域实体door。2 M1 O4 Q" r" }
 
0 ?3 }5 F( Q, [( V) [提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。2 V& M) V" n; a* H" U- j1 C6 v

# _! N# P' u7 [$ f8 c在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
, ]- C) {# Z! _  X% h! H- J8 ]' J ' I' n2 _3 y, ^8 `0 }( G: x
提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。
/ F  t, V2 I! c9 i8 V: v( c' I$ @* \* U7 }4 h/ I: S
2 H8 c  y& E/ f
保存并测试,效果应该如下图。) U! ?3 w/ [& `/ G0 H
* W. @: O. }% H/ ]9 X* y6 n$ a

3 f. c6 ?2 E) u) q
% @$ d" T/ M. A. c
) c. Q- ?) B6 J7 |3 u& I9 _[脚本]
7 R* ]& o4 g. m( q, b  Q! e1 p& g! W) j% q8 o) o) p: d; \- `- a7 `
现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。
7 S0 U2 U- y: T: R; B- @, v2 Z
, k$ D. h$ @! t* J我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。
& I" \" C7 x* i2 [  \
: i3 o' O# T* h' N$ F
- G  t8 V3 P% V6 N% N : v8 X7 ?9 I( L0 V. B) i* y. W3 V
在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
# E. f2 b4 E/ i2 e& E
% G# I/ Q1 I5 A8 T6 i; O' J/ a" E% D' l/ Z
+ |4 ^# x5 M# f9 R

( `8 q6 b9 [$ a, u9 [+ s/ X; X回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)8 J3 S9 e+ r# Q1 r3 ~& u. Q. [
    $ @  ~5 }" P2 B  ]- E6 g' @5 j

& L0 c3 H' f8 a# G" v% A& j- i; m/ ^8 ?# I
之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。1 k0 D0 s, [" q. z
现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):' H# A' M) L( p8 `$ V4 i

- P" i6 F4 r/ x) X2 w* }
* o+ g- H9 s2 ~
#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]}
9 B& b6 V! ?, g: ~9 E& c& j
* D6 X4 Q6 _3 y7 [$ J
因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。
* A$ L: ~9 p0 j3 A( Y+ o8 l" r! C5 @8 u$ A; w
保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。/ t- g2 _/ O+ i. `+ I5 R
* a' d* x/ w. G% P

* c8 F/ A- W& x; i8 O$ K* k5 k& I$ Y
这一章结束了~' c8 P6 P: z0 F* {

: T4 f; k) ~- u  z: {# i2 Z) f
0 C+ ?& B8 d) {5 B  E0 t- E帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。! j7 I4 \( c# R* l& h: D; h4 m
关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。% k  L! J: Y1 Z( E8 O
步骤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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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