C# 需要单游戏屏幕分辨率和交集方面的帮助吗
目前在我的游戏中,我想尝试将我的物体向x轴和y轴移动。因为我也想把它放在中间,所以我放了一个摄像头。这是我的摄像头代码-C# 需要单游戏屏幕分辨率和交集方面的帮助吗,c#,xna,monogame,xna-4.0,C#,Xna,Monogame,Xna 4.0,目前在我的游戏中,我想尝试将我的物体向x轴和y轴移动。因为我也想把它放在中间,所以我放了一个摄像头。这是我的摄像头代码- public class Camera { public Matrix transform; public Viewport view; public Vector2 origin; Vector2 baseScreenSize = new Vector2(1136, 720); float horScaling ; floa
public class Camera
{
public Matrix transform;
public Viewport view;
public Vector2 origin;
Vector2 baseScreenSize = new Vector2(1136, 720);
float horScaling ;
float verScaling ;
Vector3 screenScalingFactor ;
public Camera(Viewport newView)
{
view = newView;
horScaling = view.Width / baseScreenSize.X;
verScaling = view.Height / baseScreenSize.Y;
screenScalingFactor = new Vector3(horScaling, verScaling, 1);
}
public void update(GameTime gt, ball pl)
{
origin = new Vector2(pl.Position.X + (pl.ballRectangle.Width / 2) - 400, 0);
transform = Matrix.CreateScale(1,1,0) *
Matrix.CreateTranslation(new Vector3(-origin.X, -origin.Y, 0));
}
}
在Game1.cs文件中,像往常一样,在begin语句中,我把这个-
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, cm.transform*globalTransformation);
ba.Draw(spriteBatch, Color.White);
spriteBatch.End();
这里ba是ball的对象,它只是具有移动x和y的功能
在一个单独的begin、end语句中,我正在绘制其余的所有对象-
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, globalTransformation);
spriteBatch.Draw(mainMenu, new Vector2(0, 0), Color.White);
spriteBatch.Draw(mainMenu1, new Vector2(450, 100), Color.White);
spriteBatch.End();
这里应用了globaltransformation以获得独立的屏幕分辨率(类似于Camera.cs中的代码)
其余对象按预期工作,但摄影机对象和其余对象的交点未按预期工作。
我猜这是因为分辨率无关性没有应用到相机对象上(我不确定)。我在搜索互联网后尝试了很多代码,但没有一个能像预期的那样工作。
简单地说,我想克隆这个游戏-
如果您看到主要玩家正在沿x轴和y轴移动,但由于摄影机处于固定位置,但障碍物不在摄影机中,那么在这种情况下,如何实现摄影机绘制中的obejct与摄影机中不存在的对象之间的交点
请求所有人帮助,我被困在这里很久了…我不明白你的问题,但从我收集的信息来看,你想让相机跟随目标的位置,你还想独立的屏幕分辨率 对于独立的屏幕分辨率,只需创建一个屏幕分辨率处理程序,将场景渲染为由大小定义的RenderTarget2D。然后把它画到屏幕上 对于相机运动。尝试通过偏移和slerp插值调整相机的位置以跟随目标的位置,以防止口吃和平滑动作
void Update(float gameTime) {
Vector3 camTransform = Camera.Position + cameraTarget;
Vector3 newCameraPosition = Vector3.Slerp(cameraPosition, camTransform, 0.2f);
Camera.Position = newCameraPosition;
}
对于你的交叉口问题,沿着这条路试试
private bool intersects(rectangle1, rectangle2) {
return rectangle1.x >= rectangle2.x &&
rectangle1.y >= rectangle2.y &&
rectangle1.y <= rectangle2.y + rectangle2.h &&
rectangle1.x <= rectangle2.x + rectangle2.w;
}
private void checkIntersections(gameObjects[]) {
foreach (var obj in gameobjects) {
if (intersects(obj.rectangle, camera.rectangle){
handleIntersections(camera, obj);
}
}
}
private bool相交(矩形1、矩形2){
返回矩形1.x>=矩形2.x&&
矩形1.y>=矩形2.y&&
矩形1.y没想到这会这么容易…在互联网上搜索,在
他们说的大多数代码都需要对摄影机进行逆变换。
但事实并非如此。从一开始我就说我的问题是摄影机对象和非摄影机对象之间的交集,下面是答案-
首先,我们需要找到摄像机对象的位置,以形成一个世界空间矩形
Vector2 hj = Vector2.Transform(ba.Position, cm.transform);
Rectangle leftRectangleT1 =
new Rectangle((int)hj.X, (int)hj.Y, ba.tex.Width, ba.tex.Height);
这里ba是摄影机对象,我们需要像上面的代码一样将其变换为摄影机变换
为了在像素相交的情况下得到ba的变换,下面是代码-
Matrix ballTransform = Matrix.CreateTranslation(new Vector3(hj.X, hj.Y, 0.0f));
也就是说,你有一个球体矩形,它是相机对象,与现实世界的对象(非相机对象)相交谢谢你的回复,我很快就能实现目标,但问题是交叉点不起作用。嘿,没问题。你希望执行什么样的交叉点?光线投射、边界框等。或者,你可以坚持使用矩形,通过四叉树测试每个对象的每个交叉点。正常干涉在相机对象(本例中为ba.draw)和相机外对象(其中已应用解决方案独立性)之间的。要实现的是简单的相交计算。创建一个屏幕矩形(与您选择的分辨率成比例)并为每个对象创建矩形,然后在名为IntersectionHandler的单独类中测试所有交点。这是最简单的方法,但使用四叉树(2D)或八叉树(3D)对于任何类型的交叉点,相对于屏幕摄影机,它节省了性能,并且易于实现。正如我在问题中提到的,所有交叉点都按预期工作,唯一不工作的是摄影机对象和其他对象之间的交叉点