gamemaker函数中文帮助 联系客服

发布时间 : 星期三 文章gamemaker函数中文帮助更新完毕开始阅读8e04da21dc36a32d7375a417866fb84ae45cc3ea

mp_grid_clear_cell(id,h,v) 清除指定单元。单元 0 , 0 在最左上角。

mp_grid_clear_rectangle(id,left,top,right,bottom) 清除和指定矩形交叉的所有的单元(在相应的房间里)。

mp_grid_add_cell(id,h,v) 标记指定的单元为禁止通行。单元 0 , 0 在最左上角。 mp_grid_add_rectangle(id,left,top,right,bottom) 标记和指定矩形交叉的所有的单元为禁止通行。

mp_grid_add_instances(id,obj,prec) 标记所有与指定对象的实例交叉的单元为禁止通行。你可以通过参数 obj ,实例的 id 名来使用一个单独的实例。同样也可以使用关键字 all 表示所以对象的所有实例。参数 prec 为是否使用精确检测(只有当实例使用的精灵打开精确检测时才有效)。

mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) 计算一条通过网格的路径。参数 path 必须指定一条已经存在的路径用来被电脑路径替代。参数 xstart 和 ystart 为路径的开始点, xgoal 和 ygoal 为目标点。参数 allowdiag 为是否允许使用斜角移动替代水平和垂直移动。函数返回值为是否寻路成功。(注意路径不受当前实例影响;是一条穿越网格的路径,不是某特殊实例的路径)

mp_grid_draw(id) 这个函数将空的单元绘成绿色,禁止通行的单元绘成红色。这个函数运行起来很慢这是用来做 debug 工具。 碰撞检测

计划运动或是要决定具体行动时,察看实例是否与其它对象在确定的地点碰撞是一件十分重要的事。为此需要用到下面的程序。所有的这些函数有三个共有参数:参数 obj 是某对象,关键字 all ,或是某实例的 id 名。参数 prec 是是否启用精确检测或是仅仅使用实例的碰撞盒。精确检测只有当实例的精灵设定了精确碰撞检测时才有效。参数 notme 可以设为 true ( 1 ),使调用的实例不会被检测。所有的这些函数返回值为被碰撞实例的 id 名,如果没有碰撞就返回一个负值 。

collision_point(x,y,obj,prec,notme) 这个函数测试在( x , y )位置是否和实体对象 obj 有碰撞。

collision_rectangle(x1,y1,x2,y2,obj,prec,notme) 这个函数测试指定对角的矩形(已填充)是否和实体对象 obj 有碰撞。举例来说,你可以使用这个函数测试某个区域里是否没有障碍物。

collision_circle(xc,yc,radius,obj,prec,notme) 这个函数测试指定圆心( xc , yc )的圆(已填充)是否和实体对象 obj 有碰撞。举例来说,你可以使用这个函数测试某对象是否靠近某特点位置。

collision_ellipse(x1,y1,x2,y2,obj,prec,notme) 这个函数测试指定对角的椭圆(已填充)是否和实体对象 obj 有碰撞。

collision_line(x1,y1,x2,y2,obj,prec,notme) 这个函数测试线段( x1 , y1 )到 (x2,y2) 是否和实体对象 obj 有碰撞。这是个强大的函数。你可以这样使用这个函数,通过检测线段是否与他们之间的墙相交来测试某实例是否可以看到另一实例。 实例

游戏中,最基本的单位就是各种不同对象的实例。游戏进行时可以替换许多实例的外貌。同样你也可以通过创建新实例并摧毁实例达到替换的效果。除了先前讨论的运动相关变量和下面将要讨论的绘制相关变量,每个实例都有如下一些变量 :

object_index* 对象的索引。这个变量不可以改变。

id* 实例的统一标识符( >= 100000 )。(注意,定义房间时,鼠标指定的实例 id 名总会显示出来。)

mask_index 遮照精灵的索引,用来碰撞检测。值为 -1 时效果和 sprite_index 一样。 solid 实例是否为固体。可以在游戏进行中改变。

persistent 实例是否持久显示并且移动到另一房间时再现。某些时候经常需要把持久的效果关掉。(举例来说,要回到第一个房间的时候)

处理实例时有个问题。分辨单个的实例不是很容易。他们没有名字。只有某特点对象的某个实例时你可以使用对象名,否则需要实例的 id 名。实例有一个统一的标识符。你可以在 with 语句中当做对象标识符使用。幸运的是有大量的变量及程序帮助你定位实例 id 名。 instance_count* 房间中现存实例的数量。

instance_id[0..n-1]* 特定实例的 id 名。这里的 n 为实例的编号。

注意,实例对实例 id 名的分配每一步都改变,所以你不能使用上一步的值。我来举个例子。设想你游戏中的每个单位都有特别有力量,你想找到最强壮的那个,可以使用以下代码 : {

maxid = -1; maxpower = 0;

for (i=0; i

iii = instance_id[i];

if (iii.object_index == unit) {

if (iii.power > maxpower)

{maxid = iii; maxpower = iii.power;} } } }

做完循环, maxid 就是那个最强的单位了。(循环时不要销毁实例,因为他们会自动从数组中移除)

instance_find(obj,n) 返回值为参数 obj 的第 (n+1) 个实例 id 名。参数 obj 可以是某对象或是关键字 all 。如果不存在,返回特殊对象 noone 。注意,实例对实例 id 名的分配每一步都改变,所以你不能使用上一步的值。

