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

Revision 6415, 17.4 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       
203        if (Keyboard.GetKeyState(Key.Right) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Left
204            || CheckIfAnotherArrowKeyIsDown(Key.Left, Key.Right) && Movement.FacingDir == Movement.Direction.Left
205            || !CheckIfAnotherArrowKeyIsDown(Key.Left) && Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
206        {
207            if (Movement.CanMoveLeft && Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
208            {
209                Player.Move(new Vector(-Distance, 0), GameValues.MOVE_SPEED);
210            }
211        }
212    }
213    void MoveRight(double Distance)
214    {
215        if (Keyboard.GetKeyState(Key.Left) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Right
216            || CheckIfAnotherArrowKeyIsDown(Key.Right, Key.Left) && Movement.FacingDir == Movement.Direction.Right
217            || !CheckIfAnotherArrowKeyIsDown(Key.Right) && Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
218        {
219            if (Movement.CanMoveRight)
220            {
221                Player.Move(new Vector(Distance, 0), GameValues.MOVE_SPEED);
222            }
223        }
224    }
225    void MoveUp(double Distance)
226    {
227        if (Keyboard.GetKeyState(Key.Down) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Up
228            || CheckIfAnotherArrowKeyIsDown(Key.Up, Key.Down) && Movement.FacingDir == Movement.Direction.Up
229            || !CheckIfAnotherArrowKeyIsDown(Key.Up) && Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
230        {
231            if (Movement.CanMoveUp)
232            {
233                Player.Move(new Vector(0, Distance), GameValues.MOVE_SPEED);
234            }
235        }
236    }
237    void MoveDown(double Distance)
238    {
239        if (Keyboard.GetKeyState(Key.Up) != ButtonState.Down && Movement.FacingDir == Movement.Direction.Down
240            || CheckIfAnotherArrowKeyIsDown(Key.Down, Key.Up) && Movement.FacingDir == Movement.Direction.Down
241            || !CheckIfAnotherArrowKeyIsDown(Key.Down) && Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
242        {
243            if (Movement.CanMoveDown)
244            {
245                Player.Move(new Vector(0, -Distance), GameValues.MOVE_SPEED);
246            }
247        }
248    }
249
250    public void CheckWhereCanMove()
251    {
252        Tile LeftTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Math.Max(Player.PositionInTiles.X - 1,0),(int)(Player.PositionInTiles.Y));
253        Tile RightTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Math.Min(Player.PositionInTiles.X + 1, OverworldView.CurrentCollisionMap.CollisionMapArray.GetLength(0) - 1) , (int)Player.PositionInTiles.Y);
254        Tile TopTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Player.PositionInTiles.X, (int)Math.Min(Player.PositionInTiles.Y + 1, OverworldView.CurrentCollisionMap.CollisionMapArray.GetLength(1) - 1));     
255        Tile BottomTile = (Tile)OverworldView.CurrentCollisionMap.CollisionMapArray.GetValue((int)Player.PositionInTiles.X, (int)Math.Max(Player.PositionInTiles.Y - 1, 0));
256
257        if (LeftTile.IsWalkable) Movement.CanMoveLeft = true;
258        else Movement.CanMoveLeft = false;
259        if (RightTile.IsWalkable) Movement.CanMoveRight = true;
260        else Movement.CanMoveRight = false;
261        if (TopTile.IsWalkable) Movement.CanMoveUp = true;
262        else Movement.CanMoveUp = false;
263        if (BottomTile.IsWalkable) Movement.CanMoveDown = true;
264        else Movement.CanMoveDown = false;
265    }
266
267    bool CheckIfAnotherArrowKeyIsDown(Key Key)
268    {
269        if (Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
270        {
271            if (Key != Key.Left) return true;
272        }
273        if (Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
274        {
275            if (Key != Key.Right) return true;
276        }
277        if (Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
278        {
279            if (Key != Key.Up) return true;
280        }
281        if (Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
282        {
283            if (Key != Key.Down) return true;
284        }
285
286        return false;
287    }
288    bool CheckIfAnotherArrowKeyIsDown(Key Key, Key Key2)
289    {
290        if (Keyboard.GetKeyState(Key.Left) == ButtonState.Down)
291        {
292            if (Key != Key.Left && Key2 != Key.Left) return true;
293        }
294        if (Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
295        {
296            if (Key != Key.Right && Key2 != Key.Right) return true;
297        }
298        if (Keyboard.GetKeyState(Key.Up) == ButtonState.Down)
299        {
300            if (Key != Key.Up && Key2 != Key.Up) return true;
301        }
302        if (Keyboard.GetKeyState(Key.Down) == ButtonState.Down)
303        {
304            if (Key != Key.Down && Key2 != Key.Down) return true;
305        }
306
307        return false;
308    }
309
310    #endregion
311
312    public void FadeOut()
313    {
314        if (Fade != null && Fade.IsAddedToGame) Fade.Destroy();
315
316        Fade = new Widget(Screen.WidthSafe, Screen.HeightSafe);
317        Fade.Color = Jypeli.Color.Transparent;
318        Add(Fade);
319        Fade.FadeColorTo(Jypeli.Color.Black, FadeSpeed);
320    }
321    public void FadeIn()
322    {
323        if (Fade != null && Fade.IsAddedToGame) Fade.Destroy();
324
325        Fade = new Widget(Screen.WidthSafe, Screen.HeightSafe);
326        Fade.Color = Jypeli.Color.Black;
327        Add(Fade);
328        Fade.FadeColorTo(Jypeli.Color.Transparent, FadeSpeed);
329    }
330
331    public void FadeMusicOut()
332    {
333        double CurrentVolume = MediaPlayer.Volume;
334
335        Timer Fade = new Timer();
336        Fade.Interval = 0.001;
337        Fade.Timeout += delegate
338        {
339            MediaPlayer.Volume -= CurrentVolume / 500;
340
341            if (MediaPlayer.Volume <= 0)
342            {
343                MediaPlayer.Stop();
344                MediaPlayer.Volume = CurrentVolume;
345                Fade.Stop();
346            }
347        };
348        Fade.Start();
349    }
350    public void FadeMusicIn(string Music)
351    {
352        MediaPlayer.Play(Music);
353        double TargetVolume = MediaPlayer.Volume;
354
355        Timer Fade = new Timer();
356        Fade.Interval = 0.001;
357        Fade.Timeout += delegate
358        {
359            MediaPlayer.Volume += TargetVolume / 500;
360
361            if (MediaPlayer.Volume >= TargetVolume)
362            {
363                MediaPlayer.Volume = TargetVolume;
364                Fade.Stop();
365            }
366        };
367        Fade.Start();
368    }
369
370    public void RandomEncounterAnimation(Action AfterAnimation, Action OnFadingOut)
371    {
372        if (!RandomEncounterAnim)
373        {
374            renderTarget = new RenderTarget2D(GraphicsDevice,
375                    GraphicsDevice.PresentationParameters.BackBufferWidth,
376                    GraphicsDevice.PresentationParameters.BackBufferHeight);
377
378            RandomEncounterAnim = true;
379            SoundEffects.Battle.Encounter.Play();
380
381            Timer.SingleShot(1, delegate
382            {
383                FadeOut();
384                if (OnFadingOut != null) OnFadingOut.Invoke();
385                Timer.SingleShot(FadeSpeed + 1, delegate
386                {
387                    RandomEncounterAnim = false;
388
389                    Camera.ZoomFactor = 1.0f;
390                    UseShaders = false;
391                    WarpAmount = 0.0f;
392
393                    FadeIn();
394
395                    Camera.StayInLevel = false;
396                    Camera.Position = Player.Position;
397                   
398                    if (AfterAnimation != null) AfterAnimation.Invoke();
399                });
400            });
401        }
402       
403    }
404
405    protected override void Update(Time time)
406    {
407        base.Update(time);
408
409        if (Flags.InBattle)
410        {
411            BattleView.Update(time);
412        }
413
414        if (RandomEncounterAnim)
415        {
416            float deltaTime = (float)Time.SinceLastUpdate.TotalSeconds;
417            WarpAmount += deltaTime * 3;
418
419            Camera.ZoomFactor += deltaTime * 3;
420        }
421    }
422
423    protected override void Draw(GameTime gameTime)
424    {
425        GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.Black);
426
427        if (UseShaders) GraphicsDevice.SetRenderTarget(renderTarget);
428
429        base.Draw(gameTime);
430        if (UseShaders) GraphicsDevice.SetRenderTarget(null);
431
432        if (UseShaders)
433        {
434            GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.Black);
435           
436            spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
437            if (Twirl == Content.Load<Effect>("Twirl"))
438            {
439                Twirl.Parameters["Rotation"].SetValue(new Vector2(WarpAmount, WarpAmount));
440                Twirl.Parameters["CenterRadius"].SetValue(new Vector4(0.5f, 0.5f, 0.5f, 0.5f));
441                Twirl.CurrentTechnique.Passes[0].Apply();
442            }
443            else if (Shader == Content.Load<Effect>("Shader") || Shader == Content.Load<Effect>("Wave"))
444            {
445                Shader.Parameters["parameter1"].SetValue((float)Time.SinceStartOfGame.TotalMilliseconds);
446                Shader.CurrentTechnique.Passes[0].Apply();
447            }
448            spriteBatch.Draw(renderTarget, new Vector2(0, 0), Microsoft.Xna.Framework.Color.White);
449            spriteBatch.End();
450        }
451    }
452}
Note: See TracBrowser for help on using the repository browser.