Objekt orienterad programmering med arduino/c++, polletten har inte trillat ner!
Hej!
Har knopat ihop ett fungerande Pong för att komma igång med lite mer programmering, jag ser det som något efter "hello world". Efter att jag fått det att fungera började jag fundera på är detta jag knåpat ihop objekt orienterat? Använder jag klasser, funktioner eller metoder m.m. Jag insåg att jag har inte en aning! Försöker just nu klura ut om ett library i arduino IDE är samma sak som en klass? Ju mer jag letar inser jag att ge sig på C++ som ett första språk verkar vara en resa men nu är den på börjad. Köpte mig en bok som ej har kommit än hoppas det skall hjälpa lite.
iaf nu till mitt program jag använder, koden kommer sist i inlägget.
När jag började projektet tänkte jag vad är Pong. Var skall jag börja? För min del så är slut målet att bygga en liten låda med knappar i varje hörn på ovansidan och en lite 0,96" OLED i mitten. Jag började med att bygga en kvick krets på en breadboard, jag går inte in för mycket på hårdvaran men tänkte att det behövs för koden. Ville även utforska lite analog data så byggde knapparna på en analogpinne.
För själva spelet så tänkte jag att det består av:
2st paddlar
1st boll
1st spelplan
1st bild för poäng
Började med att koda paddlarna för att forsätta med paddlarna och vidare till poängen. När jag fått ihop allt till något som fungerar slog det mig att jag skapar något som är objekt orienterat. Borde inte paddlarna vara en klass, bollen en, spelplanen en och poängen en. Ett försök att skapa något som jag tyckte skulle vara rätt. Så det blev en void scoreScreen för att visa poängen. Efter lite funderande och tänkade tror jag idag att det är en Function jag skapat. När jag sedan tänkte på det jag skriver i början "include" borde ju vara det som är klasserna jag vill använda i spelet.
Dock fungerar programmet men det är inte onödig mycket objekt orienterat. Vilket jag skulle vilja för att försöka få ordning på konceptet. Metoder är något jag inte förstått alls än.
Så nu till några frågor:
Är det jag skriver #include de klasser jag vill använda?
När jag tänker på vad spelet består av (paddlar, boll...) något som skall vara en egen klass? För att få koden objekt orienterad.
När jag skriver detta inser jag att jag inte skrivit något om objekt någonstans, så jag inser att jag inte har förstått detta riktigt men jag börjar såhär.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// If using software SPI (the default case):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
//Paddle variables
int xPlayerOne = 0;
int yTopPlayerOne = 24;
int yBottomPlayerOne = 40;
int xPlayerTwo = 127;
int yTopPlayerTwo = 24;
int yBottomPlayerTwo = 40;
int paddleLength = 14;
//Ball variables
int ballX = 10;
int ballY = 31;
int ballXDir = 1;
int ballSpeed = 1;
int ballYDir = 1;
int ballAngle = 1;
//Score variables
int playerOneScore = 0;
int playerTwoScore = 0;
void setup() {
//Setup display
display.begin(SSD1306_SWITCHCAPVCC);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.clearDisplay();
}
void loop() {
// put your main code here, to run repeatedly:
display.setCursor(100,0);
display.print(ballX);
//Player One Code
//Read analog pin 5
int buttonValue = analogRead(A5);
//Values for debugging
display.setCursor(0,0);
display.println(buttonValue);
display.print(yTopPlayerOne);
if (buttonValue >= 500 && buttonValue <= 513){ //Moving the paddle down
yTopPlayerOne++;
yBottomPlayerOne++;
yTopPlayerTwo++;
yBottomPlayerTwo++;
}
else if (buttonValue >= 5 && buttonValue <= 12){ //Moving the paddle up
yTopPlayerOne--;
yBottomPlayerOne--;
yTopPlayerTwo--;
yBottomPlayerTwo--;
}
//Check if paddles are on screen
if (yTopPlayerOne <= 0){
yTopPlayerOne++;
yBottomPlayerOne++;
yTopPlayerTwo++;
yBottomPlayerTwo++;
}
else if (yBottomPlayerOne >= 63){
yTopPlayerOne--;
yBottomPlayerOne--;
yTopPlayerTwo--;
yBottomPlayerTwo--;
}
//Draw a paddles on the screen
//format (xStart, yStart, xStop, yStop, color);
display.drawLine(xPlayerOne, yTopPlayerOne, xPlayerOne, yBottomPlayerOne, WHITE);
display.drawLine(xPlayerTwo, yTopPlayerTwo, xPlayerTwo, yBottomPlayerTwo, WHITE);
//Ball code
if (ballX >= 127 && ballY >= yTopPlayerTwo && ballY <= yBottomPlayerTwo){
ballXDir = -1;
ballAngle = 1;//random(6);
ballSpeed = random(3);
}
else if (ballX <= 0 && ballY >= yTopPlayerOne && ballY <= yBottomPlayerOne) {
ballXDir = 1;
ballAngle = 1;//random(6); uncommet for more ball variation
ballSpeed = random(1,3);
}
else if (ballX >= 127 && (ballY <= yTopPlayerTwo || ballY >= yBottomPlayerTwo)){
delay(500);
scoreScreen();
}
else if (ballX <= 0 && (ballY <= yTopPlayerOne || ballY >= yBottomPlayerOne)){
delay(500);
scoreScreen();
}
if (ballY >= 63){
ballYDir = -1;
}
else if (ballY <= 0){
ballYDir = 1;
}
ballX = (ballX + (ballXDir * ballSpeed)); //ballX + ballXDir; uncomment for straight shot
ballY = (ballY + (ballYDir * ballAngle)); //ballY; uncomment for straight shot
display.drawPixel(ballX, ballY, WHITE);
display.display();
display.clearDisplay();
}
//Function to show the score
void scoreScreen(){
if (ballX >= 127){
playerOneScore++;
}
else{
playerTwoScore++;
}
//Setting up the display to show current score
display.clearDisplay();
display.setCursor(10,10);
display.setTextSize(4);
display.print(playerOneScore);
display.setCursor(75,10);
display.print(playerTwoScore);
display.display();
// resetting the ball to middle of screen and reversing the x direction
ballX = 63;
ballXDir = ballXDir * -1;
//Resetting text size for debugging numbers
display.setTextSize(1);
delay(1500);
display.clearDisplay();
//while (analogRead(A5)< 500)
}
Ber om ursäkt för ett kanske rörigt inlägg men detta är rörigt i huvudet just nu.
Laptop: HP Elitebook 640 G9
Server: HP Microserver N54L, 8 GB ram, 8 TB hd.