这里,我的精力主要放在了,如何给玩家提供视野,如何让游戏在视觉上与玩家直接交互。
首先,新建一个对象,不指定任何精灵。
这是它的Create事件
camera = camera_create();//新建相机,将其赋值给camera
//相机基本属性矩阵
var vm = matrix_build_lookat(x,y,-10,x,y,0,0,1,0);//新建一个矩阵vm,保存相机的视野信息
var pm = matrix_build_projection_ortho(640,480,1,10000);//新建一个矩阵pm,保存相机的投影信息
//为camera设定视野矩阵以及投影矩阵
camera_set_view_mat(camera,vm);
camera_set_proj_mat(camera,pm);
//将camara赋值给view_camera[0],即房间第0号相机
view_camera[0] = camera;
//将玩家的目标赋值给follow
follow = obj_player;
//初始化xTo,yTo
xTo = x;
yTo = y;
这里值得一提的有:
matrix_build_lookat(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup)
这个函数会返回一个矩阵的索引,这个矩阵记录了相机视野的一些信息:
x/y/zfrom:即相机的所在地的坐标点
x/y/zto:即相机所看向的位置的坐标点
x/y/zup:没有搞清楚怎么用,似乎是为了旋转相机角度而存在的参数,欢迎补充
matrix_build_projection_ortho(w,h,znear,zfar)
这个函数同样返回一个矩阵的索引,记录的是关于相机投影的一些信息:
w(width)和h(height)即为投影的宽度和高度
znear和zfar为投影最近和最远的横截面
这里还有一个类似的函数matrix_build_projection_perspective(w,h,znear,zfar)
和此函数的区别在于:
ortho指的是orthographic projection,即正交投影,正视投影
perspective即perspective projection,透视投影
下图比较了两种不同投影的实际效果:
投影对比
完成create事件后,再新建一个step事件:
x += (xTo - x)/25;//如果希望相机移动变快,可以减小分母
y += (yTo - y)/25;
if(follow != noone)
{
xTo = follow.x;
yTo = follow.y;
}
var vm = matrix_build_lookat(x,y,-10,x,y,0,0,1,0);
camera_set_view_mat(camera,vm);
这个就很好理解了,不停更新相机这个目标的x,y值,用xTo,yTo来读取玩家的目标的坐标,然后将其重新赋值给相机的x,y,再不断更新相机的视野。
网友评论