root/Code/oMaE/oMaE/MiniGames/FSM.cs @ 103

Revision 103, 7.6 KB (checked in by acarter, 2 years ago)

Finished basic structure for FSM 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.Content;
8using Microsoft.Xna.Framework.GamerServices;
9using Microsoft.Xna.Framework.Graphics;
10using Microsoft.Xna.Framework.Input;
11using Microsoft.Xna.Framework.Media;
12using oMaE.Widgets;
13
14namespace oMaE.MiniGames
15{
16    /// <summary>
17    /// The finite state machine minigame
18    /// </summary>
19    public class FSM : MiniGame
20    {
21        private int States = 3;
22        private class Transition : GameObject
23        {
24            public Color Color;
25            public Vector2 Location;
26            public CompassSelector NextDirection;
27            public DigitSelect NextState;
28            private int states;
29            public Transition(Color Color, Vector2 Location, int states)
30            {
31                this.Color = Color;
32                this.Location = Location;
33                this.states = states;
34            }
35            public override void Initialize()
36            {
37                NextDirection = new CompassSelector(new Rectangle((int)Location.X + 75, (int)Location.Y, 50, 50));
38                children.Add(NextDirection);
39                NextState = new DigitSelect(new Rectangle((int)Location.X + 150, (int)Location.Y, 50, 50), states, 0);
40                children.Add(NextState);
41                base.Initialize();
42            }
43            public override void Draw(Screen2D screen)
44            {
45                screen.FillRectangle(new Rectangle((int)Location.X, (int)Location.Y, 50, 50), Color.White);
46                screen.FillRectangle(new Rectangle((int)Location.X + 10, (int)Location.Y + 10, 30, 30), Color);
47                base.Draw();
48            }
49        }
50
51        private String[] GRID = new String[]
52        {
53            "001",
54            "2X1",
55            "X!2",
56        };
57        private Point start = new Point(0, 0);
58        private Point current = new Point(0, 0);
59        private long Timer = 0;
60        private static long DELAY = 3000;
61        private List<Vector3> Path = new List<Vector3>();
62        private int currentEdge { get { return (int) (Timer / DELAY); } }
63        private int percentAcross { get { return (int) (Timer % DELAY); } }
64        private Color[] colors = new Color[]{Color.Red, Color.DarkGreen, Color.Blue};
65        private Transition[][] transitions;
66        public FSM() { }
67        public override void Initialize()
68        {
69            transitions = new Transition[States][];
70            for(int i = 0; i < States; ++i)
71            {
72                transitions[i] = new Transition[colors.Length];
73                for (int j = 0; j < colors.Length; ++j)
74                {
75                    transitions[i][j] = new Transition(colors[j], new Vector2(100 + 250 * i, 50 + 75 * j), States);
76                    children.Add(transitions[i][j]);
77                }
78            }
79            Path.Add(Vector3.Zero);
80            base.Initialize();
81        }
82        public override void Update(GameState gameState)
83        {
84            Timer += gameState.EllapsedMilliseconds;
85            if (Timer >= (Path.Count - 1) * DELAY)
86            {
87                Timer = (Path.Count - 1) * DELAY;
88                Timer = DELAY * Path.FindIndex(o => o == Path[currentEdge]);
89            }
90            base.Update(gameState);
91        }
92        public override bool Correct
93        {
94            get
95            {
96                Path = new List<Vector3>();
97                Vector3 loc = new Vector3(start.X, start.Y, 0);
98                while (true)
99                {
100                    Path.Add(loc);
101                    if (loc.Y < 0 || loc.Y >= GRID.Length || loc.X < 0 || loc.X >= GRID[(int)loc.Y].Length)
102                        return false;
103                    switch (GRID[(int)loc.Y][(int)loc.X])
104                    {
105                        case '!':
106                            return true;
107                        case 'X':
108                            return false;
109                        default:
110                            int val = GRID[(int)loc.Y][(int)loc.X] - '0';
111                            switch (transitions[(int)loc.Z][val].NextDirection.Value)
112                            {
113                                case CompassSelector.Direction.NORTH:
114                                    loc = new Vector3(loc.X, loc.Y - 1, transitions[(int)loc.Z][val].NextState.Value);
115                                    break;
116                                case CompassSelector.Direction.SOUTH:
117                                    loc = new Vector3(loc.X, loc.Y + 1, transitions[(int)loc.Z][val].NextState.Value);
118                                    break;
119                                case CompassSelector.Direction.EAST:
120                                    loc = new Vector3(loc.X + 1, loc.Y, transitions[(int)loc.Z][val].NextState.Value);
121                                    break;
122                                case CompassSelector.Direction.WEST:
123                                    loc = new Vector3(loc.X - 1, loc.Y, transitions[(int)loc.Z][val].NextState.Value);
124                                    break;
125                            }
126                            break;
127                    }
128                    if (Path.Contains(loc))
129                    {
130                        Path.Add(loc);
131                        return false;
132                    }
133                }
134            }
135        }
136        public override void Draw(Screen2D screen)
137        {
138            screen.FillRectangle(new Rectangle(100, 300, 125, 125), Color.Black);
139            for (int i = 0; i < GRID.Length; ++i)
140            {
141                for (int j = 0; j < GRID[i].Length; ++j)
142                {
143                    Color square = Color.Black;
144                    switch (GRID[i][j])
145                    {
146                        case '0':
147                            square = colors[0];
148                            break;
149                        case '1':
150                            square = colors[1];
151                            break;
152                        case '2':
153                            square = colors[2];
154                            break;
155                        case '!':
156                            square = Color.White;
157                            break;
158                        default:
159                            square = Color.Black;
160                            break;
161                    }
162                    screen.FillRectangle(new Rectangle(125 + 25 * j, 325 + 25 * i, 25, 25), square);
163                }
164            }
165            screen.DrawText("0", new Vector2(137.5f + 25 * start.X, 337.5f + 25 * start.Y), TextHorizontal.CENTERED, TextVertical.CENTERED, Color.White);
166            if (percentAcross != 0)
167            {
168                Vector2 loc = new Vector2(137.5f + 25 * (percentAcross * Path[currentEdge+1].X + Path[currentEdge].X * (DELAY - percentAcross)) / DELAY,
169                                337.5f + 25 * (percentAcross * Path[currentEdge+1].Y + Path[currentEdge].Y * (DELAY - percentAcross)) / DELAY);
170                screen.DrawText(Path[currentEdge].Z.ToString(), loc, TextHorizontal.CENTERED, TextVertical.CENTERED, Color.Black);
171            }
172            else
173            {
174                screen.DrawText(Path[currentEdge].Z.ToString(),
175                        new Vector2(137.5f + 25 * Path[currentEdge].X, 337.5f + 25 * Path[currentEdge].Y),
176                        TextHorizontal.CENTERED, TextVertical.CENTERED, Color.Black);
177            }
178            base.Draw(screen);
179        }
180    }
181}
Note: See TracBrowser for help on using the browser.