【游戏开发】- 摄像机
摄像机
在现实生活中摄像机是一种记录生活的方式方法,它可以记录生活的方方面面,那么我们的摄像机在游戏中的应用其实和电影的作用是一样的,都是记录主角的一种方式,我认为游戏开发在于理解他的精髓,我们怎么实现这些底层的东西,那么你应对游戏开发的过程就会更加轻松!
实现:
首先我们要清楚2D游戏和3D游戏的摄像机的区别,2D游戏中摄像机的大小通常就是你窗口的大小,3D游戏则是看你的射线,也就是你显卡的渲染能力强不强,好的显卡通常能渲染更为复杂的场景,相对于简单的2D游戏来说基本对电脑的性能没有太大要求,但是在2D游戏中需要许多逻辑方面的问题,举个例子:现在我给你一个框架他能实现最基本的渲染图片,绘画直线,绘图的技术例如EasyX,你能通过EasyX来实现一个完整的游戏吗?你会怎么实现这个摄像机,那么很简单首先你得先定义一个类叫Camera
namespace SimpleGame.View;public class Camera
{}
OK!你已经打败60%的人了,为什么:因为我认为大家,包括我自己以前的时候做不出好的代码就是不敢写,因为觉得别人已经实现的技术才是好技术,而自己写的技术则不是好技术,这种想心态我持续了得有半学期,直到我第一次自己写一个完全属于我自己的代码的时候,我才真正觉醒,明白一个好的游戏开发者需要有胆量,信心,以及创造力,活力
那么我们下一步:那就是单例模式,什么是单例模式:
单例设计模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
当然具体的我以后回具体来讲,但是现在我们的首要任务是搞定摄像机这个东西
实现方法我在下面直接给到大家
namespace SimpleGame.View;public class Camera
{// 静态只读实例,在类加载时初始化private static readonly Camera instance = new Camera();// 私有构造函数private Camera(){CameraPosition = new Vector2(0, 0);}// 静态构造函数(可选,用于确保线程安全)static Camera() { }// 公共静态实例访问器public static Camera Instance{ get { return instance; }}
}
OK,你现在已经击败99%的人了,因为只差一行代码我们今天的开发就到此结束了,现在有两个问题:为什么需要使用单例模式?,为什么要确保线程安全?
第一个问题:
你需要几个摄像机?显而易见你需要的只是一个摄像机,除非其他情况的出现,比方说:FPS第一人称射击游戏,他需要一个摄像机专门来渲染枪支,为什么?我们知道大多是枪战游戏为了节约性能通常是不会为像拿在手上的枪械添加碰撞体的,那么就会出现这一种情况:人们操控着我们的主角撞上墙壁的时候,枪支就会穿墙而过,也就是我们俗称的穿模,这一点在第三人称的时候尤为明显,无论你有没有添加专门渲染枪支的摄像机,在你的队友看来你就是拿着你的枪捅进了墙壁里,但是你添加了专门渲染枪支的机器,这时候如果你关掉渲染场景的摄像机的时候,你会发现场景是空的,但是你手上的枪会一直渲染,那么这个时候就不会出现第一人称窗墙的事情了,但是在大多数情况下我们只需要一个摄像机,好了我回到第二个问题?
第二个问题:
线程安全是所有单例模式都需要保证的,因为如果有两个线程同时运行,并且同时调用了Camera这个函数,那么如果Camera这个函数是修改坐标的值那么他要听谁的呢,因为两个同时调用了嘛!所以这就是为什么要保证线程安全。
namespace SimpleGame.View;public class Camera
{// 静态只读实例,在类加载时初始化private static readonly Camera instance = new Camera();// 私有构造函数private Camera(){CameraPosition = new Vector2(0, 0);}// 静态构造函数(可选,用于确保线程安全)static Camera() { }// 公共静态实例访问器public static Camera Instance{ get { return instance; }}public Vector2 CameraPosition;
}
这个就是摄像机的所有代码了,接下来我们要渲染的位置减去摄像机的位置我们就可以在创就中渲染出自己想要的东西了。