将速度应用到无与伦比的 AI Paddle 以进行简单的乒乓球游戏
Apply Speed to Unbeatable AI Paddle for Simple Pong Game
我在 Android Studio 上为大学课程制作了 classic Pong 游戏的简单版本。在这一点上,几乎一切都准备就绪,除了我为敌人的球拍创建了一个无与伦比的 AI。我使用默认 RectF
class 创建了球拍和球,并根据球的当前位置更改了我的 AI 球拍的位置(我 subtract/add 乘以 65,因为我的球拍长度为 130 像素并且与球相比,它使球拍居中)。这基本上允许敌人球拍以无限速度移动,因为它与球的 speed/position 相匹配(球速度随着每个新级别而增加)。这是该方法:
public void AI(Paddle paddle) {
RectF paddleRect = paddle.getRect();
RectF ballRect = ball.getRect();
if (ballRect.left >= 65 && ballRect.right <= screenX - 65) {
paddleRect.left = (ballRect.left - 65);
paddleRect.right = (ballRect.right + 65);
}
if (ballRect.left < 65) {
paddleRect.left = 0;
paddleRect.right = 130;
}
if (ballRect.right > screenX - 65) {
paddleRect.left = screenX - 130;
paddleRect.right = screenX;
}
}
作为参考,这里是我的Paddle
class的相关部分:
public Paddle(float screenX, float screenY, float xPos, float yPos, int defaultSpeed){
length = 130;
height = 30;
paddleSpeed = defaultSpeed;
// Start paddle in the center of the screen
x = (screenX / 2) - 65;
xBound = screenX;
// Create the rectangle
rect = new RectF(x, yPos, x + length, yPos + height);
}
// Set the movement of the paddle if it is going left, right or nowhere
public void setMovementState(int state) {
paddleMoving = state;
}
// Updates paddles' position
public void update(long fps){
if(x > 0 && paddleMoving == LEFT){
x = x - (paddleSpeed / fps);
}
if(x < (xBound - 130) && paddleMoving == RIGHT){
x = x + (paddleSpeed / fps);
}
rect.left = x;
rect.right = x + length;
}
上面update(long fps)
方法中的fps
是从我View
class中的run()
方法传过来的:
public void run() {
while (playing) {
// Capture the current time in milliseconds
startTime = System.currentTimeMillis();
// Update & draw the frame
if (!paused) {
onUpdate();
}
draw();
// Calculate the fps this frame
thisTime = System.currentTimeMillis() - startTime;
if (thisTime >= 1) {
fps = 1000 / thisTime;
}
}
}
在 View
class.
我的 onUpdate()
方法中,我的球拍和球不断更新
public void onUpdate() {
// Update objects' positions
paddle1.update(fps);
ball.update(fps);
AI(paddle2);
}
如何使用我已经为每个新桨定义的桨速度为我的 AI 桨附加速度限制?我已经尝试修改 AI(Paddle paddle)
方法以合并 +/- (paddleSpeed / fps)
并且它似乎根本没有影响桨。也许我只是实施错误,但任何帮助都会很棒!
要让 AI 以稳定的速度移动桨而不是跳到正确的位置,只需尝试使桨的中间与球的中间对齐:
public void AI(Paddle paddle) {
RectF paddleRect = paddle.getRect();
RectF ballRect = ball.getRect();
float ballCenter = (ballRect.left + ballRect.right) / 2;
float paddleCenter = (paddleRect.left + paddleRect.right) / 2;
if (ballCenter < paddleCenter) {
setMovementState(LEFT);
}
else {
setMovementState(RIGHT);
}
}
然后在 onUpdate
中调用 AI(paddle2)
之后,调用 paddle2.update(fps)
。这样您就不会重复自己的绘图代码。您会注意到,如果球比球拍快得多,AI 球拍可能无法完美运行。在这种情况下,您可以使用数学来预测球的最终位置并努力到达那里。
我在 Android Studio 上为大学课程制作了 classic Pong 游戏的简单版本。在这一点上,几乎一切都准备就绪,除了我为敌人的球拍创建了一个无与伦比的 AI。我使用默认 RectF
class 创建了球拍和球,并根据球的当前位置更改了我的 AI 球拍的位置(我 subtract/add 乘以 65,因为我的球拍长度为 130 像素并且与球相比,它使球拍居中)。这基本上允许敌人球拍以无限速度移动,因为它与球的 speed/position 相匹配(球速度随着每个新级别而增加)。这是该方法:
public void AI(Paddle paddle) {
RectF paddleRect = paddle.getRect();
RectF ballRect = ball.getRect();
if (ballRect.left >= 65 && ballRect.right <= screenX - 65) {
paddleRect.left = (ballRect.left - 65);
paddleRect.right = (ballRect.right + 65);
}
if (ballRect.left < 65) {
paddleRect.left = 0;
paddleRect.right = 130;
}
if (ballRect.right > screenX - 65) {
paddleRect.left = screenX - 130;
paddleRect.right = screenX;
}
}
作为参考,这里是我的Paddle
class的相关部分:
public Paddle(float screenX, float screenY, float xPos, float yPos, int defaultSpeed){
length = 130;
height = 30;
paddleSpeed = defaultSpeed;
// Start paddle in the center of the screen
x = (screenX / 2) - 65;
xBound = screenX;
// Create the rectangle
rect = new RectF(x, yPos, x + length, yPos + height);
}
// Set the movement of the paddle if it is going left, right or nowhere
public void setMovementState(int state) {
paddleMoving = state;
}
// Updates paddles' position
public void update(long fps){
if(x > 0 && paddleMoving == LEFT){
x = x - (paddleSpeed / fps);
}
if(x < (xBound - 130) && paddleMoving == RIGHT){
x = x + (paddleSpeed / fps);
}
rect.left = x;
rect.right = x + length;
}
上面update(long fps)
方法中的fps
是从我View
class中的run()
方法传过来的:
public void run() {
while (playing) {
// Capture the current time in milliseconds
startTime = System.currentTimeMillis();
// Update & draw the frame
if (!paused) {
onUpdate();
}
draw();
// Calculate the fps this frame
thisTime = System.currentTimeMillis() - startTime;
if (thisTime >= 1) {
fps = 1000 / thisTime;
}
}
}
在 View
class.
onUpdate()
方法中,我的球拍和球不断更新
public void onUpdate() {
// Update objects' positions
paddle1.update(fps);
ball.update(fps);
AI(paddle2);
}
如何使用我已经为每个新桨定义的桨速度为我的 AI 桨附加速度限制?我已经尝试修改 AI(Paddle paddle)
方法以合并 +/- (paddleSpeed / fps)
并且它似乎根本没有影响桨。也许我只是实施错误,但任何帮助都会很棒!
要让 AI 以稳定的速度移动桨而不是跳到正确的位置,只需尝试使桨的中间与球的中间对齐:
public void AI(Paddle paddle) {
RectF paddleRect = paddle.getRect();
RectF ballRect = ball.getRect();
float ballCenter = (ballRect.left + ballRect.right) / 2;
float paddleCenter = (paddleRect.left + paddleRect.right) / 2;
if (ballCenter < paddleCenter) {
setMovementState(LEFT);
}
else {
setMovementState(RIGHT);
}
}
然后在 onUpdate
中调用 AI(paddle2)
之后,调用 paddle2.update(fps)
。这样您就不会重复自己的绘图代码。您会注意到,如果球比球拍快得多,AI 球拍可能无法完美运行。在这种情况下,您可以使用数学来预测球的最终位置并努力到达那里。