Android Open Source - gameengine Viewport






From Project

Back to project page gameengine.

License

The source code is released under:

Apache License

If you think the Android project gameengine listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.garrapeta.gameengine;
//  w w w . j a va 2 s . c  o  m
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PointF;
import android.graphics.RectF;
import android.util.DisplayMetrics;

import com.badlogic.gdx.math.Vector2;
import com.garrapeta.gameengine.utils.LogX;

public class Viewport {

    // -------------------------------------------------------- Constants

    public static final String TAG = GameWorld.TAG_GAME_ENGINE + ".viewport";

    // ------------------------------------------------------------ Types

    private enum ProjectionMode {
        EXPLICIT,
        FIT_WIDTH,
        FIT_HEIGHT
    };

    // ----------------------------------------------- Instance variables

    /** Associated world */
    public GameWorld mWorld;

    /**
     * Number of dps in one world unit (meters)
     */
    private float mDpsInWorldUnits;

    /** Physical width of the game view, in pixels */
    private int mViewWidth = Integer.MIN_VALUE;

    /** Physical height of the game view, in pixels */
    private int mViewHeight = Integer.MIN_VALUE;

    /** Width of the game world, in world units. */
    private float mWorldWidth;

    /** Height of the game world, in world units. */
    private float mWorldHeight;

    /** Visible world boundaries */
    private RectF mWorldBoundaries = new RectF();

    /** Current projection mode */
    private ProjectionMode mProjectionMode;

    /** Display metrics */
    private DisplayMetrics mDisplayMetrics;

    private boolean mReverseYAxis = false;

    // -------------------------------------------------- Static methods

    public static Vector2 pointFToVector2(PointF pf) {
        return new Vector2(pf.x, pf.y);
    }

    public static Vector2[] pointFToVector2(PointF[] pfs) {
        int l = pfs.length;
        Vector2[] v2s = new Vector2[l];

        for (int i = 0; i < l; i++) {
            v2s[i] = pointFToVector2(pfs[i]);
        }
        return v2s;
    }

    public static PointF vector2ToPointF(Vector2 v2) {
        return new PointF(v2.x, v2.y);
    }

    public static PointF[] vector2ToPointF(Vector2[] v2s) {
        int l = v2s.length;
        PointF[] pfs = new PointF[l];

        for (int i = 0; i < l; i++) {
            pfs[i] = vector2ToPointF(v2s[i]);
        }
        return pfs;
    }

    // ---------------------------------------------------- Constructor

    /**
     * @param world
     */
    public Viewport(GameWorld world, DisplayMetrics displayMetrics) {
        mWorld = world;
        mDisplayMetrics = displayMetrics;
    }

    // ------------------------------------------------ Instance methods

    public void gameViewSizeChanged(GameView gameView, int viewWidth, int viewHeight) {
        LogX.i(TAG, "onGameViewSizeChanged(" + viewWidth + ", " + +viewHeight + ")");

        mViewWidth = viewWidth;
        mViewHeight = viewHeight;
        updateWorldBoundaries();
    }

    void setReverseYAxis(boolean reverse) {
        mReverseYAxis = reverse;
    }

    public void setWorldSize(float width, float height, float dpsInWorldUnit) {
        setWorldSize(width, height, dpsInWorldUnit, ProjectionMode.EXPLICIT);
    }

    public void setWorldSizeAndFitWidth(float width, float height) {
        setWorldSize(width, height, Float.MIN_VALUE, ProjectionMode.FIT_WIDTH);
    }

    public void setWorldSizeAndFitHeight(float width, float height) {
        setWorldSize(width, height, Float.MIN_VALUE, ProjectionMode.FIT_HEIGHT);
    }

    public void setWorldWidth(float width, float dpsInWorldUnit) {
        setWorldSize(width, Float.MIN_VALUE, dpsInWorldUnit, ProjectionMode.EXPLICIT);
    }

    public void setWorldHeight(float height, float dpsInWorldUnit) {
        setWorldSize(Float.MIN_VALUE, height, dpsInWorldUnit, ProjectionMode.EXPLICIT);
    }

    public void setWorldWidth(float width) {
        setWorldSize(width, Float.MIN_VALUE, Float.MIN_VALUE, ProjectionMode.FIT_WIDTH);
    }

    public void setWorldHeight(float height) {
        setWorldSize(Float.MIN_VALUE, height, Float.MIN_VALUE, ProjectionMode.FIT_HEIGHT);
    }

