com.bladecoder.engine.ui.SceneFitViewport Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of blade-engine Show documentation
Show all versions of blade-engine Show documentation
Classic point and click adventure game engine
/*******************************************************************************
* Copyright 2014 Rafael Garcia Moreno.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.bladecoder.engine.ui;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.glutils.HdpiUtils;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Scaling;
import com.badlogic.gdx.utils.viewport.Viewport;
/**
* This is a Custom FitViewport with the next differences with the libgdx FitViewport
*
* - The camera uses screen coordinates. This is used to draw fonts and UI 1:1
* - The world dimensions is used only to calculate the dimensions of the viewport
*
* @author rgarcia
*/
public class SceneFitViewport extends Viewport {
/** Creates a new viewport using a new {@link OrthographicCamera}. */
public SceneFitViewport () {
setCamera(new OrthographicCamera());
}
@Override
public void update (int screenWidth, int screenHeight, boolean centerCamera) {
Vector2 scaled = Scaling.fit.apply(getWorldWidth(), getWorldHeight(), screenWidth, screenHeight);
setScreenSize(Math.round(scaled.x), Math.round(scaled.y));
// center the viewport in the middle of the screen
setScreenPosition((screenWidth - getScreenWidth()) / 2,
(screenHeight - getScreenHeight()) / 2);
apply(centerCamera);
}
@Override
public void apply (boolean centerCamera) {
HdpiUtils.glViewport(getScreenX(), getScreenY(), getScreenWidth(), getScreenHeight());
getCamera().viewportWidth = getScreenWidth();
getCamera().viewportHeight = getScreenHeight();
if (centerCamera)
getCamera().position.set(getScreenWidth() / 2, getScreenHeight() / 2, 0);
getCamera().update();
}
@Override
public Vector2 unproject(Vector2 out) {
super.unproject(out);
out.x = MathUtils.clamp(out.x, 0, getScreenWidth() - 1);
out.y = MathUtils.clamp(out.y, 0, getScreenHeight() - 1);
return out;
}
@Override
public Vector3 unproject(Vector3 out) {
super.unproject(out);
out.x = MathUtils.clamp(out.x, 0, getScreenWidth() - 1);
out.y = MathUtils.clamp(out.y, 0, getScreenHeight() - 1);
return out;
}
}