HariFun #136 - hur man skriver ett spel (8 / 8 steg)
Steg 8: Avslutande kommentarer
Jag hoppas du gillade den här videon så mycket som jag gjorde dela den. Om du gillar det, glöm inte att ge tummen upp och kanske prenumerera/följa så du inte missar kommande filmer/instructables.
Jag älskar att läsa kommentarer så skriv gärna en kommentar med dina pong minnen. Om du gör detta projekt, skulle jag älska att se den. Vänligen lämna en länk i kommentarer eller klicka på den jag gjorde det knapp.
Om du är i sociala medier, vänligen dela detta instructable eller YouTube Video.
Tack, tack, tack!
Komplett skiss är lägre än
Arduino Pong av Hari Wiguna, 2016
v0.0 - dra bollen
v0.1 - flytta bollen
v0.2 - med millis(), flytta i Y-riktningen också
v0.3 - paddlar!
v0.4 - kollision upptäckt
v0.5 - Scoring, påskynda, och ljud
#include "U8glib.h"
== Inställningar ==
U8GLIB_PCD8544 u8g (13, 11, 9, 8, 10); SPI Com: SCK = 13, MOSI = 11, CS = 9, A0/DataCommand = 8, återställa = 10
int paddle0Pin = A1; Vänster-spelare potentiometern
int paddle1Pin = A0; Rätt spelare potentiometern
int winningScore = 3; Hur hög innan vi förklara en vinnare?
byte tonePin = 2; Vilken digital stift Signalgivare bifogas
int animationSpeed0 = 25; Initial hastighet av varje runda (lägre = snabbare)
== Spelet variabler ==
u8g_uint_t courtWidth, courtHeight, halfCourtWidth;
u8g_uint_t ballSize = 4;
u8g_uint_t ballX;
u8g_uint_t ballDirectionX = 1;
u8g_uint_t ballY;
u8g_uint_t ballDirectionY = 1;
u8g_uint_t paddleWidth = 2;
u8g_uint_t paddleHeight = 8;
u8g_uint_t paddleHalfHeight = paddleHeight/2;
u8g_uint_t paddle0Y; Vänster-spelare vertikala paddel position
u8g_uint_t paddle1Y; Rätt spelare vertikala paddel position
int score0, score1; Vänster & höger spelarens poäng
bool gameOver = false;
int bounceToneFrequency = 523;
int bounceToneDuration = 62;
int missToneFrequency = 523 / 2;
int missToneDuration = 512;
osignerade långa timeToMove; När ska vi flytta bollen igen?
int animationSpeed = animationSpeed0; Aktuella bollhastighet (lägre = snabbare)
bool MissedPaddle (u8g_uint_t py)
{
u8g_uint_t ballTop = ballY;
u8g_uint_t ballBottom = ballY + ballSize - 1;
u8g_uint_t paddleTop = py;
u8g_uint_t paddleBottom = py + paddleHeight - 1;
återgå ballBottom < paddleTop || ballTop > paddleBottom;
}
void DrawScores()
{
char strScore0 [] = "?"; Uppsättningar sträng längd 1
char strScore1 [] = "?";
strScore0 [0] = "0" + score0; Overide strängvärdet med ensiffriga poäng
strScore1 [0] = "0" + score1;
U8G.setFont(u8g_font_04b_03b);
u8g_uint_t scoreWidth = u8g.getStrPixelWidth(strScore0);
CONST int offset = 5;
u8g_uint_t scoreY = 9;
U8G.drawStr (halfCourtWidth - offset - scoreWidth, scoreY, strScore0);
U8G.drawStr (halfCourtWidth + offset, scoreY, strScore1);
}
void DrawGameOver()
{
U8G.setFont(u8g_font_timB18);
U8G.setFontPosCenter(); Lodrät justering
char gameStr [] = "Spelet";
char overStr [] = "Över";
u8g_uint_t gx = (courtWidth - u8g.getStrPixelWidth(gameStr)) / 2;
u8g_uint_t ox = (courtWidth - u8g.getStrPixelWidth(overStr)) / 2;
U8G.drawStr (gx, 20, gameStr);
U8G.drawStr (oxe, 40, overStr);
}
void DrawCourt()
{
U8G.drawHLine (0, 0, courtWidth);
U8G.drawHLine (0, courtHeight - 1, courtWidth);
byte streck = 3;
för (byte y = 0; y < (courtHeight / dash / 2); y ++)
{
U8G.drawVLine (halfCourtWidth - 1, 2 + y * dash * 2, dash);
}
}
void Player0Missed()
{
När vänster-spelare missat, flytta bollen precis till vänster om längst till höger i domstolen
ballX = courtWidth - ballSize - 1;
ballY = paddle1Y + paddleHalfHeight; bollen kommer att serveras på plats av spelare 1's paddlar
tonar (tonePin, missToneFrequency, missToneDuration);
Delay(1000);
score1 ++;
animationSpeed = animationSpeed0;
om (score1 == winningScore) gameOver = sant;
}
void Player1Missed()
{
När rätt spelare missade, flytta bollen precis till höger om den längst till vänster i domstolen
ballX = 1;
ballY = paddle0Y + paddleHalfHeight; bollen kommer att serveras på plats av spelare 0's paddlar
tonar (tonePin, missToneFrequency, missToneDuration);
Delay(1000);
score0 ++;
animationSpeed = animationSpeed0;
om (score0 == winningScore) gameOver = sant;
}
void BounceX()
{
tonar (tonePin, bounceToneFrequency, bounceToneDuration);
ballDirectionX = - ballDirectionX;
animationSpeed--; Snabba upp spelet med varje studs
}
void MoveBall()
{
om (millis() > timeToMove) {
ballX += ballDirectionX;
om (ballX < = 0)
om (MissedPaddle(paddle0Y)) Player0Missed(); annat BounceX();
om (ballX > = (courtWidth - ballSize))
om (MissedPaddle(paddle1Y)) Player1Missed(); annat BounceX();
ballY += ballDirectionY;
om (ballY > = (courtHeight - ballSize) || ballY < = 0) {
ballDirectionY = - ballDirectionY;
animationSpeed--; Snabba upp spelet med varje studs
tonar (tonePin, bounceToneFrequency, bounceToneDuration);
}
timeToMove = millis() + animationSpeed;
}
}
void DrawPaddle (u8g_uint_t paddleX, int paddleY)
{
U8G.drawBox (paddleX, paddleY, paddleWidth, paddleHeight);
}
void DrawPaddles()
{
paddle0Y = map(analogRead(paddle0Pin), 0, 1023, 0, courtHeight - paddleHeight);
paddle1Y = map(analogRead(paddle1Pin), 0, 1023, 0, courtHeight - paddleHeight);
DrawPaddle (0, paddle0Y);
DrawPaddle (courtWidth - paddleWidth, paddle1Y);
}
void setup(void) {
U8G.setRot180(); Flip skärmen
courtWidth = u8g.getWidth();
courtHeight = u8g.getHeight();
halfCourtWidth = courtWidth / 2;
}
void loop(void) {
U8G.firstPage();
göra {
om (gameOver)
DrawGameOver();
annat
MoveBall();
DrawCourt();
DrawScores();
U8G.drawBox (ballX, ballY, ballSize, ballSize);
DrawPaddles();
} medan (u8g.nextPage());
}