HariFun #136 - hur man skriver ett spel (5 / 8 steg)
Steg 5: Lägga till paddlar
För de nya till elektronik kallas dessa reglermotstånden potentiometrar.
Jag föredrar att ha reglaget uppåt, så jag lödde del leads på potentiometer. Om du gör detta, se till att använda isolerade ledningar eftersom potentiometern kroppen är metall och kunde enkelt kort krets leads.
Alternativt kan du koppla potentiometer leads på en skärbräda. Om du gör detta, rekommenderar jag böja leads 90 grader så att de inte skulle sprida bakbord leder för mycket. (Se bild)
Vi binder det upp som en resistor stege. En bly går till marken, den andra till + 5V och mitten lös bly går till en Arduino Analog stift.
På en extrem, ljudutgången är 5V, på den andra ytterligheten, ljudutgången är 0V, någonstans däremellan kommer vi ha ett värde mellan 0 och 5V.
Vi kan läsa denna spänning med hjälp av analogRead(). Värdet som returneras av analogRead är inte en fraktionerad värde 0 till 5. I stället returnerar ett heltal mellan 0 och 1023. Om du vill mappa detta spänner i intervallet som motsvarar paddel lodräta position, använder vi Arduino map() funktion.
paddleYposition = karta (potentiometerValue, 0,1023, 0,36).
Upprepa för den andra sidan och vi skrev nästan ett spelbara spel!
Bollen studsar fortfarande även när det missar bollen. Låt oss fixa det.
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!
#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
Analoga pins där vi ansluta potentiometrar till
int paddle0Pin = A1;
int paddle1Pin = A0;
== Spelet variabler ==
u8g_uint_t courtWidth, courtHeight;
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;
osignerade långa timeToMove;
int animationSpeed = 20;
void MoveBall()
{
om (millis() > timeToMove) {
ballX += ballDirectionX;
om (ballX > = (courtWidth - ballSize) || ballX < = 0) ballDirectionX = - ballDirectionX;
ballY += ballDirectionY;
om (ballY > = (courtHeight - ballSize) || ballY < = 0) ballDirectionY = - ballDirectionY;
timeToMove = millis() + animationSpeed;
}
}
void DrawPaddle (u8g_uint_t paddleX, int paddlePin)
{
int analogValue = analogRead(paddlePin); returnerar 0 till 1023
Konvertera analogValue allt från 0..1023 till paddleY mellan 0... (courtHeight-paddleHeight)
u8g_uint_t paddleY = karta (analogValue, 0,1023, 0, courtHeight-paddleHeight);
Dra paddeln
U8G.drawBox (paddleX, paddleY, paddleWidth, paddleHeight);
}
void DrawPaddles()
{
DrawPaddle (0, paddle0Pin);
DrawPaddle (courtWidth - paddleWidth, paddle1Pin);
}
void setup(void) {
U8G.setRot180(); Flip skärmen
courtWidth = u8g.getWidth();
courtHeight = u8g.getHeight();
}
void loop(void) {
U8G.firstPage();
göra {
MoveBall();
U8G.drawBox (ballX, ballY, ballSize, ballSize);
DrawPaddles();
} medan (u8g.nextPage());
}