aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.WinForms/Applications
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS.WinForms/Applications')
-rw-r--r--ShiftOS.WinForms/Applications/Pong.Designer.cs4
-rw-r--r--ShiftOS.WinForms/Applications/Pong.cs242
2 files changed, 160 insertions, 86 deletions
diff --git a/ShiftOS.WinForms/Applications/Pong.Designer.cs b/ShiftOS.WinForms/Applications/Pong.Designer.cs
index 11bed40..22ad6f6 100644
--- a/ShiftOS.WinForms/Applications/Pong.Designer.cs
+++ b/ShiftOS.WinForms/Applications/Pong.Designer.cs
@@ -36,7 +36,7 @@
this.pnlcanvas.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlcanvas.Location = new System.Drawing.Point(0, 0);
this.pnlcanvas.Name = "pnlcanvas";
- this.pnlcanvas.Size = new System.Drawing.Size(620, 469);
+ this.pnlcanvas.Size = new System.Drawing.Size(879, 450);
this.pnlcanvas.TabIndex = 0;
this.pnlcanvas.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlcanvas_Paint);
this.pnlcanvas.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pnlcanvas_MouseMove);
@@ -47,7 +47,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.pnlcanvas);
this.Name = "Pong";
- this.Size = new System.Drawing.Size(620, 469);
+ this.Size = new System.Drawing.Size(879, 450);
this.ResumeLayout(false);
}
diff --git a/ShiftOS.WinForms/Applications/Pong.cs b/ShiftOS.WinForms/Applications/Pong.cs
index 235a049..079c880 100644
--- a/ShiftOS.WinForms/Applications/Pong.cs
+++ b/ShiftOS.WinForms/Applications/Pong.cs
@@ -22,12 +22,25 @@ namespace ShiftOS.WinForms.Applications
InitializeComponent();
paddleWidth = pnlcanvas.Width / 30;
drawTimer = new Timer();
- drawTimer.Interval = 16;
+ drawTimer.Interval = 1;
drawTimer.Tick += (o, a) =>
{
UpdateBall();
pnlcanvas.Refresh();
};
+ counterTimer = new Timer();
+ counterTimer.Interval = 1000;
+ counterTimer.Tick += (o, a) =>
+ {
+ if(secondsleft > 0)
+ {
+ secondsleft--;
+ }
+ else
+ {
+ LevelComplete();
+ }
+ };
}
private double ballX = 0.0f;
@@ -37,144 +50,154 @@ namespace ShiftOS.WinForms.Applications
private double aiBallY = 0.0f;
- private double speedFactor = 0.025;
+ private double speedFactor = 0.0125;
private double xVel = 1;
private double yVel = 1;
private int paddleWidth;
+ Timer counterTimer = null;
+
private long codepointsToEarn = 0;
private int level = 1;
private double playerY = 0.0;
private double opponentY = 0.0;
-
+ private int secondsleft = 60;
bool doAi = true;
+ bool doBallCalc = true;
+
+ private string header = "Pong - Technology Demo";
+
+ private string counter = "";
public void UpdateBall()
{
- double ballXLocal = linear(ballX, -1.0, 1.0, 0, pnlcanvas.Width);
- double ballYLocal = linear(ballY, -1.0, 1.0, 0, pnlcanvas.Height);
+ if (doBallCalc)
+ {
+ double ballXLocal = linear(ballX, -1.0, 1.0, 0, pnlcanvas.Width);
+ double ballYLocal = linear(ballY, -1.0, 1.0, 0, pnlcanvas.Height);
- ballXLocal -= ((double)paddleWidth / 2);
- ballYLocal -= ((double)paddleWidth / 2);
+ ballXLocal -= ((double)paddleWidth / 2);
+ ballYLocal -= ((double)paddleWidth / 2);
- double aiBallXLocal = linear(aiBallX, -1.0, 1.0, 0, pnlcanvas.Width);
- double aiBallYLocal = linear(aiBallY, -1.0, 1.0, 0, pnlcanvas.Height);
+ double aiBallXLocal = linear(aiBallX, -1.0, 1.0, 0, pnlcanvas.Width);
+ double aiBallYLocal = linear(aiBallY, -1.0, 1.0, 0, pnlcanvas.Height);
- aiBallXLocal -= ((double)paddleWidth / 2);
- aiBallYLocal -= ((double)paddleWidth / 2);
+ aiBallXLocal -= ((double)paddleWidth / 2);
+ aiBallYLocal -= ((double)paddleWidth / 2);
- double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height);
- double opponentYLocal = linear(opponentY, -1.0, 1.0, 0, pnlcanvas.Height);
+ double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height);
+ double opponentYLocal = linear(opponentY, -1.0, 1.0, 0, pnlcanvas.Height);
- int paddleHeight = pnlcanvas.Height / 5;
+ int paddleHeight = pnlcanvas.Height / 5;
- Rectangle ballRect = new Rectangle((int)ballXLocal, (int)ballYLocal, paddleWidth, paddleWidth);
+ Rectangle ballRect = new Rectangle((int)ballXLocal, (int)ballYLocal, paddleWidth, paddleWidth);
- Rectangle aiBallRect = new Rectangle((int)aiBallXLocal, (int)aiBallYLocal, paddleWidth, paddleWidth);
+ Rectangle aiBallRect = new Rectangle((int)aiBallXLocal, (int)aiBallYLocal, paddleWidth, paddleWidth);
- Rectangle playerRect = new Rectangle((int)paddleWidth, (int)(playerYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight);
- Rectangle opponentRect = new Rectangle((int)(pnlcanvas.Width - (paddleWidth * 2)), (int)(opponentYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight);
+ Rectangle playerRect = new Rectangle((int)paddleWidth, (int)(playerYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight);
+ Rectangle opponentRect = new Rectangle((int)(pnlcanvas.Width - (paddleWidth * 2)), (int)(opponentYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight);
- //Top and bottom walls:
- if (ballRect.Top <= 0 || ballRect.Bottom >= pnlcanvas.Height)
- yVel = -yVel; //reverse the Y velocity
+ //Top and bottom walls:
+ if (ballRect.Top <= 0 || ballRect.Bottom >= pnlcanvas.Height)
+ yVel = -yVel; //reverse the Y velocity
- //Left wall
- if(ballRect.Left <= 0)
- {
- //You lose.
- codepointsToEarn = 0;
- Lose();
- }
+ //Left wall
+ if (ballRect.Left <= 0)
+ {
+ //You lose.
+ codepointsToEarn = 0;
+ Lose();
+ }
- //Right wall
- if(ballRect.Right >= pnlcanvas.Width)
- {
- //You win.
- codepointsToEarn += CalculateAIBeatCP();
- Win();
- }
+ //Right wall
+ if (ballRect.Right >= pnlcanvas.Width)
+ {
+ //You win.
+ codepointsToEarn += CalculateAIBeatCP();
+ Win();
+ }
- //Enemy paddle:
- if (ballRect.IntersectsWith(opponentRect))
- {
- //check if the ball x is greater than the player paddle's middle coordinate
- if (ballRect.Right <= opponentRect.Right - (opponentRect.Width / 2))
+ //Enemy paddle:
+ if (ballRect.IntersectsWith(opponentRect))
{
- //reverse x velocity to send the ball the other way
- xVel = -xVel;
+ //check if the ball x is greater than the player paddle's middle coordinate
+ if (ballRect.Right >= opponentRect.Left)
+ {
+ //reverse x velocity to send the ball the other way
+ xVel = -xVel;
- //set y velocity based on where the ball hit the paddle
- yVel = linear((ballRect.Top + (ballRect.Height / 2)), opponentRect.Top, opponentRect.Bottom, -1, 1);
+ //set y velocity based on where the ball hit the paddle
+ yVel = linear((ballRect.Top + (ballRect.Height / 2)), opponentRect.Top, opponentRect.Bottom, -1, 1);
+ doAi = false;
+ }
}
- }
-
- //Enemy paddle - AI:
- if (aiBallRect.IntersectsWith(opponentRect))
- {
- //check if the ball x is greater than the player paddle's middle coordinate
- if (aiBallRect.Right <= opponentRect.Right - (opponentRect.Width / 2))
+ //Enemy paddle - AI:
+ if (aiBallRect.IntersectsWith(opponentRect))
{
- doAi = false;
- }
+ //check if the ball x is greater than the player paddle's middle coordinate
+ if (aiBallRect.Right >= opponentRect.Left)
+ {
+ doAi = false;
+ }
- }
+ }
- //Player paddle:
- if (ballRect.IntersectsWith(playerRect))
- {
- //check if the ball x is greater than the player paddle's middle coordinate
- if(ballRect.Left >= playerRect.Left + (playerRect.Width / 2))
+ //Player paddle:
+ if (ballRect.IntersectsWith(playerRect))
{
- //reverse x velocity to send the ball the other way
- xVel = -xVel;
+ //check if the ball x is greater than the player paddle's middle coordinate
+ if (ballRect.Left >= playerRect.Left)
+ {
+ //reverse x velocity to send the ball the other way
+ xVel = -xVel;
- //set y velocity based on where the ball hit the paddle
- yVel = linear((ballRect.Top + (ballRect.Height / 2)), playerRect.Top, playerRect.Bottom, -1, 1);
+ //set y velocity based on where the ball hit the paddle
+ yVel = linear((ballRect.Top + (ballRect.Height / 2)), playerRect.Top, playerRect.Bottom, -1, 1);
- //reset the ai location
- aiBallX = ballX;
- aiBallY = ballY;
- doAi = true;
- }
+ //reset the ai location
+ aiBallX = ballX;
+ aiBallY = ballY;
+ doAi = true;
+ }
- }
+ }
- ballX += xVel * speedFactor;
- ballY += yVel * speedFactor;
+ ballX += xVel * speedFactor;
+ ballY += yVel * speedFactor;
- aiBallX += xVel * (speedFactor * 2);
- aiBallY += yVel * (speedFactor * 2);
+ aiBallX += xVel * (speedFactor * 2);
+ aiBallY += yVel * (speedFactor * 2);
- if (doAi == true)
- {
- if (opponentY != aiBallY)
+ if (doAi == true)
{
- if (opponentY < aiBallY)
- {
- if (opponentY < 0.9)
- opponentY += speedFactor;
- }
- else
+ if (opponentY != aiBallY)
{
- if (opponentY > -0.9)
- opponentY -= speedFactor;
+ if (opponentY < aiBallY)
+ {
+ if (opponentY < 0.9)
+ opponentY += speedFactor;
+ }
+ else
+ {
+ if (opponentY > -0.9)
+ opponentY -= speedFactor;
+ }
}
}
}
@@ -185,6 +208,13 @@ namespace ShiftOS.WinForms.Applications
InitializeCoordinates();
}
+ public void LevelComplete()
+ {
+ level++;
+ speedFactor += speedFactor / level;
+ secondsleft = 60;
+ }
+
public long CalculateAIBeatCP()
{
return 2 * (10 * level);
@@ -192,7 +222,24 @@ namespace ShiftOS.WinForms.Applications
public void Win()
{
+ header = "You beat the AI! " + CalculateAIBeatCP() + " Codepoints!.";
InitializeCoordinates();
+ new System.Threading.Thread(() =>
+ {
+ doBallCalc = false;
+ counter = "3";
+ Engine.AudioManager.PlayStream(Properties.Resources.writesound);
+ System.Threading.Thread.Sleep(1000);
+ counter = "2";
+ Engine.AudioManager.PlayStream(Properties.Resources.writesound);
+ System.Threading.Thread.Sleep(1000);
+ counter = "1";
+ Engine.AudioManager.PlayStream(Properties.Resources.writesound);
+ System.Threading.Thread.Sleep(1000);
+ doBallCalc = true;
+ header = "";
+ counter = "";
+ }).Start();
}
public void InitializeCoordinates()
@@ -221,6 +268,7 @@ namespace ShiftOS.WinForms.Applications
e.Graphics.Clear(pnlcanvas.BackColor);
//draw the ball
+ if(doBallCalc)
e.Graphics.FillEllipse(new SolidBrush(pnlcanvas.ForeColor), new RectangleF((float)ballXLocal, (float)ballYLocal, (float)paddleWidth, (float)paddleWidth));
double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height);
@@ -245,6 +293,30 @@ namespace ShiftOS.WinForms.Applications
);
e.Graphics.DrawString(cp_text, SkinEngine.LoadedSkin.Header3Font, new SolidBrush(pnlcanvas.ForeColor), tLoc);
+ tSize = e.Graphics.MeasureString(counter, SkinEngine.LoadedSkin.Header2Font);
+
+ tLoc = new PointF((pnlcanvas.Width - (int)tSize.Width) / 2,
+ (pnlcanvas.Height - (int)tSize.Height) / 2
+
+ );
+ e.Graphics.DrawString(counter, SkinEngine.LoadedSkin.Header2Font, new SolidBrush(pnlcanvas.ForeColor), tLoc);
+ tSize = e.Graphics.MeasureString(header, SkinEngine.LoadedSkin.Header2Font);
+
+ tLoc = new PointF((pnlcanvas.Width - (int)tSize.Width) / 2,
+ (pnlcanvas.Height - (int)tSize.Height) / 4
+
+ );
+ e.Graphics.DrawString(header, SkinEngine.LoadedSkin.Header2Font, new SolidBrush(pnlcanvas.ForeColor), tLoc);
+
+ string l = Localization.Parse("{LEVEL}: " + level + " - " + secondsleft + " {SECONDS_LEFT}");
+ tSize = e.Graphics.MeasureString(l, SkinEngine.LoadedSkin.Header3Font);
+
+ tLoc = new PointF((pnlcanvas.Width - (int)tSize.Width) / 2,
+ (tSize.Height)
+ );
+ e.Graphics.DrawString(l, SkinEngine.LoadedSkin.Header3Font, new SolidBrush(pnlcanvas.ForeColor), tLoc);
+
+
}
static public double linear(double x, double x0, double x1, double y0, double y1)
@@ -261,6 +333,7 @@ namespace ShiftOS.WinForms.Applications
public void OnLoad()
{
drawTimer.Start();
+ counterTimer.Start();
}
public void OnSkinLoad()
@@ -270,6 +343,7 @@ namespace ShiftOS.WinForms.Applications
public bool OnUnload()
{
drawTimer.Stop();
+ counterTimer.Stop();
return true;
}