[WAT-JS539]조이스틱 게임 실험 키트 – 조이스틱으로 캐릭터 움직이기

JS539

아두이노 보드로 컴퓨터 화면 제어

[WAT-JS539] 조이스틱 게임 실험 키트 예제 중 조이스틱으로 캐릭터는 제어하는 예제입니다.

 

준비

실험에 사용할 WAT-JS539 보드를 컴퓨터에 USB 케이블로 연결합니다.

 

 

소스코드

아두이노 코드

최신 소스코드는 [파일]=>[예제]=>[WhiteAT UNO]=> [JS539] => [11_JS539_1]  에 있으며
라이브러리는 아두이노 개발환경  을 참조하세요

/*

	WAT-JS539 조이스틱 게임 실험 모듈로
	조이스틱 움직임과 버튼으로 간단한 게임 가능한 예제

보드:
	WAT-JS539 조이스틱 (WAT-JS539) 모듈 : https://kit128.com/goods/view?no=539

   
WAT-JS539 설명
	출처: https://docs.whiteat.com/?p=6412

*/


#define DELAY 400

#define PIN_ANALOG_X 0
#define PIN_ANALOG_Y 1

#define BUTTON_UP 2
#define BUTTON_RIGHT 3
#define BUTTON_DOWN 4
#define BUTTON_LEFT 5
#define BUTTON_E 6
#define BUTTON_F 7

void setup()
{

	Serial.begin(115200);

	pinMode(BUTTON_UP, INPUT);
	digitalWrite(BUTTON_UP, HIGH);

	pinMode(BUTTON_RIGHT, INPUT);
	digitalWrite(BUTTON_RIGHT, HIGH);

	pinMode(BUTTON_DOWN, INPUT);
	digitalWrite(BUTTON_DOWN, HIGH);

	pinMode(BUTTON_LEFT, INPUT);
	digitalWrite(BUTTON_LEFT, HIGH);

	pinMode(BUTTON_E, INPUT);
	digitalWrite(BUTTON_E, HIGH);

	pinMode(BUTTON_F, INPUT);
	digitalWrite(BUTTON_F, HIGH);
}

// 123,123,1,1,1,1,1,1  형태로 전송
String strSend = "";
void loop()
{
	strSend = "";

	strSend += analogRead(PIN_ANALOG_X);
	strSend += ",";
	strSend += (1023 - analogRead(PIN_ANALOG_Y));


	strSend += ",";
	if (digitalRead(BUTTON_UP) == LOW) {
		strSend += "1";
	}
	else
	{
		strSend += "0";
	}

	strSend += ",";
	strSend += digitalRead(BUTTON_RIGHT) == LOW;

	strSend += ",";
	strSend += digitalRead(BUTTON_DOWN) == LOW;

	strSend += ",";
	strSend += digitalRead(BUTTON_LEFT) == LOW;

	strSend += ",";
	strSend += digitalRead(BUTTON_E) == LOW;

	strSend += ",";
	strSend += digitalRead(BUTTON_F) == LOW;


	Serial.println(strSend);
	delay(100);

}

프로세싱 코드

프로세싱 전체 소스코드는 http://whiteat.com/230211 에서 제공됩니다.

// Arduino joystick play Example #01
//
// KIT set
// WAT-JS539 : https://kit128.com/goods/view?no=539


import processing.serial.*;
Serial port;

int WIDTH = 680;
int HEIGHT = 853;

int lastTime=0;
int setTimer = 10;

 Enemy enemy = new Enemy();
 
String myString = null;

PImage  imageFly = new PImage() ;

PImage  imageFire = new PImage() ;
int gun_x = 0;
int gun_y = -110;

PImage  imageBG = new PImage() ; 
int x,y;

void setup() {
  size(680,853); 
  x = WIDTH/2-80;
  y = HEIGHT/3*2-80;
 imageFly = loadImage("fly.png");
 imageFire = loadImage("gun.png");
 imageBG = loadImage("bg.jpg");
 

 println("Available serial ports:");
 println(Serial.list());
 port = new Serial(this, Serial.list()[0], 115200);
 
 image(imageBG,0,0,WIDTH,HEIGHT);   
 surface.setTitle("Arduino Joystick Play Example #01 - http://docs.WhiteAT.com");
   
}

void draw() 
{
  boolean is_refresh = false;
  
  int passedTime = millis() - lastTime;
  if(passedTime > setTimer)
  {
      lastTime =  millis();
      gun_y -=20;
    
     is_refresh = true;

     enemy.move();
     if(enemy.IsHit(gun_x,gun_y+20))
     {
       enemy.moveFirst();
       
       gun_y = -100;
     }       
  }
  
  int iTemp =0;
  
  myString ="";
  while (port.available() > 0) {
    myString = port.readStringUntil(10);
  }
  myString = myString.replace('\n', ' ');
  myString = trim(myString); 
   
   if(myString.length()>0)
   println(myString);
   
                               
                                           //   x,  y,A,B,C,D,E,F
  String[] list  = split(myString, ",");   // 500,503,1,1,1,1,1,1
  
  if(is_refresh)
  {
    image(imageBG,0,0,WIDTH,865);
    image(imageFire,gun_x,gun_y);  
  }
  
  if(list.length==8)
  {   
      
    // x
    iTemp =  Integer.parseInt(list[0]);
    if( iTemp<=400) x-=50;   
    else if( iTemp>=600) x+=50;
    
   if(x<0) x+=50;
   else if(x>WIDTH-imageFly.width) x-=50;
   
    // y
    iTemp =  Integer.parseInt(list[1]);
    if( iTemp<=400) y-=50;  
    else if( iTemp>=600) y+=50;
    
    if(y<0) y+=50;
    else if(y>HEIGHT-imageFly.height) y-=50;
   
     // gun
    if(1== Integer.parseInt(list[5]))
    {
      if(gun_y<0)
      {
       gun_x = x  +(imageFly.width  -imageFire.width)/2;
       gun_y = y;
      }
    }     
  }
   
  image(imageFly ,x,y);

  enemy.draw();
    
  PFont f= createFont("Arial",16,true);   
  textFont(f,32); 
  text("WhiteAT.com, KIT128.com",20,30);      
} 

class Enemy
{
  PImage  image  =null;
 
  int x=50;
  int y=0;
  
  public boolean IsHit(int _x,int _y )
  {
     if ( x < _x  && _x < (x + image.width) && y < _y && _y < (y + image.height) )
      return true;
    else
      return false;  
  }

  public void move()
  {
    y+=10;
    
    if(y >800)
    {
       moveFirst();
    }
  }
  
  public void moveFirst()
  {
    y=0;
    x= (int)random(60)*10;
  }
  
  public void draw()
  {
    if(image ==null)
      image  = loadImage("ghost.png");
    image(image,x,y);
  } 
}

 

 

 

결과 화면

적군이 랜덤 위치에서 내려오며 조이스틱으로 비행이 조종이 가능합니다. 버튼을 누르면 미사일로 발사 됩니다.

 

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다