    public void setWorldSizeDpsPerWorldUnit(float dpsPerWorldUnit) {
        final float worldWidth = mDisplayMetrics.widthPixels / mDisplayMetrics.density / dpsPerWorldUnit;
        final float worldHeight = mDisplayMetrics.heightPixels / mDisplayMetrics.density / dpsPerWorldUnit;
        setWorldSize(worldWidth, worldHeight, dpsPerWorldUnit);
    }

    public void setWorldSizeGivenWorldUnitsPerInchX(float worldUnitsPerInchX) {
        // Due to bug in some devices (samsung) we cannot trust
        // mDisplayMetrics.xdpi,
        // so we use mDisplayMetrics.densityDpi, which is more reliable albeit
        // less accurate
        // https://groups.google.com/forum/#!topic/android-developers/g56jV0Hora0

        // final float xPixelsPerInch = mDisplayMetrics.xdpi;
        final float xPixelsPerInch = mDisplayMetrics.densityDpi;

        final float widthPixels = mDisplayMetrics.widthPixels;

        final float inchesX = widthPixels / xPixelsPerInch;
        final float worldWidth = inchesX * worldUnitsPerInchX;

        setWorldWidth(worldWidth);
    }

    public void setWorldSizeGivenWorldUnitsPerInchY(float worldUnitsPerInchY) {
        // Due to bug in some devices (samsung) we cannot trust
        // mDisplayMetrics.ydpi,
        // so we use mDisplayMetrics.densityDpi, which is more reliable albeit
        // less accurate
        // https://groups.google.com/forum/#!topic/android-developers/g56jV0Hora0

        // final float xPixelsPerInch = mDisplayMetrics.ydpi;
        final float yPixelsPerInch = mDisplayMetrics.densityDpi;

        final float heightPixels = mDisplayMetrics.heightPixels;

        final float inchesY = heightPixels / yPixelsPerInch;
        final float worldHeight = inchesY * worldUnitsPerInchY;

        setWorldHeight(worldHeight);
    }

    private void setWorldSize(float width, float height, float dpsInWorldUnit, ProjectionMode mode) {
        mWorldWidth = width;
        mWorldHeight = height;
        mDpsInWorldUnits = dpsInWorldUnit;
        mProjectionMode = mode;
        updateWorldBoundaries();
    }

    private void updateWorldBoundaries() {

        if (mViewWidth != Integer.MIN_VALUE && mViewHeight != Integer.MIN_VALUE && mProjectionMode != null) {

            switch (mProjectionMode) {
            case FIT_WIDTH:
                if (mWorldWidth == Float.MIN_VALUE) {
                    throw new IllegalArgumentException("Projection mode is " + ProjectionMode.FIT_WIDTH + " but width is undefined");
                }
                mDpsInWorldUnits = pixelsToDps(mViewWidth) / mWorldWidth;
                break;
            case FIT_HEIGHT:
                if (mWorldHeight == Float.MIN_VALUE) {
                    throw new IllegalArgumentException("Projection mode is " + ProjectionMode.FIT_HEIGHT + " but height is undefined");
                }
                mDpsInWorldUnits = pixelsToDps(mViewHeight) / mWorldHeight;
                break;
            case EXPLICIT:
                break;
            }
        }

        // set of world size
        if (mWorldWidth == Float.MIN_VALUE && mDpsInWorldUnits != Float.MIN_VALUE) {
            mWorldWidth = pixelsToDps(mViewWidth) / mDpsInWorldUnits;
        }
        if (mWorldHeight == Float.MIN_VALUE && mDpsInWorldUnits != Float.MIN_VALUE) {
            mWorldHeight = pixelsToDps(mViewHeight) / mDpsInWorldUnits;
        }

        // update of boundaries
        if (mWorldWidth != Float.MIN_VALUE && mWorldHeight != Float.MIN_VALUE) {
            RectF prevWorldBoundaries = new RectF(mWorldBoundaries);

            mWorldBoundaries.left = 0;
            mWorldBoundaries.right = mWorldWidth;

            if (!mReverseYAxis) {
                mWorldBoundaries.top = 0;
                mWorldBoundaries.bottom = mWorldHeight;
            } else {
                mWorldBoundaries.top = mWorldHeight;
                mWorldBoundaries.bottom = 0;
            }

            if (prevWorldBoundaries.left != mWorldBoundaries.left || prevWorldBoundaries.right != mWorldBoundaries.right
                    || prevWorldBoundaries.top != mWorldBoundaries.top || prevWorldBoundaries.bottom != mWorldBoundaries.bottom) {

                mWorld.onGameWorldSizeChanged(mWorldBoundaries);
            }
        }

    }

