Pengembangan game pada Proses dengan kontrol melalui papan Arduino Uno, bagian 2

pengantar


Dalam artikel sebelumnya , kami meneliti contoh membuat game satu dimensi yang paling sederhana - "a la menghindari tabrakan". Dengan seperangkat kemampuan seperti itu, ShG jelas tidak memenuhi namanya. Bahkan, itu ternyata menjadi bola penghindaran, yang tidak terdengar bangga. Jadi mengapa tidak memperluas kemampuan "gameplay" dan menambahkan elemen interaktivitas ke permainan?
Untuk mulai dengan, diusulkan untuk mentransfer aksi permainan ke pesawat. Kenalkan kondisi kemenangan ke dalam gim - sebuah akun, setelah mencapai itu, gamer yang dihargai “You won” akan muncul. Keluarkan senjata pasifis ke ShG untuk set poin yang lebih cepat dan interaksi dengan ShP , jika mungkin ubah desain visual proyek menjadi yang lebih menarik.
Sebenarnya, saya mengambil solusi dari masalah ini sebagai bagian dari proyek "akhir pekan" berikutnya. Apa yang terjadi, baca terus.

Langkah 1 “Tugas Pengembangan”


-ShG harus memiliki 2 derajat kebebasan.
-SHG memiliki kemampuan untuk dengan cepat mencetak poin dan memperlambat kecepatan pergerakan silo dengan cara memukul balok khusus terakhir.
-Terapkan aturan baru - permainan ini dimainkan hingga 1000 poin. Untuk menghindari tabrakan, 1 poin diberikan. Untuk retensi sinar pada bola +1 poin untuk setiap 50 * 10 ^ -3 s (penundaan 50 ms diatur dalam program Arduino)

Langkah 2 “Deskripsi menghubungkan stik analog”


Stik memiliki 5 pin untuk koneksi: VCC pin terhubung ke daya + 5V, GND - untuk terhubung ke papan Arduino Uno, X - ke input analog A0, Y - ke A1, D - ke input digital D2.

Langkah 3 “Mentransfer Banyak Koordinat melalui Koneksi Serial”


Data pada posisi stick ditransmisikan bersama untuk memastikan pemrosesan mereka secepat mungkin tanpa penundaan waktu. Untuk menggambarkan posisi stick analog saat ini, 7 bit XXXYYYB sudah cukup - 3 untuk koordinat X, 3 lebih untuk koordinat Y, 1 bit untuk mengendalikan tombol pada stick. Saya lampirkan kode di bawah ini:
Kode untuk Arduino Uno Board
#include <stdio.h>
int xPin = A0, yPin = A1, buttonPin = 2;
int xPosition = 0, yPosition = 0, buttonState = 0;
char strbuf[20]; //
void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);
  //activate pull-up resistor on the push-button pin
  pinMode(buttonPin, INPUT_PULLUP);   }
void loop() {
  xPosition = map(analogRead(xPin),0,1023,0,639);
  yPosition = map(analogRead(yPin),0,1023,0,639);
  buttonState = digitalRead(buttonPin);
  sprintf(strbuf,"%03d%03d%1d",xPosition,yPosition,buttonState);
  Serial.println(strbuf); 
  delay(50); }// add some delay between reads

Setelah menghubungkan tongkat dan firmware Arduino Uno, Anda dapat melihat sesuatu seperti berikut ini di monitor port serial.

Ini adalah vektor status stick dalam format yang kami tentukan. By the way, kadang-kadang artefak "slip" - vektor merosot dari 2 3 bit. Fenomena yang sangat tidak menyenangkan. Karena mereka, game di Processing mogok. Mungkin ini karena cacat pada papan tongkat saya, mungkin tidak. Bagaimanapun, saya tidak mencoba berurusan dengan artefak di tingkat Arduino. Untuk ini, syarat khusus disediakan dalam kode game untuk Diproses (lihat Langkah 4). Tugasnya adalah memverifikasi integritas data yang dikirim melalui koneksi Serial.

Langkah 4 “Encoding game”


