- Home /
Maintaining the trajectory of a ball when manipulating its velocity in a Breakout/Arkanoid clone
I am making a clone of Breakout and I'm adding a mechanic where the velocity of the ball, after launched, can be manipulated. My problem is that pressing the button to increase velocity also launches the ball vertically in whatever coordinate position its in during that speed. If the ball is already moving at normal speed, I want the ball to keep it's trajectory when the velocity is increased. On top of this, I only want to increase the velocity while a button is held down, and for the ball to return to its normal speed when the button is released. The ball isn't gradually getting faster when the button is held down, the velocity is higher but it's a value that remains static during the different states (think of being able to "fast forward" the moving ball). The ball itself is a dynamic 2D rigidbody, with physics 2D gravity settings being at x = 0 and y = -1. Here's my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour {
private Vector3 paddleToBallVector;
private bool hasStarted = false;
public Paddle paddle;
public Rigidbody2D rb;
private enum States {MachSpeed};
private States myState;
// Use this for initialization
void Start () {
paddleToBallVector = this.transform.position - paddle.transform.position;
myState = States.MachSpeed;
}
// Update is called once per frame
void Update () {
if (!hasStarted) {
// Lock the ball relative to the paddle
this.transform.position = paddle.transform.position + paddleToBallVector;
// Wait for a space press to launch
if (Input.GetKeyDown (KeyCode.Space)) {
print ("Space Clicked, Launch Ball");
hasStarted = true;
this.rb.velocity = new Vector2 (2f, 6f);
}
}
if (myState == States.MachSpeed) {MachSpeed ();}
}
void MachSpeed () {
if (Input.GetKeyDown(KeyCode.X)) {
print ("Mach Speed initiated");
this.rb.velocity = new Vector2 (0f, 20f);
}
}
}
Answer by unit_nick · Oct 20, 2017 at 04:33 AM
here's an implementation that should do what you want
using UnityEngine;
public class Blank : MonoBehaviour
{
public Paddle paddle;
public Rigidbody2D rb;
private Vector3 paddleToBallVector;
private bool hasStarted = false;
private enum States { MachSpeed };
private States myState;
private Vector2 velocity;
// Use this for initialization
void Start()
{
paddleToBallVector = this.transform.position - paddle.transform.position;
myState = States.MachSpeed;
}
// Update is called once per frame
void Update()
{
if (!hasStarted)
{
// Lock the ball relative to the paddle
transform.position = paddle.transform.position + paddleToBallVector;
// Wait for a space press to launch
if (Input.GetKeyDown(KeyCode.Space))
{
print("Space Clicked, Launch Ball");
hasStarted = true;
velocity = new Vector2(2f, 6f);
rb.velocity = velocity;
}
}
if (myState == States.MachSpeed) { MachSpeed(); }
}
void MachSpeed()
{
if (Input.GetKey(KeyCode.X))
{
print("Mach Speed");
rb.velocity = velocity * 3;
}
else
{
rb.velocity = velocity;
}
}
}
really it's pretty rough. but should give you enough to work with?
Thank you! I'll play around with this!