EsploraTFTPong

Bu çizim, Arduino Esplora ile TFT ekran için pong'un çok temel bir uygulamasıdır.

Oyunun bu sürümü, iki yönde hareket edebilen dikdörtgen bir platform ve ekranın kenarlarına ve hareketli platforma karşı zıplayan bir top oluşturur. Esplora üzerindeki kaydırıcı topun zıplama hızını kontrol eder.

Örnek, ekrandaki nesneler arasındaki çarpışma algılamanın yanı sıra, her loop() tüm loop() silmeden görüntülerin hızlı bir şekilde nasıl güncelleneceğini gösterir.

Gerekli Donanım

  • Arduino Esplora
  • Arduino TFT ekran

Devre

TFT ekranını "SD Kart" etiketi yukarı bakacak şekilde Esplora'nızdaki sokete takın.

Kod

Ekranı kullanmak için önce SPI ve TFT kitaplıklarını eklemeniz gerekir. Esplora kütüphanesini de eklemeyi unutmayın.

#include <Esplora.h>
#include <TFT.h>
#include <SPI.h>
[Kodu Al]

Top ve raket x & y konumları, topun yönü ve top ve raketin önceki konumları için değişkenleri ayarlayın.

int paddleX = 0 ;
int kürek Y = 0 ;
int oldPaddleX , oldPaddleY ;
int ballDirectionX = 1 ;
int ballDirectionY = 1 ;

int ballX , ballY , oldBallX , oldBallY ;

setup() , seri iletişimi başlatın, ekranı başlatın ve ekranın arka planını temizleyin.

void setup ( ) {
Seri . başlar ( 9600 ) ;
// ekranı başlat
EsploraTFT. begin ( ) ;
// arka planı siyah olarak ayarla
EsploraTFT. arka plan ( 0 , 0 , 0 ) ;
}

loop() , joystick konumunu okumak, raketin önceki konumunu silmek ve yeni konumuna çizmek için kodu tutacaktır.

