root/Code/oMaE/oMaE/MiniGames/Wave1D.cs @ 108

Revision 108, 4.3 KB (checked in by jwentworth, 2 years ago)

New minigame

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Graphics;
8using Microsoft.Xna.Framework.Input;
9using Microsoft.Xna.Framework.Storage;
10using Microsoft.Xna.Framework.Content;
11using oMaE.Widgets;
12
13
14namespace oMaE.MiniGames
15{
16    using Overworld;
17
18    class Wave1D : MiniGame
19    {
20        Vector2[] waveFunction; // <- I'm with stupid.
21        Vector2[] delayedWaveFunction;
22
23        int numPts;
24        int hBox, vBox;
25        float width;
26
27        float csq; //Square of the wave speed
28        float gamma; //Damping factor
29
30        public override void Initialize()
31        {
32            numPts = 200;
33            hBox = 50;
34            width = 700.0f;
35            csq = 0.01f;
36            gamma = 0.01f;
37
38            waveFunction = new Vector2[numPts];
39            delayedWaveFunction = new Vector2[numPts];
40            for (int i = 0; i < numPts; ++i)
41            {
42                waveFunction[i] = new Vector2(width / (float)numPts * (float)i, 250.0f);
43                delayedWaveFunction[i] = new Vector2(10.0f * (float)i, 250.0f);
44            }
45
46            base.Initialize();
47        }
48
49        public override void Update(GameState gameState)
50        {
51            MouseState mouseStateCurrent = Mouse.GetState();
52            if (mouseStateCurrent.LeftButton == ButtonState.Pressed)
53                waveFunction[0].Y = getInRange(mouseStateCurrent.Y, 175.0f, 325.0f);
54
55            waveUpdate();
56            boxUpdate();
57
58            base.Update();
59        }
60
61        private float getInRange(float n, float min, float max)
62        {
63            return Math.Min(max, Math.Max(min, n));
64        }
65
66        private void waveUpdate()
67        {
68            for (int i = 1; i < numPts - 1; ++i)
69            {
70                float x = waveFunction[i].X;
71                float h1 = waveFunction[i].Y;
72                float h0 = delayedWaveFunction[i].Y;
73                float laplacian = waveFunction[i - 1].Y - 2.0f * waveFunction[i].Y + waveFunction[i + 1].Y;
74                // Ladies and gentlemen, the 1D wave equation.
75                float h = 2.0f * h1 - h0 + csq * laplacian - gamma * (h1 - h0);
76                // ... and this is why it's called "delayed"
77                delayedWaveFunction[i] = waveFunction[i];
78                waveFunction[i] = new Vector2(x, h);
79            }
80            //Free boundary condition on right
81            waveFunction[numPts - 1] = waveFunction[numPts - 2];
82        }
83
84        private void boxUpdate()
85        {
86            if (hBox == 50 && waveFunction[numPts - 1].Y < 50.0f)
87                vBox = 1; // We've hit the box!
88
89            if (vBox != 0)
90                vBox += 1;
91
92            hBox += vBox;
93
94            if (hBox > 475)
95            {
96                hBox = 475;
97                vBox = 0;
98            }
99        }
100
101        public override bool Correct
102        {
103            get
104            {
105                return hBox == 475;
106            }
107        }
108
109        public override void Draw(Screen2D screen)
110        {
111            screen.FillRectangle(new Rectangle(0, 0, 700, 500), Color.White);
112            screen.FillRectangle(new Rectangle(675, hBox, 25, 25), Color.Gold);
113            for (int i = 0; i < numPts - 1; ++i)
114                screen.DrawLine(waveFunction[i], waveFunction[i+1], Color.Black);
115
116            screen.DrawText("Waves carry energy through", new Vector2(710, 60), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
117            screen.DrawText("almost any material.", new Vector2(710, 80), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
118            screen.DrawText("Click to move the left side of", new Vector2(710, 120), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
119            screen.DrawText("the string. Create a wave big", new Vector2(710, 140), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
120            screen.DrawText("enough to knock down the gold", new Vector2(710, 160), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
121            screen.DrawText("box. ", new Vector2(710, 180), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
122
123            base.Draw(screen);
124        }
125    }
126}
Note: See TracBrowser for help on using the browser.