2017-05-05 33 views
0

我已經創建了一個簡單的典型乒乓球遊戲Android Studio上的大學課程。在這一點上,幾乎所有事情都準備好了,除了我爲敵人的槳創造了無與倫比的AI。我使用默認的RectF類創建了槳和球,並根據球的當前位置(我減去/加65,因爲我的槳的長度爲130像素,並且它與槳球相比球的中心)更改了我的AI槳的位置。這基本上允許敵方槳以無限的速度移動,因爲它匹配球的速度/位置(球的速度隨着每個新的水平而增加)。下面是一個方法:將速度應用於無與倫比的AI槳簡單的乒乓球遊戲

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類的相關部分:

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)上述方法是通過從run()方法在我View類傳遞的fps

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; 
     } 
    } 
} 

我的槳和球不斷更新在我的onUpdate()方法在View類中。

public void onUpdate() { 
    // Update objects' positions 
    paddle1.update(fps); 
    ball.update(fps); 
    AI(paddle2); 
} 

我如何附上限速使用槳速度我已經定義了每個新槳我的AI槳?我已經嘗試修改AI(Paddle paddle)方法來合併+/- (paddleSpeed/fps)並且它看起來完全不影響槳。也許我錯誤地實現了它,但是任何幫助都會很棒!

回答

2

爲了使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槳可能不會完美。在這種情況下,您可以使用數學來預測球會在哪裏結束並努力到達那裏。

+0

非常感謝! – ethanharrell