void loop ( ) {
// ekranın genişliğini ve yüksekliğini kaydet
int myWidth = EsploraTFT. genişlik ( ) ;
int myHeight = EsploraTFT. yükseklik ( ) ;

// raketin konumunu kumanda kolunun konumuna eşleyin
paddleX = harita (Esplora readJoystickX (), 512, - 512, 0, myWidth.) - 20/2;
paddleY = harita (Esplora readJoystickY (), - 512, 512, 0, myHeight.) - 5/2;
Seri . baskı ( paddleX ) ;
Seri . yazdır ( "" ) ;
Seri . println ( kürek Y ) ;

// dolgu rengini siyaha ayarlar ve öncekini siler
// kürek şimdiden farklıysa konumu
EsploraTFT. dolgu ( 0 , 0 , 0 ) ;

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

// kürekleri ekrana çiz, mevcut pozisyonu kaydet
// önceki gibi.
EsploraTFT. dolgu ( 255 , 255 , 255 ) ;
EsploraTFT. rect (paddleX, paddleY, 20, 5);

Raketin geçerli konumunu önceki konum olarak kaydedin, böylece bir sonraki seferde taşınıp taşınmadığını kontrol edebilirsiniz.

oldPaddleX = paddleX ;
oldPaddleY = kürekY ;

loop() sonunda, topun hızını belirlemek için kaydırıcının konumunu okuyun. Topun konumunu güncellemek için moveBall() adlı özel bir işlevi moveBall() .

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

moveBall() topun konumunu güncelleyecek, önceki konumunu silecek ve yeni noktaya çizecektir. Ayrıca ekrandan çıkmadığından emin olmak için kontrol eder, yanlara çarptığında yönü tersine çevirir. Bu aynı zamanda top ve raketin kesişimlerini kontrol eden inPaddle() adında ikinci bir özel işlevi çağırır.

void moveBall ( ) {
if ( ballX > EsploraTFT. genişlik ( ) || ballX < 0 ) {
ballDirectionX = - ballDirectionX ;
}
if ( ballY > EsploraTFT. yükseklik ( ) || ballY < 0 ) {
ballDirectionY = - ballDirectionY ;
}
if ( inPaddle ( ballX , ballY , paddleX , paddleY , 20 , 5 ) ) {
ballDirectionY = - ballDirectionY ;
}

ballX + = ballDirectionX ;
ballY + = ballDirectionY ;

EsploraLCD. dolgu ( 0 , 0 , 0 ) ;

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

EsploraLCD. dolgu ( 255 , 255 , 255 ) ;
EsploraLCD. rect (ballX, Bally, 5, 5);

oldBallX = topX ;
oldBallY = topY ;
}

inPaddle() , raket ve topun aynı alanı kullanıp kullanmadığını kontrol eder. Eğer öyleyse, moveBall() da topun yönünü tersine çeviren TRUE moveBall() .

boolean inPaddle ( int x , int y , int rectX , int rectY , int rectWidth , int rectHeight ) {
boole sonucu = yanlış ;

eğer ( ( x > = rectX && x <= ( rectX + rectWidth ) ) &&
( y > = rectY && y <= ( rectY + rectHeight ) ) ) {
sonuç = doğru ;
}
sonuç döndürür;
}

Çizimin tamamı aşağıdadır:

/ *

Esplora TFT Pong

Arduino TFT ekranlı Esplora için bu örnek
dikdörtgen bir platformu hareket ettirmek için kumanda kolunun değeri
x ve y eksenlerinde. Platform bir topla kesişebilir
sıçramasına neden oluyor. Esplora'nın kaydırıcısı hızı ayarlar
topu.

Bu örnek kod kamu malıdır.

Oluşturan Tom Igoe Aralık 2012
15 Nisan 2013, Scott Fitzgerald tarafından değiştirildi

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

* /


#include <Esplora.h>
#include <Adafruit_GFX.h> // Temel grafik kütüphanesi
#include <Adafruit_ST7735.h> // Donanıma özgü kitaplık
#include <TFT.h> // Arduino LCD kütüphanesi
#include <SPI.h>

// topun ve raketin konumu için değişkenler
int paddleX = 0 ;
int kürek Y = 0 ;
int oldPaddleX , oldPaddleY ;
int ballDirectionX = 1 ;
int ballDirectionY = 1 ;

int ballX , ballY , oldBallX , oldBallY ;

void setup ( ) {

Seri . başlar ( 9600 ) ;

// ekranı başlat
EsploraTFT. begin ( ) ;
// arka planı siyah olarak ayarla
EsploraTFT. arka plan ( 0 , 0 , 0 ) ;
}

void loop ( ) {
// ekranın genişliğini ve yüksekliğini kaydet
int myWidth = EsploraTFT. genişlik ( ) ;
int myHeight = EsploraTFT. yükseklik ( ) ;

// raketin konumunu kumanda kolunun konumuna eşleyin
paddleX = harita (Esplora readJoystickX (), 512, - 512, 0, myWidth.) - 20/2;
paddleY = harita (Esplora readJoystickY (), - 512, 512, 0, myHeight.) - 5/2;
Seri . baskı ( paddleX ) ;
Seri . yazdır ( "" ) ;
Seri . println ( kürek Y ) ;

// dolgu rengini siyaha ayarlar ve öncekini siler
// kürek şimdiden farklıysa konumu
EsploraTFT. dolgu ( 0 , 0 , 0 ) ;

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

// kürekleri ekrana çiz, mevcut pozisyonu kaydet
// önceki gibi.
EsploraTFT. dolgu ( 255 , 255 , 255 ) ;
EsploraTFT. rect (paddleX, paddleY, 20, 5);
oldPaddleX = paddleX ;
oldPaddleY = kürekY ;

// topun hızını belirlemek için kaydırıcıyı okuyun
int ballSpeed = harita ( Esplora. readSlider ( ) , 0 , 1023 , 0 , 80 ) + 1 ;
if ( millis ( ) % ballSpeed < 2 ) {
moveBall ( ) ;
}
}


// bu fonksiyon topun ekrandaki konumunu belirler
void moveBall ( ) {
// top ekran dışına çıkarsa, yönü ters çevir:
if ( ballX > EsploraTFT. genişlik ( ) || ballX < 0 ) {
ballDirectionX = - ballDirectionX ;
}

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

// topun ve raketin ekranda aynı alanı kullanıp kullanmadığını kontrol edin
if ( inPaddle ( ballX , ballY , paddleX , paddleY , 20 , 5 ) ) {
ballDirectionY = - ballDirectionY ;
}

// topun konumunu güncelleyin
ballX + = ballDirectionX ;
ballY + = ballDirectionY ;

// topun önceki konumunu sil
EsploraTFT. dolgu ( 0 , 0 , 0 ) ;

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

// topun mevcut pozisyonunu çiz
EsploraTFT. dolgu ( 255 , 255 , 255 ) ;

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

oldBallX = topX ;
oldBallY = topY ;

}

// bu fonksiyon topun pozisyonunu kontrol eder
// raketle kesişip kesişmediğini görmek için
boolean inPaddle ( int x , int y , int rectX , int rectY , int rectWidth , int rectHeight ) {
boole sonucu = yanlış ;

eğer ( ( x > = rectX && x <= ( rectX + rectWidth ) ) &&
( y > = rectY && y <= ( rectY + rectHeight ) ) ) {
sonuç = doğru ;
}

sonuç döndürür;
}