Example #1
0
        public void DrawBackground(SpriteBatch spriteBatch, Camera cam, BackgroundCreatureManager backgroundCreatureManager = null)
        {
            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap);

            Vector2 backgroundPos = cam.WorldViewCenter;

            backgroundPos.Y = -backgroundPos.Y;
            backgroundPos  /= 20.0f;

            if (backgroundPos.Y < 1024)
            {
                if (backgroundPos.Y < 0)
                {
                    backgroundTop.SourceRect = new Rectangle((int)backgroundPos.X, (int)backgroundPos.Y, 1024, (int)Math.Min(-backgroundPos.Y, 1024));
                    backgroundTop.DrawTiled(spriteBatch, Vector2.Zero, new Vector2(GameMain.GraphicsWidth, Math.Min(-backgroundPos.Y, GameMain.GraphicsHeight)),
                                            Vector2.Zero, level.BackgroundColor);
                }
                if (backgroundPos.Y > -1024)
                {
                    background.SourceRect = new Rectangle((int)backgroundPos.X, (int)Math.Max(backgroundPos.Y, 0), 1024, 1024);
                    background.DrawTiled(spriteBatch,
                                         (backgroundPos.Y < 0) ? new Vector2(0.0f, (int)-backgroundPos.Y) : Vector2.Zero,
                                         new Vector2(GameMain.GraphicsWidth, (int)Math.Ceiling(1024 - backgroundPos.Y)),
                                         Vector2.Zero, level.BackgroundColor);
                }
            }

            spriteBatch.End();

            spriteBatch.Begin(SpriteSortMode.BackToFront,
                              BlendState.AlphaBlend,
                              SamplerState.LinearWrap, DepthStencilState.Default, null, null,
                              cam.Transform);

            backgroundSpriteManager.DrawSprites(spriteBatch, cam);

            if (backgroundCreatureManager != null)
            {
                backgroundCreatureManager.Draw(spriteBatch);
            }


            for (int i = 0; i < 4; i++)
            {
                float scale = 1.0f - i * 0.2f;

                //alpha goes from 1.0 to 0.0 when scale is in the range of 0.2-0.1
                float alpha = (cam.Zoom * scale) < 0.2f ? (cam.Zoom * scale - 0.1f) * 10.0f : 1.0f;
                if (alpha <= 0.0f)
                {
                    continue;
                }

                Vector2 offset = (new Vector2(cam.WorldViewCenter.X, cam.WorldViewCenter.Y) + dustOffset) * scale;
                Vector3 origin = new Vector3(cam.WorldView.Width, cam.WorldView.Height, 0.0f) * 0.5f;

                dustParticles.SourceRect = new Rectangle(
                    (int)((offset.X - origin.X + (i * 256)) / scale),
                    (int)((-offset.Y - origin.Y + (i * 256)) / scale),
                    (int)((cam.WorldView.Width) / scale),
                    (int)((cam.WorldView.Height) / scale));

                spriteBatch.Draw(dustParticles.Texture,
                                 new Vector2(cam.WorldViewCenter.X, -cam.WorldViewCenter.Y),
                                 dustParticles.SourceRect, Color.White * alpha, 0.0f,
                                 new Vector2(cam.WorldView.Width, cam.WorldView.Height) * 0.5f / scale, scale, SpriteEffects.None, 1.0f - scale);
            }

            spriteBatch.End();

            RenderWalls(GameMain.Instance.GraphicsDevice, cam);
        }
