0

我有我一直在制作的 XNA 2D 游戏,但我遇到了问题。

我的精灵正在跳过屏幕上滚动的框。精灵被 2D 摄像头跟踪,我担心摄像头会引起问题,因为它会导致滚动框在屏幕中途停止而不是继续,而且生命的数量正在迅速减少而不是一个生命当发生一次碰撞时。

这是我的精灵与移动框碰撞的代码

    Rectangle fairyRectangle = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);

        hit = false;

        for (int i = 0; i < GameConstants.TotalBoxes; i++)
        {
            if (scrollingBlocks.boxArray[i].alive)
            {
                Rectangle blockRectangle = new Rectangle((int)scrollingBlocks.boxArray[i].position.X, (int)scrollingBlocks.boxArray[i].position.Y, scrollingBlocks.boxArray[i].texture.Width, scrollingBlocks.boxArray[i].texture.Height);

                if (IntersectPixels(fairyRectangle, fairyTextureData, blockRectangle, blockTextureData))
                {
                    scrollingBlocks.boxArray[i].alive = false;



                    hit = true;
                    lives--;

                    scrollingBlocks.boxArray[i].alive = true;

                    scrollingBlocks.boxArray[i].position.X = random.Next(GameConstants.ScreenWidth);
                    scrollingBlocks.boxArray[i].position.Y = 570;
                }
            }

        }

这是滚动框中的更新函数 public void Update(GameTime gameTime) {

        for (int i = 0; i < GameConstants.TotalBoxes; i++)
        {
            boxArray[i].position.X = boxArray[i].position.X - 5;
            boxArray[i].position.Y = boxArray[i].position.Y;

            if (boxArray[i].position.X < 0)
            {
                boxArray[i].position.X = randomno.Next(GameConstants.ScreenWidth) + 700;
                boxArray[i].position.Y = 570;
            }

            Helper.WrapScreenPosition(ref boxArray[i].position);
        }



    }

我希望它们从右侧屏幕开始并一直移动到 x = 0,但它们目前在 x = 400 处停止。

最后,这是我用精灵和方块绘制的地方

    if (gameState == GameState.PLAYINGLEVEL3)
        {
            graphics.GraphicsDevice.Clear(Color.Aquamarine);
            spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
            backgroundManager.Draw(spriteBatch);
            //scrollingBlocks.Draw(spriteBatch);
            spriteBatch.DrawString(lucidaConsole, "Score: " + score + " Level: " + level + " Time Remaining: " + ((int)timer / 1000).ToString() + " Lives Remaining: " + lives, scorePosition, Color.DarkOrchid);
            spriteBatch.End();


            spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Deferred, SaveStateMode.None, camera.transform);
            scrollingBlocks.Draw(spriteBatch);
            fairyL3.Draw(spriteBatch);
            spriteBatch.End();
        }

谢谢你的帮助!

4

1 回答 1

0

从提供的代码中,我无法说明您的相机是如何工作的,但我的猜测是,当您启动关卡时,您的相机会选择一个新的中心点(而不是原来的 xna 屏幕位置)

换句话说,相机的中心可能已经将它向后推了一点,所以你认为屏幕的位置 0 可能已经被向前推到了屏幕的中间,使盒子停止了。我建议查看这些相机教程http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/http://www.youtube.com/看?v=pin8_ZfBgq0

相机可能很棘手,所以我建议看一些教程来获取挂出矩阵和查看端口。

至于夺走的生命不止一个,那是因为你说“如果这个箱子撞到我的玩家,夺走生命”。计算机不知道你只想带走一个,只要它与带走生命的玩家发生冲突,它就会不断递减。

希望这会给你一些想法:D

于 2013-06-13T21:32:28.833 回答