1

処理用のマルチタッチ ゲームパッド コントロールを作成し、それを使用してリモートの Arduino ロボットを制御したいと考えています。ProcessingでGUIを作ってAndroid用にコンパイルしたいです。

これまでに作成した処理用の GUI ゲームパッドは次のとおりです。

    float easing = 0.09;
// start position
int posX = 50;
int posY = 200;
// target position
int targetX = 50;
int targetY = 200;

boolean dragging = false;

void setup() 
{
  size(500,250);
  smooth();
}

void draw() 
{
 background(255);
 if (!dragging) 
 {
   // calculate the difference in position, apply easing and add to vx/vy
   float vx = (targetX - (posX)) * easing;
   float vy = (targetY - (posY)) * easing;


    // Add the velocity to the current position: make it move!
    posX += vx;
    posY += vy;
 }

 if(mousePressed) 
 {
   dragging = true;
   posX = mouseX;
   posY = mouseY;
 }
 else 
 {
   dragging = false; 
 }

 DrawGamepad();  
 DrawButtons();  
} 

void DrawGamepad()
{
   //fill(0,155,155);
  //rect(0, 150, 100, 100, 15);

  ellipseMode(RADIUS);  // Set ellipseMode to RADIUS

  fill(0,155,155);  // Set fill to blue
  ellipse(50, 200, 50, 50);  // Draw white ellipse using RADIUS mode

  ellipseMode(CENTER);  // Set ellipseMode to CENTER
  fill(255);  // Set fill to white//
  ellipse(posX, posY, 35, 35);  // Draw gray ellipse using CENTER mode
}

void DrawButtons()
{
    fill(0,155,155);  // Set fill to blue
    ellipse(425, 225, 35, 35);
    ellipse(475, 225, 35, 35);
    fill(255,0,0);  // Set fill to blue
    ellipse(425, 175, 35, 35);
    ellipse(475, 175, 35, 35);
}

おそらくそのコードは Android でのマルチタッチ イベントをサポートしていないことに気付いたので、このリンクにある別のコードを思いつきました

Processing はマルチタッチを処理できますか?

したがって、このプロジェクトの目的は、私の Arduino ロボットを制御するために使用するマルチタッチ ゲームパッドを作成することです。ゲームパッドは、押されたキーとジョイスティックの方向を検出する必要があります。

どんな助けでも感謝します。

4

1 に答える 1

1

最初に言いたいのは、おそらくマルチタッチ互換性を実装する必要はないということです。

これをテストするアンドロイドはありませんが、次のコードは機能するはずです:

import android.view.MotionEvent;

int TouchEvents;

/*
* xTouch and yTouch are arrays of the x and y coordinates of all fingers touching the screen, in arbitrary order.
* e.g. xTouch[2] and yTouch[2] are the coordinates of the third arbitrarily ordered finger touching the screen.
*/
float[] xTouch;
float[] yTouch;
int currentPointerId = 0;
boolean printFPS;

float easing = 0.09;
// start position
float posX = 50;
float posY = 200;
// target position
float targetX = 50;
float targetY = 200;

boolean dragging = false;

void setup() 
{
  size(500,250);
  smooth();
  //size(displayWidth, displayHeight);
  orientation(LANDSCAPE);
  background(0, 255, 0);
  fill(0, 0, 244);
  rect(100, 100, 100, 100);
  stroke(255);

  // Initialize Multitouch x y arrays
  xTouch = new float [10];
  yTouch = new float [10]; // Don't use more than ten fingers!
}

void draw() 
{
  background(255);
  if (!dragging) 
  {
    // calculate the difference in position, apply easing and add to vx/vy
    float vx = (targetX - (posX)) * easing;
    float vy = (targetY - (posY)) * easing;


    // Add the velocity to the current position: make it move!
    posX += vx;
    posY += vy;

    for (int i = 0; i < xTouch.length; i++)
    {
      ellipse(xTouch[i], yTouch[i], 150, 150);
    }
  }
  DrawGamepad();
  DrawButtons();

  targetX = xTouch[currentPointerId];
  targetY = yTouch[currentPointerId];
} 

void DrawGamepad()
{
  //fill(0,155,155);
  //rect(0, 150, 100, 100, 15);

  ellipseMode(RADIUS);  // Set ellipseMode to RADIUS

  fill(0,155,155);  // Set fill to blue
  ellipse(50, 200, 50, 50);  // Draw white ellipse using RADIUS mode

  ellipseMode(CENTER);  // Set ellipseMode to CENTER
  fill(255);  // Set fill to white//
  ellipse(posX, posY, 35, 35);  // Draw gray ellipse using CENTER mode
}

void DrawButtons()
{
  fill(0,155,155);  // Set fill to blue
  ellipse(425, 225, 35, 35);
  ellipse(475, 225, 35, 35);
  fill(255,0,0);  // Set fill to blue
  ellipse(425, 175, 35, 35);
  ellipse(475, 175, 35, 35);
}

public boolean surfaceTouchEvent(MotionEvent event)
{
  // Number of places on the screen being touched:
  TouchEvents = event.getPointerCount();

  // If no action is happening, listen for new events else 
  for(int i = 0; i < TouchEvents; i++)
  {
    int pointerId = event.getPointerId(i);
    xTouch[pointerId] = event.getX(i);
    yTouch[pointerId] = event.getY(i);
    float siz = event.getSize(i);
  }

  // ACTION_DOWN 
  if(event.getActionMasked() == 0)
  {
    print("Initial action detected. (ACTION_DOWN)");
    print("Action index: " +str(event.getActionIndex()));
  } 
  // ACTION_UP 
  else if(event.getActionMasked() == 1)
  {
    print("ACTION_UP");
    print("Action index: " +str(event.getActionIndex()));
  }
  //  ACTION_POINTER_DOWN 
  else if(event.getActionMasked() == 5)
  {
    print("Secondary pointer detected: ACTION_POINTER_DOWN");
    print("Action index: " +str(event.getActionIndex()));
  }
  // ACTION_POINTER_UP 
  else if(event.getActionMasked() == 6)
  {
    print("ACTION_POINTER_UP");
    print("Action index: " +str(event.getActionIndex()));
  }
  // 
  else if(event.getActionMasked() == 4)
  {

  }

  // If you want the variables for motionX/motionY, mouseX/mouseY etc.
  // to work properly, you'll need to call super.surfaceTouchEvent().
  return super.surfaceTouchEvent(event);
}
于 2013-10-24T12:51:19.053 に答える