2015-09-03 2 views
0

Je suis récemment passé de Gamemaker: Studio à Java et Slick2D. Je ne suis pas sûr de savoir comment décrire mon problème, mais je ferai de mon mieux. Dans Gamemaker, il y avait une fonction appelée motion_add qui ajouterait du mouvement à un objet avec les paramètres donnés (vitesse et direction). Disons que nous avons un objet descendant à 20 pixels/image. Si vous deviez inverser l'angle de cet objet de 180 degrés (il pointe maintenant vers le haut) et exécuter le code motion_add, il ralentirait jusqu'à 0, puis accélérerait de nouveau. Cela fonctionne très bien pour le mouvement spatial flottant (ce que j'essaie de faire).Java/Slick2D Malédictions du mouvement (Ajouter un mouvement au lieu de le régler?)

Ma question est, comment puis-je recréer ceci? Ceci est mon code actuel mobile:

private void doPlayerMovement(Input input, int delta) { 
    // Calculate rotation speed 
    rotateSpeed = rotateSpeedBase - (speed/5); 
    if (rotateSpeed < 0.1f) { rotateSpeed = 0.1f; } 

    // Get input 
    if (input.isKeyDown(Input.KEY_A)) { 
     // Rotate left 
     if (input.isKeyDown(Input.KEY_W)) { rotation -= rotateSpeed * delta; } 
     sprite.rotate(-rotateSpeed * delta); 
    } 

    if (input.isKeyDown(Input.KEY_D)) { 
     // Rotate right 
     if (input.isKeyDown(Input.KEY_W)) { rotation += rotateSpeed * delta; } 
     sprite.rotate(rotateSpeed * delta); 
    } 

    if (input.isKeyDown(Input.KEY_W)) { 
     // Accelerate 
     speed += acceleration * delta; 
    } if (input.isKeyDown(Input.KEY_S)) { 
     // Decelerate 
     speed -= acceleration * delta; 
    } else { 
     if (speed > 0) { speed -= friction; } 
    } 

    // Clamping 
    if (speed > maxSpeed) { speed = maxSpeed; } else if (speed < minSpeed) { speed = minSpeed; } 
    if (rotation > 360 || rotation < -360) { rotation = 0; } 

    // Make sure rotation catches up with image angle, if necessairy 
    if (rotation != sprite.getRotation() && input.isKeyDown(Input.KEY_W)) { 
     rotation = sprite.getRotation(); 
    } 

    // Update position 
    position.x += speed * Math.sin(Math.toRadians(rotation)) * delta; 
    position.y -= speed * Math.cos(Math.toRadians(rotation)) * delta; 

Qu'advient: A et D tournent l'image-objet. Si vous appuyez sur W (ce qui accélère l'objet), cela «oriente» l'objet. Si la rotation de l'objet n'est pas la même que la rotation de l'image-objet, la rotation de l'objet sera définie sur la rotation de l'image-objet et , où est mon problème. Cela permettra à l'objet de tirer instantanément dans la nouvelle direction avec sa vitesse ne ralentissant pas. Comment puis-je le ralentir?

Modifier (sorte de) Je suis sûr qu'il doit y avoir un nom pour cela, si vous deviez conduire une voiture à 100 mph, le faire tourner de 180 ° en quelque sorte pendant son déplacement, et appuyez sur la gaz, il va ralentir puis accélérer à nouveau. C'est ce que j'essaie d'accomplir. Merci pour tout conseil.

Répondre

1

Vous devez recréer ce comportement. Cela peut s'appeler inertie. Vous pouvez ajouter un vecteur de direction à votre objet afin que vous ayez une direction de mouvement vers laquelle il va et la direction effective vers laquelle pointe votre animation.

Ensuite, lorsque vous changez de direction en mouvement, vous devez décélérer avant de vous diriger vers la nouvelle direction.

Vector movementVector=...; // choose whatever class you want 
Vector pointingVector=...; 

if (movementVector.x == -pointingVector.x || movementVector.y == -pointingVector.y) { 
    // if pressing W then decelerate 
    // if reaching speed == 0 then change movementVector value and accelerate in the other way 
}