标签: xna

模仿老派雪碧闪烁(理论和概念)

我正在尝试开发一个老式的NES风格的视频游戏,精灵闪烁和图形减速.我一直在想我应该用什么类型的逻辑来启用这样的效果.

如果我想要老式的NES风格,我必须考虑以下限制:

  • 屏幕上一次不超过64个精灵
  • 每条扫描线不超过8个精灵,或者Y轴上的每条线都不超过8个精灵
  • 如果屏幕上有太多动作,系统将图像冻结一帧以让处理器赶上动作

从我读过的内容来看,如果屏幕上有超过64个精灵,开发人员只会绘制高优先级精灵而忽略低优先级精灵.它们也可以交替,在奇数编号的相对帧上绘制每个偶数编号的精灵.

扫描线问题很有意思.从我的测试来看,通过像NES那样逐个像素地绘制精灵,不可能在XBOX 360 XNA框架上获得良好的速度.这就是为什么在老式游戏中,如果在一条线上有太多的精灵,如果它们被减半,就会出现一些.对于这个项目的所有目的,我将扫描线设置为8像素高,并通过Y定位将每个扫描线的精灵分组在一起.

为了澄清,我将以8x8像素,而不是1x1的批量绘制精灵到屏幕.

所以,愚蠢的我需要提出一个解决方案....

  • 一次在屏幕上显示64个精灵
  • 每个'scanline'有8个精灵
  • 可以根据优先级绘制精灵
  • 每帧可以间隔精灵
  • 模拟减速

这是我目前的理论

首先,我提出的一个基本想法是解决精灵优先级问题.假设0-255(0为低)之间的值,我可以分配精灵优先级,例如:

  • 0到63低
  • 63至127为中等
  • 128到191很高
  • 192到255是最大的

在我的数据文件中,我可以将每个精灵分配为特定优先级.创建父对象时,精灵将在其指定范围之间随机分配一个数字.然后我会按照从高到低的顺序绘制精灵,最终目标是绘制每个精灵.

现在,当一个精灵被绘制在一个帧中时,我会在其初始优先级内随机生成一个新的优先级值.但是,如果没有在帧中绘制精灵,我可以将32添加到其当前优先级.例如,如果该系统可只画出精灵下降到135的优先级,具有45°的初始优先级的子画面然后可以后不被抽的3帧绘制(45 + 32 + 32 + 32 = 141)

理论上,这将允许精灵交替帧,允许优先级,并将精灵限制为每个屏幕64个.

现在,有趣的问题是我如何将精灵限制为每个扫描线只有8个?

我想如果我将精灵高优先级排序为低优先级,则循环遍历循环直到我达到64个精灵.但是,我不应该只列出列表中的前64个精灵.

在绘制每个精灵之前,我可以通过计数器变量检查在它的相应扫描线中绘制了多少个精灵.例如:

  • 0到7之间的Y值属于扫描线0,scanlineCount [0] = 0
  • 8到15之间的Y值属于Scanline 1,scanlineCount [1] = 0
  • 等等

我可以为每个绘制的帧重置每条扫描线的值.在向下精灵列表的同时,如果在该扫描线中绘制了精灵,则向扫描线的相应计数器添加1.如果它等于8,则不绘制该精灵并转到具有下一个最低优先级的精灵.

慢一点

我需要做的最后一件事是模拟减速.我最初的想法是,如果我每帧绘制64个精灵并且还需要绘制更多的精灵,我可以将渲染暂停16ms左右.然而,在我玩过的NES游戏中,如果没有任何精灵闪烁,有时会减速,而即使有一些精灵闪烁,游戏也会漂亮地移动.

也许为每个在屏幕上使用精灵的对象赋予一个值(比如上面的优先级值),如果所有对象的组合值都超过阈值,那么引入减速?

结论...

我写的所有内容听起来是否合法且可行,或者它是一个白日梦吗?我可以用这个游戏编程理论思考哪些改进?

graphics xna animation sprite

20
推荐指数
1
解决办法
2439
查看次数

XNA for Visual Studio 2013

是否可以在Visual Studio 2013(Ultimate)预览版中使用XNA?我没有听说过,也没有看到有关XNA for VS 2013的任何信息.

我刚刚安装了VS 2013,它不在那里; 我在VS 2012中有它,所以也许有办法让它与2013年一起工作?

.net xna visual-studio visual-studio-2013

20
推荐指数
3
解决办法
5万
查看次数

如何在XNA中实现蠕虫风格的可破坏地形?

我想为我的游戏制作一个想法的原型.这个游戏的想法是玩家将挖掘地面,创建隧道和寻找宝藏.

我正在寻找创建"蠕虫风格"的地形,通过碰撞检测让玩家在隧道中游荡和跳跃.在这些图片中可以看到这种类型的动态地形的例子. 示例1 http://img301.imageshack.us/img301/1675/30184730wd6.png 例2

我的问题是如何实现这种类型的可破坏地形的最佳方法?我正在使用XNA游戏工作室.

c# xna terrain

19
推荐指数
3
解决办法
2万
查看次数

'最近邻'缩放

当我绘制拉伸时Texture2D,像素会获得类似模糊的效果.

我想在我的游戏中使用'像素化'图形,并想知道如何禁用这个以支持最简单的最近邻居缩放.

我已创建此图片以供说明:(x4 zoom)
在此输入图像描述

我能以什么方式实现这一目标?

c# xna image xna-4.0

18
推荐指数
2
解决办法
4945
查看次数

如何加速C#数学代码

