Jump to content
模组网
icedream

【Creation Kit 学习指南 29】属性与函数

Recommended Posts

概述

请确保在学习本章前已完成Hello World教程变量和条件语句教程的学习。本章相比前两章较长,但是你将学到更多知识。现在开始吧!

你将学到:

  • 对前两章内容的复习
    • 脚本的第一行,也就是“继承”一个脚本
    • 如何在脚本中使用{}添加提示工具
  • 如何使用道具并将它在编辑器中编辑
  • 如何创造并使用一个函数
脚本的第一行

在本章开始之前,让我们复习一下前两章的内容。

打开前两章学习使用的脚本,如果你认真观察,你会发现脚本正式开始的第一行有这样的段落:

Scriptname HelloWorldScript extends ObjectReference
  • Scriptname HelloWorldScript extends ObjectReference:任何脚本开头都会有这句话。
  • Scriptname HelloWorldScript extends ObjectReference: 在此你可以对你的脚本命名,Scriptname是脚本的名称,在任何情况下紧接名称都要写"HelloWorldScript"(注意之间有空格)。
  • Scriptname HelloWorldScript extends ObjectReference:extends是关键字,它表示继承,也就是这个脚本是以extends右边的项目为基础编写的。
  • Scriptname HelloWorldScript extends ObjectReference: ObjectReference是该脚本所要继承的类,也就是该脚本的基础和前提。
脚本类的继承

实际中任何你编写的脚本都要“继承”其它的脚本,当你继承一个脚本时,你会说:“我的脚本是在这个父脚本后面添加的内容,只不过独立成为一个脚本。”

被继承的父脚本也可以这样说:“你的脚本是按照我的样式写的。”

例如,你想要在一个已存在的脚本后面添加新的脚本内容(以石柱脚本为例),即在脚本"ObjectReference"后面添加你的新脚本内容。如果你想在脚本”Quest"后面添加一个你编写的名为“YourScript”的脚本,你可以写“YourScript HelloWorldScript extends Quest"。其它亦如此。

如果你能得心应手地面对脚本编写,那么你一定对脚本类的继承并不陌生。现在,你要知道哪个脚本是你要继承的那个。

添加工具栏

现在你肯定在考虑第二行应该怎样写?如下所示:

{This is my very first script!}
当你制作新的脚本并开始Documentation String的编写时,请看

gallery_1_72_3284.jpg

当你的脚本停留在scripts标签时这个工具框将出现:

gallery_1_72_14683.jpg

当你想改变工具框时,请改变双大括号{}之间的内容.

你也可以借助添加工具栏来管理你的道具。如下:

属性

一个属性就像一个变量,但你可以在编辑器中把它与东西关联。

让我们现在开始吧!

在 "int count"一行上方添加脚本:

Message property box1 auto
{Points to the message box that is shown on the first activation.}
 
Message property box2 auto
{Points to the message box that is shown on the second activation.}
 
Message property box3 auto
{Points to the message box that is shown on the third activation.}
  • Message property box1 auto:Message的作用是决定box1的类型,是message(这和我们"count"变量定义"int"类型是一样的)
  • Message property box1 auto:这个message的类型不是变量,而是属性(property)。
  • Message property box1 auto:我们给这个属性命名"box1"(如同我们给变量命名"count")。
  • Message property box1 auto:auto是一个关键字,我们对属性的定义(不要担心这包含什么高深的意思 ,现在只要记住"auto"是用来定义属性)。
你要注意到大双括号{}。它将提供工具框,让我们看一下:

点击file->save. 关闭script窗口. 然后点击石柱的reference窗口上的properties按钮。你将看到属性列表停留在它们的名称上。

gallery_1_72_132017.jpg

创建消息框

现在我们将创建链接目标的消息框。

目标窗口是类"Miscellaneous"的延伸,点击类"Messages".在messages列表上右击,从弹出目录选择"New"。

gallery_1_72_78637.jpg

输入以下内容:

  • ID: myMessageBox1
  • Message Text: Hello World! This is the first time the player activated the Pillar.
gallery_1_72_801.jpg

按下图所示创建至少2个消息框:

  • ID: myMessageBox2
  • Message Text: This is the second time the player activated the Pillar.
  • ID: myMessageBox3
  • Message Text: It's been three or more times activating the Pillar.
属性与消息框的链接

重新打开石柱的属性窗口。

点击"box1"所在的一行然后点击"edit value"按钮。点击"Pick Object"的下拉菜单选择myMessageBox1。然后重复相同的步骤对属性box2,box3分别选择myMessageBox2,myMessageBox3。

gallery_1_72_3723.jpg

