source: 2014/27/AleksanteriV/Protokolla236TrueSurvivor/Protokolla236TrueSurvivor/Protokolla236TrueSurvivor/Protokolla236TrueSurvivor.cs @ 5499

Revision 5499, 12.5 KB checked in by mijoilmo, 7 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Proto236b : PhysicsGame //true survivor
10{
11    private Player player;
12    public Player Player { get { return player; } set { player = value; } }
13    private Hud hud;
14    public Hud Hud { get { return hud; } set { hud = value; } }
15    private ColorTileMap map;
16    public ColorTileMap Map { get { return map; } set { map = value; } }
17    private Dictionary<string, Image> images = new Dictionary<string, Image>();
18    public Dictionary<string, Image> Images { get { return images; } set { images = value; } }
19    private Dictionary<string, Image[]> imageLists = new Dictionary<string, Image[]>();
20    public Dictionary<string, Image[]> ImageLists { get { return imageLists; } set { imageLists = value; } }
21    private Music music;
22    public Music Music { get { return music; } set { music = value; } }
23    private ProtoLevel currentLevel;
24    public ProtoLevel CurrentLevel { get { return currentLevel; } set { currentLevel = value; } }
25    private ScreenView gameScreen;
26    public ScreenView GameScreen { get { return gameScreen; } set { gameScreen = value; } }
27    private Dictionary<string, ProtoLevel> levels = new Dictionary<string, ProtoLevel>();
28    private Galaxy galaxy;
29    public Galaxy Galaxy { get { return galaxy; } set { galaxy = value; } }
30    private Dictionary<int, Dictionary<int, Dictionary<int, GameObject>>> positionGrid = new Dictionary<int, Dictionary<int, Dictionary<int, GameObject>>>();
31
32    void AssignKeys()
33    {
34        Keyboard.Listen(Key.Escape, ButtonState.Down, Exit, "Lento");
35        Keyboard.Listen(Key.Up, ButtonState.Down, player.thrusterStart, "Lento", 1.0);
36        Keyboard.Listen(Key.Up, ButtonState.Released, player.thrusterEnd, "Lento");
37        Keyboard.Listen(Key.Down, ButtonState.Down, player.thrusterStart, "Lento", -0.2);
38        Keyboard.Listen(Key.Down, ButtonState.Released, player.thrusterEnd, "Lento");
39        Keyboard.Listen(Key.Left, ButtonState.Down, player.rotate, "Lento", 4.0);
40        Keyboard.Listen(Key.Right, ButtonState.Down, player.rotate, "Lento", -4.0);
41        Keyboard.Listen(Key.LeftControl, ButtonState.Down, player.shoot, "Lento");
42    }
43    void LoadAllImages()
44    {
45        images["space_background"] = LoadImage("graphics/backgrounds/Space");
46        images["mars_background"] = LoadImage("graphics/backgrounds/Mars");
47        images["planet2"] = LoadImage("graphics/Planets/MapPlanet4");
48        images["planet3"] = LoadImage("graphics/Planets/MapPlanet3");
49        images["planet1_background"] = LoadImage("graphics/backgrounds/planet1");
50        images["planet2_background"] = LoadImage("graphics/backgrounds/planet2");
51        images["planet3_background"] = LoadImage("graphics/backgrounds/planet1");
52        images["player"] = LoadImage("graphics/ships/player1.0");
53        images["galaxy_map"] = LoadImage("graphics/HUD/galaxy_map");
54        imageLists["planet_map"] = LoadImages("graphics/HUD/RadarPlaneetta1.0", "graphics/HUD/RadarPlaneetta1.1");
55
56        //kaikki tilet
57        images["grass1"] = LoadImage("graphics/tiles/tilenurmi");
58        images["soil1"] = LoadImage("graphics/tiles/tilemulta");
59        images["wood1"] = LoadImage("graphics/tiles/tilepuu");
60
61        imageLists["player_thruster"] = LoadImages("graphics/effects/thrusters/thruster0.1", "graphics/effects/thrusters/thruster0.2");
62        imageLists["enemy1"] = LoadImages("graphics/Enemy/Enemy1.0", "graphics/Enemy/Enemy1.1", "graphics/Enemy/Enemy1.2");
63        imageLists["HUD_radar"] = LoadImages("graphics/HUD/HUD_radar1.0", "graphics/HUD/HUD_radar1.1");
64        images["HUD_ship"] = LoadImage("graphics/HUD/cross1.0");
65    }
66    void LoadAllMusic()
67    {
68        this.music = new Music();
69    }
70    public SoundEffect loadSound(string ef)
71    {
72        return LoadSoundEffect(ef);
73    }
74    public void LoadLevel(string levelId, Angle planetAngle/*PlanetAngle määrittää missä kulmassa planeettaan tullaan tai sieltä poistutaan*/)
75    {
76        ClearAll();
77
78        //MessageDisplay.Add("loading level '" + level.TileMapSrc + "'...");
79        currentLevel = this.levels[levelId];
80
81        Level.Background.Color = Color.Black;
82        this.player.Velocity = Vector.Zero;//resetoi pelaajan velocity
83        Add(this.player, 1);
84        Camera.Follow(this.player);
85
86        LevelFromImage(currentLevel);
87
88        MediaPlayer.Stop();
89        string music = currentLevel.PickMusic();
90        if (music != "")
91        {
92            MediaPlayer.Play(music);
93        }
94
95        if (currentLevel.IsPlanet)
96        {
97            Gravity = new Vector(0, -200);
98            player.LinearDamping = 0.99;//ns ilmanvastus
99            galaxy.CurrentPlanet = galaxy.Planets[currentLevel.Id];//aseta galaksiin tiedot nykyisestä planeetasta
100            player.Y = Level.Top - Screen.Height;
101            player.X = (planetAngle.Degrees / Angle.FullAngle.Degrees) * Level.Width - Level.Width / 2;
102            Layers[-3].RelativeTransition = new Vector(1, 1);
103        }
104        else
105        {
106            Gravity = new Vector(0, 0);
107            player.LinearDamping = 1;//avaruudessa ei ilmanvastusta
108            Camera.Zoom(0.4);
109            if (galaxy.CurrentPlanet != null)//current planet voi olla null jos pelaaja ei vielä ole käynyt millään planeetalla.
110            {
111                //aseta pelaaja galaksiin
112                player.Position = galaxy.CurrentPlanet.Position;
113                //laske vielä vektori, mistä suunnasta pelaaja poistui
114                player.Position += Vector.FromLengthAndAngle(galaxy.CurrentPlanet.Radius + 50, planetAngle);
115                player.AbsoluteAngle = planetAngle;
116            }
117            Layers[-1].RelativeTransition = new Vector(0.1, 0.1);
118        }
119
120        AssignKeys();
121        initializeHUD();
122    }
123    void CreateBg(string id, int offset, double scale = 1, int layer = -3)
124    {
125        double h = 1, w = 1;
126        if (currentLevel.IsPlanet)
127        {
128            h = 150 * 40;
129            w = Level.Width;
130        }
131        else
132        {
133            h = Level.Height * scale;
134            w = Level.Width * scale;
135        }
136        GameObject bg = new GameObject(w, h);
137        bg.Image = images[id];
138        bg.X += Level.Width * offset;
139        if (!currentLevel.IsPlanet)
140        {
141            bg.Y += Level.Height * offset;
142        }
143        Add(bg, layer);
144    }
145    void LevelFromImage(ProtoLevel level)
146    {
147        Dictionary<String, String> convert = new Dictionary<String, String>();
148        convert.Add("000000", "grass1");
149        convert.Add("00ffff", "wood1");
150        ColorTileMap tileMap = ColorTileMap.FromLevelAsset(level.TileMapSrc);
151        tileMap.SetTileMethod(Color.FromHexCode("000000"), createTile, convert["000000"], false);
152        tileMap.SetTileMethod(Color.FromHexCode("00ffff"), createTile, convert["00ffff"], true);
153        tileMap.SetTileMethod(Color.FromHexCode("ff0000"), spawnPlayer);
154        tileMap.SetTileMethod(Color.FromHexCode("00ff00"), spawnEnemy);
155
156        //shopit
157        //tileMap.SetTileMethod(Color.FromHexCode("ff7700"), createShop);
158
159        //kaikki spacessa olevat jutut voisi alkaa CC
160        tileMap.SetTileMethod(Color.FromHexCode("ccffff"), createPlanet, "planet2");//planeetta 2
161        tileMap.SetTileMethod(Color.FromHexCode("ccffcc"), createPlanet, "planet3");//planeetta 1
162
163        double w = 0, h = 0;
164        //tiilien välinen skaala valitaan
165        if (CurrentLevel.IsPlanet)
166        {
167            w = 40; h = 40;
168        }
169        else
170        {
171            w = 2000; h = 2000;
172        }
173        tileMap.Execute(w, h);
174        map = tileMap;
175
176        if (currentLevel.IsPlanet)
177        {
178            //luo backgroundit (2 valetta ja 1 oikea)
179            CreateBg(level.BackgroundId, -1);
180            CreateBg(level.BackgroundId, 0);
181            CreateBg(level.BackgroundId, 1);
182            //lasketaan montako tiiltä tarvitaan
183            double zoom = 0.7;
184            var tilesNeeded = Math.Floor((Screen.Width / 2 / 40) / zoom);
185
186            //vasen puoli
187            for (int x = 0; x < tilesNeeded; x++)
188            {
189                for (int y = 0; y < tileMap.RowCount; y++)
190                {
191                    String hexColor = tileMap.GetTile(y, x).ToString().Substring(2, 6).ToLower();
192                    if (convert.ContainsKey(hexColor))
193                        createTile(new Vector(x * w + w / 2 - Level.Width / 2 + Level.Width, (tileMap.RowCount - y - 1) * h + h / 2 - Level.Height / 2), w, h, convert[hexColor], false);
194                }
195            }
196            //oikea puoli
197            for (int x = tileMap.ColumnCount - 1; x > tileMap.ColumnCount - 1 - tilesNeeded; x--)
198            {
199                for (int y = 0; y < tileMap.RowCount; y++)
200                {
201                    String hexColor = tileMap.GetTile(y, x).ToString().Substring(2, 6).ToLower();
202                    if (convert.ContainsKey(hexColor))
203                        createTile(new Vector(x * w + w / 2 - Level.Width / 2 - Level.Width, (tileMap.RowCount - y - 1) * h + h / 2 - Level.Height / 2), w, h, convert[hexColor], false);
204                }
205            }
206        }
207        else
208        {
209            CreateBg("space_background", 0, 1, -1);
210        }
211    }
212    public void initializeHUD()
213    {
214        if (hud != null)
215        {
216            //poista vanha hud
217            hud.Destroy();
218        }
219        hud = new Hud(this);
220    }
221    void createTile(Vector position, double w, double h, string id, bool breakable = false)
222    {
223        if (id == "") { return; }
224        if (breakable)
225        {
226            MikonPhysicsObject tile = new MikonPhysicsObject(this, w, h);
227            tile.MakeStatic();
228            tile.AbsolutePosition = position;
229            tile.Image = images[id];
230            Add(tile);
231        }
232        else
233        {
234            PhysicsObject tile = new PhysicsObject(w, h);
235            tile.MakeStatic();
236            tile.AbsolutePosition = position;
237            tile.Image = images[id];
238            Add(tile);
239        }
240    }
241    void createPlanet(Vector position, double w, double h, string id)
242    {
243        Planet planet = new Planet(this, position, 5000, id);
244        AddCheap(planet);
245    }
246    void createShop(Vector position, double w, double h)
247    {
248        Shop shop = new Shop();
249        Add(shop);
250    }
251    void spawnPlayer(Vector position, double w, double h)
252    {
253        player.Position = position;
254    }
255    void spawnEnemy(Vector position, double w, double h)
256    {
257        new Enemy1(this, w, h, position);
258    }
259    void LoadAllLevels()
260    {
261        this.levels["space"] = new ProtoLevel(this, "!space", false, "space_background");
262        this.levels["planet2"] = new ProtoLevel(this, "planet2", true, "planet1_background");
263        this.levels["planet3"] = new ProtoLevel(this, "planet3", true, "planet2_background");
264    }
265    public override void Begin()
266    {
267        // TODO: Kirjoita peli tähän
268        SmoothTextures = false;
269        LoadAllMusic();
270        LoadAllImages();
271        LoadAllLevels();
272
273        this.player = new Player(this);
274        this.player.attachWeapon();
275        this.player.IsUpdated = true;
276
277        this.gameScreen = Screen;
278        this.galaxy = new Galaxy(this);
279
280        LoadLevel("space", Angle.Zero);//avaruus ladataan jotta galaksi saa planeettansa
281        //LoadLevel("planet2", Angle.Zero);
282    }
283    protected override void Update(Microsoft.Xna.Framework.GameTime gameTime)
284    {
285        Predicate<GameObject> predicate = isGameObject;
286        List<GameObject> list = this.GetObjects(predicate);
287        foreach (GameObject obj in list)
288        {
289
290        }
291        base.Update(gameTime);
292    }
293    private bool isGameObject(GameObject obj)
294    {
295        return (obj is GameObject);
296    }
297    private void AddCheap(GameObject o){
298        int x = Convert.ToInt32(o.X), y = Convert.ToInt32(o.Y);
299        if (!positionGrid.ContainsKey(x))
300        {
301            Dictionary<int, Dictionary<int, GameObject>> posGridX = new Dictionary<int, Dictionary<int, GameObject>>();
302            positionGrid.Add(x, posGridX);
303        }
304        if (!positionGrid[x].ContainsKey(y))
305        {
306            Dictionary<int, GameObject> posGridY = new Dictionary<int, GameObject>();
307            positionGrid[x].Add(y, posGridY);
308        }
309        GameObject uusi = ((GameObject)o);
310        positionGrid[x][y].Add(positionGrid[x][y].Count - 1, uusi);
311        Add(o);
312    }
313}
Note: See TracBrowser for help on using the repository browser.