instance_exists(obj) 返回值为 obj 的实例是否存在。参数 obj 可以是某对象,实例 id 名或是关键字 all 。

instance_number(obj) 返回 obj 实例的编号。参数 obj 可以是某对象或是关键字 all 。 instance_position(x,y,obj) 返回值为 obj 在( x , y )位置上实例的 id 名。同一位置有多个实例时,返回第一个实例。参数 obj 可以是某对象或是关键字 all 。如果不存在,返回特殊对象 noone 。

instance_nearest(x,y,obj) 返回值为最接近( x , y )位置的 obj 的实例 id 名。参

数 obj 可以是某对象或是关键字 all 。

instance_furthest(x,y,obj) 返回值为离( x , y )位置最远的 obj 的实例 id 名。参数 obj 可以是某对象或是关键字 all 。

instance_place(x,y,obj) 返回值为遇到当前( x , y )位置上实例的 obj 的实例 id 名。参数 obj 可以是某对象或是关键字 all 。如果不存在,返回特殊对象 noone 。 下面的函数用于创建销毁实例 。

instance_create(x,y,obj) 在( x , y )位置创建 obj 的实例。函数返回新实例的 id 名。

instance_copy(performevent) 创建当前实例的复制品。参数 performevent 为复制品的创建事件( creation event )是否必须执行。函数返回新复制品的 id 名。 instance_destroy() 销毁当前实例。

instance_change(obj,perf) 改变 obj 的实例。参数 perf 为是否执行销毁和创建事件( destroy and creation events )。

position_destroy(x,y) 销毁所有包含( x , y )位置精灵的实例。 position_change(x,y,obj,perf) 在( x , y )位置改变所有 obj 的实例。参数 perf 为是否执行销毁和创建事件( destroy and creation events )。 解散实例

当你创建大房间时,比如在平台游戏中,在一个小视野里,很多实例在视野的外面。这些实例仍然是激活状态并且会执行他们的事件。同样,计算碰撞检测时这些实例也会加入计算。这样会浪费大量的时间,通常也没有必要。(举例来说,视野外的实例移动一点都不重要。)为了解决这个问题, Game Maker 内含了一些函数来解散和激活实例。使用前你必须清楚地明白他们是怎样运作的 。

解散实例时,它们会被判断为从游戏中移除。他们不再可见也不会执行任何事件。所以对大部分动作库和函数来说,它们不再存在。这样节省了大量的时间,但使用时要非常小心。举例来说,当你删除了某特别类型的所有实例,已解散实例没有被删除(因为它们不存在)。所以不要认为一串角色捡到的钥匙可以用来打开一个已解散的门。

最容易犯的错误是解除了一个激活的实例。为了避免下面的一些程序,要求你强调被调用的实例不会解除它本身 这儿有些可用的程序 :

instance_deactivate_all(notme) 解除房间内的所有实例。如果参数 notme 为 true ( 1 )正在调用的实例不会解除(通常是你想要的效果)。

instance_deactivate_object(obj) 解除房间内的所有 obj 的实例。你也可以参数 obj 改为 all 来使所有的实例解除或者指定实例 id 名解除一单个的实例。

instance_deactivate_region(left,top,width,height,inside,notme) 解除指定区域内的所有实例(那些碰撞盒部分在区域内的也算)。如果参数 inside 为 false ( 0 ),完全露在区域外的实例会被解除。如果参数 notme 为 true ( 1 )正在调用的实例不会解除(通常是你想要的效果)。

instance_activate_all() 激活房间内的所有实例。

instance_activate_object(obj) 激活房间内的所有 obj 的实例。你也可以参数 obj 改为 all 来使所有的实例激活或者指定实例 id 名激活一单个的实例。

instance_activate_region(left,top,width,height,inside)激活指定区域内的所有实例。如果参数 inside 为 false ( 0 ),完全露在区域外的实例会被激活。

举例来说,视野外的实例都解除,视野内的实例全激活,你可以将下面的代码放到移动角色的并行事件中( step event ) r:

{

instance_activate_all();

instance_deactivate_region(view_xview[0],view_yview[0],

view_wview[0],view_hview[0],false,true); }

特别注意, 你可能需要让区域比视野稍微大一些 。 定时

一个好的游戏要求精确的时间控制。幸运的是 Game Maker 有许多时间方面的函数。使事物恒速( rate )发生。这个速度( rate )在定义房间的时候设置。你可以用全局变量 room_speed 来改变它。举例来说,通过每一步对 room_speed 增加一个很小的量(比如 0.001 ),你可以缓慢增加游戏的速度,使它难度更高。如果你的电脑很慢,游戏速度可能不能达到。可以使用变量 fps 来不断监测实际每秒的帧数。最后,一些高级定时使用时可以用变量 current_time ,电脑开始时的毫秒数。这儿是所有可用的变量(只有第一个可以改变) :

room_speed 当前房间的游戏速度(单位为步每秒) 。 fps* 实际每秒的帧数。

current_time* 系统开始时经过的毫秒数。 current_year* 当前年。 current_month* 当前月。 current_day* 当前日。

current_weekday* 当前星期几( 1 为星期日, ?,7 为星期六)。 current_hour* 当前小时。 current_minute* 当前分钟。 current_second* 当前秒。

有时候你需要将游戏停止一小会儿。使用 sleep 函数 。 sleep(numb) 睡眠( numb )毫秒 。

如你所知,每个实例有 12 个不同的定时器可以设置。使用下面的变量改变(或获取)不同定时器的值 :