aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.Main/Apps/Breakout.cs
blob: 4e41a14cf556b53e6ab22becf59e2d21257a8d43 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine.WindowManager;

namespace ShiftOS.Main.Apps
{
    public partial class Breakout : UserControl
    {
        bool goLeft = false;
        bool goRight = false;
        int speed = 5;
        float ballX = 5;
        float ballY = 5;
        int rows = 5;
        int col = 8;
        public PictureBox[,] blocks;
        public Breakout()
        {
            InitializeComponent();
            DrawBlocks();
            gameTimer.Start();
            ResetToRest();
        }
        void ResetToRest()
        {
            ball.Location = new Point((int)Math.Round(this.Width / 2d, 0), (int)Math.Round(this.Height / 2d, 0));
            playerPaddle.Location = new Point((int)Math.Round(ClientSize.Width / 2d, 0), playerPaddle.Location.Y);
        }

        private void Pong_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A && playerPaddle.Left > 0) goLeft = true;
            if (e.KeyCode == Keys.D && playerPaddle.Left + playerPaddle.Width < this.Width) goRight = true;
        }

        private void Pong_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A) goLeft = false;
            if (e.KeyCode == Keys.D) goRight = false;
        }

        private void gameTimer_Tick(object sender, EventArgs e)
        {
            ball.Top += (int)ballY;
            ball.Left += (int)ballX;

            if (ball.Bottom > ClientSize.Height || ball.Top < 0) ballY = -ballY;
            if (ball.Right > ClientSize.Width || ball.Left < 0) ballX = -ballX;
            if (ball.Bounds.IntersectsWith(playerPaddle.Bounds)) ballY = -ballY;
            if (goRight) playerPaddle.Left += 8;
            if (goLeft) playerPaddle.Left -= 8;
            if (playerPaddle.Left < 1) goLeft = false;
            if (playerPaddle.Left + playerPaddle.Width > this.Width) goRight = false;

            for (int j = 0; j < rows; j++)
            {
                for (int i = 0; i < col; i++)
                {
                    if (ball.Bounds.IntersectsWith(blocks[j,i].Bounds) && blocks[j,i].Visible)
                    {
                        ballY = -ballY;
                        blocks[j,i].Visible = false;
                    }
                }
            }
            if (ball.Top + ball.Height > ClientSize.Height)
            {
                gameTimer.Stop();
                var infoBox = ShiftWM.StartInfoboxSession("Breakout - You Lose! ", "It appears that you have lost the game, meaning\nall codepoints won were lost. Would you\nlike to try again?", InfoboxTemplate.ButtonType.YesNo);
                ShiftWM.StartInfoboxSession(null, infoBox.isOK.ToString(), InfoboxTemplate.ButtonType.Ok);
                infoBox.btnOpt1.Click += InfoboxYes;
                infoBox.btnOpt2.Click += InfoboxYes;
            }
        }

        private void InfoboxYes(object sender, EventArgs e)
        {
            DrawBlocks();
            ResetToRest();
            gameTimer.Start();
        }
        private void InfoboxNo(object sender, EventArgs e)
        {
            // When user clicks No
        }

        private void DrawBlocks()
        {
            int h = 20;
            int w = 75;
            blocks = new PictureBox[rows, col];
            for (int j = 0; j < rows; j++)
            {
                for (int i = 0; i < col; i++)
                {
                    blocks[j, i] = new PictureBox();
                    blocks[j, i].Height = h;
                    blocks[j, i].Width = w;
                    blocks[j, i].Top = h * j;
                    blocks[j, i].Left = w * i;
                    blocks[j, i].Paint += (o, a) =>
                      {
                          Rectangle rect = new Rectangle(blocks[j,i].Location.X, blocks[j,i].Location.Y, blocks[j,i].ClientSize.Width, blocks[j,i].ClientSize.Height);

                          rect.Inflate(1,1); // border thickness
                          ControlPaint.DrawBorder(a.Graphics, rect, Color.Black, ButtonBorderStyle.Solid);
                      };
                    this.Controls.Add(blocks[j, i]);
                }
            }
        }
    }
}