Go Down

Topic: Problema con software per game controller con Processing (Read 1 time) previous topic - next topic

alberto01

BUongiorno a tutti!
Ecco il mio problema: su un mio manuale di Arduino ho trovato questo sketch per Processing, che sfrutta una scheda Arduino Uno e un sensore di movimento ADXL335, per generare un video gioco tipo break-out(se non erro, si chiama così). In pratica, il controller è ha piu o meno le stesse funzioni di un controller Wii.Ecco il codice (ripeto, per Processing):
Code: [Select]
/ START:game_serial
import processing.serial.*;
Serial arduinoPort;
// END:game_serial

// START:game_constants
final int COLUMNS = 7;
final int ROWS = 4;
final int BALL_RADIUS = 8;
final int BALL_DIAMETER = BALL_RADIUS * 2;
final int MAX_VELOCITY = 8;
final int PADDLE_WIDTH = 60;
final int PADDLE_HEIGHT = 15;
final int BRICK_WIDTH = 40;
final int BRICK_HEIGHT = 20;
final int MARGIN = 10;
final int WIDTH = COLUMNS * BRICK_WIDTH + 2 * MARGIN;
final int HEIGHT = 300;
final int X_AXIS_MIN = 252;
final int X_AXIS_MAX = 443;
final int LINE_FEED = 10;
final int BAUD_RATE = 19200;
// END:game_constants

// START:game_objects
int px, py;
int vx, vy;
int xpos = WIDTH / 2;
int[][] bricks = new int[COLUMNS][ROWS];
// END:game_objects

// START:game_states
boolean buttonPressed = false;
boolean paused = true;
boolean done = true;
// END:game_states

// START:game_init
void setup() {
  size(WIDTH, HEIGHT);
  noCursor();
  textFont(loadFont("Verdana-Bold-36.vlw"));
  initGame(); 
  println(Serial.list());
  arduinoPort = new Serial(this, Serial.list()[0], BAUD_RATE);
  arduinoPort.bufferUntil(LINE_FEED);
}

void initGame() {
  initBricks();
  initBall();
}

void initBricks() {
  for (int x = 0; x < COLUMNS; x++)
    for (int y = 0; y < ROWS; y++ )
      bricks[x][y] = 1;
}

void initBall() {
  px = width / 2;
  py = height / 2;
  vx = int(random(-MAX_VELOCITY, MAX_VELOCITY));
  vy = -2;
}
// END:game_init

// START:game_main
void draw() {
  background(0);
  stroke(255);
  strokeWeight(3);
 
  done = drawBricks();
  if (done) {
    paused = true;
    printWinMessage();
  }
 
  if (paused)
    printPauseMessage();
  else
    updateGame();
 
  drawBall();
  drawPaddle(); 
}
// END:game_main

// START:game_draw_objects
boolean drawBricks() {
  boolean allEmpty = true;
  for (int x = 0; x < COLUMNS; x++) {
    for (int y = 0; y < ROWS; y++) {
      if (bricks[x][y] > 0) {
        allEmpty = false;
        fill(0, 0, 100 + y * 8);
        rect(
          MARGIN + x * BRICK_WIDTH,
          MARGIN + y * BRICK_HEIGHT,
          BRICK_WIDTH,
          BRICK_HEIGHT
        );
      }
    }
  }
  return allEmpty;
}

void drawBall() {
  strokeWeight(1);
  fill(128, 0, 0);
  ellipse(px, py, BALL_DIAMETER, BALL_DIAMETER);
}

void drawPaddle() {
  int x = xpos - PADDLE_WIDTH / 2;
  int y = height - (PADDLE_HEIGHT + MARGIN);
  strokeWeight(1);
  fill(128);
  rect(x, y, PADDLE_WIDTH, PADDLE_HEIGHT);
}
// END:game_draw_objects

// START:game_messages
void printWinMessage() {
  fill(255);
  textSize(36);
  textAlign(CENTER);
  text("YOU WIN!", width / 2, height * 2 / 3);
}

void printPauseMessage() {
  fill(128);
  textSize(16);
  textAlign(CENTER);
  text("Press Button to Continue", width / 2, height * 5 / 6);
}
// END:game_messages

// START:game_update
void updateGame() {
  if (ballDropped()) {
    initBall();
    paused = true;
  } else {
    checkBrickCollision();
    checkWallCollision();
    checkPaddleCollision();
    px += vx;
    py += vy;
  }
}
// END:game_update

// START:game_collision
boolean ballDropped() {
  return py + vy > height - BALL_RADIUS;
}

boolean inXRange(final int row, final int v) {
  return px + v > row * BRICK_WIDTH &&
         px + v < (row + 1) * BRICK_WIDTH + BALL_DIAMETER;
}

boolean inYRange(final int col, final int v) {
  return py + v > col * BRICK_HEIGHT &&
         py + v < (col + 1) * BRICK_HEIGHT + BALL_DIAMETER;
}

