source: 2016/koodauskerho/TaneliL/SimoR/Tasohyppelypeli/Tasohyppelypeli/Tasohyppelypeli/Tasohyppelypeli.cs @ 8359

Revision 8359, 13.4 KB checked in by sieerinn, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Graphics;
9using Microsoft.Xna.Framework;
10using System.Reflection;
11
12public class Tasohyppelypeli : PhysicsGame
13{
14    const double nopeus = 200;
15    const double hyppyNopeus = 750;
16    const int RUUDUN_KOKO = 40;
17
18    int kenttaNro = 1;
19    IntMeter keratytTahdet = new IntMeter(0);
20
21    PlatformCharacter pelaaja1;
22    PlatformCharacter vihu;
23
24    GameObject cursori;
25
26    //AssaultRifle pelaajan1ase;
27
28    Image pelaajanKuva = LoadImage("norsu");
29    Image tahtiKuva = LoadImage("tahti");
30    Image palikkaKuva = LoadImage("Palikka");
31
32    SoundEffect maaliAani = LoadSoundEffect("maali");
33
34    List<PhysicsObject> tasot = new List<PhysicsObject>();
35    List<PhysicsObject> tahdet = new List<PhysicsObject>();
36    List<PhysicsObject> vihut = new List<PhysicsObject>();
37    List<PhysicsObject> ammukset = new List<PhysicsObject>();
38
39    public override void Begin()
40    {
41        SeuraavaKentta();
42        LisaaNappaimet();
43        Pyoritys();
44
45        IsMouseVisible = false;
46
47        Timer.SingleShot(0.1, delegate
48        {
49        Window.Width = 1920;
50        Window.Height = 1080;
51
52            Window.X = (int)Screen.Width / 2;
53            Window.Y = (int)Screen.Height / 2;
54        });
55
56        keratytTahdet.Changed += TarkistaTahdet;
57    }
58
59    void SeuraavaKentta()
60    {
61        ClearAll();
62        if (kenttaNro == 1) LuoKentta("kentta1");
63        else if (kenttaNro == 2) LuoKentta("kentta2");
64    }
65
66    void LuoKentta(string kenttaTiedostonNimi)
67    {
68        TileMap kentta = TileMap.FromLevelAsset(kenttaTiedostonNimi);
69        kentta.SetTileMethod('#', LisaaTaso);
70        kentta.SetTileMethod('*', LisaaTahti);
71        kentta.SetTileMethod('N', LisaaPelaaja);
72        kentta.SetTileMethod('x', LisaaVihu);
73        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
74        Level.CreateBorders();
75        Level.Background.CreateGradient(Jypeli.Color.White, Jypeli.Color.SkyBlue);
76
77        Gravity = new Vector(0, -1000);
78
79        Camera.Follow(pelaaja1);
80        Camera.ZoomFactor = 1.2;
81        Camera.StayInLevel = true;
82    }
83
84    void LisaaTaso(Vector paikka, double leveys, double korkeus)
85    {
86        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
87        taso.Position = paikka;
88        taso.Color = Jypeli.Color.Green;
89        taso.Image = palikkaKuva;
90        taso.IsVisible = false;
91        Add(taso);
92        tasot.Add(taso);
93    }
94
95    void LisaaTahti(Vector paikka, double leveys, double korkeus)
96    {
97        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
98        tahti.IgnoresCollisionResponse = true;
99        tahti.Position = paikka;
100        tahti.Image = tahtiKuva;
101        tahti.Tag = "tahti";
102        tahti.IsVisible = false;
103        Add(tahti);
104        tahdet.Add(tahti);
105        tahti.Destroyed += () => tahdet.Remove(tahti);
106    }
107
108    void LisaaVihu(Vector paikka, double leveys, double korkeus)
109    {
110        vihu = new PlatformCharacter(leveys, korkeus);
111        vihu.Position = paikka;
112        vihu.Mass = 4.0;
113        vihu.Image = pelaajanKuva;
114        vihu.Tag = "vihu";
115        vihu.IsVisible = false;
116
117        RandomMoverBrain vihunAivot = new RandomMoverBrain();
118        vihunAivot.WanderRadius = 2000;
119        vihu.Brain = vihunAivot;
120 
121        Add(vihu);
122        vihut.Add(vihu);
123    }
124
125    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
126    {
127        pelaaja1 = new PlatformCharacter(leveys, korkeus);
128        pelaaja1.Position = paikka;
129        pelaaja1.Mass = 4.0;
130        pelaaja1.Image = pelaajanKuva;
131        pelaaja1.IsVisible = false;
132        pelaaja1.Tag = "pelaaja";
133        AddCollisionHandler(pelaaja1, TormaaPelaajaan);
134        Add(pelaaja1);
135
136        cursori = new GameObject(30, 30);
137        cursori.IsVisible = false;
138        Add(cursori);
139
140        pelaaja1.Weapon = new AssaultRifle(30, 30);
141        pelaaja1.Weapon.IsVisible = false;
142        pelaaja1.Weapon.ProjectileCollision = AmmusOsui;
143       
144    }
145
146    void LisaaNappaimet()
147    {
148        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
149        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
150
151        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
152        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, nopeus);
153        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
154        Mouse.Listen(MouseButton.Left, ButtonState.Down, Ammu, "Pelaaja ampuu", pelaaja1);
155
156        Mouse.ListenMovement(0, LiikutaTahtainta, "Tahtain liikkuu");
157
158        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
159
160        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
161        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
162        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
163
164        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
165    }
166
167    void Liikuta(PlatformCharacter hahmo, double nopeus)
168    {
169        hahmo.Walk(nopeus);
170    }
171
172    void Hyppaa(PlatformCharacter hahmo, double nopeus)
173    {
174        hahmo.Jump(nopeus);
175    }
176
177    void LiikutaTahtainta(AnalogState hiiri)
178    {
179        cursori.Position += hiiri.MouseMovement;
180    }
181
182    void Ammu(PlatformCharacter hahmo)
183    {
184        PhysicsObject ammus = hahmo.Weapon.Shoot();
185
186        if (ammus != null)
187        {
188            ammukset.Add(ammus);
189            ammus.X -= 20;
190            ammus.IsVisible = false;
191            ammus.Destroyed += () => ammukset.Remove(ammus);
192            ammus.Velocity = (cursori.Position - pelaaja1.Position).Normalize() * 300;
193        }
194    }
195
196    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
197    {
198        ammus.Destroy();
199    }
200
201    void TormaaPelaajaan(PhysicsObject pelaaja1, PhysicsObject kohde)
202    {
203        if (kohde.Tag == "vihu")
204        {
205            ClearAll();
206            Nollaus();
207        }
208
209        else if (kohde.Tag == "tahti")
210        {
211            maaliAani.Play();
212            MessageDisplay.Add("Keräsit tähden!");
213            keratytTahdet.Value += 1;
214            kohde.Destroy();
215        }
216    }
217
218    void TarkistaTahdet(int a, int b)
219    {
220        if(keratytTahdet == 10)
221        {
222            kenttaNro = 2;
223            ClearAll();
224            Nollaus();
225        }
226    }
227
228    void Nollaus()
229    {
230        tahdet.Clear();
231        tasot.Clear();
232        vihut.Clear();
233
234        matrixLerp = 0f;
235        cameraRotation = 0f;
236        norsuRotation = 0f;
237
238        rotateStar = false;
239        starRotation = 0f;
240
241        perspective = false;
242        light = false;
243
244        SeuraavaKentta();
245        LisaaNappaimet();
246        Pyoritys();
247    }
248   
249    /********************************************************/
250    /****************       WARNING!       ******************/
251    /****************   Here be dragons    ******************/
252    /********************************************************/
253
254    float aspectRatio;
255    GraphicsDeviceManager graphics;
256
257    Model norsuModel;
258    Model tasoModel;
259    Model tahtiModel;
260    Model vihuModel;
261    Model ammusModel;
262
263    Texture2D norsuTexture;
264    Texture2D palikkaTexture;
265    Texture2D tahtiTexture;
266    Texture2D vihuTexture;
267
268    Vector3 cameraStartPos = new Vector3(50f, 0f, 0f);
269    Vector3 cameraPos = new Vector3(50f, 0f, 0f);
270
271    float matrixLerp = 0f;
272    float cameraRotation = 0f;
273    float norsuRotation = 0f;
274
275    bool rotateStar = false;
276    float starRotation = 0f;
277
278    bool perspective = false;
279    bool light = false;
280
281    protected override void LoadContent()
282    {
283        Pyoritys();
284        base.LoadContent();
285        aspectRatio = GraphicsDevice.Viewport.AspectRatio;
286
287        // Haetaan reflektiolla Jypelin sisältä GraphicsDeviceManager.
288        var props = typeof(Tasohyppelypeli).GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Static);
289        foreach (PropertyInfo property in props)
290        {
291            if (property.Name == "GraphicsDeviceManager")
292                graphics = property.GetValue(null, null) as GraphicsDeviceManager;
293        }
294
295        // Yritetään säätää multisampling päälle.
296        if (graphics != null)
297        {
298            graphics.PreferMultiSampling = true;
299            graphics.ApplyChanges();
300        }
301
302        // Ladataan mallit ja tekstuurit.
303        norsuModel = Content.Load<Model>("pelaaja");
304        tasoModel = Content.Load<Model>("taso");
305        tahtiModel = Content.Load<Model>("tahti2");
306        vihuModel = Content.Load<Model>("vihu");
307        ammusModel = Content.Load<Model>("Pallo");
308        norsuTexture = Content.Load<Texture2D>("norsumusta");
309        palikkaTexture = Content.Load<Texture2D>("Palikka");
310        tahtiTexture = Content.Load<Texture2D>("tahti");
311        vihuTexture = Content.Load<Texture2D>("norsumusta");
312       
313    }
314
315    void Pyoritys()
316    {
317        Keyboard.Listen(Key.W, ButtonState.Pressed, () =>
318        {
319            rotateStar = !rotateStar;
320            if (!rotateStar)
321                starRotation = 0f;
322        }, null);
323
324        Keyboard.Listen(Key.F2, ButtonState.Down, () => { norsuRotation += 0.2f; }, null);
325
326        // A ja D pyörittää maailmaa.
327        Keyboard.Listen(Key.A, ButtonState.Down, () => { cameraRotation += 0.005f; }, null);
328        Keyboard.Listen(Key.D, ButtonState.Down, () => { cameraRotation -= 0.005f; }, null);
329
330        // Välilyönti vaihtaa ortogonaali- ja perspektiivinäkymän väliltä.
331        Keyboard.Listen(Key.Space, ButtonState.Pressed, () => { perspective = !perspective; }, null);
332
333        // F12 laittaa päälle valaistuksen.
334        Keyboard.Listen(Key.F12, ButtonState.Pressed, () => { light = !light; }, null);
335    }
336
337    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
338    {
339        float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
340
341        base.Draw(gameTime); // Piirretään Jypeli jutut ensin.
342
343        // Tähtien pyörittely.
344        if (rotateStar)
345            starRotation += -1.3f * dt;
346
347        // Sulava muunnos projektiomatriisien välille.
348        float dir = perspective ? 1f : -1f;
349        matrixLerp += dir * 0.3f * dt;
350        matrixLerp = MathHelper.Clamp(matrixLerp, 0f, 1f);
351
352        // Kameran pyörittely.
353        cameraPos = Vector3.Transform(cameraStartPos, Matrix.CreateRotationY(cameraRotation));
354
355        // Piirretään 3D-mallit päälle.
356        if(!pelaaja1.IsDestroyed)
357        {
358            DrawModel(norsuModel, norsuTexture, pelaaja1.Position, norsuRotation);
359            DrawModel(norsuModel, norsuTexture, cursori.Position, norsuRotation);
360        }
361
362        foreach (var taso in tasot)
363        {
364            DrawModel(tasoModel, palikkaTexture, taso.Position, 0f);
365        }
366        foreach (var tahti in tahdet)
367        {
368            DrawModel(tahtiModel, tahtiTexture, tahti.Position, starRotation);
369        }
370        foreach (var vihu in vihut)
371        {
372            DrawModel(vihuModel, vihuTexture, vihu.Position, 0f);
373        }
374        foreach (var ammus in ammukset)
375        {
376            DrawModel(ammusModel, norsuTexture, ammus.Position, 0f);
377        }
378    }
379
380    void DrawModel(Model model, Texture2D tex, Vector jypeliPos, float rotation)
381    {
382        var transforms = new Matrix[model.Bones.Count];
383        model.CopyAbsoluteBoneTransformsTo(transforms);
384
385        var screenPos = Camera.WorldToScreen(jypeliPos);
386        var modelPosition = 0.022f * new Vector3(0f, (float)screenPos.Y, (float)-screenPos.X);
387
388        // Projektiomatriisin interpolointi ortogonaalin ja perspektiivin väliltä.
389        var perspMat = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(30.0f), aspectRatio, 1.0f, 1000.0f);
390        var ortMat = Matrix.CreateOrthographic(25f * aspectRatio, 25f, 0.1f, 100f);
391        var finalMat = Matrix.Lerp(ortMat, perspMat, matrixLerp);
392       
393
394        foreach (ModelMesh mesh in model.Meshes)
395        {
396            foreach (BasicEffect effect in mesh.Effects)
397            {
398                effect.LightingEnabled = true;
399                effect.AmbientLightColor = new Vector3(5f, 5f, 5f);
400                effect.DirectionalLight0.Enabled = false;
401                effect.DirectionalLight1.Enabled = false;
402                effect.DirectionalLight2.Enabled = false;
403
404                if (light)
405                {
406                    effect.EnableDefaultLighting();
407                    effect.DiffuseColor = new Vector3(1f, 1f, 1f);
408                }
409
410                effect.World = Matrix.CreateScale(0.8f) * transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(rotation) * Matrix.CreateTranslation(modelPosition);
411                effect.View = Matrix.CreateLookAt(cameraPos, Vector3.Zero, Vector3.Up);
412                effect.Projection = finalMat;
413                effect.TextureEnabled = true;
414                effect.Texture = tex;
415            }
416            mesh.Draw();
417        }
418    }
419}
Note: See TracBrowser for help on using the repository browser.