0

問題を示す画像

問題を説明するためにできることはこれ以上ありません。

これが私の主な描画方法です。私が変更した場合

controls.Draw(spriteBatch);
spriteBatch.End();
spriteBatch.Begin(); 

controls.Draw(spriteBatch);
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, d, rs); 

コントロールやテキストが画面に描画されないことを除いて、ブロックは完全に描画されます。

d = new DepthStencilState(); //Class level
d.DepthBufferEnable = true;
d.DepthBufferWriteEnable = true;            
GraphicsDevice.DepthStencilState = d;
rs = RasterizerState.CullNone;
GraphicsDevice.RasterizerState = rs;

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.Cyan);

    // need to do this on reach devices to allow non 2^n textures
    GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp; 
    //spriteBatch.Begin(SpriteSortMode.Immediate, null, null, d, rs);

    if (gameState == State.BREAKOUT)
    {
        wallBlock.Draw(camera);

        if (firstBlocks.Count < 49)
        {
            foreach (Block block in secondBlocks)
            {
               block.Draw(camera);
            }
        }

        foreach (Block block in firstBlocks)
        {
            block.Draw(camera);
        }

        ball.Draw(GraphicsDevice, camera.View, camera.Projection, spriteBatch);

        spriteBatch.Begin(SpriteSortMode.Immediate, null, null, d, rs); 
        controls.Draw(spriteBatch);
        spriteBatch.End();
        spriteBatch.Begin();
        if (ball.scoreMultiplier <= 1)
        {
            spriteBatch.DrawString(
                       scoreFont, 
                       "Score: " + 
                       scoreDiff + 
                       "\n Lives:" + 
                       ball.lives, 
                       new Vector2(100, 10), 
                       Color.Black);
        }
        else
        {
            spriteBatch.DrawString(
                       scoreFont, 
                       "Score: " + 
                       scoreDiff + 
                       "x" + 
                       ball.scoreMultiplier + 
                       " multiplier!" + 
                       "\n Lives:" 
                       + ball.lives, 
                       new Vector2(100, 10), 
                       Color.Black);
        }
        spriteBatch.End();
    }
}
4

2 に答える 2

1

ボックスの面の巻き順が逆になっているようです。defaultSpriteBatch.Begin()メソッドを呼び出すと、デバイスのカリング モードが にリセットされCullCounterClockwiseFaceます。

呼び出しをこれに変更すると:

spriteBatch.Begin(SpriteSortMode.Immediate, null, null, d, rs); 

...そのデフォルトをオーバーライドし、デバイスを に設定していますCullNone。必ずしも を使用する必要はありませんSpriteSortMode.Immediateが、ボックスの巻き順が間違っている場合は、デフォルト以外の を指定する必要がありますRasterizerState

これが一部のプラットフォームでは機能するのに、他のプラットフォームでは機能しない理由については、私にはわかりません。すべての抽象化が漏れやすいという事実に遭遇しました。MonoGame は、ほとんどのプラットフォームで OpenGL の上に実装されているため、内部で行われていることは根本的に異なります。

一般に、クロスプラットフォームにしようとするときは、何をしているのかを具体的SpriteBatch.Begin()に示す方がよいでしょう (この場合は、デバイスの状態を手動で指定することによって)実際に達成しようとしています。

于 2013-09-04T15:04:26.357 に答える
0

多分動く

GraphicsDevice.Clear(Color.Cyan);

spriteBtachの前に

GraphicsDevice.Clear(Color.Cyan);
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, d, rs); 
controls.Draw(spriteBatch);
spriteBatch.End();
于 2013-09-04T12:54:23.797 に答える