2011-09-29 195 views
9

使用XNA,我试图让一个冒险游戏引擎,可以让你做游戏,看上去就像他们跌出了90年代初,像触手和萨姆&最大命中的日道路。因此,我希望游戏实际运行在320x240(我知道,它应该可能是320x200,但嘘),但它应该放大取决于用户设置。缩放整个屏幕在XNA

它的工作方式现在好了,但我遇到了一些问题,我真的希望它看起来更多像素化,它目前。

下面是我在做什么现在:

在游戏初始化:

public Game() { 
     graphics = new GraphicsDeviceManager(this); 
     graphics.PreferredBackBufferWidth = 640; 
     graphics.PreferredBackBufferHeight = 480; 
     graphics.PreferMultiSampling = false; 

     Scale = graphics.PreferredBackBufferWidth/320; 
    } 

规模是一个公共静态变量,我可以检查任何时候看到我多少应该相对我的球技规模到320x240。

在我的绘图功能:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale)); 

这样,一切都在320×240绘制并炸毁,以适应当前的分辨率(默认为640×480)。当然,我做数学将鼠标的实际坐标转换为320x240坐标,等等。

现在,这是伟大的,所有,但现在我正在开始扩大我的精灵,让他们走到远处等等。

看看下面的图片。左上角的图像是游戏以640x480运行时的截图。右边的图像是它应该看起来如何,在320x240。底部的一排图像只是最高达300%(在Photoshop中,不在引擎中),所以你可以看到我在说什么。

image showing the difference in scaling as the resolution changes

在640×480的图像,你可以看到不同的 “线宽”;较粗的线是它应该看起来的样子(一个像素= 2x2,因为它运行在640x480),但是较细的线(1x1像素)也会出现,当它们不应该时,由于缩放(请参阅右侧的图像)。

基本上我试图模仿一个320x240的显示器,但炸到使用XNA的任何分辨率,而矩阵转换没有做到这一点。有什么办法可以做到这一点?

回答

14

渲染的原始分辨率一切的渲染目标,而不是后台缓存:

 SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice); 
     RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240); 
     GraphicsDevice.SetRenderTarget(target); 

     //perform draw calls 

那么这个目标(您的整个屏幕)渲染到后台缓冲区:

 //set rendering back to the back buffer 
     GraphicsDevice.SetRenderTarget(null); 

     //render target to back buffer 
     targetBatch.Begin(); 
     targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White); 
     targetBatch.End(); 
+1

感谢一大堆!我做了最后一个SpriteBatch调用:spriteBatch.Begin(SpriteSortMode.Deferred,BlendState.NonPremultiplied,SamplerState.PointClamp,DepthStencilState.Default,RasterizerState.CullNone);为了使投影看起来不模糊,但它看起来很棒!再次感谢! –