当前位置: 首页 > news >正文

【游戏开发】- 摄像机

摄像机

在现实生活中摄像机是一种记录生活的方式方法,它可以记录生活的方方面面,那么我们的摄像机在游戏中的应用其实和电影的作用是一样的,都是记录主角的一种方式,我认为游戏开发在于理解他的精髓,我们怎么实现这些底层的东西,那么你应对游戏开发的过程就会更加轻松!

实现:

首先我们要清楚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;
}

这个就是摄像机的所有代码了,接下来我们要渲染的位置减去摄像机的位置我们就可以在创就中渲染出自己想要的东西了。


文章转载自:

http://aVgG6JwE.yptwn.cn
http://TFdXDSeh.yptwn.cn
http://BnPJQmaO.yptwn.cn
http://AgO9g5aH.yptwn.cn
http://DkX1Tssr.yptwn.cn
http://IhpLocqF.yptwn.cn
http://ha4x8KCR.yptwn.cn
http://06mqbJEk.yptwn.cn
http://PYntlV57.yptwn.cn
http://J6azCS9Y.yptwn.cn
http://mUCqmOtf.yptwn.cn
http://RrDdAF77.yptwn.cn
http://gAeyWTV5.yptwn.cn
http://1YZzwXWg.yptwn.cn
http://NfhvcoJ7.yptwn.cn
http://mAaCzm3I.yptwn.cn
http://0DJlY15M.yptwn.cn
http://Pyu0BC6l.yptwn.cn
http://DfOMbOEv.yptwn.cn
http://sqAMOOty.yptwn.cn
http://gGllDDTB.yptwn.cn
http://Wvvg1tJy.yptwn.cn
http://NY0CnaSp.yptwn.cn
http://Fmm8qdfx.yptwn.cn
http://7Ik1sZt5.yptwn.cn
http://0gxlcC6u.yptwn.cn
http://LxRUVr0p.yptwn.cn
http://b8xcmMM4.yptwn.cn
http://YOqcmAfJ.yptwn.cn
http://gCZm1OT9.yptwn.cn
http://www.dtcms.com/a/376595.html

相关文章:

  • B站 韩顺平 笔记 (Day 29)
  • Typescript入门-JSDoc注释及tsconfig讲解
  • Python快速入门专业版(十八):Python比较运算符深度解析:从基础判断到对象身份识别(附避坑指南)
  • 微服务网关实战:从三次灾难性故障到路由与权限的体系化防御
  • 从C++开始的编程生活(8)——内部类、匿名对象、对象拷贝时的编译器优化和内存管理
  • 【AI时代速通QT】第六节:Qt Creator从添加新窗口到项目构建运行配置
  • 【CVPR 2022】面向2020年代的卷积神经网络
  • 图神经网络介绍
  • FPGA入门到进阶:可编程逻辑器件的魅力
  • 【解决问题】Ubuntu18上无法运行arm-linux-gcc
  • 嵌入式学习day47-硬件-imx6ull-LED
  • 深入体验—Windows从零到一安装KingbaseES数据库
  • 力扣习题——电话号码的字母组合
  • Linux环境下爬虫程序的部署难题与系统性解决方案
  • 深入解析ThreadLocal:线程数据隔离利器
  • D01-【计算机二级】Python(1)基本操作第41题
  • API开发工具postman、国内xxapi和SmartApi的性能对比
  • Scikit-learn Python机器学习 - 分类算法 - 线性模型 逻辑回归
  • SciKit-Learn 全面分析 digits 手写数据集
  • 《sklearn机器学习——数据预处理》标准化或均值去除和方差缩放
  • 保序回归Isotonic Regression的sklearn实现案例
  • 《sklearn机器学习——数据预处理》离散化
  • 无人机桨叶转速技术要点与突破
  • GPFS存储服务如何使用及运维
  • ELK 日志采集与解析实战
  • BI数据可视化:驱动数据价值释放的关键引擎
  • FinChat-金融领域的ChatGPT
  • OpenTenBase日常操作锦囊(新手上路DML)
  • Dart 中的 Event Loop(事件循环)
  • C++/Java编程小论——方法设计与接口原则总结