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

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

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

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

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

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

注意区域Region、实体Entities、区域实体Region entities是不一样的- -; A: p8 _/ W5 r1 k# u- e! ^1 `
, b6 X, n1 K. |& Y
[区域实体]
+ y7 z6 s% p2 j+ `  i( Y) L5 R" u$ O. Z; F0 m5 [
% O" M, o" J# x4 H( b9 l
如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。
- t9 P. \3 c& W2 V, X. w2 w7 l. f: e* B. m$ t) e. B
  w. D: N" E; n' `" b/ L
我们将添加门、柜子、窗户三个区域实体作为例子。5 Y0 V3 U# ]* S( E' P
* F* r9 r* W. ~) r  T
在SceneEdit中打开MyScene.scene。2 ^2 p9 }5 |" r- P

: a" C6 l0 u# w' b* D5 L3 D点击下图中的按钮添加区域实体。
3 j* F2 z* i$ R9 e; p  F+ z
) v4 L6 O8 \4 R- L1 S5 d. m# G' X
) B( O& b2 ~3 S$ | 9 A9 C; b7 h- [
你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。
( r7 S- W( @# a+ ?3 e* i! Z' M; T+ M6 C. T7 t4 [! d7 O

3 ]1 v/ p4 t" ?( ~: u这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。
& u9 y' s' @6 @5 x2 x
" i9 x( P; N% O) M, N* K+ h
- f5 G' B4 ^; I) B( d        
7 Q' P4 E7 x8 E5 ~2 Y
) g8 h8 `5 Z: L  D注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。: J/ N4 F/ n: J0 f% J  I/ r
在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)+ F) q, e3 F5 K" b7 ]/ f$ [( |8 l

; B7 z. v, F7 q" U  O& ]( C( Y1 P8 p# n: T
! B6 U( _- T1 g- ?$ l1 [+ n5 w5 S& ~+ g; \4 |
9 F$ w4 z" |5 N$ H, \  z. r
现在测试一下,门、柜子、和窗户都是可“互动”的了。
/ Q& i, m* @. F
! C- M8 i# E# f3 w9 Y& E[光标]' V* D0 \) o- R* r8 f+ X

# R. ^3 H! I/ _$ {" M# K- d你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
/ l0 t7 r% ?1 j' L' @4 H: Y8 }1 Z, Z( q6 \; G- z% A
返回SceneEdit并选择之前创建的区域实体door。
6 v3 s& C0 m! c& _ 4 v& i* s- [, o
提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。
, x# K8 {, v6 E" J# x' Y, N. e, k3 l$ j, ~0 J
在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
( ~7 w, U* I8 T+ A! [1 a 
6 ?; Q4 |, X: V" J$ }. D3 U提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。
) |% @/ n" C0 @. j- [8 y6 X1 n: }3 o7 `& u( x/ R( F9 a0 R3 n- c
- H: b: |4 W1 D$ i8 _0 [
保存并测试,效果应该如下图。1 {6 X! n, K1 \: \' [1 P& j

. @" W6 d" [) B" q) o
; N, q% B' t+ L+ {& b
! {. a" n( p/ j2 P7 \# w0 ~( ~5 g3 [; l0 i; d
[脚本]
" e" |2 p% h6 e* T8 L9 I7 S# d% S9 r0 R  A& u& @" E, |. U0 b
现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。. B; l# u) `4 m! P1 l

$ ?6 z5 w, y6 _2 A1 C2 ^& l1 L我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。5 D4 U7 ?3 g/ b: b- j1 d" Y
/ p$ w  v" T2 U( }( l4 }1 p
$ s! i( |0 W# q  ]1 W
3 H* o; _" z6 a' z! j; y
在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
- x3 c- J4 [+ X* ^: k, u" a: B, d" c4 _6 P' B& v

4 }  w5 y$ o% N5 J1 ^
. h2 |3 }* ~( E1 }: F9 ^7 j" ~5 N3 }, n8 ?# E
回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)- N) z2 M; c8 Z% w0 B( L: e/ y7 c
   
8 o( p" K2 A! B$ M
% y: w! ^+ i+ K0 e: @7 l5 b' d, s4 r9 ?( z+ A2 M6 m1 W- [7 f) `/ U
之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。0 i* @: a/ W  m* s
现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):4 |0 _/ z: G/ n* F. r
  X% q0 }9 T7 U) L0 N* B
  X# T' A4 P" X8 K' `0 Z" D
#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]}
8 `4 n* L3 z0 ]5 z! Y8 Y

# h* F$ a' w' F5 V6 q0 A5 g0 N* ~6 s因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。4 x+ d( n) Z: b. d+ j! z; l- Q9 C
, r- p& L0 p, b; \8 R6 p( _
保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。6 K# {. _8 l5 D8 r6 L+ o

6 F( D4 y+ |  v: J2 `/ q4 j5 U, G: E/ m  @1 B
! |) @1 J% b( V  V6 f- O3 j' F
这一章结束了~
% e: Q* T- W" p7 D
, x# {+ Y& h  F  s) g
6 k6 V' I+ }! i# K, ~3 B& i. v帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。/ `, w) C% g' N  D2 Q0 n
关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。0 x3 T, I& Q" U
步骤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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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