Example #2
0
        public void DrawBackground(SpriteBatch spriteBatch, Camera cam,
                                   BackgroundSpriteManager backgroundSpriteManager     = null,
                                   BackgroundCreatureManager backgroundCreatureManager = null)
        {
            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap);

            Vector2 backgroundPos = cam.WorldViewCenter;

            backgroundPos.Y = -backgroundPos.Y;
            backgroundPos  *= 0.05f;

            if (backgroundPos.Y < 1024)
            {
                if (backgroundPos.Y < 0)
                {
                    backgroundTop.SourceRect = new Rectangle((int)backgroundPos.X, (int)backgroundPos.Y, 1024, (int)Math.Min(-backgroundPos.Y, 1024));
                    backgroundTop.DrawTiled(spriteBatch, Vector2.Zero, new Vector2(GameMain.GraphicsWidth, Math.Min(-backgroundPos.Y, GameMain.GraphicsHeight)),
                                            Vector2.Zero, level.BackgroundColor);
                }
                if (backgroundPos.Y > -1024)
                {
                    background.SourceRect = new Rectangle((int)backgroundPos.X, (int)Math.Max(backgroundPos.Y, 0), 1024, 1024);
                    background.DrawTiled(spriteBatch,
                                         (backgroundPos.Y < 0) ? new Vector2(0.0f, (int)-backgroundPos.Y) : Vector2.Zero,
                                         new Vector2(GameMain.GraphicsWidth, (int)Math.Ceiling(1024 - backgroundPos.Y)),
                                         Vector2.Zero, level.BackgroundColor);
                }
            }

            spriteBatch.End();

            spriteBatch.Begin(SpriteSortMode.Deferred,
                              BlendState.AlphaBlend,
                              SamplerState.LinearWrap, DepthStencilState.Default, null, null,
                              cam.Transform);


            if (backgroundSpriteManager != null)
            {
                backgroundSpriteManager.DrawSprites(spriteBatch, cam);
            }
            if (backgroundCreatureManager != null)
            {
                backgroundCreatureManager.Draw(spriteBatch);
            }

            Rectangle srcRect = new Rectangle(0, 0, 2048, 2048);
            Vector2   origin  = new Vector2(cam.WorldView.X, -cam.WorldView.Y);
            Vector2   offset  = -origin + dustOffset;

            while (offset.X <= -srcRect.Width)
            {
                offset.X += srcRect.Width;
            }
            while (offset.X > 0.0f)
            {
                offset.X -= srcRect.Width;
            }
            while (offset.Y <= -srcRect.Height)
            {
                offset.Y += srcRect.Height;
            }
            while (offset.Y > 0.0f)
            {
                offset.Y -= srcRect.Height;
            }
            for (int i = 0; i < 4; i++)
            {
                float scale      = 1.0f - i * 0.2f;
                float recipScale = 1.0f / scale;

                //alpha goes from 1.0 to 0.0 when scale is in the range of 0.5-0.25
                float alpha = (cam.Zoom * scale) < 0.5f ? (cam.Zoom * scale - 0.25f) * 40.0f : 1.0f;
                if (alpha <= 0.0f)
                {
                    continue;
                }

                Vector2 offsetS = offset * scale + new Vector2(cam.WorldView.Width, cam.WorldView.Height) * (1.0f - scale) * 0.5f - new Vector2(256.0f * i);
                while (offsetS.X <= -srcRect.Width * scale)
                {
                    offsetS.X += srcRect.Width * scale;
                }
                while (offsetS.X > 0.0f)
                {
                    offsetS.X -= srcRect.Width * scale;
                }
                while (offsetS.Y <= -srcRect.Height * scale)
                {
                    offsetS.Y += srcRect.Height * scale;
                }
                while (offsetS.Y > 0.0f)
                {
                    offsetS.Y -= srcRect.Height * scale;
                }

                dustParticles.DrawTiled(spriteBatch, origin + offsetS, new Vector2(cam.WorldView.Width - offsetS.X, cam.WorldView.Height - offsetS.Y), Vector2.Zero, srcRect, Color.White * alpha, new Vector2(scale));
            }

            spriteBatch.End();

            RenderWalls(GameMain.Instance.GraphicsDevice, cam);
        }
