球应该从桨上反弹,游戏应该在游戏结束时重新启动

时间:2016-05-19 18:10:52

标签: processing

所以这是我的整个代码以及它没有做的,但绝对应该首先在与桨碰撞时反弹,然后如果不这样做,那么一旦游戏进入游戏模式,一旦按下一个键它应该重启游戏。现在我尝试了几件事,似乎没什么用。

有人可以找一个解决方案并尝试解释我做错了什么吗?

 
// variables for the ball
int ball_width = 15, ball_height = 15;  
int ballX = width/2, ballY = height/2;
//
// variables for the paddles
int paddle_width = 20, paddle_height = 150;
int paddle1 = 60, paddle2;
//
// direction variables
int directionX = 15, directionY = 15;
//
// variables for the score
int scorecounter = 0;
//
//game states
boolean playing = false, gameover = false, finalscore = false, score = true;

void setup () {
  size (1900, 1300); // the field game is going to be 1900x1300 px big
  rectMode (CENTER);
  paddle2 = width - 60;
}



void draw () {
  background (0); // black background

  playing ();
  gameover ();
  finalscore();

}

// 
void playing () {
  if (keyPressed) { 
    playing = true;
  }

  if (!playing) { // playing = false

    fill(255); 
    textSize(80); 
    textAlign(CENTER); 
    text("Press Space to Play", width/2, height/4);

    fill (255); 
    ellipse (width/2, height/2, ball_width, ball_height); // this is the starting point of the ball
    fill (255, 10, 20); 
    rect(paddle1, (height/2), paddle_width, paddle_height);  // red pong
    fill (60, 255, 0); 
    rect(paddle2, (height/2), paddle_width, paddle_height);  // green pong
  }

  if (playing) { // playing = true
    score();

    ballX = ballX + directionX; 
    ballY = ballY + directionY;

    fill (255); 
    ellipse (ballX, ballY, ball_width, ball_height); 

    fill ( 255, 10, 20 ); 
    rect(paddle1, mouseY, paddle_width, paddle_height); // red pong
    fill ( 60, 255, 0 ); 
    rect(paddle2, mouseY, paddle_width, paddle_height);  // green pong

   if ( ballY > height ) { 
     directionY = -directionY;
   } // if the ball reaches the lower wall it will bounce off
   if ( ballY < 0 ) { 
     directionY = -directionY;
   } // if the ball reaches the upper wall it will bounce off

   if ( ballX > width || ballX < 0 ) { 
     gameover = true; }
   }

   if (ballX == paddle1 && ballY <= paddle_height) { 
     directionX = -directionX;
     directionY = -directionY;
   }
   if (ballX == paddle2 && ballY <= paddle_height) {
     directionX = -directionX;
     directionY = -directionY;
   }
}

void gameover () {
  if (gameover) {
    background (0);
  }

  finalscore ();
  score = false;

  if (keyPressed) { 
    playing = true;
  }
}

void score () {
  if (playing) {

    fill(255); 
    textSize(45); 
    textAlign(CENTER); 
    text ( scorecounter, width/2, height/4);

    if (ballX == paddle1 && ballY <= paddle_height) { 
      scorecounter = scorecounter + 10;
    }
    if (ballX == paddle2 && ballX <= paddle_height) { 
      scorecounter = scorecounter + 10;
    }
  }

  if (!playing) {
    score = false;
  }
}

void finalscore () {
  if (gameover) {
    score = false;

    fill(255); 
    textSize(45); 
    textAlign(CENTER); 
    text("Game Over. Press a key to play again.", width/2, height/4);
    fill(255); 
    textSize(80); 
    textAlign(CENTER); 
    text("You scored " + scorecounter + " points", width/2, (height/4) * 3);


    if (keyPressed) { 
      playing = playing;
    }
  }
}  

3 个答案:

答案 0 :(得分:1)

不确定这是否是问题,但

if (keyPressed) { 
   playing = playing;
}

看起来不太有用。你有一个函数和一个名为playing的变量。重用标识符通常会导致混淆。

答案 1 :(得分:0)

如果您第一次没有从球拍中弹出球,请看看这些线:

if (ballX == paddle1 && ballY <= paddle_height) { 
     directionX = -directionX;
     directionY = -directionY;
}
if (ballX == paddle2 && ballY <= paddle_height) {
     directionX = -directionX;
     directionY = -directionY;
}

请注意,您正在检查ballX == paddle1ballX == paddle2。您正在检查球的精确像素位置是否与任何一个桨匹配。

但是,同时注意到每次移动球的强度都是 15像素,所以它击中精确像素的几率非常低。换句话说,你的球将在精确的像素位置移动并且在你的桨内是您必须检查的内容。

此外,你只是检查球的y位置是否小于paddleHeight。这还不够。你还必须检查它是否大于桨位!

即使在那之后,我也不确定你是否想要在碰到桨时反转directionY,但我会让你自己决定。

关于游戏过程中没有重置的其他问题,请注意你永远不会重置球的位置!这意味着你开始玩,但然后立即开始游戏。在重新开始游戏之前,您需要重置球的位置。

老实说,如果我是你,我会从一个更基本的草图开始。你的代码中有很多额外的东西没有多大意义,所以我对你感到困惑并不感到惊讶。从更简单的事情开始:您是否可以创建一个简单检测鼠标何时在矩形内的草图?从那里开始(甚至更简单!)并采取一些小步骤,而不是试图一次性编程你的最终目标。祝你好运。

答案 2 :(得分:-1)

这不是重置的原因是因为你永远不会更新ballX o gameover变量。每按一次键,你就会陷入这种情况。

if ( ballX > width || ballX < 0 ) {
  gameover = true; 
}

我通过在游戏方法中添加你的初始值来解决这个问题:

void playing () {
  if (keyPressed) { 
    playing = true;
    gameover = false;
    ballX = width/2;
    ballY = height/2;
  }
  // rest of playing() code
}