我有一些3d插值代码,占用了我项目运行时的90%,无法预先计算.

我可以使用哪些技术加快速度?算法或微优化?

这是感兴趣的人的代码.

它基本上采用放置在2个3d数组中的数据并插入其余数据.

编辑:此外,我已经将其拆分为更高级别的线程以提高性能,但这对Windows手机没有帮助,因为它们都是单核...

我可能会做一些像(Single [] DensityMap = new Single [128*128*128];)来删除多D阵列命中.我访问100个地方的数组,并希望不必这样做(包装在一个函数没有帮助,因为Windows手机不会内联函数调用,它没有帮助perf然后......)

float[, ,] DensityMap = new float[128, 128, 128];
float[, ,] PressureMap = new float[128, 128, 128];

unchecked
{
    for (int x = 0; x < g_CraftWorldConstants.RegionSizeX; x++)
    {
        int offsetX = (x / SAMPLE_RATE_3D_HOR) * SAMPLE_RATE_3D_HOR;
        int plusOffsetX = SAMPLE_RATE_3D_HOR + offsetX;
        int poxox = plusOffsetX - offsetX;
        double poxxpoxox = ((plusOffsetX - x) / (double)poxox);
        double xoxpoxox = ((x - offsetX) / (double)poxox);

        for (int y = …
Run Code Online (Sandbox Code Playgroud)

c# optimization performance xna windows-phone-7

18
推荐指数
2
解决办法
3399
查看次数

为什么Visual Studio无法打开.csproj文件?

我有一个奇怪的问题,我无法在Visual Studio中打开我的.NET项目的属性.如果我尝试通过单击解决方案资源管理器中的属性树节点打开它,我会收到以下消息:

".... csproj"没有可用的编辑器.确保已安装文件类型(.csproj)的应用程序.

如果我尝试通过主菜单打开项目属性,则根本没有任何事情发生.

我已经尝试通过命令行和修复安装重置Visual Studio设置,但到目前为止没有任何帮助.

我在版本9.0.30729.1 SP中使用Visual Studio 2008,包括XNA Game Studio 3.0,ReSharper 4.1和Visual SVN 1.5.1.

它发生在我的所有项目上,似乎是一个本地问题,因为我的同事没有这种问题.

非常感谢帮助!

谢谢,迈克尔

.net xna visual-studio-2008 xna-3.0

17
推荐指数
1
解决办法
6万
查看次数

个人项目计划

我想用C#/ XNA设计一个2D游戏理念.在学校之间,项目缺乏经验,资源有限以及其他可能导致我对项目保释的事情我会在我跳入之前尝试计划出来:

  • 您在成功的个人项目中注意到了哪些关键方面?

  • 你是如何(成功地)从项目中获得收入(除了要求捐款)?(注意:这不是我项目的主要目的,但会很好!)

  • 您如何规划非编程方面,如窗口布局(UI),游戏流程和外观?

  • 你如何带来一个抽象的游戏理念,并成为一个真正的产品.您在草绘和规划中使用了哪些工具?

  • 由于资源有限(艺术才能和金钱),我如何创造一些我需要的艺术资源(除了股票艺术)?或者在我有成品之前我不应该担心吗?

  • 最后,你如何打破代码中的障碍(可能是知识,时间还是坚持不懈)?

c# xna project-management

17
推荐指数
2
解决办法
2241
查看次数

在WinForms中嵌入XNA

是否可以在C#WinForm或C++窗口中嵌入XNA游戏.如果是,那么如何.

我想使用普通的UI控件并拥有游戏的窗口界面,以进行更具交互性和动态的模拟.

c# c++ xna uicomponents winforms

17
推荐指数
2
解决办法
1万
查看次数

为什么要使用服务(IServiceProvider)?

我是从探索XNA框架来探讨这个问题的,但我想了解一般情况.

ISomeService someService = (ISomeService)Game.GetServices(typeof(ISomeService));
Run Code Online (Sandbox Code Playgroud)

然后我们对界面中的任何函数/属性做一些事情:

someService.DoSomething();  // let's say not a static method but doesn't matter
Run Code Online (Sandbox Code Playgroud)

我试图找出为什么这种实现比以下更好:

myObject = InstanceFromComponentThatWouldProvideTheService();

myObject.DoSomething();
Run Code Online (Sandbox Code Playgroud)

当您使用服务方式获取接口时,您实际上只是获取了提供服务的组件实例.对?你不能有一个接口"实例".而且只有一个类可以成为服务的提供者.所以你真正拥有的只是组件类的一个实例,唯一的区别是你只能访问组件对象的子集(界面中的任何子集).

这有什么不同于公共和私人方法和属性?换句话说,组件的公共方法/属性 "接口",我们可以停止所有这些迂回.您仍然可以更改实现"接口"的方式而不会破坏任何内容(直到您更改方法签名,但这也会破坏服务实现).

无论如何,组件和服务之间将存在一对一的关系(多个类不能注册成为服务的提供者),并且我看不到类是提供者的不止一项服务(srp和所有).

所以我想我正在试图找出这种框架要解决的问题.我错过了什么?

c# xna

17
推荐指数
2
解决办法
2万
查看次数

XNA - 获取当前屏幕分辨率

是否有可能获得当前的桌面屏幕分辨率?

我的XNA游戏中有一些小的设置,其中一个是屏幕分辨率.如果它大于当前桌面分辨率支持,我想要做的是屏幕分辨率选项.

c# desktop xna resolution screen

17
推荐指数
2
解决办法
2万
查看次数