source: 2016/24/SimoR/Tasohyppelypeli/Tasohyppelypeli/Tasohyppelypeli/Tasohyppelypeli.cs @ 7398

Revision 7398, 8.0 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;
10
11public class Tasohyppelypeli : PhysicsGame
12{
13    const double nopeus = 200;
14    const double hyppyNopeus = 750;
15    const int RUUDUN_KOKO = 40;
16
17    PlatformCharacter pelaaja1;
18
19    Image pelaajanKuva = LoadImage("norsu");
20    Image tahtiKuva = LoadImage("tahti");
21
22    SoundEffect maaliAani = LoadSoundEffect("maali");
23
24    List<PhysicsObject> tasot = new List<PhysicsObject>();
25    List<PhysicsObject> tahdet = new List<PhysicsObject>();
26
27    public override void Begin()
28    {
29        Gravity = new Vector(0, -1000);
30
31        LuoKentta();
32        LisaaNappaimet();
33
34        Camera.Follow(pelaaja1);
35        Camera.ZoomFactor = 1.2;
36        Camera.StayInLevel = true;
37    }
38
39    void LuoKentta()
40    {
41        TileMap kentta = TileMap.FromLevelAsset("kentta1");
42        kentta.SetTileMethod('#', LisaaTaso);
43        kentta.SetTileMethod('*', LisaaTahti);
44        kentta.SetTileMethod('N', LisaaPelaaja);
45        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
46        Level.CreateBorders();
47        Level.Background.CreateGradient(Jypeli.Color.White, Jypeli.Color.SkyBlue);
48    }
49
50    void LisaaTaso(Vector paikka, double leveys, double korkeus)
51    {
52        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
53        taso.Position = paikka;
54        taso.Color = Jypeli.Color.Green;
55        taso.IsVisible = false;
56        Add(taso);
57        tasot.Add(taso);
58    }
59
60    void LisaaTahti(Vector paikka, double leveys, double korkeus)
61    {
62        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
63        tahti.IgnoresCollisionResponse = true;
64        tahti.Position = paikka;
65        tahti.Image = tahtiKuva;
66        tahti.Tag = "tahti";
67        tahti.IsVisible = false;
68        Add(tahti);
69        tahdet.Add(tahti);
70        tahti.Destroyed += () => tahdet.Remove(tahti);
71    }
72
73    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
74    {
75        pelaaja1 = new PlatformCharacter(leveys, korkeus);
76        pelaaja1.Position = paikka;
77        pelaaja1.Mass = 4.0;
78        pelaaja1.Image = pelaajanKuva;
79        pelaaja1.IsVisible = false;
80        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
81        Add(pelaaja1);
82    }
83
84    void LisaaNappaimet()
85    {
86        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
87        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
88
89        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
90        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
91        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
92
93        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
94
95        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
96        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
97        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
98
99        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
100    }
101
102    void Liikuta(PlatformCharacter hahmo, double nopeus)
103    {
104        hahmo.Walk(nopeus);
105    }
106
107    void Hyppaa(PlatformCharacter hahmo, double nopeus)
108    {
109        hahmo.Jump(nopeus);
110    }
111
112    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
113    {
114        maaliAani.Play();
115        MessageDisplay.Add("Keräsit tähden!");
116        tahti.Destroy();
117    }
118
119    /********************************************************/
120    /****************       WARNING!       ******************/
121    /****************   Here be dragons    ******************/
122    /********************************************************/
123
124    float aspectRatio;
125
126    Model norsuModel;
127    Model tasoModel;
128    Model tahtiModel;
129
130    Texture2D norsuTexture;
131    Texture2D vihreaTexture;
132    Texture2D tahtiTexture;
133
134    Vector3 cameraStartPos = new Vector3(50f, 0f, 0f);
135    Vector3 cameraPos = new Vector3(50f, 0f, 0f);
136
137    float matrixLerp = 0f;
138    float cameraRotation = 0f;
139
140    bool perspective = false;
141    bool light = false;
142
143    protected override void LoadContent()
144    {
145        base.LoadContent();
146        aspectRatio = GraphicsDevice.Viewport.AspectRatio;
147
148        norsuModel = Content.Load<Model>("norsu2");
149        tasoModel = Content.Load<Model>("taso");
150        tahtiModel = Content.Load<Model>("tahti2");
151        norsuTexture = Content.Load<Texture2D>("norsu");
152        vihreaTexture = Content.Load<Texture2D>("vihrea");
153        tahtiTexture = Content.Load<Texture2D>("tahti");
154
155        // A ja D pyörittää maailmaa.
156        Keyboard.Listen(Key.A, ButtonState.Down, () => { cameraRotation += 0.005f; }, null);
157        Keyboard.Listen(Key.D, ButtonState.Down, () => { cameraRotation -= 0.005f; }, null);
158
159        // Välilyönti vaihtaa ortogonaali- ja perspektiivinäkymän väliltä.
160        Keyboard.Listen(Key.Space, ButtonState.Pressed, () => { perspective = !perspective; }, null);
161
162        // F12 laittaa päälle valaistuksen.
163        Keyboard.Listen(Key.F12, ButtonState.Pressed, () => { light = !light; }, null);
164    }
165
166    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
167    {
168        base.Draw(gameTime); // Piirretään se mitä Jypeli jutut ensin.
169
170        // Sulava muunnos projektiomatriisien välille.
171        float dir = perspective ? 1f : -1f;
172        matrixLerp += dir * 0.3f * (float)gameTime.ElapsedGameTime.TotalSeconds;
173        matrixLerp = MathHelper.Clamp(matrixLerp, 0f, 1f);
174
175        // Kameran pyörittely.
176        cameraPos = Vector3.Transform(cameraStartPos, Matrix.CreateRotationY(cameraRotation));
177       
178        // Piirretään 3D-mallit päälle.
179        DrawModel(norsuModel, norsuTexture, pelaaja1.Position);
180        foreach (var taso in tasot)
181        {
182            DrawModel(tasoModel, vihreaTexture, taso.Position);
183        }
184        foreach (var tahti in tahdet)
185        {
186            DrawModel(tahtiModel, tahtiTexture, tahti.Position);
187        }
188    }
189
190    void DrawModel(Model model, Texture2D tex, Vector jypeliPos)
191    {
192        var transforms = new Matrix[model.Bones.Count];
193        model.CopyAbsoluteBoneTransformsTo(transforms);
194
195        var screenPos = Camera.WorldToScreen(jypeliPos);
196        var modelPosition = 0.022f * new Vector3(0f, (float)screenPos.Y, (float)-screenPos.X);
197
198        // Projektiomatriisin interpolointi ortogonaalin ja perspektiivin väliltä.
199        var perspMat = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(30.0f), aspectRatio, 1.0f, 1000.0f);
200        var ortMat = Matrix.CreateOrthographic(25f * aspectRatio, 25f, 0.1f, 100f);
201        var finalMat = Matrix.Lerp(ortMat, perspMat, matrixLerp);
202
203        foreach (ModelMesh mesh in model.Meshes)
204        {
205            foreach (BasicEffect effect in mesh.Effects)
206            {
207                effect.LightingEnabled = true;
208                effect.AmbientLightColor = new Vector3(5f, 5f, 5f);
209                effect.DirectionalLight0.Enabled = false;
210                effect.DirectionalLight1.Enabled = false;
211                effect.DirectionalLight2.Enabled = false;
212
213                if (light) effect.EnableDefaultLighting();
214
215                effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(0f) * Matrix.CreateTranslation(modelPosition);
216                effect.View = Matrix.CreateLookAt(cameraPos, Vector3.Zero, Vector3.Up);
217                effect.Projection = finalMat;
218                effect.TextureEnabled = true;
219                effect.Texture = tex;
220            }
221            mesh.Draw();
222        }
223    }
224}
Note: See TracBrowser for help on using the repository browser.