package com.cookbook.samples;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
public class CarEngineSample extends GdxSample {
private static final int VIRTUAL_WIDTH = 640;
private static final int VIRTUAL_HEIGHT = 360;
private final static float MAX_SPEED = 200.0f;
private final static float ACCELERATION = 25.0f;
private final static float FRICTION = 15.0f;
private final static float IDLE_THRESHOLD = 0.1f;
private float speed;
private Sound engine;
private Sound idle;
private long soundId;
private OrthographicCamera camera;
private Viewport viewport;
private SpriteBatch batch;
private BitmapFont font;
@Override
public void create() {
camera = new OrthographicCamera();
viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
batch = new SpriteBatch();
font = new BitmapFont();
font.setColor(Color.WHITE);
font.getData().setScale(2.5f);
camera.position.set(VIRTUAL_WIDTH * 0.5f, VIRTUAL_HEIGHT * 0.5f, 0.0f);
idle = Gdx.audio.newSound(Gdx.files.internal("data/sfx/car-idle.wav"));
engine = Gdx.audio.newSound(Gdx.files.internal("data/sfx/car-engine.wav"));
soundId = idle.play();
idle.setLooping(soundId, true);
}
@Override
public void dispose() {
batch.dispose();
font.dispose();
engine.dispose();
idle.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
updateEngine(Gdx.graphics.getDeltaTime());
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
font.draw(batch, "Speed: " + speed + "km/h", 20.0f, 200.0f);
font.draw(batch, "Press SPACE or touch to accelerate", 20.0f, 150.0f);
batch.end();
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
private void updateEngine(float delta) {
boolean wasIdle = speed < IDLE_THRESHOLD;
// Update speed
float acceleration = -FRICTION;
if (Gdx.input.isKeyPressed(Keys.SPACE) || Gdx.input.isButtonPressed(Buttons.LEFT)) {
acceleration = ACCELERATION;
}
speed = MathUtils.clamp(speed + acceleration * delta, 0.0f, MAX_SPEED);
boolean isIdle = speed < IDLE_THRESHOLD;
// Update sounds
if (wasIdle && !isIdle) {
idle.stop();
soundId = engine.play();
engine.setLooping(soundId, true);
}
else if (!wasIdle && isIdle) {
engine.stop();
soundId = idle.play();
idle.setLooping(soundId, true);
}
if (!isIdle) {
float pitch = 0.5f + speed / MAX_SPEED * 0.5f;
engine.setPitch(soundId, pitch);
}
}
}