代码之家  ›  专栏  ›  技术社区  ›  Mike Koder

在XNA中使部分纹理2d透明

  •  2
  • Mike Koder  · 技术社区  · 15 年前

    我刚开始开发游戏,我觉得像坦克战或蠕虫这样的游戏会很不错。 到目前为止,我能想到的最困难的部分是让地形变得容易破坏,我想知道在做简单的部分之前是如何做到的。

    我认为爆炸可能有一个面具纹理,可以缩放为不同的武器。然后,使用该遮罩,我应该使底层地形透明(并且可以选择绘制一个深色边界)。 http://mikakolari.fi/wp-content/uploads/2010/10/terrain.png 我怎样才能做到? 我需要一个像素一个像素地改变alpha值,还是可以使用某种蒙版技术?在地形上画一个蓝色的圆圈不是一个选择。

    我有XNA的3.1和4.0版本。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Andrew Russell    15 年前

    这是一个很难回答的问题,因为有很多方法可以做到。每种方法都有利弊。我只是简单介绍一下:

    作为整体设计,您需要跟踪:原始纹理、应用的“黑暗”和应用的“透明度”。我几乎可以肯定的一件事是你想“积累”爆炸的结果-你不想做的是保持一份所有爆炸发生的清单。

    所以你有表面的纹理,黑暗和透明。你可能会把黑暗和透明合并到一个单一的表面上,用一个通道来存储“正常”、“黑暗”(或一个黑暗层次)和“透明”。

    因为你可能不希望暗环在它们相交的地方逐渐变暗,当你将爆炸应用到你的黑暗层时, max 功能( Math.Max C)。

    要生成最终纹理,您只需将“黑暗/透明度”纹理写入原始纹理或其副本(只需更新每个爆炸接触的区域)。

    或者,您可以使用像素着色程序来组合它们-这些细节超出了这个问题的范围。(同样,像素明暗器在WindowsPhone7的xna 4.0上也不起作用。)

        2
  •  3
  •   Alex    15 年前

    本教程是您要搜索的内容: http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

    Capter 20:添加爆炸坑

    简而言之: 您有两种纹理:一种颜色纹理(可见),一种碰撞纹理(不可见) 从碰撞纹理中减去爆炸图像。 要获得深色边框:展开爆炸纹理并使该区域中的颜色变暗。 现在生成一个新的颜色纹理(旧颜色-Collison=新颜色)。

        3
  •  0
  •   Ashkan Ghodrat    14 年前

    应使用所需像素的颜色生成新的texure2d。alpha=0。

    Color[] bits = new Color[Texture.Width * Texture.Height];
    Texture.GetData(bits);
    
    foreach(Vector2D pixel in overlapedArea)
    {
       int x = (int)(pixel.X);
       int y = (int)(pixel.Y);
    
       bits[x + y * texture.Width] = Color.FromNonPremultiplied(0,0,0,0));
    }
    
    Texture2D newTexture = new Texture2D(texture.GraphicsDevice, texture.Width, texture.Height);
    newTexture.SetData(bits);
    

    现在用最后一个纹理替换新纹理2d,你就可以走了!

    有关碰撞或更改纹理像素颜色的更多代码,请转到此页面获取代码: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

    推荐文章