2017-05-05 5 views
0

J'ai créé une interprétation simple du jeu classique Pong sur Android Studio pour un cours collégial. À ce stade, presque tout est prêt, à part le fait que j'ai créé une IA imbattable pour la pagaie ennemie. J'ai créé les pagaies et la balle avec la classe RectF par défaut et change la position de ma pagaie AI en fonction de la position actuelle de la balle (je soustrais/ajoute 65 car mes pagaies ont une longueur de 130 pixels et centrent la pagaie). Cela permet essentiellement à la pagaie ennemie de se déplacer à une vitesse infinie car elle correspond à la vitesse/position de la balle (la vitesse de la balle augmente à chaque nouveau niveau). Voici cette méthode:Appliquer la vitesse à la palette AI imbattable pour le jeu Simple Pong

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

Pour référence, voici les parties pertinentes de ma Paddle classe:

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

Le fps dans la méthode update(long fps) ci-dessus est passé à travers de la méthode run() dans ma View classe :

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

Mes pagaies et la balle constamment mise à jour dans mon onUpdate() dans la classe View.

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

Comment puis-je fixer une limite de vitesse à ma pagaie AI en utilisant la vitesse de paddle je définis déjà pour chaque nouvelle palette? J'ai déjà essayé de modifier la méthode AI(Paddle paddle) pour incorporer +/- (paddleSpeed/fps) et cela n'affectait pas du tout la palette. Peut-être que je viens de l'appliquer, mais toute aide serait fantastique!

Répondre

2

Pour faire l'IA déplacer la palette à un rythme régulier plutôt que de sauter au bon endroit, juste essayer de faire au milieu de la ligne de paddle avec le milieu de la balle:

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

puis Après avoir appelé AI(paddle2) à l'intérieur de onUpdate, appelez paddle2.update(fps). De cette façon, vous ne vous répétez pas avec le code de dessin. Vous remarquerez que la palette AI peut ne pas faire parfaitement si la balle est beaucoup plus rapide que la pagaie. Dans ce cas, vous pouvez utiliser les mathématiques pour anticiper où la balle finira et travailler pour y arriver.

+0

Merci beaucoup! – ethanharrell