所以这是我的整个代码以及它没有做的,但绝对应该首先在与桨碰撞时反弹,然后如果不这样做,那么一旦游戏进入游戏模式,一旦按下一个键它应该重启游戏。现在我尝试了几件事,似乎没什么用。
有人可以找一个解决方案并尝试解释我做错了什么吗?
// 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;
}
}
}
答案 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 == paddle1
或ballX == 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
}