source: 2010/23/hniemi/BlockPusher/Blockpusher/Blockpusher/Blockpusher.cs @ 2640

Revision 2640, 8.4 KB checked in by hniemi, 11 years ago (diff)

Tiedostoformaattia muutettu, ja korjatut bugi, että palikoita voi oikeasti työntää...

Kentät myös siirretty hakemistoihin ja hakemisto lisätty projektiin

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using System.IO;
9
10/// <summary>
11/// Blockpusher-game
12///
13/// TODO: clones needed from levels
14/// </summary>
15public class Blockpusher : Game
16{
17    public static readonly int BlockSize = 20;
18
19    private readonly Color playerColor = Color.Blue;
20    private readonly Color satisfyColor = Color.Green;
21    private readonly Color unsatisfyColor = Color.Red;
22
23    private int currentLevelIndex = 0;
24    private BlockLevel currentLevel;
25    private List<BlockLevel> levels = new List<BlockLevel>();
26
27    private bool gameSaved = false;
28    private IList<string> savedLevel;
29
30    private List<String> testLevel = new List<string>(new String[]
31                                 {"xxxxxxxxx",
32                                  "x  x  xmx",
33                                  "xb p  xbx",
34                                  "xm x    x",
35                                  "x  xxxxxx",
36                                  "x      xx",
37                                  "xxxxxxxxx"});
38
39    /// <summary>
40    /// Starts the game
41    /// </summary>
42    public override void Begin()
43    {
44        Menu();
45        LoadLevels();
46    }
47
48    /// <summary>
49    /// Starts new game
50    /// </summary>
51    public void NewGame(int levelIndex) 
52    {
53        ClearAll();
54        currentLevelIndex = levelIndex;
55        currentLevel = levels[levelIndex].Clone();
56        currentLevel.Victory += VictorySplash;
57        currentLevel.AddToGame();
58        SetControls();
59    }
60
61    /// <summary>
62    /// Loads levels from directory
63    /// </summary>
64    /// <param name="directory">Not in use</param>
65    public void LoadLevels(string directory=@"Data\Levels")
66    {
67        //TODO: Tee lukeminen valmiiksi
68
69        IEnumerable<string> folders = Directory.EnumerateDirectories(directory,"*");
70
71        foreach (string s in folders)
72        {
73            //Exludes hidden folder (with . before name)
74            if (s.Length != 0 && s[s.LastIndexOf('\\')+1] != '.')
75            {
76                //MessageDisplay.Add(s);
77                LoadLevels(s);
78            }
79        }
80
81        IEnumerable<string> files = Directory.EnumerateFiles(directory, "*");
82        foreach (string file in files)
83        {
84            BlockLevel level = new BlockLevel(this);
85            level.CreateField(ReadFile(file));
86
87            //level.Name = file.Substring(file.LastIndexOf('\\')+1, file.LastIndexOf('.') - file.LastIndexOf('\\')-1);
88            levels.Add(level);
89        }
90    }
91
92    #region Menu
93    /// <summary>
94    /// Creates startmenu for game
95    /// </summary>
96    public void Menu()
97    {
98        int labelHeighth = 50;
99
100        ClearAll();
101        IsMouseVisible = true;
102        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
103        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
104
105        List<Tuple<string, Action>> labels = new List<Tuple<string, Action>>();
106        if (gameSaved) labels.Add(new Tuple<string, Action>("Continue", ContinueGame));
107        labels.Add(new Tuple<string, Action>("New game", delegate { LevelSelectionMenu(); }));
108        labels.Add(new Tuple<string, Action>("Quit?", ConfirmExit));
109
110        for (int i = 0; i < labels.Count; i++)
111        {
112            PushButton button = new PushButton(200, labelHeighth);
113            button.Text = labels[i].Item1;
114            button.Y = -(i * labelHeighth);
115            button.Clicked += labels[i].Item2;
116            Add(button);
117        }
118    }
119
120    /// <summary>
121    /// Asks if you want to go to main menu or continue playing
122    /// </summary>
123    public void ConfirmMenu()
124    {
125        ClearControls();
126        MultiSelectWindow w = new MultiSelectWindow("Back to menu?", new String[] { "Yes", "No!" });
127        w.AddItemHandler(0, delegate { MakeContinuable(); Menu(); });
128        w.AddItemHandler(1, delegate { SetControls(); w.Close(); });
129        Add(w);
130    }
131
132    /// <summary>
133    /// Shows "Victory"-label
134    /// </summary>
135    public void VictorySplash() 
136    {
137        Label victory = new Label("Victory!");
138        victory.Color = Color.DarkCyan;
139        victory.TextColor = Color.Fuchsia;
140
141        Add(victory);
142
143        Timer.SingleShot(1, Victory);
144    }
145
146    /// <summary>
147    /// Eventhandler for victory
148    /// </summary>
149    public void Victory()
150    {
151        IsMouseVisible = true;
152        MultiSelectWindow w = new MultiSelectWindow("Conratulations, you cleared level with "+ currentLevel.Moves +" moves! Do you want to:", new String[] { "Retry", "Next Level", "Main menu" });
153        w.AddItemHandler(0, delegate { NewGame(currentLevelIndex); });
154        w.AddItemHandler(1, delegate { NewGame((currentLevelIndex+1) % levels.Count); });
155        w.AddItemHandler(2, Menu);
156       
157        Add(w);
158    }
159
160    /// <summary>
161    /// Shows levelselection menu
162    /// </summary>
163    public void LevelSelectionMenu(int current = 0)
164    {
165        ClearAll();
166        int buttonheight = 50;
167
168        Label topic = new Label("Levels");
169
170        Widget buttons = new Widget(new HorizontalLayout());
171        Widget bottomButtons = new Widget(new HorizontalLayout());
172
173        PushButton previous = new PushButton(150, buttonheight, "Previous");
174        buttons.Add(previous);
175
176        PushButton next = new PushButton(150, buttonheight, "Next");
177        buttons.Add(next);
178
179        Label name = new Label(levels[current].Name);
180
181        PushButton back = new PushButton(150, buttonheight, "Back");
182        bottomButtons.Add(back);
183
184        PushButton play = new PushButton(150, buttonheight, "Select");
185        bottomButtons.Add(play);
186
187        topic.Top = Screen.Top;
188        buttons.Top = topic.Bottom;
189        name.Y = buttons.Bottom - (name.Height / 2);
190
191        bottomButtons.Bottom = Screen.Bottom;
192       
193        Add(topic);
194        Add(buttons);
195        Add(name);
196        Add(bottomButtons);
197
198        levels[current].AddToGame();
199
200        previous.Clicked += delegate { LevelSelectionMenu((current-1 + levels.Count) % levels.Count); };
201        next.Clicked += delegate { LevelSelectionMenu((current + 1) % levels.Count); };
202        play.Clicked += delegate { NewGame(current); };
203        back.Clicked += Menu;
204
205    }
206    #endregion
207
208    /// <summary>
209    /// Continues game from current save
210    /// </summary>
211    public void ContinueGame() 
212    {
213        ClearAll();
214        currentLevel = new BlockLevel(this);
215        currentLevel.Victory += VictorySplash;
216
217        currentLevel.CreateField(ReadFile("Data/CurrentSave.txt"));
218        currentLevel.AddToGame();
219        SetControls();
220    }
221
222    /// <summary>
223    /// Saves game
224    /// </summary>
225    public void MakeContinuable()
226    {
227        gameSaved = true;
228        savedLevel = currentLevel.CurrentState();
229
230        File.WriteAllLines("Data/CurrentSave.txt", savedLevel);
231    }
232
233    /// <summary>
234    /// Reads lines from file
235    /// </summary>
236    /// <param name="file">Sourcefile</param>
237    public List<String> ReadFile(string file) 
238    {
239        List<String> lines = new List<string>();
240        try
241        {
242            using (StreamReader sr = new StreamReader(file))
243            {
244                String line;
245                while ((line = sr.ReadLine()) != null)
246                {
247                    lines.Add(line);
248                }
249            }
250        }
251        catch (Exception e)
252        {
253            return null;
254        }
255        return lines;
256    }
257
258    /// <summary>
259    /// Moves player in current level
260    /// </summary>
261    /// <param name="xMov">X-movement</param>
262    /// <param name="yMov">Y-movement</param>
263    public void MovePlayer(int xMov, int yMov)
264    {
265        currentLevel.MovePlayer(xMov, yMov);
266    }
267
268    /// <summary>
269    /// Sets controllisteners for keyboard
270    /// </summary>
271    public void SetControls() 
272    {
273        Keyboard.Listen(Key.Up, ButtonState.Pressed, MovePlayer, null, 0, -1);
274        Keyboard.Listen(Key.Down, ButtonState.Pressed, MovePlayer, null, 0, 1);
275        Keyboard.Listen(Key.Left, ButtonState.Pressed, MovePlayer, null, -1, 0);
276        Keyboard.Listen(Key.Right, ButtonState.Pressed, MovePlayer, null, 1, 0);
277
278        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmMenu, "Lopeta peli");
279    }
280}
Note: See TracBrowser for help on using the repository browser.