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

Revision 5607, 4.6 KB checked in by mijoilmo, 6 years ago (diff)

muutoksia skriptiin sekä kursori

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