Title
아두이노 예제
2017.02.07 15:45

TFT Library(ESPLORA) - Esplora TFT Pong

조회 수 38 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

이 스케치는 Arduino Esplora의 TFT스크린을 이용한 TFT스크린의 기본적인 구현입니다.

 

이 버전의 게임은 두 방향으로 이동할 수 있는 직사각형 플랫폼을 만듭니다. 그리고 화면의 가장자리와 움직이는 플랫폼의 가장자리에 튀어 나온 공 입니다. 플립 차트의 슬라이더는 볼의 속도를 제어합니다.

 

예제에서는 전체 화면을 지우지 않고 이미지를 신속 하 게 업데이트 하는 방법으로 화면에 개체 간 충돌 감지 모든 loop()를 사용합니다.

 

Hardware Required


  • Arduino Esplora
  • Arduino TFT screen

 

Circuit


89.png

 

화면 레이블이 위로 향하도록 "SD 카드"를 Esplora에 소켓에 연결 합니다.

 

Code


화면을 사용하려면 먼저 SPI 및 TFT라이브러리를 포함해야 합니다. 또한 메모리에서 이미지를 읽으려면 SD라이브러리를 포함해야 합니다.

 

#include <Esplora.h>
#include <TFT.h>
#include <SPI.h>

 

볼과 패들의 위치, 볼의 방향, 공의 위치, 그리고 공과 패들의 위치를  x & y를 이용하여 설정합니다.

 

int paddleX = 0;
int paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1;
int ballDirectionY = 1;

int ballX, ballY, oldBallX, oldBallY;

 

setup()에서 직렬 통신을 시작하고 디스플레이를 초기화하고 화면의 배경을 지웁니다.

 

void setup() {
  Serial.begin(9600);
  // initialize the display
  EsploraTFT.begin();
  // set the background the black
  EsploraTFT.background(0,0,0); 
}

 

loop()는 조이 스틱 위치를 읽고 새 위치를 삭제하고 새 위치에 그리기 위해 코드를 판독합니다.

 

void loop() {
  // save the width and height of the screen
  int myWidth = EsploraTFT.width();
  int myHeight = EsploraTFT.height();

  // map the paddle's location to the joystick's position 
  paddleX = map(Esplora.readJoystickX(), 512, -512, 0, myWidth) - 20/2; 
  paddleY = map(Esplora.readJoystickY(), -512, 512, 0, myHeight) - 5/2; 
  Serial.print(paddleX);
  Serial.print(" ");
  Serial.println(paddleY);

  // set the fill color to black and erase the previous 
  // position of the paddle if different from present
  EsploraTFT.fill(0,0,0);

  if (oldPaddleX != paddleX || oldPaddleY != paddleY) {
    EsploraTFT.rect(oldPaddleX, oldPaddleY, 20, 5);
  }

  // draw the paddle on screen, save the current position
  // as the previous.
  EsploraTFT.fill(255,255,255);
  EsploraTFT.rect(paddleX, paddleY, 20, 5);

 

이전 위치로 패들의 현재 위치를 저장하므로 다음 번에 이동한 후 이동할 수 있는지 확인할 수 있습니다.

 

oldPaddleX = paddleX;
  oldPaddleY = paddleY;

 

loop()의 끝부분에서 슬라이더의 위치를 판독하여 볼의 속도를 결정합니다. moveBall()라는 이름의 사용자 지정 함수를 호출하여 볼의 위치를 업데이트할 수 있습니다.

 

int ballSpeed = map(Esplora.readSlider(), 0, 1023, 0, 80)+1;
  if (millis() % ballSpeed < 2) {
    moveBall();
  }
}

 

moveBall()는 볼의 위치를 업데이트하고 이전 위치를 삭제하고 새 위치에 그립니다. 또한 그것이 옆면에 부딪힐 때 방향을 이탈하지 않고 스크린에서 떨어지지 않도록 할 것 입니다. 또한 공과 패들의 교차점을 확인하는 두번째 사용자 지정 함수를 호출한다.

 

void moveBall() {
  if (ballX > EsploraTFT.width() || ballX < 0) {
    ballDirectionX = -ballDirectionX;
  }
  if (ballY > EsploraTFT.height() || ballY < 0) {
    ballDirectionY = -ballDirectionY;
  }  
  if (inPaddle(ballX, ballY, paddleX, paddleY, 20, 5)) {
    ballDirectionY = -ballDirectionY;
  }

  ballX += ballDirectionX;
  ballY += ballDirectionY;

  EsploraLCD.fill(0,0,0);

  if (oldBallX != ballX || oldBallY != ballY) {
    EsploraTFT.rect(oldBallX, oldBallY, 5, 5);
  }

  EsploraLCD.fill(255,255,255);
  EsploraLCD.rect(ballX, ballY, 5, 5);

  oldBallX = ballX;
  oldBallY = ballY;
}

 

inPaddle() 라켓과 공 같은 공간을 차지 하는 경우 참조를 확인 합니다. 그래서, 그것은 TRUE를 반환를 moveBall()에서 볼의 방향을 반전 합니다.

 