Saya tidak akan berkomentar secara rinci tentang kode. Saya mencoba membuatnya dimengerti. Evaluasi apakah Anda bisa di bawah spoiler atau tidak. Untuk jaga-jaga, saya memberikan tabel variabel:
radiusOfHero-radius SH;
radiusOfEnemy - jari-jari silo;
radiusOfBullet - radius peluru; menghasilkan SHG;
Counter - point counter;
speedOfEnemy - koefisien yang berbanding lurus dengan penurunan kecepatan silo;
DeltaPositionOfHeroX - kenaikan posisi SH di sepanjang sumbu X, diperoleh dari tongkat;
positionOfHeroX1 - koordinat akhir dari pergerakan SH sepanjang sumbu X (pada akhir jam baca);
positionOfHeroX0 - koordinat awal sepanjang sumbu X (di awal ukuran);
DeltaposisiOfHeroY, positionOfHeroY1, positionOfHeroY0 - sama di sepanjang sumbu Y;
strbuf adalah baris di mana indikasi status tongkat analog yang ditransmisikan dari Arduino Uno dibaca.
Memproses Kode Permainan
import processing.serial.*;//I/O library
Serial port;
PShape bot;
PFont font;
PImage img;
int radiusOfHero=100, radiusOfEnemy, radiusOfBullet=5, Counter=0, Fire;
float speedOfEnemy=1, DeltaPositionOfHeroX, positionOfHeroX1, positionOfHeroX0=640.0,
DeltapositionOfHeroY, positionOfHeroY1, positionOfHeroY0=640.0,
positionOfEnemyY = 0.0 ,positionOfEnemyX=0.0, positionOfBulletX=0.0,positionOfBulletY=0.0;
String strbuf="3223220";
void setup()
{
  size(640, 640);
  port = new Serial(this, "COM4", 9600);
  port.bufferUntil('\n');
  bot = loadShape("2.svg");
  font = loadFont("AgencyFB-Bold-200.vlw");
  img = loadImage("img.png");  // Load the image into the program  
  textFont(font,200);
}
void draw() {
    background(0);
    image(img, 0, 0);
    fill(255);
    text(Counter, 400,170);
//==========definiton of hero==========
fill(0, 200, 102);
positionOfHeroX1=positionOfHeroX0+(0.05*(DeltaPositionOfHeroX-width/2));
if (positionOfHeroX1<0){positionOfHeroX1=0.0;}
if (positionOfHeroX1>width){positionOfHeroX1=width;}
positionOfHeroY1=positionOfHeroY0+(0.05*(DeltapositionOfHeroY-height/2));
if (positionOfHeroY1<0){positionOfHeroY1=0.0;}
if (positionOfHeroY1>height){positionOfHeroY1=height;}
ellipse(positionOfHeroX1, positionOfHeroY1, radiusOfHero, radiusOfHero);
positionOfHeroX0=positionOfHeroX1;
positionOfHeroY0=positionOfHeroY1;
fill(244);
       positionOfBulletY= positionOfHeroY1-radiusOfHero/2;
      if (Fire==0){
            for(int i = 0; i < (positionOfHeroY1); i++){
                      positionOfBulletX = positionOfHeroX1; 
                      positionOfBulletY= positionOfBulletY-height/100;
                      ellipse(positionOfBulletX, positionOfBulletY, radiusOfBullet, radiusOfBullet);           }
                       }
//===============definition of enemy===============
fill(255,0,0);
radiusOfEnemy=round(random(60));{
   for(int i = 0; i < height; i++) 
     positionOfEnemyY=positionOfEnemyY+0.02*speedOfEnemy;
     ellipse(positionOfEnemyX, positionOfEnemyY, radiusOfEnemy*2, radiusOfEnemy*2); }
        if (positionOfEnemyY>height) {
        positionOfEnemyY=0.0;
        positionOfEnemyX = round(random(width)); 
        Counter++;}
//==========definition of counter==========        
        if (Counter>1000){
        text("YOU WON!", 50,height/2);
}
//==========clash==========
if (abs(positionOfHeroX1-positionOfEnemyX) < (radiusOfHero+radiusOfEnemy)/2 & 
   (abs(positionOfHeroY1-positionOfEnemyY) < (radiusOfHero+radiusOfEnemy)/2)){
background(255,0,0);
shape(bot, positionOfHeroX1-radiusOfHero/2,positionOfHeroY1-radiusOfHero, 100, 100);  
Counter=-1;
fill(255);
textFont(font,150);
text("TURN AWAY!", 0,height/2);}
//==========Checking of target hit==========
    if (((abs(positionOfBulletX-positionOfEnemyX) < (radiusOfBullet+radiusOfEnemy)/2))& (Fire==0))
      {speedOfEnemy=0.05;// decreasing of enemy speed
      Counter++;}
    else speedOfEnemy=0.2;}
   
void serialEvent (Serial port) {
  if(port.available()>0){
   strbuf=port.readStringUntil('\n'); 
if (strbuf.length()<7) {//condition to prevent artefacts
strbuf="3223220";
  }
DeltaPositionOfHeroX=float(strbuf.substring(0, 3)); 
DeltapositionOfHeroY=float(strbuf.substring(3, 6)); 
Fire=int(strbuf.substring(6, 7));
}
}

Langkah 5 “Demonstrasi”



Source: https://habr.com/ru/post/id384689/


All Articles