我一直在使用XNA在C#中构建一个游戏引擎,这是我第一次尝试编程,我想用它来更全面地理解我需要知道如何解决的问题。
我目前正在研究的引擎部分是碰撞检测。我正在研究的模式是基于图像的主动碰撞系统。
角色有一个位置(XNA矩形),背景是2个纹理,角色有一个Vector2运动属性。 1是显示纹理,另一个是第一纹理中的碰撞区域的双色图。我显示纹理1,并在加载背景时使用纹理的GetData例程将纹理2加载到Color []数组中。输入解析例程不会直接更改位置,而是添加到motion属性。
所以,每次更新: 检查输入解析器,并添加到运动Vector2。 比较玩家的位置.X / Y沿着每个表面的位置。宽度/高度到运动所采取的方向。如果运动将其带到碰撞区域(通过与Color []数组进行比较检测到),则运动被清零(重力子程序除外),并且在该特定方向上没有移动。
这使我不会停止所有动作,就像在超级马里奥这样的游戏中,跳到一个方块的一侧不会结束你的Y轴运动。
现在,我的问题(说明很快失控)......
我该如何处理不同的决议?我不明白如何缩放图像以填充所需的区域,然后将其用于我可用于拉取GetData的格式?我不想让游戏为每个分辨率加载不同的背景碰撞探测器。我认为这是编码的工作,而不是艺术/设计。
答案 0 :(得分:1)
使用比例方法......
假设您的背景纹理具有大小(Wbk,Hbk),并将其绘制到具有大小(Wvp,Hvp)和offst(Xvp,Yvp)的视口。
视口是屏幕内的一个矩形,用于绘制背景。
现在你想在背景纹理中获得正确的坐标(Xc,Yc),用于绘制精灵的屏幕位置(Xs,Ys)......
然后你需要计算背景纹理大小乘以相对于视口的坐标除以视口大小。
Xc= Wbk * (Xs-Xvp)/Wvp;
Yc= Hbk * (Ys-Yvp)/Hvp;