2017-05-05 12 views
0

私は大学のコースのためにAndroidスタジオで古典的なポンゲームの簡単な演出を作成しました。この時点で、私は敵のパドルのための無敵のAIを作ったという事実を除いて、ほとんどすべてが準備ができています。私はパドルとボールをデフォルトのRectFクラスで作成し、ボールの現在の位置に基づいて自分のAIパドルの位置を変更します(パドルの長さは130ピクセルでありボールと比較してパドルを中心にするため、これは本質的に敵のパドルがボールの速度/位置に合っているため(ボールの速度が新しいレベルごとに増加するため)、無限の速度で移動することができます。ここではその方法です:シンプルなポンゲームのために無敵の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クラスの関連する部分です:上記の私Viewクラスにrun()メソッドから通過さupdate(long fps)方法で

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

fps

私のパドルとボールは常にで更新されますViewクラスのメソッド。私はすでにそれぞれの新しいパドルに定義パドル速度を使用して、私のAIパドルに速度制限を付けることができますどのように

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

?私はすでにAI(Paddle paddle)メソッドに+/- (paddleSpeed/fps)を組み込むように修正しようとしましたが、パドルにはまったく影響しませんでした。たぶん私はそれを間違って実装したが、どんな助けも素晴らしいだろう!その後、

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

と:

答えて

2

AIはちょうどボールの真ん中でパドルラインアップの真ん中をしようと、むしろ正しい場所にジャンプするよりも安定した速度でパドルを動かすようにするにをonUpdateの内側に電話した後は、paddle2.update(fps)に電話してください。この方法では、描画コードで自分自身を繰り返すことはありません。ボールがパドルよりもはるかに速い場合、AIパドルが完全には動作しないことがあります。この場合は、ボールがどこに到達してそこに到達するかを予測するために数学を使用することができます。

+0

ありがとうございました! – ethanharrell

関連する問題