创建一个在XNA中继承Drawable Game Component的类作为具有自定义函数的CLASS

时间:2014-06-10 03:14:59

标签: c# xna

using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace TileEngine
{
    class Renderer : DrawableGameComponent
    {
        public Renderer(Game game) : base(game)
        {

        }
        SpriteBatch spriteBatch ;

        protected override void LoadContent()
        {
            base.LoadContent();
        }

        public override void Draw(GameTime gameTime)
        {
            base.Draw(gameTime);
        }

        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }

        public override void Initialize()
        {
            base.Initialize();
        }

        public RenderTarget2D new_texture(int width, int height)
        {
            Texture2D TEX = new Texture2D(GraphicsDevice, width, height);   //create the texture to render to
            RenderTarget2D Mine = new RenderTarget2D(GraphicsDevice, width, height);
            GraphicsDevice.SetRenderTarget(Mine); //set the render device to the reference provided
            //maybe base.draw can be used with spritebatch. Idk. We'll see if the order of operation
            //works out. Wish I could call base.draw here.
            return Mine;    //I'm hoping that this returns the same instance and not a copy.
        }

        public void draw_texture(int width, int height, RenderTarget2D Mine)
        {
            GraphicsDevice.SetRenderTarget(null); //Set the renderer to render to the backbuffer again
            Rectangle drawrect = new Rectangle(0, 0, width, height); //Set the rendering size to what we want
            spriteBatch.Begin();                        //This uses spritebatch to draw the texture directly to the screen  
            spriteBatch.Draw(Mine, drawrect, Color.White); //This uses the color white
            spriteBatch.End();      //ends the spritebatch
            //Call base.draw after this since it doesn't seem to recognize inside the function
            //maybe base.draw can be used with spritebatch. Idk. We'll see if the order of operation
            //works out. Wish I could call base.draw here.
        }
    }
}

我解决了以前的问题,我无法访问主要默认' main'之外的GraphicsDevice。类 即#34;游戏"或者" Game1"等等 现在我有一个新问题。 FYi没有人告诉我,使用可绘制类可以使用GraphicsDevice References使其不为null。 (希望在解决了最后一个错误后,它仍然没有返回null)

无论如何,目前问题是我似乎无法将其初始化为主程序中的实例。 即

Renderer tileClipping;

我无法使用它等 值得注意的是,我甚至还没有测试过以下两个步骤,但在编译之前 但是当这个类的这些函数被调用时,它抱怨它无法渲染到null设备。 这意味着该设备未被初始化。我不明白为什么。谷歌这个花了我几个小时。 我终于找到了我需要的单词......这些单词是"我在XNA中单独进行渲染" 现在我还没有使用addcomponent函数,因为我不想让它只自动运行这些函数 我希望能够打电话给那些自定义的。

简而言之,我想要的是: *访问渲染目标和图形设备OUTSIDE默认类 * Rendertarget2D的传递(包含纹理和纹理应该自动与渲染目标一起传递?) *设备也应该传递给这个函数,或者设备应作为传递rendertarget的副产品传递给这个函数(它与最初给出的渲染设备自动关联) *我假设我在这里处理抽象指针,所以当我传递一个类对象或实例时,我应该收到我引用的SAME对象,而不是只有函数生命周期的副本运行

*所有这些选项的目的:我想动态初始化新的2d纹理以自定义tileclipping甚至是X,y将渲染整个纹理的偏移量,以及其中tile的X和Y偏移量 将在该表面上呈现。 这就是为什么。我会按照每个瓷砖甚至每个8X8像素空间进行基于区域的照明效果..我们会看到 我还将在整个纹理上进行精灵旋转,然后再次将其复制到圆形蒙版 纹理,然后仅为实体图块执行第二个副本,以便在精灵上进行蒙板旋转碰撞。 我将检查我的碰撞的蒙面像素,并可能使用光线投射来检查碰撞 那些地区。

当旋转发生时,精灵将保持在中心位置。 这是一个详细的图表:

enter image description here http://i.stack.imgur.com/INf9K.gif

我将使用texture2D执行步骤4-6 我想也是第1步。 现在,它的剪裁大小(IE渲染的sqaure) 将以每帧为基础缩小或增加 因此我不能为我的主纹理2使用相同的静态大小,我只能使用后备缓冲区 或者我们得到恼人的闪烁。 此外,我将有渲染器类的多个实例,以便我可以自由地传递纹理 好像他们正在打牌(在某种意义上)将它们叠在彼此的顶部,按照我想要的方式裁剪它们 等等。 然后使用spritebatch在我想要的位置简单地绘制它们。 希望这是有道理的,是的,我将计划使用alpha混合,但仅限于之后 所有瓷砖都已绘制.. 掩盖的碰撞是重要的,是的,我避免在平铺渲染上使用数学,而是在视频内存中采用图像处理,这就是为什么我需要这个以我想要的方式工作而不是以默认的方式工作XNA似乎处理图形。

感谢愿意提供帮助的人。

我讨厌提供的代码形式,因为那时我必须依赖于静态存在的更新功能。 如果我想杀死那个更新函数或那个对象,但是将它放在内存中,但是暂时不活动怎么办?我在这里假设其中一个游戏组件的更新功能是自动的吗? 无论如何,这个详细我可以做这个帖子希望有人可以帮我解决问题。而不是告诉我" derrr不要这样做'#34;这是少数人告诉我的(但他们不了解我的实际目标)

我试图创建一个基本上可以自由复制图像的库,无论大小如何,我只需要在函数中指定大小,只要对该对象的引用存在它就应该保持活着?对? :/反正..

还有别的吗?我不知道。我理解面向对象的编码,但我不理解这个XNA 如果不将所有渲染代码放入主类的绘制函数中,它就会觉得不可能做任何自定义的事情

tileClipping.new_texture(GraphicsDevice, width, height) 
tileClipping.Draw_texture(...) 

0 个答案:

没有答案