我正在为编程课程创建突破游戏。

import processing.serial.*;
//sets the conditions for winning
int lose = 1;
boolean flip_sensor_value = false;

//variable declarations for ports, paddles, conditions, and start/end
Serial myPort;
PFont myFont;
int lf = 10;
Paddle Paddle; //Error Here
Ball breakout;
int padWidth = 15;
int padHeight = 60;
int leftPaddlePos = 0;
int distWall = 20;
float lpp;
boolean Win = false;
PImage pStart;
PImage pEnd;
boolean Contact = false;
boolean started = false;
int timePlayed = 0;

//sets the game window up
void setup(){
   size(1000, 600);

   myFont = createFont("FFScala", 16);
   textFont(myFont);

   rectMode(CENTER);
   ellipseMode(CENTER);

   println(Serial.list());
   //If the paddle isn't working set the number in the [] to 1, 2, or 3
   myPort = new Serial(this, Serial.list()[0], 9600);
   myPort.bufferUntil('\n');

   Paddle = new Paddle(padWidth, padHeight, distWall, leftPaddlePos); //Error Here
   //creates the ball
   breakout = new Ball (15, width/2, height/2, 8, 2, 1, 1);
}
void showGUI() {

  stroke(87, 36, 124);
  line(width/2, 0, width/2, height);

  textSize(16);
  pushStyle();
  fill(87, 36, 124);
  popStyle();
  //Tells you that you won
  if (Win == true) {
    textSize(48);
    image(pEnd, 0, 0, width, height);
    pushStyle();
    fill(87, 36, 124);
    text("YOU WIN!!!", width/2 - 175, 100);
    popStyle();
  }
}
void draw(){
  background(247);
  //dislplays and updates the Ball
  breakout.display();
  breakout.update();

   Paddle.display(lpp);
  //Shows the graphical user interface
  showGUI();

  if (started == false){
    image(pStart, 0, 0, width, height);
    println("Start");
  }
  timePlayed ++;  //Controls the timer in the game
  breakout.bRadius = breakout.bRadius + (timePlayed * 0.5);
}
void serialEvent(Serial myPort) {

  String myString = myPort.readStringUntil('\n');
  if (myString != null) {

    myString = trim(myString);

    // if you haven't heard from the microncontroller yet, listen:
    if (Contact == false) {
      if (myString.equals("hello")) {
        myPort.clear();          // clear the serial port buffer
        Contact = true;     // you've had first contact from the microcontroller
        myPort.write('A');       // ask for more
        println("contact");
      }
    }else {
      int sensors[] = int(split(myString, ','));
      for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) {
        println("Sensor " + sensorNum + ": " + sensors[sensorNum]);
      }
      if(sensors.length>1){
        leftPaddlePos = sensors[0];

        lpp = (float)leftPaddlePos;
        if ( flip_sensor_value == false ) {
          lpp = map(lpp, 0, 1023, 1, height);
        }
        else if ( flip_sensor_value == true ) {
          lpp = map(lpp, 1023, 0, 1, height);
        }
      }
    }
    myPort.write("A");
  }
}
void keyPressed() {
  if (started == true) {   //added for Start Screen
    breakout.keyPressed();
  }                        //added for Start Screen
  if (started == false) {  //added for Start Screen
    started = true;        //added for Start Screen
  }                        //added for Start Screen
}


桨类

    class Paddle{

  float pWidth;
  float pHeight;
  float yPos;
  float xPos;

  Paddle(float ipWidth, float ipHeight, float ixPos, float iyPos) {

    pWidth = ipWidth;
    pHeight = ipHeight;
    xPos = ixPos;
    yPos = iyPos;
  }

  void display(float yPos) {
    pushStyle();
    fill(87, 36, 124);// or littleBits white(247)
    rect(xPos, yPos, pWidth, pHeight);
    popStyle();
  }
}}


