我们即将开始我们的第一个玩家的绘制,并且稍后会介绍更高级的东西,就目前而言,我们将尽可能简单的介绍。我们再行走的时候会移动玩家,我们将创建一个处理我们的地图类和控制周围环境的相机类,相机将跟随我们的玩家。
首先,让我们开始为我们的第一个玩家奠定一些基础。我们暂时不会使用这个简单的教程进入多人游戏,但会包含在将来的教程中,所以我们仍然以客户端的思维模式构建。
创建一个场景,在最上面的文档中我们已经介绍过如何创建一个场景,场景完成后,我们需要双击改场景进行打开该场景。
之后我们创建一个图片对象,准备一张作为主角的图片,点击图片对象,在右边出现的属性面板当中的图片路径里选中该图片,在编辑器当中我们就能看到我们的第一个主角已经在游戏当中存在了。
运行游戏,我们现在需要通过鼠标/键盘来控制玩家,先从简单的键盘控制开始,我们在文档当中可以找到关于键盘的一些API
我们右键资源管理器中的Scripts文件夹,如果您更偏向使用Lua则创建一个Lua脚本,如果您对C#有一定研究,则创建一个c#脚本。我们命名为Player.cs / Player.lua打开我们刚创建的脚本,他是继承于ObjectComponent,这意味着我们可以使用ObjectComponent中的所有公开属性和方法
我们在脚本当中找到默认提供的Update方法,这里只进行一些游戏逻辑更新,并且每一帧都会运行到其中的方法,我们的键盘或者鼠标控制则需要在该方法中每一帧进行检测来达到连续移动。
我们先简单的使用键盘A进行让人物向左移动
- public float Speed = 100;
- public override void Update(Microsoft.Xna.Framework.GameTime gameTime)
- {
- base.Update(gameTime);
- // TODO:更新组件逻辑
- if (Keyboard.GetState().IsKeyDown(Keys.A))
- {
- Transform.Position = new Vector2(Transform.Position.X - Time.deltaTime * Speed, Transform.Position.Y);
- }
- }
需要引入命名空间 using Microsoft.Xna.Framework.Input;
您还可以将public float Speed = 100; 改为 public float Speed { get; set; }自动属性。则在编辑器的属性视图中可以看到改属性并动态进行修改,但是无法在脚本中进行初始值设置,只允许在编辑器内编辑初始值。(请确保该组件已添加至对象上,如果未添加请往下继续阅读如何添加)
- local Speed = 100
- function Script:Update() -- 0:gameTime
- local gameObject = Script.InitializeArgs[0
- local transform = gameObject.Transform
- if (Keyboard.GetState():IsKeyDown(Keys.A)) then
- transform.Position = Vector2(transform.Position.X - Time.deltaTime * Speed, transform.Position.Y)
- end
- end
Time.deltaTime 代表每一帧所花费的时间,这个值能允许您的游戏以固定的速度进行游戏。
有关于Script.InitializeArgs见
脚本说明
有关于Time.deltaTime 见
时间类
接下来您可以自行为玩家添加其他方向的移动。请阅读下面添加组件后再运行游戏。
添加组件如果您使用的是C#脚本,请在编辑器中点击编译按钮进行编译,然后右键图片对象添加您的脚本。如果您是Lua脚本,添加后的Lua组件需要点击一下,然后再右边的属性视图中选择脚本文件绑定您创建的Lua脚本,然后运行游戏查看效果。
注意!如果您是C#脚本,每次修改脚本后需要点击完整编译,如果是Lua脚本则只需要简单编译即可
鼠标控制鼠标控制人物行走主要难点涉及到方向问题,CL游戏引擎中提供了Transform.LookAt方法,可以返回点与点之间的弧度。注意的一点是在LookAt第二个参数要改为false,不需要引擎自动为你进行旋转,你需要自行判断弧度来辨别,如果您对弧度并不是了解,则使用MathHelper.ToDegrees转换为角度
移动物体您可以直接通过改变transform.Position属性 或者通过 transform.Translate方法进行改变位置