อยากรู้วิธีเขียนโค้ดให้มันหยุดที่แต้ม 15 คะแนนแล้วให้โชว์คนชนะตอนนี้มันเล่นไปเรื่อยๆไม่มีที่สิ้นสุดลองใช้ if else แล้วก็ไม่ได้หรือผมใส่ไม่ถูก -..- พอดีค้นกูลเกิ้ลทั้งนอกและไทยไม่มีเลยครับ ขอคำชี้แนะด้วย
void loop()
{
calculateMovement();
draw();
}
void calculateMovement()
{
int controlA = analogRead(CONTROL_A);
int controlB = analogRead(CONTROL_B);
paddleLocationA = map(controlA, 0, 1023, 0, SCREEN_HEIGHT - PADDLE_HEIGHT);
paddleLocationB = map(controlB, 0, 1023, 0, SCREEN_HEIGHT - PADDLE_HEIGHT);
int paddleSpeedA = paddleLocationA - lastPaddleLocationA;
int paddleSpeedB = paddleLocationB - lastPaddleLocationB;
ballX += ballSpeedX;
ballY += ballSpeedY;
//bounce from top and bottom
if (ballY >= SCREEN_HEIGHT - BALL_SIZE || ballY <= 0) {
ballSpeedY *= -1;
}
//bounce from paddle A
if (ballX >= PADDLE_PADDING && ballX <= PADDLE_PADDING+BALL_SIZE && ballSpeedX < 0) {
if (ballY > paddleLocationA - BALL_SIZE && ballY < paddleLocationA + PADDLE_HEIGHT) {
soundBounce();
ballSpeedX *= -1;
addEffect(paddleSpeedA);
}
}
//bounce from paddle B
if (ballX >= SCREEN_WIDTH-PADDLE_WIDTH-PADDLE_PADDING-BALL_SIZE && ballX <= SCREEN_WIDTH-PADDLE_PADDING-BALL_SIZE && ballSpeedX > 0) {
if (ballY > paddleLocationB - BALL_SIZE && ballY < paddleLocationB + PADDLE_HEIGHT) {
soundBounce();
ballSpeedX *= -1;
addEffect(paddleSpeedB);
}
}
//score points if ball hits wall behind paddle
if (ballX >= SCREEN_WIDTH - BALL_SIZE || ballX <= 0) {
if (ballSpeedX > 0) {
scoreA++;
ballX = SCREEN_WIDTH / 4;
}
if (ballSpeedX < 0) {
scoreB++;
ballX = SCREEN_WIDTH / 4 * 3;
}
soundPoint();
}
//set last paddle locations
lastPaddleLocationA = paddleLocationA;
lastPaddleLocationB = paddleLocationB;
}
void draw()
{
display.clearDisplay();
//draw paddle A
display.fillRect(PADDLE_PADDING,paddleLocationA,PADDLE_WIDTH,PADDLE_HEIGHT,WHITE);
//draw paddle B
display.fillRect(SCREEN_WIDTH-PADDLE_WIDTH-PADDLE_PADDING,paddleLocationB,PADDLE_WIDTH,PADDLE_HEIGHT,WHITE);
//draw center line
for (int i=0; i<SCREEN_HEIGHT; i+=4) {
display.drawFastVLine(SCREEN_WIDTH/2, i, 2, WHITE);
}
//draw ball
display.fillRect(ballX,ballY,BALL_SIZE,BALL_SIZE,WHITE);
//print scores
//backwards indent score A. This is dirty, but it works ... ;)
int scoreAWidth = 5 * FONT_SIZE;
if (scoreA > 9) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 99) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 999) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 9999) scoreAWidth += 6 * FONT_SIZE;
display.setCursor(SCREEN_WIDTH/2 - SCORE_PADDING - scoreAWidth,0);
display.print(scoreA);
display.setCursor(SCREEN_WIDTH/2 + SCORE_PADDING+1,0); //+1 because of dotted line.
display.print(scoreB);
display.display();
}
void addEffect(int paddleSpeed)
{
float oldBallSpeedY = ballSpeedY;
//add effect to ball when paddle is moving while bouncing.
//for every pixel of paddle movement, add or substact EFFECT_SPEED to ballspeed.
for (int effect = 0; effect < abs(paddleSpeed); effect++) {
if (paddleSpeed > 0) {
ballSpeedY += EFFECT_SPEED;
} else {
ballSpeedY -= EFFECT_SPEED;
}
}
//limit to minimum speed
if (ballSpeedY < MIN_Y_SPEED && ballSpeedY > -MIN_Y_SPEED) {
if (ballSpeedY > 0) ballSpeedY = MIN_Y_SPEED;
if (ballSpeedY < 0) ballSpeedY = -MIN_Y_SPEED;
if (ballSpeedY == 0) ballSpeedY = oldBallSpeedY;
}
//limit to maximum speed
if (ballSpeedY > MAX_Y_SPEED) ballSpeedY = MAX_Y_SPEED;
if (ballSpeedY < -MAX_Y_SPEED) ballSpeedY = -MAX_Y_SPEED;
}
void soundStart()
{
tone(BEEPER, 250);
delay(100);
tone(BEEPER, 500);
delay(100);
tone(BEEPER, 1000);
delay(100);
noTone(BEEPER);
}
void soundBounce()
{
tone(BEEPER, 500, 50);
}
void soundPoint()
{
tone(BEEPER, 150, 150);
}
void centerPrint(char *text, int y, int size)
{
display.setTextSize(size);
display.setCursor(SCREEN_WIDTH/2 - ((strlen(text))*6*size)/2,y);
display.print(text);
}
เขียน code ยังไงให้มันหยุดเมื่อแต้มครบครับ
void loop()
{
calculateMovement();
draw();
}
void calculateMovement()
{
int controlA = analogRead(CONTROL_A);
int controlB = analogRead(CONTROL_B);
paddleLocationA = map(controlA, 0, 1023, 0, SCREEN_HEIGHT - PADDLE_HEIGHT);
paddleLocationB = map(controlB, 0, 1023, 0, SCREEN_HEIGHT - PADDLE_HEIGHT);
int paddleSpeedA = paddleLocationA - lastPaddleLocationA;
int paddleSpeedB = paddleLocationB - lastPaddleLocationB;
ballX += ballSpeedX;
ballY += ballSpeedY;
//bounce from top and bottom
if (ballY >= SCREEN_HEIGHT - BALL_SIZE || ballY <= 0) {
ballSpeedY *= -1;
}
//bounce from paddle A
if (ballX >= PADDLE_PADDING && ballX <= PADDLE_PADDING+BALL_SIZE && ballSpeedX < 0) {
if (ballY > paddleLocationA - BALL_SIZE && ballY < paddleLocationA + PADDLE_HEIGHT) {
soundBounce();
ballSpeedX *= -1;
addEffect(paddleSpeedA);
}
}
//bounce from paddle B
if (ballX >= SCREEN_WIDTH-PADDLE_WIDTH-PADDLE_PADDING-BALL_SIZE && ballX <= SCREEN_WIDTH-PADDLE_PADDING-BALL_SIZE && ballSpeedX > 0) {
if (ballY > paddleLocationB - BALL_SIZE && ballY < paddleLocationB + PADDLE_HEIGHT) {
soundBounce();
ballSpeedX *= -1;
addEffect(paddleSpeedB);
}
}
//score points if ball hits wall behind paddle
if (ballX >= SCREEN_WIDTH - BALL_SIZE || ballX <= 0) {
if (ballSpeedX > 0) {
scoreA++;
ballX = SCREEN_WIDTH / 4;
}
if (ballSpeedX < 0) {
scoreB++;
ballX = SCREEN_WIDTH / 4 * 3;
}
soundPoint();
}
//set last paddle locations
lastPaddleLocationA = paddleLocationA;
lastPaddleLocationB = paddleLocationB;
}
void draw()
{
display.clearDisplay();
//draw paddle A
display.fillRect(PADDLE_PADDING,paddleLocationA,PADDLE_WIDTH,PADDLE_HEIGHT,WHITE);
//draw paddle B
display.fillRect(SCREEN_WIDTH-PADDLE_WIDTH-PADDLE_PADDING,paddleLocationB,PADDLE_WIDTH,PADDLE_HEIGHT,WHITE);
//draw center line
for (int i=0; i<SCREEN_HEIGHT; i+=4) {
display.drawFastVLine(SCREEN_WIDTH/2, i, 2, WHITE);
}
//draw ball
display.fillRect(ballX,ballY,BALL_SIZE,BALL_SIZE,WHITE);
//print scores
//backwards indent score A. This is dirty, but it works ... ;)
int scoreAWidth = 5 * FONT_SIZE;
if (scoreA > 9) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 99) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 999) scoreAWidth += 6 * FONT_SIZE;
if (scoreA > 9999) scoreAWidth += 6 * FONT_SIZE;
display.setCursor(SCREEN_WIDTH/2 - SCORE_PADDING - scoreAWidth,0);
display.print(scoreA);
display.setCursor(SCREEN_WIDTH/2 + SCORE_PADDING+1,0); //+1 because of dotted line.
display.print(scoreB);
display.display();
}
void addEffect(int paddleSpeed)
{
float oldBallSpeedY = ballSpeedY;
//add effect to ball when paddle is moving while bouncing.
//for every pixel of paddle movement, add or substact EFFECT_SPEED to ballspeed.
for (int effect = 0; effect < abs(paddleSpeed); effect++) {
if (paddleSpeed > 0) {
ballSpeedY += EFFECT_SPEED;
} else {
ballSpeedY -= EFFECT_SPEED;
}
}
//limit to minimum speed
if (ballSpeedY < MIN_Y_SPEED && ballSpeedY > -MIN_Y_SPEED) {
if (ballSpeedY > 0) ballSpeedY = MIN_Y_SPEED;
if (ballSpeedY < 0) ballSpeedY = -MIN_Y_SPEED;
if (ballSpeedY == 0) ballSpeedY = oldBallSpeedY;
}
//limit to maximum speed
if (ballSpeedY > MAX_Y_SPEED) ballSpeedY = MAX_Y_SPEED;
if (ballSpeedY < -MAX_Y_SPEED) ballSpeedY = -MAX_Y_SPEED;
}
void soundStart()
{
tone(BEEPER, 250);
delay(100);
tone(BEEPER, 500);
delay(100);
tone(BEEPER, 1000);
delay(100);
noTone(BEEPER);
}
void soundBounce()
{
tone(BEEPER, 500, 50);
}
void soundPoint()
{
tone(BEEPER, 150, 150);
}
void centerPrint(char *text, int y, int size)
{
display.setTextSize(size);
display.setCursor(SCREEN_WIDTH/2 - ((strlen(text))*6*size)/2,y);
display.print(text);
}