现在的位置: 首页 > 综合 > 正文

3DGS脚本教程翻译(11)-指针

2013年07月29日 ⁄ 综合 ⁄ 共 2024字 ⁄ 字号 评论关闭

Workshop 11: 指针

指针用来存储一个物体的引用。来设想一下下面的情形:你想用Acknex引擎创建一个pong的克隆:

你想让左边的挡板由玩家控制右边由电脑控制。问题是……在你的代码中如何说明谁是玩家谁是电脑?答案很简单:你创建一个指针,这只是物体的另一个名字。一个典型的指针定义是这样:

entity the_player;

或者

function check_status;

或者

string my_name;

或者

panel game_over;

或者

bmap health_picture;

OK,看起来我们可以给实体,函数,字符串,面板和位图定义指针。我们简单的在物体关键字前加“*”。

我知道你现在感觉有点头晕。来看个例子:启动Wed打开work11关卡文件:

这个关卡是先前的房子和巫师模型稍微修正版:

这次有2个巫师模型,来运行它:

OH我看到了!这两个巫师兄弟穿蓝色和红色!它们什么也不做但是并没有经过任何动画帧,就像第一个教程,因为巫师有一个动作附在上面。加上任何动作它会停止混乱的动画。

来写些控制台代码,按Tab输入如下代码:

wizard.x = 300;

红衣巫师离摄像机比较近了。

但为什么红衣巫师移动了?蓝色为什么不移动?它们为什么不同时移动?

我恐怕不能一下处理这么多的问题,但是我给你一句短语来回答这所有的问题:我给红衣巫师用了一个指针。你看,我们生活在一个残酷的世界,这些凶狠的电脑不关心我们人类。我们知道巫师模型什么样但电脑没兴趣。如果你告诉电脑移动红衣巫师它会嘲笑你,它不知道也不关心谁是巫师。你只能用一个指针来指挥需要特殊对待的实体。

来启动Sed,打开script11文件:

感谢上帝!脚本看起来不是很复杂!

我们设置屏幕和色深,定义一个字符串名叫work11_wmb(将要载入的关卡)并定义一个指针叫"wizard"。来看下代码:

entity* wizard;

Main函数简单的载入关卡work11_wmb。来看下动作wizard_with_pointer

action wizard_with_pointer
{

     wizard = me;

     my.ambient = 100;

}

第一行分配指针到一个实体。"wizard = me;"意思是我是巫师!我,已经附上动作的实体,从现在起将会知道"wizard"wizard_with_pointer动作已经附上红衣巫师模型因此红巫师变成"wizard"

第二行设置ambient100,使它看起来明亮些。想知道有什么不同吗?看下面:

第二行没有指针因此它所做的只是增加ambient值。

action wizard_simple
{

     my.ambient = 100;

}

这个是附在蓝模型上的动作。忘了告诉你“my”也是个指针!它先前已经定义了因此不需要在定义。别担心,我们会在最后谈到它。

OK,如何创建一个指针?有两步:

1)定义指针:

entity* horse;

2)我们告诉指针谁是它的所有者,在动作里放一行代码:

action players_horse
{

    horse = me;

    ............

}

现在开始你可以控制实体使用圆点方法:object.property

启动游戏输入下面的代码到控制台:

wizard.z = 100;

巫师确实改变了它的高度!你可以玩下xyzpantiltroll……如果你想隐藏巫师用:

wizard.invisible = on;

它就会消失!输入:

wizard.invisible = off;

你又能看到它了。

一个好消息是你可以通过脚本中的任何函数或动作改变红巫师的属性。复制下面的代码到你的script10文件末尾:

function move_up()
{

    wizard.z = wizard.z + 5;

}

on_u = move_up;

修改后的脚本文件看起来这样:

你可以看到move_up函数增大了高度(z5。如果它的初始高为15,函数会设为20。下面这行代码看起来怪怪的:

on_u = move_up;

on_u意思是“当玩家按下U键”并且move_up是个函数名,没有圆括号,每次我们按下U键都会执行(它不影响Caps Lock开或关)。作为结束,每次我们按下U键,move_up函数会增加红巫师高度5

保存脚本,启动关卡并按下U键几次来移动红巫师。很明显move_up()函数知道谁是“巫师”。

最后注意:Acknex用的最重要的指针是“my”。在看下动作函数:

action wizard_simple
{

     my.ambient = 100;

}

代码设置所附上实体的ambient100。把它看作通用的指针,每个实体都可以使用它但是它不知道动作或函数以外的东西。如果你输入:

my.invisible = on;

到控制台它不会工作,因为“my”不知道是什么。但下面的代码会使实体看不见因为动作附上实体了:

action hide_me
{
    my.invisible = on;
} 
 

抱歉!评论已关闭.