    /**
     * @return the worldBoundaries
     */
    public RectF getWorldBoundaries() {
        return mWorldBoundaries;
    }

    // Length conversion methods

    public float worldUnitsToPixels(float worldUnits) {
        return dpsToPixels(worldUnits * mDpsInWorldUnits);
    }

    public float pixelsToWorldUnits(float pixels) {
        return pixelsToDps(pixels / mDpsInWorldUnits);
    }

    public float pixelsToDps(float pixels) {
        return pixels / mDisplayMetrics.density;
    }

    public float dpsToPixels(float dps) {
        return dps * mDisplayMetrics.density;
    }

    // Coordinate conversion methods

    public float screenToWorldX(float screenX) {
        return pixelsToWorldUnits(screenX);
    }

    public float screenToWorldY(float screenY) {
        if (!mReverseYAxis) {
            return pixelsToWorldUnits(screenY);
        } else {
            return pixelsToWorldUnits(mViewHeight - screenY);
        }
    }

    public float worldToScreenX(float worldX) {
        return worldUnitsToPixels(worldX);
    }

    public float worldToScreenY(float worldY) {
        if (!mReverseYAxis) {
            return worldUnitsToPixels(worldY);
        } else {
            return mViewHeight - worldUnitsToPixels(worldY);
        }
    }

    // ----------------------------------------------------------------------------------

    /**
     * Dibuja una cuadr?cula en pantalla
     * 
     * @param canvas
     * @param worldSpacing
     *            tama?o de las celdas en unidades del mundo (normalmente
     *            metros)
     */
    public void drawBoundaries(Canvas canvas, Paint paint) {
        // TODO: not sure if offsets are working
        float worldSpacing = 1;
        float screenSpacing = worldUnitsToPixels(worldSpacing);

        paint.setStyle(Style.STROKE);
        paint.setColor(Color.DKGRAY);

        float left = worldToScreenX(mWorldBoundaries.left);
        float top = worldToScreenY(mWorldBoundaries.bottom);
        float right = worldToScreenX(mWorldBoundaries.right);
        float bottom = worldToScreenY(mWorldBoundaries.top);

        // rayas verticales
        for (float i = left; i < right; i += screenSpacing) {
            canvas.drawLine(i, top, i, bottom, paint);
        }

        // rayas horizontales
        for (float i = bottom; i < top; i += screenSpacing) {
            canvas.drawLine(left, i, right, i, paint);
        }

    }

    /**
     * Frees resources
     */
    public void dispose() {
        mWorld = null;
        mWorldBoundaries = null;
        mDisplayMetrics = null;
    }

}




Java Source Code List