void checkBrickCollision() {
  for (int x = 0; x < COLUMNS; x++) {
    for (int y = 0; y < ROWS; y++) {
      if (bricks[x][y] > 0) {
        if (inXRange(x, vx) && inYRange(y, vy)) {
          bricks[x][y] = 0;
          if (inXRange(x, 0)) // Hit top or bottom of brick.
            vy = -vy;
          if (inYRange(y, 0)) // Hit left or right side of brick.
            vx = -vx;
        }
      }
    }
  }
}

void checkWallCollision() {
  if (px + vx < BALL_RADIUS || px + vx > width - BALL_RADIUS)
    vx = -vx;

  if (py + vy < BALL_RADIUS || py + vy > height - BALL_RADIUS)
    vy = -vy;
}

void checkPaddleCollision() {
  final int cx = xpos;
  if (py + vy >= height - (PADDLE_HEIGHT + MARGIN + 6) &&
      px >= cx - PADDLE_WIDTH / 2 &&
      px <= cx + PADDLE_WIDTH / 2)
  {
    vy = -vy;
    vx = int(
           map(
             px - cx,
             -(PADDLE_WIDTH / 2), PADDLE_WIDTH / 2,
             -MAX_VELOCITY,
             MAX_VELOCITY
           )
         );
  } 
}
// END:game_collision

// START:game_controller
void serialEvent(Serial port) {
  final String arduinoData = port.readStringUntil(LINE_FEED);

  if (arduinoData != null) {
    final int[] data = int(split(trim(arduinoData), ' ')); // <label id="code.motion.controller_data"/>
    if (data.length == 4) {
      buttonPressed = (data[3] == 1);
      if (buttonPressed) {
        paused = !paused;
        if (done) {
          done = false;
          initGame();
        }
      }
     
      if (!paused)
        xpos = int(map(data[0], X_AXIS_MIN, X_AXIS_MAX, 0, WIDTH)); // <label id="code.motion.xpos"/>
    }
  }
}
// END:game_controller

Il problema è che quando avvio il programma, appare la schermata, sì, ma appare la scitta programmata di press the button to continue(o qualcosa del genere) , ma se schiaccio il bottone, non succede niente!
Come risolvo il problema???

nid69ita

Un programma per Processing che usa Arduino Uno (con sensore) come controller.

Perciò c'e' anche un programma su Arduino. E se fosse quello a non funzionare?
Il sensore deve essere collegato ad Arduino. E se fossero i collegamenti errati? Il "controller" ovvero sensore funziona su Arduino?

my name is IGOR, not AIGOR

alberto01

Allora, il sensore funziona, testato con sketch che visualizza valori in seriale.
E se funziona quello, funzionano anche i collegamenti.
Poi... CHE PROGRAMMA DEVO METTERE SU ARDUINOOOOOOOO??? :smiley-eek: :smiley-eek: :smiley-eek: :smiley-eek: :smiley-eek:(scs, dovevo rendere l'idea..., ma su mio manuale non c'è scritto nulla a proposito, o non l'ho notato io...).

nid69ita

Scusa ma come pensi che dialoghino il sensore, Arduino e Processing, per telepatia?    :smiley-mr-green:     (battuta!)

Su Arduino ci deve essere uno sketch che legge i dati del sensore e li reinvia attraverso la seriale (USB)
Quale libro/manuale?   
Difficile dirti quale sketch ci devi mettere. Ma di sicuro qualcosa in internet lo si trova.
Prova con adxl335 arduino processing   in google, a me sembra di aver visto qualcosa tempo fa su questo argomento


http://chionophilous.wordpress.com/2011/06/20/getting-started-with-accelerometers-and-micro-controllers-arduino-adxl335/
my name is IGOR, not AIGOR

alberto01

Il manuale si chiama "Il manuale di arduino" di Maik Schmidt, titolo originale "Arduino: a quick start guide" edito in italia da APOGEO.
Ammetto di essere stato ingenuo a pensare che non dovessi caricare nessuno sketch su Arduino, ora controllo il link che mi hai dato

alberto01

Non riesco comunque a capire come a far dialogare Arduino con Processing.... :( :smiley-fat: :~

nid69ita

Cerca nel libro: MotionSensor/controller/controller.pde  (capitolo 6)

Sul sito di Apogeo, dovresti poter scaricare i vari sketch/programmi scritti sul libro. Di solito gli autori di questo genere di libri lo fanno per non costringerti a riscrivere tutto. Prova a vedere nelle prime pagine del libro, dovrebbero esserci dei riferimenti a dove scaricare il codice.

Pagina Risorse Online:
http://pragprog.com/titles/msard
my name is IGOR, not AIGOR

alberto01

Si, lo co che si posso no scaicare i codici(secondo te mi riscrivevo tutta quella papprdella?? :~)
Ora guardo un po'...

Go Up