source: 2014/30/MikkoI/WindowsGame1/WindowsGame1/WindowsGame1/Render/MapRenderer.cs @ 5693

Revision 5693, 4.4 KB checked in by mijoilmo, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Microsoft.Xna.Framework;
5using Microsoft.Xna.Framework.Content;
6using Microsoft.Xna.Framework.Graphics;
7
8namespace ShadowSimulator2014
9{
10    class MapRenderer
11    {
12        //renderöi periaatteessa kaiken paitsi GUI:n. sisältää tekstuurit
13        Map map;
14        Vector3 baseSunPosition = new Vector3(0, 0, 0);
15        Camera camera;
16        RendererBase r;
17
18        float sunAngle = 24;
19        Vector3 sunPosition = new Vector3(-100, -100, 40);
20
21        public MapRenderer(RendererBase r, Map map, Camera camera)
22        {
23            this.map = map;
24            this.baseSunPosition = new Vector3(map.Size.X / 2, map.Size.Y / 2, 40);//alusta auringon pyörityksen joint-piste
25            this.camera = camera;
26            this.r = r;
27        }
28
29        void renderGroundObjects(Matrix matrix)
30        {
31            //renderöi kaikki maassa olevat dynaamiset objektit, eli puut, olennot ym.
32            r.spriteBatch.Begin(SpriteSortMode.FrontToBack, null, null, null, null, null, matrix);
33
34            //VARJOJEN RENDERÖINTI
35            foreach (MapObject obj in map.Objects)
36            {
37                Texture2D texture = shadowSimulator.Instance.textures[obj.textureId];
38                Vector2 size = new Vector2(texture.Width, texture.Height) * camera.zoomFactor;//ditto
39
40                Vector2 erotus = new Vector2(sunPosition.X, sunPosition.Y) - obj.position;
41
42
43                float shadowAngle = (float)(Math.Atan2(erotus.Y, erotus.X) - Math.PI / 2.0);
44
45                var shadowDirection = sunPosition - new Vector3(obj.position.X, obj.position.Y, 0f);
46                shadowDirection.Normalize();
47
48                double dot = Vector3.Dot(Vector3.UnitZ, shadowDirection);
49
50                r.spriteBatch.Draw(texture, new Rectangle((int)((obj.position.X + 0.5) * 64), (int)((obj.position.Y + 0.5) * 64), texture.Width, (int)((1.0 / dot) * texture.Height - texture.Height)), null, new Color(0f, 0f, 0f, 0.5f), shadowAngle, new Vector2(texture.Width / 2, texture.Height + obj.shadowOffset), SpriteEffects.None, 0.5f);
51            }
52
53            r.spriteBatch.End();
54
55            r.spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
56
57            //OBJEKTIEN RENDERÖINTI
58            foreach (MapObject obj in map.Objects)
59            {
60                Texture2D texture = shadowSimulator.Instance.textures[obj.textureId];
61                Vector2 size = new Vector2(texture.Width, texture.Height) * camera.zoomFactor;//ditto
62                r.renderGroundObject(texture, (int)obj.position.X, (int)obj.position.Y, size, matrix, camera);
63            }
64            sunAngle += 1 / 3000.0f;//auringon pyörimisnopeus
65
66            if (sunPosition.X < 30)
67            {
68                sunPosition.X += 0.2f;
69                sunPosition.Y += 0.2f;
70            }
71            else
72            {
73                if (sunPosition.Z > 5)
74                {
75                    sunPosition.Z -= 0.2f;
76                }
77
78            }
79
80            Vector3 fixedSun = sunPosition;
81            fixedSun.Z *= -1.0f;
82
83            Texture2D sunTexture = shadowSimulator.Instance.textures["taivas/aurinko"];
84            r.renderDistantSprite(sunTexture, fixedSun, new Vector2(sunTexture.Width * camera.zoomFactor * 5, sunTexture.Height * camera.zoomFactor * 5), matrix, camera);
85
86            r.spriteBatch.End();
87        }
88
89        void renderSky(Matrix matrix)
90        {
91            r.spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
92
93            Texture2D starBackground = shadowSimulator.Instance.textures["taivas/tähdet"];
94
95            //r.renderBackground(starBackground, new Vector2(starBackground.Width, starBackground.Height));
96
97            r.spriteBatch.End();
98        }
99
100        public void Render(Matrix matrix)
101        {//renderöi koko mapin, kutsu ulkopuolelta
102            renderSky(matrix);
103
104            r.spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, matrix);
105            for (var x = 0; x < map.Size.X; x++)
106            {
107                for (var y = 0; y < map.Size.Y; y++)
108                {
109                    r.renderGroundTile(shadowSimulator.Instance.textures[map.Tiles[x, y].textureId], x, y);
110                }
111            }
112            r.spriteBatch.End();
113
114            renderGroundObjects(matrix);
115        }
116    }
117}
Note: See TracBrowser for help on using the repository browser.