gallery_1_72_10891.jpg

gallery_1_72_21954.jpg

然后务必点击"OK"关闭窗口(如果未点击"OK",任何更改将作废),然后保存你的插件。

我们必须在属性box1, box2, box3和消息框myMessageBox1, myMessageBox2, myMessageBox3之间建立链接。

在确信每个消息框和属性建立链接后,我们继续编辑脚本。

在属性中调用函数

现在让我们在游戏中打开这些消息框。

打开并编辑你的脚本,然后将以下这些段落:

if count == 1
	Debug.MessageBox("Hello, World!")
elseif count == 2
	Debug.MessageBox("Hello, World. Again!")
else
	Debug.MessageBox("Hello, World. Enough already!")
endif
替换为:

if count == 1
	box1.Show()
elseif count == 2
	box2.Show()
else
	box3.Show()
endif
我们现在分别在属性box1, box2, box3的消息框中调用函数"Show()",半角句号(.)的右边是被调用的函数("Show()"),左边是需要调用函数的属性(例如:属性"box1")。

保存脚本,通过点击OK来关闭关闭编辑参考窗口,然后保存你的插件。然后运行游戏!(COC MolagBalVoiceCell)

你将在每次点击石柱时看到对应的消息框。

(如果出现"cannot call show() on a none object"的警告,请返回确认你的属性与消息框是否已关联,然后再在每个打开的窗口点击OK关闭并保存。

一切顺利完成,接下来我们将学习建立函数!

建立函数

如同我们在程序调试的过程中调用"MessageBox()"函数、以及在属性的对话框里建立"Show()"一样,我们也可以在脚本里建立一个自创的函数,但是我们在调用新函数之前,我们必须创造它。

在脚本底部添加如下内容:

Message function GetMessage(int currentCount)
	Message chosenMessage
 
	if currentCount == 1
		chosenMessage = box1
	elseif currentCount == 2
		chosenMessage = box2
	else
		chosenMessage = box3
	endif
 
	Return chosenMessage
 
endFunction
让我们剖析第一行:
  • Message function GetMessage(int currentCount):Message说明这个函数将返回一个消息框。注意这是一个非强制返回函数,不一定要有返回值。
  • Message function GetMessage(int currentCount):我们说这是这是一个函数,如同我们定义属性时用"property"一样。
  • Message function GetMessage(int currentCount):GetMessage是函数的名字,然后我们在需要调用时直接调用名字即可。
  • Message function GetMessage(int currentCount):小括号()里的内容是当我们调用函数时函数的参数,int表明我们要求参数的类型是整型,"currentCount"是参数的名字,我们在需要时只需调用参数的名字,然后函数返回一个数值供我们调用。
然后剖析下一行:
  • Message chosenMessage:我们声明变量的类型是Message。(就如同我们定义"count"的类型是"int"或其它目标类型一样。在这种情况下,我们定义其类型为"Message")
  • Message chosenMessage:我们对变量命名"chosenMessage"。
接下来我们将分别对属性box1, box2, box3建立选择消息框 。(再次注意"=="和"="之间的区别)

最后我们添加:

Return chosenMessage
这些说明当我们调用函数GetMessage()时,它将给我们属性chosenMessage中的消息框。

现在我们将在新脚本中应用函数。

将以下段落:

if count == 1
	box1.Show()
elseif count == 2
	box2.Show()
else
	box3.Show()
endif
替换为:

GetMessage(count).Show()
我们现在调用GetMessage()并对count赋予参数。因为GetMessage(count)将返回一个消息框,我们可以在这里调用Show(),然后消息框将在游戏中出现。

现在你的脚本将如下所示:

Scriptname HelloWorldScript extends ObjectReference
{This is my very first script!}
 
Message property box1 auto
{Points to the message box that is shown on the first activation.}
 
Message property box2 auto
{Points to the message box that is shown on the second activation.}
 
Message property box3 auto
{Points to the message box that is shown on the third activation.}
 
int count ;stores the number of times this object has been activated
 
Event OnActivate(ObjectReference akActionRef)
	count = count + 1
	 
	GetMessage(count).Show()
endEvent
 
Message function GetMessage(int currentCount)
	Message chosenMessage
	 
	if currentCount == 1
		chosenMessage = box1
	elseif currentCount == 2
		chosenMessage = box2
	else
		chosenMessage = box3
	endif
	 
	Return chosenMessage
 
endFunction
当你运行游戏,激活石柱,我们将看到消息框内容。(COC MolagBalVoiceCell)

下章预告

基础教程以学习完毕。下章将学习如何制作BOSS。

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...