source: 2015/26/MikkoL/JRPG/JRPG/JRPG/MainGame.cs @ 6416

Revision 6416, 20.9 KB checked in by mijoliim, 5 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.CSharp;
9using Microsoft.Xna.Framework;
10using Microsoft.Xna.Framework.Graphics;
11
12public class JRPG : PhysicsGame
13{
14    public static JRPG Game { get; set; }
15
16    public static BattleView BattleView { get; set; }
17
18    public Player Player { get; set; }
19
20    public SpriteFont MainFont { get; set; }
21
22    public bool UseShaders = false;
23    bool RandomEncounterAnim = false;
24    float WarpAmount = 0.0f;
25    double FadeSpeed = 0.5;
26    Effect Shader;
27    Effect Twirl;
28    public Effect Wave;
29    SpriteBatch spriteBatch;
30    RenderTarget2D renderTarget;
31
32    Widget Fade { get; set; }
33
34    public override void Begin()
35    {
36        SoundEffect.MasterVolume = 0.4;
37        MediaPlayer.Volume = 0.3;
38
39        MainFont = Content.Load<SpriteFont>("MainFont");
40
41        spriteBatch = new SpriteBatch(GraphicsDevice);
42        Shader = Content.Load<Effect>("Shader");
43        Twirl = Content.Load<Effect>("Twirl");
44        Wave = Content.Load<Effect>("Wave");
45
46        Game = this;
47
48        Window.Width = GameValues.SCREEN_WIDTH;
49        Window.Height = GameValues.SCREEN_HEIGHT;
50
51        SmoothTextures = false;
52        IsMouseVisible = true;
53
54        LoadTitleScreen();
55    }
56
57    void LoadTitleScreen()
58    {
59        MediaPlayer.Play("Music//PresentingV");
60
61        _Background Background = new _Background(JRPG.Game.Content.Load<Texture2D>("Space"));
62        JRPG.Game.Add(Background, -1);
63
64        Widget TitleHeader = new Widget(Images.TitleHeader);
65        TitleHeader.Size = new Vector(Images.TitleHeader.Width, Images.TitleHeader.Height);
66        TitleHeader.Position = new Vector(0, 200);
67        Add(TitleHeader);
68
69        TextMenu StartMenu = new TextMenu();
70        StartMenu.SetTextBases(MainFont, TextAlignment.Center);
71        StartMenu.AddMenuElement("Start Game");
72        StartMenu.AddMenuElement("Quit");
73        StartMenu.Offset = 40;
74        StartMenu.Position = new Vector(0, -100);
75        StartMenu.ActionWhenSelected += delegate(int selection)
76        {
77            switch (selection)
78            {
79                case 0:
80                    FadeMusicOut();
81                    LoadGame();
82                    Background.Destroy();
83                    TitleHeader.Destroy();
84                    break;
85                case 1:
86                    System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=e9ixL-aVRCI");
87                    Exit();
88                    break;
89            }
90        };
91
92        StartMenu.LoadMenuElements();
93    }
94
95    void Ending()
96    {
97        FadeMusicIn("Music//Sensual");
98
99        string Text = "\"Nuorten peliohjelmointikurssi was a mistake\" \n                             - Antti-Jussi Lakanen, 2017";
100        BetterLabel EndSlate = new BetterLabel(MainFont, Vector.Zero, Text, TextAlignment.Center);
101        EndSlate.BorderType = TextBorderType.Thin;
102        EndSlate.IsFlashing = true;
103        Timer.SingleShot(1,
104            delegate
105            {
106                Add(EndSlate);
107            });
108
109        Gravity = new Vector(0, -200);
110
111        Timer AJParticleGen = new Timer();
112        AJParticleGen.Interval = 0.05;
113        AJParticleGen.Timeout +=
114            delegate
115            {
116                Particle_AJ();
117            };
118        AJParticleGen.Start();
119    }
120
121    void Particle_AJ()
122    {
123        PhysicsObject AJ = new PhysicsObject(LoadImage("aj2"));
124        AJ.Size = new Vector(AJ.Image.Width, AJ.Image.Height);
125        AJ.Y = Screen.TopSafe + AJ.Height / 2 + RandomGen.NextDouble(0, AJ.Height*3);
126        AJ.X = RandomGen.NextDouble(Screen.LeftSafe - AJ.Width / 2, Screen.RightSafe + AJ.Width / 2);
127        AJ.Position += Camera.Position;
128        AJ.MaximumLifetime = TimeSpan.FromSeconds(10);
129        Add(AJ);
130    }
131
132    void LoadGame()
133    {
134        OverworldView.LoadOverworldView("00");
135        Level.Size = OverworldView.CurrentMap.Size;
136        Level.Background.Color = Jypeli.Color.FromHexCode("000000");
137
138        LoadOWPlayer(new Vector(3, 3));
139        LoadOWControlsKeyboard();
140        LoadOWControlsXboxController();
141
142        CheckWhereCanMove();
143
144        Camera.Follow(Player);
145        Camera.ZoomFactor = 1.0f;
146        Camera.StayInLevel = true;
147    }
148
149    public void LoadOWPlayer(Vector PositionInTiles)
150    {
151        Player = new Player(new Vector(28, 40));
152        Player.Position = PositionInTiles * 40 + new Vector(20, 30);
153        Player.PositionInTiles = PositionInTiles;
154        Player.Color = Jypeli.Color.Blue;
155        Add(Player);
156    }
157
158    #region Controls/Movement
159
160    public void LoadOWControlsKeyboard()
161    {
162        Keyboard.Listen(Key.Delete, ButtonState.Pressed, delegate
163        {
164            renderTarget = new RenderTarget2D(GraphicsDevice,
165                    GraphicsDevice.PresentationParameters.BackBufferWidth,
166                    GraphicsDevice.PresentationParameters.BackBufferHeight);
167        }, null);
168        Keyboard.Listen(Key.Insert, ButtonState.Pressed, delegate {
169            UseShaders = !UseShaders;
170        }, null);
171        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
172
173        Keyboard.Listen(Key.Left, ButtonState.Down, delegate { if(Keyboard.GetKeyState(Key.LeftShift) != ButtonState.Down) MoveLeft(GameValues.TILE_SIZE); }, null);
174        Keyboard.Listen(Key.Right, ButtonState.Down, delegate { if (Keyboard.GetKeyState(Key.LeftShift) != ButtonState.Down) MoveRight(GameValues.TILE_SIZE); }, null);
175        Keyboard.Listen(Key.Up, ButtonState.Down, delegate { if (Keyboard.GetKeyState(Key.LeftShift) != ButtonState.Down) MoveUp(GameValues.TILE_SIZE); }, null);
176        Keyboard.Listen(Key.Down, ButtonState.Down, delegate { if (Keyboard.GetKeyState(Key.LeftShift) != ButtonState.Down) MoveDown(GameValues.TILE_SIZE); }, null);
177
178        Keyboard.Listen(Key.Left, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Left; }, null);
179        Keyboard.Listen(Key.Right, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Right; }, null);
180        Keyboard.Listen(Key.Up, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Up; }, null);
181        Keyboard.Listen(Key.Down, ButtonState.Pressed, delegate {Movement.FacingDir = Movement.Direction.Down; }, null);
182
183
184        Keyboard.Listen(Key.PageDown, ButtonState.Pressed, FadeOut, null);
185        Keyboard.Listen(Key.PageUp, ButtonState.Pressed, FadeIn, null);
186    }
187    public void LoadOWControlsXboxController()
188    {
189        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, delegate { if (ControllerOne.GetButtonState(Button.LeftShoulder) != ButtonState.Down && ControllerOne.GetButtonState(Button.RightShoulder) != ButtonState.Down) MoveLeft(GameValues.TILE_SIZE); }, null);
190        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, delegate { if (ControllerOne.GetButtonState(Button.LeftShoulder) != ButtonState.Down && ControllerOne.GetButtonState(Button.RightShoulder) != ButtonState.Down) MoveRight(GameValues.TILE_SIZE); }, null);
191        ControllerOne.Listen(Button.DPadUp, ButtonState.Down, delegate { if (ControllerOne.GetButtonState(Button.LeftShoulder) != ButtonState.Down && ControllerOne.GetButtonState(Button.RightShoulder) != ButtonState.Down) MoveUp(GameValues.TILE_SIZE); }, null);
192        ControllerOne.Listen(Button.DPadDown, ButtonState.Down, delegate { if (ControllerOne.GetButtonState(Button.LeftShoulder) != ButtonState.Down && ControllerOne.GetButtonState(Button.RightShoulder) != ButtonState.Down) MoveDown(GameValues.TILE_SIZE); }, null);
193
194        ControllerOne.Listen(Button.DPadLeft, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Left; }, null);
195        ControllerOne.Listen(Button.DPadRight, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Right; }, null);
196        ControllerOne.Listen(Button.DPadUp, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Up; }, null);
197        ControllerOne.Listen(Button.DPadDown, ButtonState.Pressed, delegate { Movement.FacingDir = Movement.Direction.Down; }, null);
198    }
199
200    void MoveLeft(double Distance)
201    {
202        SetAnimations();
203
204        if (Keyboard.GetKeyState(Key.Right) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Left
205            || CheckIfAnotherArrowKeyIsDown(Key.Left, Key.Right) && Movement.FacingDir == Movement.Direction.Left
206            || !CheckIfAnotherArrowKeyIsDown(Key.Left) && Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
207        {
208            if (Movement.CanMoveLeft && Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
209            {
210                Player.Move(new Vector(-Distance, 0), GameValues.MOVE_SPEED);
211            }
212        }
213    }
214    void MoveRight(double Distance)
215    {
216        SetAnimations();
217
218        if (Keyboard.GetKeyState(Key.Left) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Right
219            || CheckIfAnotherArrowKeyIsDown(Key.Right, Key.Left) && Movement.FacingDir == Movement.Direction.Right
220            || !CheckIfAnotherArrowKeyIsDown(Key.Right) && Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
221        {
222            if (Movement.CanMoveRight)
223            {
224                Player.Move(new Vector(Distance, 0), GameValues.MOVE_SPEED);
225            }
226        }
227    }
228    void MoveUp(double Distance)
229    {
230        SetAnimations();
231
232        if (Keyboard.GetKeyState(Key.Down) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Up
233            || CheckIfAnotherArrowKeyIsDown(Key.Up, Key.Down) && Movement.FacingDir == Movement.Direction.Up
234            || !CheckIfAnotherArrowKeyIsDown(Key.Up) && Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
235        {
236            if (Movement.CanMoveUp)
237            {
238                Player.Move(new Vector(0, Distance), GameValues.MOVE_SPEED);
239            }
240        }
241    }
242    void MoveDown(double Distance)
243    {
244        SetAnimations();
245
246        if (Keyboard.GetKeyState(Key.Up) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Down
247            || CheckIfAnotherArrowKeyIsDown(Key.Down, Key.Up) && Movement.FacingDir == Movement.Direction.Down
248            || !CheckIfAnotherArrowKeyIsDown(Key.Down) && Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
249        {
250            if (Movement.CanMoveDown)
251            {
252                Player.Move(new Vector(0, -Distance), GameValues.MOVE_SPEED);;
253            }
254        }
255    }
256
257    public void CheckWhereCanMove()
258    {
259        Tile LeftTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Math.Max(Player.PositionInTiles.X - 1,0),(int)(Player.PositionInTiles.Y));
260        Tile RightTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Math.Min(Player.PositionInTiles.X + 1, OverworldView.CurrentCollisionMap.CollisionMapArray.GetLength(0) - 1) , (int)Player.PositionInTiles.Y);
261        Tile TopTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Player.PositionInTiles.X, (int)Math.Min(Player.PositionInTiles.Y + 1, OverworldView.CurrentCollisionMap.CollisionMapArray.GetLength(1) - 1));     
262        Tile BottomTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Player.PositionInTiles.X, (int)Math.Max(Player.PositionInTiles.Y - 1, 0));
263
264        if (LeftTile.IsWalkable) Movement.CanMoveLeft = true;
265        else Movement.CanMoveLeft = false;
266        if (RightTile.IsWalkable) Movement.CanMoveRight = true;
267        else Movement.CanMoveRight = false;
268        if (TopTile.IsWalkable) Movement.CanMoveUp = true;
269        else Movement.CanMoveUp = false;
270        if (BottomTile.IsWalkable) Movement.CanMoveDown = true;
271        else Movement.CanMoveDown = false;
272    }
273
274    bool CheckIfAnotherArrowKeyIsDown(Key Key)
275    {
276        if (Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
277        {
278            if (Key != Key.Left) return true;
279        }
280        if (Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
281        {
282            if (Key != Key.Right) return true;
283        }
284        if (Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
285        {
286            if (Key != Key.Up) return true;
287        }
288        if (Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
289        {
290            if (Key != Key.Down) return true;
291        }
292
293        return false;
294    }
295    bool CheckIfAnotherArrowKeyIsDown(Key Key, Key Key2)
296    {
297        if (Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
298        {
299            if (Key != Key.Left && Key2 != Key.Left) return true;
300        }
301        if (Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
302        {
303            if (Key != Key.Right && Key2 != Key.Right) return true;
304        }
305        if (Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
306        {
307            if (Key != Key.Up && Key2 != Key.Up) return true;
308        }
309        if (Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
310        {
311            if (Key != Key.Down && Key2 != Key.Down) return true;
312        }
313
314        return false;
315    }
316
317    #endregion
318
319    public void SetAnimations()
320    {
321        if (Movement.FacingDir == Movement.Direction.Up && JRPG.Game.Keyboard.GetKeyState(Key.Up) == ButtonState.Pressed && !Movement.IsMoving)
322        {
323            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingUp);
324            Player.Animation.Start();
325        }
326        else if (Movement.FacingDir == Movement.Direction.Down && JRPG.Game.Keyboard.GetKeyState(Key.Down) == ButtonState.Pressed && !Movement.IsMoving)
327        {
328            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingDown);
329            Player.Animation.Start();
330        }
331        else if (Movement.FacingDir == Movement.Direction.Left && JRPG.Game.Keyboard.GetKeyState(Key.Left) == ButtonState.Pressed && !Movement.IsMoving)
332        {
333            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingLeft);
334            Player.Animation.Start();
335        }
336        else if (Movement.FacingDir == Movement.Direction.Right && JRPG.Game.Keyboard.GetKeyState(Key.Right) == ButtonState.Pressed && !Movement.IsMoving)
337        {
338            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingRight);
339            Player.Animation.Start();
340        }
341        else if (Movement.FacingDir == Movement.Direction.Up && JRPG.Game.Keyboard.GetKeyState(Key.Up) == ButtonState.Down && !Movement.IsMoving)
342        {
343            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingUp);
344            Player.Animation.Start();
345        }
346        else if (Movement.FacingDir == Movement.Direction.Down && JRPG.Game.Keyboard.GetKeyState(Key.Down) == ButtonState.Down && !Movement.IsMoving)
347        {
348            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingDown);
349            Player.Animation.Start();
350        }
351        else if (Movement.FacingDir == Movement.Direction.Left && JRPG.Game.Keyboard.GetKeyState(Key.Left) == ButtonState.Down && !Movement.IsMoving)
352        {
353            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingLeft);
354            Player.Animation.Start();
355        }
356        else if (Movement.FacingDir == Movement.Direction.Right && JRPG.Game.Keyboard.GetKeyState(Key.Right) == ButtonState.Down && !Movement.IsMoving)
357        {
358            Player.Animation = new Animation(Images.Characters.Overworld.Sonic_WalkingRight);
359            Player.Animation.Start();
360        }
361        else if (Movement.FacingDir == Movement.Direction.Up && !Movement.IsMoving)
362        {
363            Player.Animation = null;
364            Player.Image = Images.Characters.Overworld.Sonic_Standing_Up;
365        }
366        else if (Movement.FacingDir == Movement.Direction.Down && !Movement.IsMoving)
367        {
368            Player.Animation = null;
369            Player.Image = Images.Characters.Overworld.Sonic_Standing_Down;
370        }
371        else if (Movement.FacingDir == Movement.Direction.Left && !Movement.IsMoving)
372        {
373            Player.Animation = null;
374            Player.Image = Images.Characters.Overworld.Sonic_Standing_Left;
375        }
376        else if (Movement.FacingDir == Movement.Direction.Right && !Movement.IsMoving)
377        {
378            Player.Animation = null;
379            Player.Image = Images.Characters.Overworld.Sonic_Standing_Right;
380        }
381        /*
382        if (Player.Animation.FPS != 5)
383        {
384            Player.Animation.FPS = 5;
385        }*/
386    }
387
388    public void FadeOut()
389    {
390        if (Fade != null && Fade.IsAddedToGame) Fade.Destroy();
391
392        Fade = new Widget(Screen.WidthSafe, Screen.HeightSafe);
393        Fade.Color = Jypeli.Color.Transparent;
394        Add(Fade);
395        Fade.FadeColorTo(Jypeli.Color.Black, FadeSpeed);
396    }
397    public void FadeIn()
398    {
399        if (Fade != null && Fade.IsAddedToGame) Fade.Destroy();
400
401        Fade = new Widget(Screen.WidthSafe, Screen.HeightSafe);
402        Fade.Color = Jypeli.Color.Black;
403        Add(Fade);
404        Fade.FadeColorTo(Jypeli.Color.Transparent, FadeSpeed);
405    }
406
407    public void FadeMusicOut()
408    {
409        double CurrentVolume = MediaPlayer.Volume;
410
411        Timer Fade = new Timer();
412        Fade.Interval = 0.001;
413        Fade.Timeout += delegate
414        {
415            MediaPlayer.Volume -= CurrentVolume / 500;
416
417            if (MediaPlayer.Volume <= 0)
418            {
419                MediaPlayer.Stop();
420                MediaPlayer.Volume = CurrentVolume;
421                Fade.Stop();
422            }
423        };
424        Fade.Start();
425    }
426    public void FadeMusicIn(string Music)
427    {
428        MediaPlayer.Play(Music);
429        double TargetVolume = MediaPlayer.Volume;
430
431        Timer Fade = new Timer();
432        Fade.Interval = 0.001;
433        Fade.Timeout += delegate
434        {
435            MediaPlayer.Volume += TargetVolume / 500;
436
437            if (MediaPlayer.Volume >= TargetVolume)
438            {
439                MediaPlayer.Volume = TargetVolume;
440                Fade.Stop();
441            }
442        };
443        Fade.Start();
444    }
445
446    public void RandomEncounterAnimation(Action AfterAnimation, Action OnFadingOut)
447    {
448        if (!RandomEncounterAnim)
449        {
450            renderTarget = new RenderTarget2D(GraphicsDevice,
451                    GraphicsDevice.PresentationParameters.BackBufferWidth,
452                    GraphicsDevice.PresentationParameters.BackBufferHeight);
453
454            RandomEncounterAnim = true;
455            SoundEffects.Battle.Encounter.Play();
456
457            Timer.SingleShot(1, delegate
458            {
459                FadeOut();
460                if (OnFadingOut != null) OnFadingOut.Invoke();
461                Timer.SingleShot(FadeSpeed + 1, delegate
462                {
463                    RandomEncounterAnim = false;
464
465                    Camera.ZoomFactor = 1.0f;
466                    UseShaders = false;
467                    WarpAmount = 0.0f;
468
469                    FadeIn();
470
471                    Camera.StayInLevel = false;
472                    Camera.Position = Player.Position;
473                   
474                    if (AfterAnimation != null) AfterAnimation.Invoke();
475                });
476            });
477        }
478       
479    }
480
481    protected override void Update(Time time)
482    {
483        base.Update(time);
484
485        if (Flags.InBattle)
486        {
487            BattleView.Update(time);
488        }
489
490        if (RandomEncounterAnim)
491        {
492            float deltaTime = (float)Time.SinceLastUpdate.TotalSeconds;
493            WarpAmount += deltaTime * 3;
494
495            Camera.ZoomFactor += deltaTime * 3;
496        }
497    }
498
499    protected override void Draw(GameTime gameTime)
500    {
501        GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.Black);
502
503        if (UseShaders) GraphicsDevice.SetRenderTarget(renderTarget);
504
505        base.Draw(gameTime);
506        if (UseShaders) GraphicsDevice.SetRenderTarget(null);
507
508        if (UseShaders)
509        {
510            GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.Black);
511           
512            spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
513            if (Twirl == Content.Load<Effect>("Twirl"))
514            {
515                Twirl.Parameters["Rotation"].SetValue(new Vector2(WarpAmount, WarpAmount));
516                Twirl.Parameters["CenterRadius"].SetValue(new Vector4(0.5f, 0.5f, 0.5f, 0.5f));
517                Twirl.CurrentTechnique.Passes[0].Apply();
518            }
519            else if (Shader == Content.Load<Effect>("Shader") || Shader == Content.Load<Effect>("Wave"))
520            {
521                Shader.Parameters["parameter1"].SetValue((float)Time.SinceStartOfGame.TotalMilliseconds);
522                Shader.CurrentTechnique.Passes[0].Apply();
523            }
524            spriteBatch.Draw(renderTarget, new Vector2(0, 0), Microsoft.Xna.Framework.Color.White);
525            spriteBatch.End();
526        }
527    }
528}
Note: See TracBrowser for help on using the repository browser.