球类

    class Ball {
  Paddle Paddle; //Added so that it would accept the Class Paddle
  float bAngle = 0; //added to keep track of ball's current angle
  float bRadius; //add this line to create a vector for the ball

  int bSize;
  float xpos, ypos;
  float xspeed, yspeed;
  float xdir, ydir;

  Ball(int ibSize, float ixpos, float iypos, float ixspeed, float iyspeed, float ixdir, float iydir) {

    bSize = ibSize;
    xpos = ixpos;
    ypos = iypos;
    xspeed = ixspeed;
    yspeed = iyspeed;
    xdir = ixdir;
    ydir = iydir;
  }
  void display() {
    pushStyle();
    fill(87, 36, 124);
    ellipse(xpos+bSize/2, ypos+bSize/2, bSize, bSize);
    popStyle();
  }
void update(){

    xpos = xpos + (xspeed * xdir);
    ypos = ypos + (yspeed * ydir);

    calcRadius();
}
  void keyPressed() {

    if (keyCode=='`') {
      newGame();
    }

    if (keyCode=='1') {
      bSize++;
    }
    if (keyCode=='2') {
      bSize--;
    }
    if (keyCode=='3') {
      Paddle.pHeight++;
    }
    if (keyCode=='4') {
      Paddle.pHeight--;
    }
  }

  void reset() {
    xpos = width;
    ypos = height/2;
    ydir = random(-1, 1);
    float dir = random(-1, 1);
    if (dir > 0) {
      xdir = 1;
    }
    else if (dir <= 0) {
      xdir = -1;
    }
    breakout.xspeed = 8; //reset ball speed
    breakout.yspeed = 2; //reset ball speed
    timePlayed = 0;  //reset time played counter
    bRadius = 8.25;  //reset ball vector
  }
void newGame(){
  reset();
}
 void calcRadius() { //added to calculate radius/vector of ball trajectory
    bRadius = sqrt(pow(abs(xspeed), 2) + pow(abs(yspeed), 2)); //added to figure out ball vector
  }
   void lPadHitTest() {
    if (xpos < Paddle.xPos - Paddle.pWidth/2 - bSize/2  //check to see if it's hitting paddle side to side
    && ypos < lpp + Paddle.pHeight/2 + bSize/2           //check to see if it's hitting paddle up and down
    && ypos > lpp - Paddle.pHeight/2 - bSize/2)          //check to see if it's hitting paddle up and down
    {
      lPadAngle();                                            //change the angle of the ball depending where it hits the paddle
      xdir *= -1;                                             //turn the ball around so it bounces
    }
  }
    void lPadAngle() {
    if (ypos < lpp - 10) {  //checks if y position is above the middle section of the right paddle
      println(bAngle);
      bAngle = bAngle + (map(abs(lpp - 10 - ypos), 0, 50, 0, 15));  //adds to angle of ball trajectory
      xspeed = cos (radians(bAngle)) * bRadius; //change ball's x speed
      yspeed = sin (radians(bAngle)) * bRadius; //change ball's y spped
      println(bAngle);
    }
    if (ypos < lpp + 10) {  //checks if y position is below the middle section of the right paddle
      println(bAngle);
      bAngle = bAngle - (map(abs(lpp + 10 - ypos), 0, 50, 0, 15));  //subtracts from angle of ball trajectory
      xspeed = cos (radians(bAngle)) * bRadius; //change ball's x speed
      yspeed = sin (radians(bAngle)) * bRadius; //change ball's y spped
      println(bAngle);
    }
    xpos = Paddle.xPos + Paddle.pWidth/2 + bSize/2; //corrects for sticking in right paddle
  }


我还没有完成真正使游戏突破的部分,但问题是我被抛出了一个错误,提示“类'Paddle'不存在”。

我尝试重新排列变量声明的顺序(即使那没关系),并且尝试修复“ Paddle”类本身中的所有错误。

我曾经在“球”类中遇到问题,但是我添加了

class Ball {
  Paddle Paddle; //Added so that it would accept the Class Paddle
  float bAngle = 0; //added to keep track of ball's current angle
   ...
}


它接受了它,所以我不确定是什么问题。

是语法问题还是我忽略了重要的事情?

最佳答案

您放错了大括号:您在Paddle类末尾有一个额外的右花括号,并且在Ball类末尾缺少一个右花括号。

这是一个快速而肮脏的示例,但是如果我解决了这个问题(我也删除了Serial内容,因为它可能与您的问题无关),那么您的代码至少可以运行:

//sets the conditions for winning
int lose = 1;
boolean flip_sensor_value = false;

PFont myFont;
int lf = 10;
Paddle Paddle; //Error Here
Ball breakout;
int padWidth = 15;
int padHeight = 60;
int leftPaddlePos = 0;
int distWall = 20;
float lpp;
boolean Win = false;
PImage pStart;
PImage pEnd;
boolean Contact = false;
boolean started = false;
int timePlayed = 0;

//sets the game window up
void setup() {
  size(1000, 600);

  myFont = createFont("FFScala", 16);
  textFont(myFont);

  rectMode(CENTER);
  ellipseMode(CENTER);

  Paddle = new Paddle(padWidth, padHeight, distWall, leftPaddlePos); //Error Here
  //creates the ball
  breakout = new Ball (15, width/2, height/2, 8, 2, 1, 1);
}
void showGUI() {

  stroke(87, 36, 124);
  line(width/2, 0, width/2, height);

  textSize(16);
  pushStyle();
  fill(87, 36, 124);
  popStyle();
  //Tells you that you won
  if (Win == true) {
    textSize(48);
    image(pEnd, 0, 0, width, height);
    pushStyle();
    fill(87, 36, 124);
    text("YOU WIN!!!", width/2 - 175, 100);
    popStyle();
  }
}
void draw() {
  background(247);
  //dislplays and updates the Ball
  breakout.display();
  breakout.update();

  Paddle.display(lpp);
  //Shows the graphical user interface
  showGUI();

  if (started == false) {
    image(pStart, 0, 0, width, height);
    println("Start");
  }
  timePlayed ++;  //Controls the timer in the game
  breakout.bRadius = breakout.bRadius + (timePlayed * 0.5);
}


void keyPressed() {
  if (started == true) {   //added for Start Screen
    breakout.keyPressed();
  }                        //added for Start Screen
  if (started == false) {  //added for Start Screen
    started = true;        //added for Start Screen
  }                        //added for Start Screen
}
//Separate Tab
class Paddle {

  float pWidth;
  float pHeight;
  float yPos;
  float xPos;

  Paddle(float ipWidth, float ipHeight, float ixPos, float iyPos) {

    pWidth = ipWidth;
    pHeight = ipHeight;
    xPos = ixPos;
    yPos = iyPos;
  }

  void display(float yPos) {
    pushStyle();
    fill(87, 36, 124);// or littleBits white(247)
    rect(xPos, yPos, pWidth, pHeight);
    popStyle();
  }
}

//Separate Tab
class Ball {
  Paddle Paddle; //Added so that it would accept the Class Paddle
  float bAngle = 0; //added to keep track of ball's current angle
  float bRadius; //add this line to create a vector for the ball

  int bSize;
  float xpos, ypos;
  float xspeed, yspeed;
  float xdir, ydir;

  Ball(int ibSize, float ixpos, float iypos, float ixspeed, float iyspeed, float ixdir, float iydir) {

    bSize = ibSize;
    xpos = ixpos;
    ypos = iypos;
    xspeed = ixspeed;
    yspeed = iyspeed;
    xdir = ixdir;
    ydir = iydir;
  }
  void display() {
    pushStyle();
    fill(87, 36, 124);
    ellipse(xpos+bSize/2, ypos+bSize/2, bSize, bSize);
    popStyle();
  }
  void update() {

    xpos = xpos + (xspeed * xdir);
    ypos = ypos + (yspeed * ydir);

    calcRadius();
  }
  void keyPressed() {

    if (keyCode=='`') {
      newGame();
    }

    if (keyCode=='1') {
      bSize++;
    }
    if (keyCode=='2') {
      bSize--;
    }
    if (keyCode=='3') {
      Paddle.pHeight++;
    }
    if (keyCode=='4') {
      Paddle.pHeight--;
    }
  }

  void reset() {
    xpos = width;
    ypos = height/2;
    ydir = random(-1, 1);
    float dir = random(-1, 1);
    if (dir > 0) {
      xdir = 1;
    } else if (dir <= 0) {
      xdir = -1;
    }
    breakout.xspeed = 8; //reset ball speed
    breakout.yspeed = 2; //reset ball speed
    timePlayed = 0;  //reset time played counter
    bRadius = 8.25;  //reset ball vector
  }
  void newGame() {
    reset();
  }
  void calcRadius() { //added to calculate radius/vector of ball trajectory
    bRadius = sqrt(pow(abs(xspeed), 2) + pow(abs(yspeed), 2)); //added to figure out ball vector
  }
  void lPadHitTest() {
    if (xpos < Paddle.xPos - Paddle.pWidth/2 - bSize/2  //check to see if it's hitting paddle side to side
      && ypos < lpp + Paddle.pHeight/2 + bSize/2           //check to see if it's hitting paddle up and down
      && ypos > lpp - Paddle.pHeight/2 - bSize/2)          //check to see if it's hitting paddle up and down
    {
      lPadAngle();                                            //change the angle of the ball depending where it hits the paddle
      xdir *= -1;                                             //turn the ball around so it bounces
    }
  }
  void lPadAngle() {
    if (ypos < lpp - 10) {  //checks if y position is above the middle section of the right paddle
      println(bAngle);
      bAngle = bAngle + (map(abs(lpp - 10 - ypos), 0, 50, 0, 15));  //adds to angle of ball trajectory
      xspeed = cos (radians(bAngle)) * bRadius; //change ball's x speed
      yspeed = sin (radians(bAngle)) * bRadius; //change ball's y spped
      println(bAngle);
    }
    if (ypos < lpp + 10) {  //checks if y position is below the middle section of the right paddle
      println(bAngle);
      bAngle = bAngle - (map(abs(lpp + 10 - ypos), 0, 50, 0, 15));  //subtracts from angle of ball trajectory
      xspeed = cos (radians(bAngle)) * bRadius; //change ball's x speed
      yspeed = sin (radians(bAngle)) * bRadius; //change ball's y spped
      println(bAngle);
    }
    xpos = Paddle.xPos + Paddle.pWidth/2 + bSize/2; //corrects for sticking in right paddle
  }
}


请注意,我唯一要做的就是移动该大括号。您的代码可能还有其他错误,但这可以解决ClassNotFound错误。

如果仍然无法正常运行,请提供MCVE。这意味着要除去诸如串行代码之类的多余内容,并尽可能进行硬编码。这是您的MCVE应该多大的示例:

void setup() {
  Paddle paddle = new Paddle();
  Ball ball = new Ball();
  ball.paddle = paddle;
  ball.testBall();
}

class Paddle {
  void testPaddle() {
    println("paddle");
  }
}

class Ball {
  Paddle paddle;

  void testBall() {
    println("ball");
    paddle.testPaddle();
  }
}


请注意,我已经拿走了您所有的游戏逻辑,因为它与语法错误无关。通常在创建MCVE的过程中,您会自己发现错误。祝好运。

08-06 06:48