sourceRectangle
画面にテクスチャの一部を表示する方法について、XNA の状況に遭遇しました。
正方形と円の 2 つの単純な形状テクスチャがあるとします。円は正方形の中に配置されます。円の位置は、Mathhelper.Lerp(正方形の内側、正方形の外側、float x) で駆動されます。円のテクスチャが下に下がると、正方形の下端に到達し、実際のゲーム画面の下端に到達したかのように、徐々に消えていきます。sourceRectangle
この場合は正常に動作します。
問題は、円が上に上がり、正方形の上端に到達したときに発生します。円のテクスチャが正方形の上端の半分にあるとしましょう。この場合、円の下半分を表示したいだけです。sourceRectangle
下半分だけ描くように言ったら下半分も描いてくれるのに、その部分だけ上半分の円のテクスチャをsourceRectangle
描き直してしまいます。その結果、四角形の上端の上に円の下半分が描画されますが、これは望ましい効果ではありません。
sourcerectangle は、描画したいテクスチャの領域を取得しますが、最初にテクスチャの上部に目的の領域を描画 (または配置) するという結論に達しました。sourcerect(この場合)が下から描画するための回避策、またはその他のオプションはありますか?
Texture2d.SetData ルートを試して、ピクセルの行を透明にしました。それは機能しますが、graphicsdevice [0]をnullに設定する必要があり、そのテクスチャを元に戻す(または画面に再度表示する)方法がわかりません。Lerp が正方形の上端を横切ってテクスチャを押すたびに、正方形の上端のすぐ下にテクスチャを再配置しようとしましたが、アニメーションが「ぎこちなく見える」ようになります。
解決済み
私は自分のニーズに非常に適したソリューションを見つけました。Texture2d.SetData()/GetData()
元の投稿で、正方形の境界の外側のピクセルを透明にすることを試みたと述べました。テクスチャのデータを設定する前に、graphicsdevice を null に設定する必要があるというエラーが表示されるまでは機能します。その間、私はそれを再訪し、現在は完全に機能しています。
私の解決策/エラー:
Texture2D tempTex;
public Texture2d FormatTexture( Texture2D circleTex, int numOfRows)
{
tempTex = new Texture2d(GraphicsDevice, circleTexture.Width, circleTexture.Height)
//Each index in pixels[] will hold Color(r,g,b) data
Color[] pixels = new Color[circleTex.Width * circleTex.Height];
//Get every pixel's color info from the circle texture and store it in pixels[]
circleTex.GetData<Color>(pixels);
//Only edit the desired number of rows in the texture, not the entire texture
for(int i = 0; i < circleTex.Width * numOfRows; i++)
{
//make pixel transparent via multiplying it by 0
pixels[i] = pixels[i] * 0;
}
//Bypass that graphicsdevice[0] = null error by setting data on a texture not
//currently using spritebatch (tempTex instead of circleTex)
tempTex.SetData<Color>(pixels);
return tempTex;
}
以前私が間違っていたのは、circleTexture
のデータを設定しようとしたことです。どうやら、グラフィックデバイス上にある間はそれを行うことはできません。circleTexture
代わりに、基本的に透明な行を持つスプライトバッチ「tempTex」にない新しいテクスチャを作成しました。ここで同様のT2D.SetData
エラー投稿に気付きましたが、今まで理解できる解決策が見つかりませんでした.