Example #3
0
        public void DrawBackground(SpriteBatch spriteBatch, Camera cam,
                                   LevelObjectManager backgroundSpriteManager          = null,
                                   BackgroundCreatureManager backgroundCreatureManager = null)
        {
            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.LinearWrap);

            Vector2 backgroundPos = cam.WorldViewCenter;

            backgroundPos.Y = -backgroundPos.Y;
            backgroundPos  *= 0.05f;

            if (level.GenerationParams.BackgroundTopSprite != null)
            {
                int backgroundSize = (int)level.GenerationParams.BackgroundTopSprite.size.Y;
                if (backgroundPos.Y < backgroundSize)
                {
                    if (backgroundPos.Y < 0)
                    {
                        var backgroundTop = level.GenerationParams.BackgroundTopSprite;
                        backgroundTop.SourceRect = new Rectangle((int)backgroundPos.X, (int)backgroundPos.Y, backgroundSize, (int)Math.Min(-backgroundPos.Y, backgroundSize));
                        backgroundTop.DrawTiled(spriteBatch, Vector2.Zero, new Vector2(GameMain.GraphicsWidth, Math.Min(-backgroundPos.Y, GameMain.GraphicsHeight)),
                                                color: level.BackgroundTextureColor);
                    }
                    if (-backgroundPos.Y < GameMain.GraphicsHeight && level.GenerationParams.BackgroundSprite != null)
                    {
                        var background = level.GenerationParams.BackgroundSprite;
                        background.SourceRect = new Rectangle((int)backgroundPos.X, (int)Math.Max(backgroundPos.Y, 0), backgroundSize, backgroundSize);
                        background.DrawTiled(spriteBatch,
                                             (backgroundPos.Y < 0) ? new Vector2(0.0f, (int)-backgroundPos.Y) : Vector2.Zero,
                                             new Vector2(GameMain.GraphicsWidth, (int)Math.Min(Math.Ceiling(backgroundSize - backgroundPos.Y), backgroundSize)),
                                             color: level.BackgroundTextureColor);
                    }
                }
            }

            spriteBatch.End();

            spriteBatch.Begin(SpriteSortMode.Deferred,
                              BlendState.NonPremultiplied,
                              SamplerState.LinearWrap, DepthStencilState.DepthRead, null, null,
                              cam.Transform);

            backgroundSpriteManager?.DrawObjectsBack(spriteBatch, cam);
            if (cam.Zoom > 0.05f)
            {
                backgroundCreatureManager?.Draw(spriteBatch, cam);
            }

            if (level.GenerationParams.WaterParticles != null && cam.Zoom > 0.05f)
            {
                float textureScale = level.GenerationParams.WaterParticleScale;

                Rectangle srcRect = new Rectangle(0, 0, 2048, 2048);
                Vector2   origin  = new Vector2(cam.WorldView.X, -cam.WorldView.Y);
                Vector2   offset  = -origin + dustOffset;
                while (offset.X <= -srcRect.Width * textureScale)
                {
                    offset.X += srcRect.Width * textureScale;
                }
                while (offset.X > 0.0f)
                {
                    offset.X -= srcRect.Width * textureScale;
                }
                while (offset.Y <= -srcRect.Height * textureScale)
                {
                    offset.Y += srcRect.Height * textureScale;
                }
                while (offset.Y > 0.0f)
                {
                    offset.Y -= srcRect.Height * textureScale;
                }
                for (int i = 0; i < 4; i++)
                {
                    float scale = (1.0f - i * 0.2f);

                    //alpha goes from 1.0 to 0.0 when scale is in the range of 0.1 - 0.05
                    float alpha = (cam.Zoom * scale) < 0.1f ? (cam.Zoom * scale - 0.05f) * 20.0f : 1.0f;
                    if (alpha <= 0.0f)
                    {
                        continue;
                    }

                    Vector2 offsetS = offset * scale
                                      + new Vector2(cam.WorldView.Width, cam.WorldView.Height) * (1.0f - scale) * 0.5f
                                      - new Vector2(256.0f * i);

                    float texScale = scale * textureScale;

                    while (offsetS.X <= -srcRect.Width * texScale)
                    {
                        offsetS.X += srcRect.Width * texScale;
                    }
                    while (offsetS.X > 0.0f)
                    {
                        offsetS.X -= srcRect.Width * texScale;
                    }
                    while (offsetS.Y <= -srcRect.Height * texScale)
                    {
                        offsetS.Y += srcRect.Height * texScale;
                    }
                    while (offsetS.Y > 0.0f)
                    {
                        offsetS.Y -= srcRect.Height * texScale;
                    }

                    level.GenerationParams.WaterParticles.DrawTiled(
                        spriteBatch, origin + offsetS,
                        new Vector2(cam.WorldView.Width - offsetS.X, cam.WorldView.Height - offsetS.Y),
                        color: Color.White * alpha, textureScale: new Vector2(texScale));
                }
            }
            spriteBatch.End();

            RenderWalls(GameMain.Instance.GraphicsDevice, cam);

            spriteBatch.Begin(SpriteSortMode.Deferred,
                              BlendState.NonPremultiplied,
                              SamplerState.LinearClamp, DepthStencilState.DepthRead, null, null,
                              cam.Transform);
            backgroundSpriteManager?.DrawObjectsMid(spriteBatch, cam);
            spriteBatch.End();
        }