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

Revision 8334, 11.1 KB checked in by sieerinn, 3 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    PlatformCharacter pelaaja1;
19    PlatformCharacter vihu;
20
21    Image pelaajanKuva = LoadImage("norsu");
22    Image tahtiKuva = LoadImage("tahti");
23
24    SoundEffect maaliAani = LoadSoundEffect("maali");
25
26    List<PhysicsObject> tasot = new List<PhysicsObject>();
27    List<PhysicsObject> tahdet = new List<PhysicsObject>();
28    List<PhysicsObject> vihut = new List<PhysicsObject>();
29
30    public override void Begin()
31    {
32        //Gravity = new Vector(0, -1000);
33
34        LuoKentta();
35        LisaaNappaimet();
36
37        Window.Width = 1920;
38        Window.Height = 1080;
39
40        //Camera.Follow(pelaaja1);
41        //Camera.ZoomFactor = 1.2;
42        //Camera.StayInLevel = true;
43    }
44
45    void LuoKentta()
46    {
47        TileMap kentta = TileMap.FromLevelAsset("kentta1");
48        kentta.SetTileMethod('#', LisaaTaso);
49        kentta.SetTileMethod('*', LisaaTahti);
50        kentta.SetTileMethod('N', LisaaPelaaja);
51        kentta.SetTileMethod('x', LisaaVihu);
52        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
53        Level.CreateBorders();
54        Level.Background.CreateGradient(Jypeli.Color.White, Jypeli.Color.SkyBlue);
55
56        Gravity = new Vector(0, -1000);
57
58        Camera.Follow(pelaaja1);
59        Camera.ZoomFactor = 1.2;
60        Camera.StayInLevel = true;
61    }
62
63    void LisaaTaso(Vector paikka, double leveys, double korkeus)
64    {
65        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
66        taso.Position = paikka;
67        taso.Color = Jypeli.Color.Green;
68        taso.IsVisible = false;
69        Add(taso);
70        tasot.Add(taso);
71    }
72
73    void LisaaTahti(Vector paikka, double leveys, double korkeus)
74    {
75        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
76        tahti.IgnoresCollisionResponse = true;
77        tahti.Position = paikka;
78        tahti.Image = tahtiKuva;
79        tahti.Tag = "tahti";
80        tahti.IsVisible = false;
81        Add(tahti);
82        tahdet.Add(tahti);
83        tahti.Destroyed += () => tahdet.Remove(tahti);
84    }
85
86    void LisaaVihu(Vector paikka, double leveys, double korkeus)
87    {
88        vihu = new PlatformCharacter(leveys, korkeus);
89        vihu.Position = paikka;
90        vihu.Mass = 4.0;
91        vihu.Image = pelaajanKuva;
92        vihu.IsVisible = false;
93
94        RandomMoverBrain vihunAivot = new RandomMoverBrain();
95        vihunAivot.WanderRadius = 2000;
96        vihu.Brain = vihunAivot;
97
98        AddCollisionHandler(vihu, "pelaaja", TormaaPelaajaan);
99        Add(vihu);
100        vihut.Add(vihu);
101    }
102
103    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
104    {
105        pelaaja1 = new PlatformCharacter(leveys, korkeus);
106        pelaaja1.Position = paikka;
107        pelaaja1.Mass = 4.0;
108        pelaaja1.Image = pelaajanKuva;
109        pelaaja1.IsVisible = false;
110        pelaaja1.Tag = "pelaaja";
111        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
112        Add(pelaaja1);
113    }
114
115    void LisaaNappaimet()
116    {
117        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
118        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
119
120        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
121        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, nopeus);
122        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
123
124        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
125
126        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
127        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
128        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
129
130        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
131    }
132
133    void Liikuta(PlatformCharacter hahmo, double nopeus)
134    {
135        hahmo.Walk(nopeus);
136    }
137
138    void Hyppaa(PlatformCharacter hahmo, double nopeus)
139    {
140        hahmo.Jump(nopeus);
141    }
142
143    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
144    {
145        maaliAani.Play();
146        MessageDisplay.Add("Keräsit tähden!");
147        tahti.Destroy();
148    }
149
150    void TormaaPelaajaan(PhysicsObject vihu, PhysicsObject pelaaja1)
151    {
152        ClearAll();
153        tahdet.Clear();
154        tasot.Clear();
155        vihut.Clear();
156
157        matrixLerp = 0f;
158        cameraRotation = 0f;
159        norsuRotation = 0f;
160
161        rotateStar = false;
162        starRotation = 0f;
163
164        perspective = false;
165        light = false;
166
167        LuoKentta();
168        LisaaNappaimet();
169        Pyoritys();
170    }
171
172    /********************************************************/
173    /****************       WARNING!       ******************/
174    /****************   Here be dragons    ******************/
175    /********************************************************/
176
177    float aspectRatio;
178    GraphicsDeviceManager graphics;
179
180    Model norsuModel;
181    Model tasoModel;
182    Model tahtiModel;
183    Model vihuModel;
184
185    Texture2D norsuTexture;
186    Texture2D vihreaTexture;
187    Texture2D tahtiTexture;
188    Texture2D vihuTexture;
189
190    Vector3 cameraStartPos = new Vector3(50f, 0f, 0f);
191    Vector3 cameraPos = new Vector3(50f, 0f, 0f);
192
193    float matrixLerp = 0f;
194    float cameraRotation = 0f;
195    float norsuRotation = 0f;
196
197    bool rotateStar = false;
198    float starRotation = 0f;
199
200    bool perspective = false;
201    bool light = false;
202
203    protected override void LoadContent()
204    {
205        Pyoritys();
206        base.LoadContent();
207        aspectRatio = GraphicsDevice.Viewport.AspectRatio;
208
209        // Haetaan reflektiolla Jypelin sisältä GraphicsDeviceManager.
210        var props = typeof(Tasohyppelypeli).GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Static);
211        foreach (PropertyInfo property in props)
212        {
213            if (property.Name == "GraphicsDeviceManager")
214                graphics = property.GetValue(null, null) as GraphicsDeviceManager;
215        }
216
217        // Yritetään säätää multisampling päälle.
218        if (graphics != null)
219        {
220            graphics.PreferMultiSampling = true;
221            graphics.ApplyChanges();
222        }
223
224        // Ladataan mallit ja tekstuurit.
225        norsuModel = Content.Load<Model>("pelaaja");
226        tasoModel = Content.Load<Model>("taso");
227        tahtiModel = Content.Load<Model>("tahti2");
228        vihuModel = Content.Load<Model>("vihu");
229        norsuTexture = Content.Load<Texture2D>("norsumusta");
230        vihreaTexture = Content.Load<Texture2D>("vihrea");
231        tahtiTexture = Content.Load<Texture2D>("tahti");
232        vihuTexture = Content.Load<Texture2D>("norsumusta");
233       
234    }
235
236    void Pyoritys()
237    {
238        Keyboard.Listen(Key.W, ButtonState.Pressed, () =>
239        {
240            rotateStar = !rotateStar;
241            if (!rotateStar)
242                starRotation = 0f;
243        }, null);
244
245        Keyboard.Listen(Key.F2, ButtonState.Down, () => { norsuRotation += 0.3f; }, null);
246
247        // A ja D pyörittää maailmaa.
248        Keyboard.Listen(Key.A, ButtonState.Down, () => { cameraRotation += 0.005f; }, null);
249        Keyboard.Listen(Key.D, ButtonState.Down, () => { cameraRotation -= 0.005f; }, null);
250
251        // Välilyönti vaihtaa ortogonaali- ja perspektiivinäkymän väliltä.
252        Keyboard.Listen(Key.Space, ButtonState.Pressed, () => { perspective = !perspective; }, null);
253
254        // F12 laittaa päälle valaistuksen.
255        Keyboard.Listen(Key.F12, ButtonState.Pressed, () => { light = !light; }, null);
256    }
257
258    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
259    {
260        float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
261
262        base.Draw(gameTime); // Piirretään Jypeli jutut ensin.
263
264        // Tähtien pyörittely.
265        if (rotateStar)
266            starRotation += -1.3f * dt;
267
268        // Sulava muunnos projektiomatriisien välille.
269        float dir = perspective ? 1f : -1f;
270        matrixLerp += dir * 0.3f * dt;
271        matrixLerp = MathHelper.Clamp(matrixLerp, 0f, 1f);
272
273        // Kameran pyörittely.
274        cameraPos = Vector3.Transform(cameraStartPos, Matrix.CreateRotationY(cameraRotation));
275
276        // Piirretään 3D-mallit päälle.
277        if(!pelaaja1.IsDestroyed)
278        {
279            DrawModel(norsuModel, norsuTexture, pelaaja1.Position, norsuRotation);
280        }
281
282        foreach (var taso in tasot)
283        {
284            DrawModel(tasoModel, vihreaTexture, taso.Position, 0f);
285        }
286        foreach (var tahti in tahdet)
287        {
288            DrawModel(tahtiModel, tahtiTexture, tahti.Position, starRotation);
289        }
290        foreach (var vihu in vihut)
291        {
292            DrawModel(vihuModel, vihuTexture, vihu.Position, 0f);
293        }
294    }
295
296    void DrawModel(Model model, Texture2D tex, Vector jypeliPos, float rotation)
297    {
298        var transforms = new Matrix[model.Bones.Count];
299        model.CopyAbsoluteBoneTransformsTo(transforms);
300
301        var screenPos = Camera.WorldToScreen(jypeliPos);
302        var modelPosition = 0.022f * new Vector3(0f, (float)screenPos.Y, (float)-screenPos.X);
303
304        // Projektiomatriisin interpolointi ortogonaalin ja perspektiivin väliltä.
305        var perspMat = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(30.0f), aspectRatio, 1.0f, 1000.0f);
306        var ortMat = Matrix.CreateOrthographic(25f * aspectRatio, 25f, 0.1f, 100f);
307        var finalMat = Matrix.Lerp(ortMat, perspMat, matrixLerp);
308
309        foreach (ModelMesh mesh in model.Meshes)
310        {
311            foreach (BasicEffect effect in mesh.Effects)
312            {
313                effect.LightingEnabled = true;
314                effect.AmbientLightColor = new Vector3(5f, 5f, 5f);
315                effect.DirectionalLight0.Enabled = false;
316                effect.DirectionalLight1.Enabled = false;
317                effect.DirectionalLight2.Enabled = false;
318
319                if (light)
320                {
321                    effect.EnableDefaultLighting();
322                    effect.DiffuseColor = new Vector3(1f, 1f, 1f);
323                }
324
325                effect.World = Matrix.CreateScale(0.8f) * transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(rotation) * Matrix.CreateTranslation(modelPosition);
326                effect.View = Matrix.CreateLookAt(cameraPos, Vector3.Zero, Vector3.Up);
327                effect.Projection = finalMat;
328                effect.TextureEnabled = true;
329                effect.Texture = tex;
330            }
331            mesh.Draw();
332        }
333    }
334}
Note: See TracBrowser for help on using the repository browser.