com.badlogic.gdx.math.MathUtils.java
com.badlogic.gdx.math.Matrix3.java
com.badlogic.gdx.math.Matrix4.java
com.badlogic.gdx.math.Quaternion.java
com.badlogic.gdx.math.Vector2.java
com.badlogic.gdx.math.Vector3.java
com.badlogic.gdx.physics.box2d.BodyDef.java
com.badlogic.gdx.physics.box2d.Body.java
com.badlogic.gdx.physics.box2d.ChainShape.java
com.badlogic.gdx.physics.box2d.CircleShape.java
com.badlogic.gdx.physics.box2d.ContactFilter.java
com.badlogic.gdx.physics.box2d.ContactImpulse.java
com.badlogic.gdx.physics.box2d.ContactListener.java
com.badlogic.gdx.physics.box2d.Contact.java
com.badlogic.gdx.physics.box2d.DestructionListener.java
com.badlogic.gdx.physics.box2d.EdgeShape.java
com.badlogic.gdx.physics.box2d.Filter.java
com.badlogic.gdx.physics.box2d.FixtureDef.java
com.badlogic.gdx.physics.box2d.Fixture.java
com.badlogic.gdx.physics.box2d.JointDef.java
com.badlogic.gdx.physics.box2d.JointEdge.java
com.badlogic.gdx.physics.box2d.Joint.java
com.badlogic.gdx.physics.box2d.Manifold.java
com.badlogic.gdx.physics.box2d.MassData.java
com.badlogic.gdx.physics.box2d.PolygonShape.java
com.badlogic.gdx.physics.box2d.QueryCallback.java
com.badlogic.gdx.physics.box2d.RayCastCallback.java
com.badlogic.gdx.physics.box2d.Shape.java
com.badlogic.gdx.physics.box2d.Transform.java
com.badlogic.gdx.physics.box2d.WorldManifold.java
com.badlogic.gdx.physics.box2d.World.java
com.badlogic.gdx.physics.box2d.joints.DistanceJointDef.java
com.badlogic.gdx.physics.box2d.joints.DistanceJoint.java
com.badlogic.gdx.physics.box2d.joints.FrictionJointDef.java
com.badlogic.gdx.physics.box2d.joints.FrictionJoint.java
com.badlogic.gdx.physics.box2d.joints.GearJointDef.java
com.badlogic.gdx.physics.box2d.joints.GearJoint.java
com.badlogic.gdx.physics.box2d.joints.MouseJointDef.java
com.badlogic.gdx.physics.box2d.joints.MouseJoint.java
com.badlogic.gdx.physics.box2d.joints.PrismaticJointDef.java
com.badlogic.gdx.physics.box2d.joints.PrismaticJoint.java
com.badlogic.gdx.physics.box2d.joints.PulleyJointDef.java
com.badlogic.gdx.physics.box2d.joints.PulleyJoint.java
com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef.java
com.badlogic.gdx.physics.box2d.joints.RevoluteJoint.java
com.badlogic.gdx.physics.box2d.joints.RopeJointDef.java
com.badlogic.gdx.physics.box2d.joints.RopeJoint.java
com.badlogic.gdx.physics.box2d.joints.WeldJointDef.java
com.badlogic.gdx.physics.box2d.joints.WeldJoint.java
com.badlogic.gdx.physics.box2d.joints.WheelJointDef.java
com.badlogic.gdx.physics.box2d.joints.WheelJoint.java
com.badlogic.gdx.utils.Array.java
com.badlogic.gdx.utils.ComparableTimSort.java
com.badlogic.gdx.utils.Disposable.java
com.badlogic.gdx.utils.GdxRuntimeException.java
com.badlogic.gdx.utils.LongArray.java
com.badlogic.gdx.utils.LongMap.java
com.badlogic.gdx.utils.NumberUtils.java
com.badlogic.gdx.utils.Pool.java
com.badlogic.gdx.utils.Sort.java
com.badlogic.gdx.utils.StringBuilder.java
com.badlogic.gdx.utils.TimSort.java
com.garrapeta.MathUtils.java
com.garrapeta.gameengine.Actor.java
com.garrapeta.gameengine.AsyncGameMessage.java
com.garrapeta.gameengine.BitmapManager.java
com.garrapeta.gameengine.Box2DActor.java
com.garrapeta.gameengine.Box2DWorld.java
com.garrapeta.gameengine.GameMessage.java
com.garrapeta.gameengine.GameView.java
com.garrapeta.gameengine.GameWorld.java
com.garrapeta.gameengine.ShapeDrawer.java
com.garrapeta.gameengine.SyncGameMessage.java
com.garrapeta.gameengine.Viewport.java
com.garrapeta.gameengine.actor.Box2DAtomicActor.java
com.garrapeta.gameengine.actor.Box2DCircleActor.java
com.garrapeta.gameengine.actor.Box2DEdgeActor.java
com.garrapeta.gameengine.actor.Box2DLoopActor.java
com.garrapeta.gameengine.actor.Box2DOpenChainActor.java
com.garrapeta.gameengine.actor.Box2DPolygonActor.java
com.garrapeta.gameengine.actor.IAtomicActor.java
com.garrapeta.gameengine.actor.SimpleActor.java
com.garrapeta.gameengine.module.LevelActionsModule.java
com.garrapeta.gameengine.module.LoadedLevelActionsModule.java
com.garrapeta.gameengine.module.SoundModule.java
com.garrapeta.gameengine.module.VibrationModule.java
com.garrapeta.gameengine.utils.IOUtils.java
com.garrapeta.gameengine.utils.LogX.java
com.garrapeta.gameengine.utils.PhysicsUtils.java
com.garrapeta.gameengine.utils.Pool.java