boolean inPaddle(int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) {
  boolean result = false;

  if ((x >= rectX && x <= (rectX + rectWidth)) && 
    (y >= rectY && y <= (rectY + rectHeight))) {
    result = true; 
  }
  return result;  
}

 

전체 스케치는 아래와 같습니다.

 

/*

 Esplora TFT Pong

 This example for the Esplora with an Arduino TFT screen reads
 the value of the joystick to move a rectangular platform
 on the x and y axes. The platform can intersect with a ball
 causing it to bounce. The Esplora's slider adjusts the speed
 of the ball.

 This example code is in the public domain.

 Created by Tom Igoe December 2012
 Modified 15 April 2013 by Scott Fitzgerald

 http://www.arduino.cc/en/Tutorial/EsploraTFTPong

 */

#include <Esplora.h>
#include <TFT.h>            // Arduino LCD library
#include <SPI.h>

// variables for the position of the ball and paddle
int paddleX = 0;
int paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1;
int ballDirectionY = 1;

int ballX, ballY, oldBallX, oldBallY;

void setup() {

  Serial.begin(9600);

  // initialize the display
  EsploraTFT.begin();
  // set the background the black
  EsploraTFT.background(0, 0, 0);
}

void loop() {
  // save the width and height of the screen
  int myWidth = EsploraTFT.width();
  int myHeight = EsploraTFT.height();

  // map the paddle's location to the joystick's position
  paddleX = map(Esplora.readJoystickX(), 512, -512, 0, myWidth) - 20 / 2;
  paddleY = map(Esplora.readJoystickY(), -512, 512, 0, myHeight) - 5 / 2;
  Serial.print(paddleX);
  Serial.print(" ");
  Serial.println(paddleY);

  // set the fill color to black and erase the previous
  // position of the paddle if different from present
  EsploraTFT.fill(0, 0, 0);

  if (oldPaddleX != paddleX || oldPaddleY != paddleY) {
    EsploraTFT.rect(oldPaddleX, oldPaddleY, 20, 5);
  }

  // draw the paddle on screen, save the current position
  // as the previous.
  EsploraTFT.fill(255, 255, 255);
  EsploraTFT.rect(paddleX, paddleY, 20, 5);
  oldPaddleX = paddleX;
  oldPaddleY = paddleY;

  // read the slider to determinde the speed of the ball
  int ballSpeed = map(Esplora.readSlider(), 0, 1023, 0, 80) + 1;
  if (millis() % ballSpeed < 2) {
    moveBall();
  }
}


// this function determines the ball's position on screen
void moveBall() {
  // if the ball goes offscreen, reverse the direction:
  if (ballX > EsploraTFT.width() || ballX < 0) {
    ballDirectionX = -ballDirectionX;
  }

  if (ballY > EsploraTFT.height() || ballY < 0) {
    ballDirectionY = -ballDirectionY;
  }

  // check if the ball and the paddle occupy the same space on screen
  if (inPaddle(ballX, ballY, paddleX, paddleY, 20, 5)) {
    ballDirectionY = -ballDirectionY;
  }

  // update the ball's position
  ballX += ballDirectionX;
  ballY += ballDirectionY;

  // erase the ball's previous position
  EsploraTFT.fill(0, 0, 0);

  if (oldBallX != ballX || oldBallY != ballY) {
    EsploraTFT.rect(oldBallX, oldBallY, 5, 5);
  }

  // draw the ball's current position
  EsploraTFT.fill(255, 255, 255);

  EsploraTFT.rect(ballX, ballY, 5, 5);

  oldBallX = ballX;
  oldBallY = ballY;

}

// this function checks the position of the ball
// to see if it intersects with the paddle
boolean inPaddle(int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) {
  boolean result = false;

  if ((x >= rectX && x <= (rectX + rectWidth)) &&
      (y >= rectY && y <= (rectY + rectHeight))) {
    result = true;
  }

  return result;
}


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
» 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Pong file 귀욤둥이 2017.02.07 38
280 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Horizon file 귀욤둥이 2017.02.07 28
279 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Graph file 귀욤둥이 2017.02.07 39
278 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Etch a Sketch file 귀욤둥이 2017.02.07 30
277 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Color Picker file 귀욤둥이 2017.02.07 40
276 아두이노 예제 TFT Library(ESPLORA) - Esplora TFT Bitmap Logo file 귀욤둥이 2017.02.07 31
275 아두이노 예제 TFT Library(ARDUINO) - TFT Pong file 귀욤둥이 2017.02.07 39
274 아두이노 예제 TFT Library(ARDUINO) - TFT Graph file 귀욤둥이 2017.02.07 70
273 아두이노 예제 TFT Library(ARDUINO) - TFT Etch a Sketch file 귀욤둥이 2017.02.07 40
272 아두이노 예제 TFT Library(ARDUINO) - TFT Display Text file 귀욤둥이 2017.02.07 82
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 33 Next
/ 33