diff --git a/src/ve/ucv/ciens/ccg/nxtar/NxtARCore.java b/src/ve/ucv/ciens/ccg/nxtar/NxtARCore.java index 20d4637..c7d65b9 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/NxtARCore.java +++ b/src/ve/ucv/ciens/ccg/nxtar/NxtARCore.java @@ -128,51 +128,55 @@ public class NxtARCore extends Game implements NetworkConnectionListener{ states[game_states_t.IN_GAME.getValue()] = new InGameState(this); states[game_states_t.PAUSED.getValue()] = new PauseState(this); + for(BaseState state : states){ + Controllers.addListener(state); + } + // Set up fields. batch = new SpriteBatch(); if(ProjectConstants.DEBUG) pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());{ - // Set up the overlay font. - fontX = -((Gdx.graphics.getWidth() * ProjectConstants.OVERSCAN) / 2) + 10; - fontY = ((Gdx.graphics.getHeight() * ProjectConstants.OVERSCAN) / 2) - 10; + // Set up the overlay font. + fontX = -((Gdx.graphics.getWidth() * ProjectConstants.OVERSCAN) / 2) + 10; + fontY = ((Gdx.graphics.getHeight() * ProjectConstants.OVERSCAN) / 2) - 10; - font = new BitmapFont(); - font.setColor(1.0f, 1.0f, 0.0f, 1.0f); - if(!Ouya.runningOnOuya){ - font.setScale(1.0f); - }else{ - font.setScale(2.5f); + font = new BitmapFont(); + font.setColor(1.0f, 1.0f, 0.0f, 1.0f); + if(!Ouya.runningOnOuya){ + font.setScale(1.0f); + }else{ + font.setScale(2.5f); + } } - } - // Start networking. - mcastEnabler.enableMulticast(); + // Start networking. + mcastEnabler.enableMulticast(); - Gdx.app.debug(TAG, CLASS_NAME + ".create() :: Creating network threads"); - serviceDiscoveryThread = ServiceDiscoveryThread.getInstance(); - videoThread = VideoStreamingThread.getInstance()/*.setToaster(toaster)*/; - //robotThread = RobotControlThread.getInstance().setToaster(toaster); + Gdx.app.debug(TAG, CLASS_NAME + ".create() :: Creating network threads"); + serviceDiscoveryThread = ServiceDiscoveryThread.getInstance(); + videoThread = VideoStreamingThread.getInstance()/*.setToaster(toaster)*/; + //robotThread = RobotControlThread.getInstance().setToaster(toaster); - serviceDiscoveryThread.start(); - videoThread.start(); - videoThread.startStreaming(); - videoThread.addNetworkConnectionListener(this); - //robotThread.start(); + serviceDiscoveryThread.start(); + videoThread.start(); + videoThread.startStreaming(); + videoThread.addNetworkConnectionListener(this); + //robotThread.start(); - // Set the current and next states. - currState = game_states_t.MAIN_MENU; - nextState = null; - this.setScreen(states[currState.getValue()]); - states[currState.getValue()].onStateSet(); + // Set the current and next states. + currState = game_states_t.MAIN_MENU; + nextState = null; + this.setScreen(states[currState.getValue()]); + states[currState.getValue()].onStateSet(); - // Set initial input handlers. - Gdx.input.setInputProcessor(states[currState.getValue()]); - Controllers.addListener(states[currState.getValue()]); + // Set initial input handlers. + Gdx.input.setInputProcessor(states[currState.getValue()]); + Controllers.addListener(states[currState.getValue()]); - // Anything else. - Gdx.app.setLogLevel(Application.LOG_INFO); - // Gdx.app.setLogLevel(Application.LOG_NONE); + // Anything else. + Gdx.app.setLogLevel(Application.LOG_INFO); + // Gdx.app.setLogLevel(Application.LOG_NONE); } public void render(){ @@ -180,15 +184,14 @@ public class NxtARCore extends Game implements NetworkConnectionListener{ // If the current state set a value for nextState then switch to that state. if(nextState != null){ - // Invalidate all input processors. - Gdx.input.setInputProcessor(null); - Controllers.removeListener(states[currState.getValue()]); + states[currState.getValue()].onStateUnset(); - // Swap the pointers and set the new screen. currState = nextState; nextState = null; - setScreen(states[currState.getValue()]); + states[currState.getValue()].onStateSet(); + + setScreen(states[currState.getValue()]); } if(ProjectConstants.DEBUG){ diff --git a/src/ve/ucv/ciens/ccg/nxtar/exceptions/ImageTooBigException.java b/src/ve/ucv/ciens/ccg/nxtar/exceptions/ImageTooBigException.java index 716119a..d3196d7 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/exceptions/ImageTooBigException.java +++ b/src/ve/ucv/ciens/ccg/nxtar/exceptions/ImageTooBigException.java @@ -1,24 +1,24 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.exceptions; - -public class ImageTooBigException extends Exception{ - private static final long serialVersionUID = 9989L; - - public ImageTooBigException(String msg){ - super(msg); - } -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.exceptions; + +public class ImageTooBigException extends Exception{ + private static final long serialVersionUID = 9989L; + + public ImageTooBigException(String msg){ + super(msg); + } +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/BaseState.java b/src/ve/ucv/ciens/ccg/nxtar/states/BaseState.java index 9b68658..731bce3 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/BaseState.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/BaseState.java @@ -1,86 +1,88 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.NxtARCore; - -import com.badlogic.gdx.InputProcessor; -import com.badlogic.gdx.Screen; -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.ControllerListener; -import com.badlogic.gdx.controllers.PovDirection; -import com.badlogic.gdx.math.Vector3; - -public abstract class BaseState implements Screen, ControllerListener, InputProcessor { - protected NxtARCore core; - - /* STATE METHODS */ - public abstract void onStateSet(); - - /* SCREEN METHODS*/ - @Override - public abstract void render(float delta); - @Override - public abstract void resize(int width, int height); - @Override - public abstract void show(); - @Override - public abstract void hide(); - @Override - public abstract void pause(); - @Override - public abstract void resume(); - @Override - public abstract void dispose(); - - /* INPUT PROCESSOR METHODS. */ - @Override - public abstract boolean keyDown(int keycode); - @Override - public abstract boolean keyUp(int keycode); - @Override - public abstract boolean keyTyped(char character); - @Override - public abstract boolean touchDown(int screenX, int screenY, int pointer, int button); - @Override - public abstract boolean touchUp(int screenX, int screenY, int pointer, int button); - @Override - public abstract boolean touchDragged(int screenX, int screenY, int pointer); - @Override - public abstract boolean mouseMoved(int screenX, int screenY); - @Override - public abstract boolean scrolled(int amount); - - /* CONTROLLER LISTENER METHODS. */ - @Override - public abstract void connected(Controller controller); - @Override - public abstract void disconnected(Controller controller); - @Override - public abstract boolean buttonDown(Controller controller, int buttonCode); - @Override - public abstract boolean buttonUp(Controller controller, int buttonCode); - @Override - public abstract boolean axisMoved(Controller controller, int axisCode, float value); - @Override - public abstract boolean povMoved(Controller controller, int povCode, PovDirection value); - @Override - public abstract boolean xSliderMoved(Controller controller, int sliderCode, boolean value); - @Override - public abstract boolean ySliderMoved(Controller controller, int sliderCode, boolean value); - @Override - public abstract boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value); -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.NxtARCore; + +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.controllers.Controller; +import com.badlogic.gdx.controllers.ControllerListener; +import com.badlogic.gdx.controllers.PovDirection; +import com.badlogic.gdx.math.Vector3; + +public abstract class BaseState implements Screen, ControllerListener, InputProcessor { + protected NxtARCore core; + protected boolean stateActive; + + /* STATE METHODS */ + public abstract void onStateSet(); + public abstract void onStateUnset(); + + /* SCREEN METHODS*/ + @Override + public abstract void render(float delta); + @Override + public abstract void resize(int width, int height); + @Override + public abstract void show(); + @Override + public abstract void hide(); + @Override + public abstract void pause(); + @Override + public abstract void resume(); + @Override + public abstract void dispose(); + + /* INPUT PROCESSOR METHODS. */ + @Override + public abstract boolean keyDown(int keycode); + @Override + public abstract boolean keyUp(int keycode); + @Override + public abstract boolean keyTyped(char character); + @Override + public abstract boolean touchDown(int screenX, int screenY, int pointer, int button); + @Override + public abstract boolean touchUp(int screenX, int screenY, int pointer, int button); + @Override + public abstract boolean touchDragged(int screenX, int screenY, int pointer); + @Override + public abstract boolean mouseMoved(int screenX, int screenY); + @Override + public abstract boolean scrolled(int amount); + + /* CONTROLLER LISTENER METHODS. */ + @Override + public abstract void connected(Controller controller); + @Override + public abstract void disconnected(Controller controller); + @Override + public abstract boolean buttonDown(Controller controller, int buttonCode); + @Override + public abstract boolean buttonUp(Controller controller, int buttonCode); + @Override + public abstract boolean axisMoved(Controller controller, int axisCode, float value); + @Override + public abstract boolean povMoved(Controller controller, int povCode, PovDirection value); + @Override + public abstract boolean xSliderMoved(Controller controller, int sliderCode, boolean value); + @Override + public abstract boolean ySliderMoved(Controller controller, int sliderCode, boolean value); + @Override + public abstract boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value); +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/InGameState.java b/src/ve/ucv/ciens/ccg/nxtar/states/InGameState.java index d89152a..502d275 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/InGameState.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/InGameState.java @@ -1,445 +1,454 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.NxtARCore; -import ve.ucv.ciens.ccg.nxtar.exceptions.ImageTooBigException; -import ve.ucv.ciens.ccg.nxtar.network.VideoFrameMonitor; -import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants; -import ve.ucv.ciens.ccg.nxtar.utils.Size; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.Controllers; -import com.badlogic.gdx.controllers.PovDirection; -import com.badlogic.gdx.controllers.mappings.Ouya; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Pixmap; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.Texture.TextureFilter; -import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.math.Vector3; - -public class InGameState extends BaseState{ - private static final String TAG = "IN_GAME_STATE"; - private static final String CLASS_NAME = InGameState.class.getSimpleName(); - - private NxtARCore core; - - // Cameras. - private OrthographicCamera camera; - private OrthographicCamera pixelPerfectCamera; - - // Video stream graphics. - private Texture videoFrameTexture; - private Sprite renderableVideoFrame; - private Pixmap videoFrame; - - // Interface buttons. - private Texture buttonTexture; - private Sprite motorA; - private Sprite motorB; - private Sprite motorC; - private Sprite motorD; - - // Button touch helper fields. - private Vector3 win2world; - private Vector2 touchPointWorldCoords; - private boolean[] motorButtonsTouched; - private int[] motorButtonsPointers; - - private VideoFrameMonitor frameMonitor; - - public InGameState(final NxtARCore core){ - if(!Ouya.runningOnOuya) setUpButtons(); - - this.core = core; - frameMonitor = VideoFrameMonitor.getInstance(); - - // Set up rendering fields; - videoFrame = null; - - // Set up the cameras. - pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - camera = new OrthographicCamera(1.0f, Gdx.graphics.getHeight() / Gdx.graphics.getWidth()); - - // Set up input handling support fields. - win2world = new Vector3(0.0f, 0.0f, 0.0f); - touchPointWorldCoords = new Vector2(); - motorButtonsTouched = new boolean[4]; - motorButtonsTouched[0] = false; - motorButtonsTouched[1] = false; - motorButtonsTouched[2] = false; - motorButtonsTouched[3] = false; - - motorButtonsPointers = new int[4]; - motorButtonsPointers[0] = -1; - motorButtonsPointers[1] = -1; - motorButtonsPointers[2] = -1; - motorButtonsPointers[3] = -1; - } - - @Override - public void render(float delta) { - Pixmap temp; - byte[] frame; - Size dimensions = null; - - Gdx.gl.glClearColor(1, 1, 1, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - - frame = frameMonitor.getCurrentFrame(); - if(frame != null){ - dimensions = frameMonitor.getFrameDimensions(); - temp = new Pixmap(frame, 0, dimensions.getWidth() * dimensions.getHeight()); - if(videoFrame == null){ - try{ - videoFrame = new Pixmap(getOptimalTextureSize(dimensions.getWidth()), getOptimalTextureSize(dimensions.getHeight()), temp.getFormat()); - }catch(ImageTooBigException e){ - core.toast("Cannot display received frame.\n" + e.getMessage(), true); - Gdx.app.exit(); - return; - } - } - videoFrame.drawPixmap(temp, 0, 0); - temp.dispose(); - videoFrameTexture = new Texture(videoFrame); - videoFrameTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); - - TextureRegion region = new TextureRegion(videoFrameTexture, 0, 0, dimensions.getWidth(), dimensions.getHeight()); - - renderableVideoFrame = new Sprite(region); - renderableVideoFrame.setOrigin(renderableVideoFrame.getWidth() / 2, renderableVideoFrame.getHeight() / 2); - if(!Ouya.runningOnOuya){ - renderableVideoFrame.setSize(1.0f, renderableVideoFrame.getHeight() / renderableVideoFrame.getWidth() ); - renderableVideoFrame.rotate90(true); - renderableVideoFrame.translate(-renderableVideoFrame.getWidth() / 2, 0.5f - renderableVideoFrame.getHeight()); - }else{ - float xSize = Gdx.graphics.getHeight() * (dimensions.getWidth() / dimensions.getHeight()); - renderableVideoFrame.setSize(xSize * ProjectConstants.OVERSCAN, Gdx.graphics.getHeight() * ProjectConstants.OVERSCAN); - renderableVideoFrame.rotate90(true); - renderableVideoFrame.translate(-renderableVideoFrame.getWidth() / 2, -renderableVideoFrame.getHeight() / 2); - } - - if(!Ouya.runningOnOuya){ - core.batch.setProjectionMatrix(camera.combined); - }else{ - core.batch.setProjectionMatrix(pixelPerfectCamera.combined); - } - core.batch.begin();{ - renderableVideoFrame.draw(core.batch); - }core.batch.end(); - - videoFrameTexture.dispose(); - } - - core.batch.setProjectionMatrix(pixelPerfectCamera.combined); - core.batch.begin();{ - if(!Ouya.runningOnOuya){ - motorA.draw(core.batch); - motorB.draw(core.batch); - motorC.draw(core.batch); - motorD.draw(core.batch); - } - }core.batch.end(); - } - - @Override - public void resize(int width, int height) { - // TODO Auto-generated method stub - - } - - @Override - public void show() { - // TODO Auto-generated method stub - - } - - @Override - public void hide() { - // TODO Auto-generated method stub - - } - - @Override - public void pause() { - // TODO Auto-generated method stub - - } - - @Override - public void resume() { - // TODO Auto-generated method stub - - } - - @Override - public void dispose() { - if(videoFrameTexture != null) - videoFrameTexture.dispose(); - if(buttonTexture != null) - buttonTexture.dispose(); - if(videoFrame != null) - videoFrame.dispose(); - } - - private int getOptimalTextureSize(int imageSideLength) throws ImageTooBigException{ - for(int po2: ProjectConstants.POWERS_OF_2){ - if(imageSideLength < po2) return po2; - } - throw new ImageTooBigException("No valid texture size found. Image too large."); - } - - /*;;;;;;;;;;;;;;;;;; - ; HELPER METHODS ; - ;;;;;;;;;;;;;;;;;;*/ - - @Override - public void onStateSet(){ - Controllers.addListener(this); - Gdx.input.setInputProcessor(this); - } - - private void setUpButtons(){ - buttonTexture = new Texture(Gdx.files.internal("data/gfx/gui/PBCrichton_Flat_Button.png")); - buttonTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); - - TextureRegion region = new TextureRegion(buttonTexture, 0, 0, buttonTexture.getWidth(), buttonTexture.getHeight()); - - motorA = new Sprite(region); - motorA.setSize(motorA.getWidth() * 0.7f, motorA.getHeight() * 0.7f); - - motorB = new Sprite(region); - motorB.setSize(motorB.getWidth() * 0.7f, motorB.getHeight() * 0.7f); - - motorC = new Sprite(region); - motorC.setSize(motorC.getWidth() * 0.7f, motorC.getHeight() * 0.7f); - - motorD = new Sprite(region); - motorD.setSize(motorD.getWidth() * 0.7f, motorD.getHeight() * 0.7f); - - motorA.setPosition(-(Gdx.graphics.getWidth() / 2) + 10, -(Gdx.graphics.getHeight() / 2) + motorB.getHeight() + 20); - motorB.setPosition(-(Gdx.graphics.getWidth() / 2) + 20 + (motorA.getWidth() / 2), -(Gdx.graphics.getHeight() / 2) + 10); - motorC.setPosition((Gdx.graphics.getWidth() / 2) - (1.5f * (motorD.getWidth())) - 20, -(Gdx.graphics.getHeight() / 2) + 10); - motorD.setPosition((Gdx.graphics.getWidth() / 2) - motorD.getWidth() - 10, -(Gdx.graphics.getHeight() / 2) + 20 + motorC.getHeight()); - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN INPUT PROCESSOR METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean keyDown(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyUp(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyTyped(char character) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - if(!Ouya.runningOnOuya){ - win2world.set(screenX, screenY, 0.0f); - camera.unproject(win2world); - touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); - - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown(%d, %d, %d, %d)", screenX, screenY, pointer, button)); - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); - - if(motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor A button pressed"); - motorButtonsTouched[0] = true; - motorButtonsPointers[0] = pointer; - }else if(motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor B button pressed"); - motorButtonsTouched[1] = true; - motorButtonsPointers[1] = pointer; - }else if(motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor C button pressed"); - motorButtonsTouched[2] = true; - motorButtonsPointers[2] = pointer; - }else if(motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor D button pressed"); - motorButtonsTouched[3] = true; - motorButtonsPointers[3] = pointer; - } - } - return true; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button) { - if(!Ouya.runningOnOuya){ - win2world.set(screenX, screenY, 0.0f); - camera.unproject(win2world); - touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); - - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp(%d, %d, %d, %d)", screenX, screenY, pointer, button)); - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); - - if(motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor A button released"); - motorButtonsPointers[0] = -1; - motorButtonsTouched[0] = false; - }else if(motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor B button released"); - motorButtonsPointers[1] = -1; - motorButtonsTouched[1] = false; - }else if(motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor C button released"); - motorButtonsPointers[2] = -1; - motorButtonsTouched[2] = false; - }else if(motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor D button released"); - motorButtonsPointers[3] = -1; - motorButtonsTouched[3] = false; - } - } - return true; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer) { - if(!Ouya.runningOnOuya){ - win2world.set(screenX, screenY, 0.0f); - camera.unproject(win2world); - touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); - - if(pointer == motorButtonsPointers[0] && !motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor A button released"); - motorButtonsPointers[0] = -1; - motorButtonsTouched[0] = false; - }else if(pointer == motorButtonsPointers[1] && !motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor B button released"); - motorButtonsPointers[1] = -1; - motorButtonsTouched[1] = false; - }else if(pointer == motorButtonsPointers[2] && !motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor C button released"); - motorButtonsPointers[2] = -1; - motorButtonsTouched[2] = false; - }else if(pointer == motorButtonsPointers[3] && !motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ - Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor D button released"); - motorButtonsPointers[3] = -1; - motorButtonsTouched[3] = false; - } - } - return true; - } - - @Override - public boolean mouseMoved(int screenX, int screenY) { - // TODO Auto-generated method stub - return false; - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN CONTROLLER LISTENER METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean scrolled(int amount) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void connected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public void disconnected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public boolean buttonDown(Controller controller, int buttonCode) { - if(buttonCode == Ouya.BUTTON_L1){ - // Start right motor. - } - if(buttonCode == Ouya.BUTTON_L2){ - // Start left motor. - } - if(buttonCode == Ouya.BUTTON_DPAD_LEFT){ - // Look left. - } - if(buttonCode == Ouya.BUTTON_DPAD_RIGHT){ - // Look right; - } - return false; - } - - @Override - public boolean buttonUp(Controller controller, int buttonCode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean axisMoved(Controller controller, int axisCode, float value) { - if(axisCode == Ouya.AXIS_LEFT_TRIGGER){ - - } - if(axisCode == Ouya.AXIS_RIGHT_TRIGGER){ - // Start - } - return false; - } - - @Override - public boolean povMoved(Controller controller, int povCode, - PovDirection value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean xSliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean ySliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean accelerometerMoved(Controller controller, - int accelerometerCode, Vector3 value) { - // TODO Auto-generated method stub - return false; - } -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.NxtARCore; +import ve.ucv.ciens.ccg.nxtar.exceptions.ImageTooBigException; +import ve.ucv.ciens.ccg.nxtar.network.VideoFrameMonitor; +import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants; +import ve.ucv.ciens.ccg.nxtar.utils.Size; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.controllers.Controller; +import com.badlogic.gdx.controllers.Controllers; +import com.badlogic.gdx.controllers.PovDirection; +import com.badlogic.gdx.controllers.mappings.Ouya; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.Texture.TextureFilter; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; + +public class InGameState extends BaseState{ + private static final String TAG = "IN_GAME_STATE"; + private static final String CLASS_NAME = InGameState.class.getSimpleName(); + + private NxtARCore core; + + // Cameras. + private OrthographicCamera camera; + private OrthographicCamera pixelPerfectCamera; + + // Video stream graphics. + private Texture videoFrameTexture; + private Sprite renderableVideoFrame; + private Pixmap videoFrame; + + // Interface buttons. + private Texture buttonTexture; + private Sprite motorA; + private Sprite motorB; + private Sprite motorC; + private Sprite motorD; + + // Button touch helper fields. + private Vector3 win2world; + private Vector2 touchPointWorldCoords; + private boolean[] motorButtonsTouched; + private int[] motorButtonsPointers; + + private VideoFrameMonitor frameMonitor; + + public InGameState(final NxtARCore core){ + if(!Ouya.runningOnOuya) setUpButtons(); + + this.core = core; + frameMonitor = VideoFrameMonitor.getInstance(); + + // Set up rendering fields; + videoFrame = null; + + // Set up the cameras. + pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + camera = new OrthographicCamera(1.0f, Gdx.graphics.getHeight() / Gdx.graphics.getWidth()); + + // Set up input handling support fields. + win2world = new Vector3(0.0f, 0.0f, 0.0f); + touchPointWorldCoords = new Vector2(); + motorButtonsTouched = new boolean[4]; + motorButtonsTouched[0] = false; + motorButtonsTouched[1] = false; + motorButtonsTouched[2] = false; + motorButtonsTouched[3] = false; + + motorButtonsPointers = new int[4]; + motorButtonsPointers[0] = -1; + motorButtonsPointers[1] = -1; + motorButtonsPointers[2] = -1; + motorButtonsPointers[3] = -1; + } + + @Override + public void render(float delta) { + Pixmap temp; + byte[] frame; + Size dimensions = null; + + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + frame = frameMonitor.getCurrentFrame(); + if(frame != null){ + dimensions = frameMonitor.getFrameDimensions(); + temp = new Pixmap(frame, 0, dimensions.getWidth() * dimensions.getHeight()); + if(videoFrame == null){ + try{ + videoFrame = new Pixmap(getOptimalTextureSize(dimensions.getWidth()), getOptimalTextureSize(dimensions.getHeight()), temp.getFormat()); + }catch(ImageTooBigException e){ + core.toast("Cannot display received frame.\n" + e.getMessage(), true); + Gdx.app.exit(); + return; + } + } + videoFrame.drawPixmap(temp, 0, 0); + temp.dispose(); + videoFrameTexture = new Texture(videoFrame); + videoFrameTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); + + TextureRegion region = new TextureRegion(videoFrameTexture, 0, 0, dimensions.getWidth(), dimensions.getHeight()); + + renderableVideoFrame = new Sprite(region); + renderableVideoFrame.setOrigin(renderableVideoFrame.getWidth() / 2, renderableVideoFrame.getHeight() / 2); + if(!Ouya.runningOnOuya){ + renderableVideoFrame.setSize(1.0f, renderableVideoFrame.getHeight() / renderableVideoFrame.getWidth() ); + renderableVideoFrame.rotate90(true); + renderableVideoFrame.translate(-renderableVideoFrame.getWidth() / 2, 0.5f - renderableVideoFrame.getHeight()); + }else{ + float xSize = Gdx.graphics.getHeight() * (dimensions.getWidth() / dimensions.getHeight()); + renderableVideoFrame.setSize(xSize * ProjectConstants.OVERSCAN, Gdx.graphics.getHeight() * ProjectConstants.OVERSCAN); + renderableVideoFrame.rotate90(true); + renderableVideoFrame.translate(-renderableVideoFrame.getWidth() / 2, -renderableVideoFrame.getHeight() / 2); + } + + if(!Ouya.runningOnOuya){ + core.batch.setProjectionMatrix(camera.combined); + }else{ + core.batch.setProjectionMatrix(pixelPerfectCamera.combined); + } + core.batch.begin();{ + renderableVideoFrame.draw(core.batch); + }core.batch.end(); + + videoFrameTexture.dispose(); + } + + core.batch.setProjectionMatrix(pixelPerfectCamera.combined); + core.batch.begin();{ + if(!Ouya.runningOnOuya){ + motorA.draw(core.batch); + motorB.draw(core.batch); + motorC.draw(core.batch); + motorD.draw(core.batch); + } + }core.batch.end(); + } + + @Override + public void resize(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void show() { + // TODO Auto-generated method stub + + } + + @Override + public void hide() { + // TODO Auto-generated method stub + + } + + @Override + public void pause() { + // TODO Auto-generated method stub + + } + + @Override + public void resume() { + // TODO Auto-generated method stub + + } + + @Override + public void dispose() { + if(videoFrameTexture != null) + videoFrameTexture.dispose(); + if(buttonTexture != null) + buttonTexture.dispose(); + if(videoFrame != null) + videoFrame.dispose(); + } + + private int getOptimalTextureSize(int imageSideLength) throws ImageTooBigException{ + for(int po2: ProjectConstants.POWERS_OF_2){ + if(imageSideLength < po2) return po2; + } + throw new ImageTooBigException("No valid texture size found. Image too large."); + } + + /*;;;;;;;;;;;;;;;;;; + ; HELPER METHODS ; + ;;;;;;;;;;;;;;;;;;*/ + + @Override + public void onStateSet(){ + stateActive = true; + Gdx.input.setInputProcessor(this); + } + + @Override + public void onStateUnset(){ + stateActive = false; + Gdx.input.setInputProcessor(null); + } + + private void setUpButtons(){ + buttonTexture = new Texture(Gdx.files.internal("data/gfx/gui/PBCrichton_Flat_Button.png")); + buttonTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); + + TextureRegion region = new TextureRegion(buttonTexture, 0, 0, buttonTexture.getWidth(), buttonTexture.getHeight()); + + motorA = new Sprite(region); + motorA.setSize(motorA.getWidth() * 0.7f, motorA.getHeight() * 0.7f); + + motorB = new Sprite(region); + motorB.setSize(motorB.getWidth() * 0.7f, motorB.getHeight() * 0.7f); + + motorC = new Sprite(region); + motorC.setSize(motorC.getWidth() * 0.7f, motorC.getHeight() * 0.7f); + + motorD = new Sprite(region); + motorD.setSize(motorD.getWidth() * 0.7f, motorD.getHeight() * 0.7f); + + motorA.setPosition(-(Gdx.graphics.getWidth() / 2) + 10, -(Gdx.graphics.getHeight() / 2) + motorB.getHeight() + 20); + motorB.setPosition(-(Gdx.graphics.getWidth() / 2) + 20 + (motorA.getWidth() / 2), -(Gdx.graphics.getHeight() / 2) + 10); + motorC.setPosition((Gdx.graphics.getWidth() / 2) - (1.5f * (motorD.getWidth())) - 20, -(Gdx.graphics.getHeight() / 2) + 10); + motorD.setPosition((Gdx.graphics.getWidth() / 2) - motorD.getWidth() - 10, -(Gdx.graphics.getHeight() / 2) + 20 + motorC.getHeight()); + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; BEGIN INPUT PROCESSOR METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean keyDown(int keycode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean keyUp(int keycode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean keyTyped(char character) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + if(!Ouya.runningOnOuya){ + win2world.set(screenX, screenY, 0.0f); + camera.unproject(win2world); + touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); + + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown(%d, %d, %d, %d)", screenX, screenY, pointer, button)); + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); + + if(motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor A button pressed"); + motorButtonsTouched[0] = true; + motorButtonsPointers[0] = pointer; + }else if(motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor B button pressed"); + motorButtonsTouched[1] = true; + motorButtonsPointers[1] = pointer; + }else if(motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor C button pressed"); + motorButtonsTouched[2] = true; + motorButtonsPointers[2] = pointer; + }else if(motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Motor D button pressed"); + motorButtonsTouched[3] = true; + motorButtonsPointers[3] = pointer; + } + } + return true; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + if(!Ouya.runningOnOuya){ + win2world.set(screenX, screenY, 0.0f); + camera.unproject(win2world); + touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); + + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp(%d, %d, %d, %d)", screenX, screenY, pointer, button)); + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); + + if(motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor A button released"); + motorButtonsPointers[0] = -1; + motorButtonsTouched[0] = false; + }else if(motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor B button released"); + motorButtonsPointers[1] = -1; + motorButtonsTouched[1] = false; + }else if(motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor C button released"); + motorButtonsPointers[2] = -1; + motorButtonsTouched[2] = false; + }else if(motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchUp() :: Motor D button released"); + motorButtonsPointers[3] = -1; + motorButtonsTouched[3] = false; + } + } + return true; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + if(!Ouya.runningOnOuya){ + win2world.set(screenX, screenY, 0.0f); + camera.unproject(win2world); + touchPointWorldCoords.set(win2world.x * Gdx.graphics.getWidth(), win2world.y * Gdx.graphics.getHeight()); + + if(pointer == motorButtonsPointers[0] && !motorA.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor A button released"); + motorButtonsPointers[0] = -1; + motorButtonsTouched[0] = false; + }else if(pointer == motorButtonsPointers[1] && !motorB.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor B button released"); + motorButtonsPointers[1] = -1; + motorButtonsTouched[1] = false; + }else if(pointer == motorButtonsPointers[2] && !motorC.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor C button released"); + motorButtonsPointers[2] = -1; + motorButtonsTouched[2] = false; + }else if(pointer == motorButtonsPointers[3] && !motorD.getBoundingRectangle().contains(touchPointWorldCoords)){ + Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Motor D button released"); + motorButtonsPointers[3] = -1; + motorButtonsTouched[3] = false; + } + } + return true; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + // TODO Auto-generated method stub + return false; + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; BEGIN CONTROLLER LISTENER METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean buttonDown(Controller controller, int buttonCode) { + if(stateActive){ + Gdx.app.log(TAG, CLASS_NAME + ".buttonDown() :: " + controller.getName() + " :: " + Integer.toString(buttonCode)); + return true; + }else{ + return false; + } + } + + @Override + public boolean buttonUp(Controller controller, int buttonCode) { + if(stateActive){ + Gdx.app.log(TAG, CLASS_NAME + ".buttonDown() :: " + controller.getName() + " :: " + Integer.toString(buttonCode)); + return true; + }else{ + return false; + } + } + + @Override + public boolean axisMoved(Controller controller, int axisCode, float value) { + if(stateActive){ + if(value >= Ouya.STICK_DEADZONE){ + if(axisCode == Ouya.AXIS_LEFT_TRIGGER){ + Gdx.app.log(TAG, CLASS_NAME + ".axisMoved() :: LEFT TRIGGER pressed."); + } + if(axisCode == Ouya.AXIS_RIGHT_TRIGGER){ + Gdx.app.log(TAG, CLASS_NAME + ".axisMoved() :: RIGHT TRIGGER pressed."); + } + } + return true; + }else{ + return false; + } + } + + @Override + public boolean scrolled(int amount) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void connected(Controller controller) { + // TODO Auto-generated method stub + + } + + @Override + public void disconnected(Controller controller) { + // TODO Auto-generated method stub + + } + + @Override + public boolean povMoved(Controller controller, int povCode, + PovDirection value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean xSliderMoved(Controller controller, int sliderCode, + boolean value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean ySliderMoved(Controller controller, int sliderCode, + boolean value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean accelerometerMoved(Controller controller, + int accelerometerCode, Vector3 value) { + // TODO Auto-generated method stub + return false; + } +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/MainMenuStateBase.java b/src/ve/ucv/ciens/ccg/nxtar/states/MainMenuStateBase.java index c64a00e..a6aa5e0 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/MainMenuStateBase.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/MainMenuStateBase.java @@ -1,139 +1,234 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.controllers.Controllers; -import com.badlogic.gdx.controllers.mappings.Ouya; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.NinePatch; -import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; -import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.scenes.scene2d.ui.TextButton; -import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle; -import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; - - -public abstract class MainMenuStateBase extends BaseState{ - protected static final String TAG = "MAIN_MENU"; - - // Client connection helper fields. - protected boolean clientConnected; - - // Buttons and other gui components. - protected TextButton startButton; - protected Rectangle startButtonBBox; - protected Sprite clientConnectedLedOn; - protected Sprite clientConnectedLedOff; - - // Graphic data for the start button. - private Texture startButtonEnabledTexture; - private Texture startButtonDisabledTexture; - private Texture startButtonPressedTexture; - private NinePatch startButtonEnabled9p; - private NinePatch startButtonDisabled9p; - private NinePatch startButtonPressed9p; - private BitmapFont font; - - // Other graphics. - private Texture clientConnectedLedOffTexture; - private Texture clientConnectedLedOnTexture; - - public MainMenuStateBase(){ - // Create the start button background. - startButtonEnabledTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Yellow.png")); - startButtonEnabled9p = new NinePatch(new TextureRegion(startButtonEnabledTexture, 0, 0, startButtonEnabledTexture.getWidth(), startButtonEnabledTexture.getHeight()), 49, 49, 45, 45); - - startButtonDisabledTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Cyan.png")); - startButtonDisabled9p = new NinePatch(new TextureRegion(startButtonDisabledTexture, 0, 0, startButtonDisabledTexture.getWidth(), startButtonDisabledTexture.getHeight()), 49, 49, 45, 45); - - startButtonPressedTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Blue.png")); - startButtonPressed9p = new NinePatch(new TextureRegion(startButtonPressedTexture, 0, 0, startButtonPressedTexture.getWidth(), startButtonPressedTexture.getHeight()), 49, 49, 45, 45); - - // Create the start button font. - FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("data/fonts/d-puntillas-B-to-tiptoe.ttf")); - font = generator.generateFont(Ouya.runningOnOuya ? 60 : 40, ProjectConstants.FONT_CHARS, false); - generator.dispose(); - - // Create the start button itself. - TextButtonStyle tbs = new TextButtonStyle(); - tbs.font = font; - tbs.up = new NinePatchDrawable(startButtonEnabled9p); - tbs.checked = new NinePatchDrawable(startButtonPressed9p); - tbs.disabled = new NinePatchDrawable(startButtonDisabled9p); - tbs.disabledFontColor = new Color(0, 0, 0, 1); - startButton = new TextButton("Start server", tbs); - startButton.setText("Start game"); - startButton.setDisabled(true); - startButtonBBox = new Rectangle(0, 0, startButton.getWidth(), startButton.getHeight()); - - // Create the connection leds. - TextureRegion region; - clientConnectedLedOnTexture = new Texture("data/gfx/gui/Anonymous_Button_Green.png"); - region = new TextureRegion(clientConnectedLedOnTexture, clientConnectedLedOnTexture.getWidth(), clientConnectedLedOnTexture.getHeight()); - clientConnectedLedOn = new Sprite(region); - - clientConnectedLedOffTexture = new Texture("data/gfx/gui/Anonymous_Button_Red.png"); - region = new TextureRegion(clientConnectedLedOffTexture, clientConnectedLedOffTexture.getWidth(), clientConnectedLedOffTexture.getHeight()); - clientConnectedLedOff = new Sprite(region); - - clientConnected = false; - } - - @Override - public abstract void render(float delta); - - @Override - public abstract void resize(int width, int height); - - @Override - public abstract void show(); - @Override - public abstract void hide(); - - @Override - public abstract void pause(); - - @Override - public abstract void resume(); - - @Override - public void dispose(){ - startButtonEnabledTexture.dispose(); - startButtonDisabledTexture.dispose(); - startButtonPressedTexture.dispose(); - clientConnectedLedOnTexture.dispose(); - clientConnectedLedOffTexture.dispose(); - font.dispose(); - } - - @Override - public void onStateSet(){ - Controllers.addListener(this); - Gdx.input.setInputProcessor(this); - } - - public void onClientConnected(){ - clientConnected = true; - startButton.setDisabled(false); - } -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.controllers.Controller; +import com.badlogic.gdx.controllers.PovDirection; +import com.badlogic.gdx.controllers.mappings.Ouya; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle; +import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; + + +public abstract class MainMenuStateBase extends BaseState{ + protected static final String TAG = "MAIN_MENU"; + + // Client connection helper fields. + protected boolean clientConnected; + + // Buttons and other gui components. + protected TextButton startButton; + protected Rectangle startButtonBBox; + protected Sprite clientConnectedLedOn; + protected Sprite clientConnectedLedOff; + + // Graphic data for the start button. + private Texture startButtonEnabledTexture; + private Texture startButtonDisabledTexture; + private Texture startButtonPressedTexture; + private NinePatch startButtonEnabled9p; + private NinePatch startButtonDisabled9p; + private NinePatch startButtonPressed9p; + private BitmapFont font; + + // Other graphics. + private Texture clientConnectedLedOffTexture; + private Texture clientConnectedLedOnTexture; + + public MainMenuStateBase(){ + // Create the start button background. + startButtonEnabledTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Yellow.png")); + startButtonEnabled9p = new NinePatch(new TextureRegion(startButtonEnabledTexture, 0, 0, startButtonEnabledTexture.getWidth(), startButtonEnabledTexture.getHeight()), 49, 49, 45, 45); + + startButtonDisabledTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Cyan.png")); + startButtonDisabled9p = new NinePatch(new TextureRegion(startButtonDisabledTexture, 0, 0, startButtonDisabledTexture.getWidth(), startButtonDisabledTexture.getHeight()), 49, 49, 45, 45); + + startButtonPressedTexture = new Texture(Gdx.files.internal("data/gfx/gui/Anonymous_Pill_Button_Blue.png")); + startButtonPressed9p = new NinePatch(new TextureRegion(startButtonPressedTexture, 0, 0, startButtonPressedTexture.getWidth(), startButtonPressedTexture.getHeight()), 49, 49, 45, 45); + + // Create the start button font. + FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("data/fonts/d-puntillas-B-to-tiptoe.ttf")); + font = generator.generateFont(Ouya.runningOnOuya ? 60 : 40, ProjectConstants.FONT_CHARS, false); + generator.dispose(); + + // Create the start button itself. + TextButtonStyle tbs = new TextButtonStyle(); + tbs.font = font; + tbs.up = new NinePatchDrawable(startButtonEnabled9p); + tbs.checked = new NinePatchDrawable(startButtonPressed9p); + tbs.disabled = new NinePatchDrawable(startButtonDisabled9p); + tbs.disabledFontColor = new Color(0, 0, 0, 1); + startButton = new TextButton("Start server", tbs); + startButton.setText("Start game"); + startButton.setDisabled(true); + startButtonBBox = new Rectangle(0, 0, startButton.getWidth(), startButton.getHeight()); + + // Create the connection leds. + TextureRegion region; + clientConnectedLedOnTexture = new Texture("data/gfx/gui/Anonymous_Button_Green.png"); + region = new TextureRegion(clientConnectedLedOnTexture, clientConnectedLedOnTexture.getWidth(), clientConnectedLedOnTexture.getHeight()); + clientConnectedLedOn = new Sprite(region); + + clientConnectedLedOffTexture = new Texture("data/gfx/gui/Anonymous_Button_Red.png"); + region = new TextureRegion(clientConnectedLedOffTexture, clientConnectedLedOffTexture.getWidth(), clientConnectedLedOffTexture.getHeight()); + clientConnectedLedOff = new Sprite(region); + + clientConnected = false; + + stateActive = false; + } + + @Override + public abstract void render(float delta); + + @Override + public abstract void resize(int width, int height); + + @Override + public abstract void show(); + @Override + public abstract void hide(); + + @Override + public abstract void pause(); + + @Override + public abstract void resume(); + + @Override + public void dispose(){ + startButtonEnabledTexture.dispose(); + startButtonDisabledTexture.dispose(); + startButtonPressedTexture.dispose(); + clientConnectedLedOnTexture.dispose(); + clientConnectedLedOffTexture.dispose(); + font.dispose(); + } + + @Override + public void onStateSet(){ + stateActive = true; + Gdx.input.setInputProcessor(this); + } + + @Override + public void onStateUnset(){ + stateActive = false; + Gdx.input.setInputProcessor(null); + } + + public void onClientConnected(){ + clientConnected = true; + startButton.setDisabled(false); + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; INPUT LISTENER METHOD STUBS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean keyDown(int keycode){ + return false; + } + + @Override + public boolean keyUp(int keycode){ + return false; + } + + @Override + public boolean keyTyped(char character){ + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button){ + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button){ + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer){ + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY){ + return false; + } + + @Override + public boolean scrolled(int amount){ + return false; + } + + @Override + public void connected(Controller controller){ } + + @Override + public void disconnected(Controller controller){ } + + @Override + public boolean buttonDown(Controller controller, int buttonCode){ + return false; + } + + @Override + public boolean buttonUp(Controller controller, int buttonCode){ + return false; + } + + @Override + public boolean axisMoved(Controller controller, int axisCode, float value){ + return false; + } + + @Override + public boolean povMoved(Controller controller, int povCode, PovDirection value){ + return false; + } + + @Override + public boolean xSliderMoved(Controller controller, int sliderCode, boolean value){ + return false; + } + + @Override + public boolean ySliderMoved(Controller controller, int sliderCode, boolean value){ + return false; + } + + @Override + public boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value){ + return false; + } +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/OuyaMainMenuState.java b/src/ve/ucv/ciens/ccg/nxtar/states/OuyaMainMenuState.java index 1cd4fc3..dd53b98 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/OuyaMainMenuState.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/OuyaMainMenuState.java @@ -1,204 +1,155 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.NxtARCore; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.Controllers; -import com.badlogic.gdx.controllers.PovDirection; -import com.badlogic.gdx.graphics.GL10; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.math.Vector3; - -public class OuyaMainMenuState extends MainMenuStateBase{ - private OrthographicCamera pixelPerfectCamera; - - public OuyaMainMenuState(final NxtARCore core){ - this.core = core; - this.pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - } - - @Override - public void render(float delta) { - Gdx.gl.glClearColor(1, 1, 1, 1); - Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); - - core.batch.setProjectionMatrix(pixelPerfectCamera.combined); - core.batch.begin();{ - this.startButton.draw(core.batch, 1.0f); - }core.batch.end(); - } - - @Override - public void resize(int width, int height) { - // TODO Auto-generated method stub - - } - - @Override - public void show() { - // TODO Auto-generated method stub - - } - - @Override - public void hide() { - // TODO Auto-generated method stub - - } - - @Override - public void pause() { - // TODO Auto-generated method stub - - } - - @Override - public void resume() { - // TODO Auto-generated method stub - - } - - @Override - public void dispose(){ - super.dispose(); - } - - /*;;;;;;;;;;;;;;;;;; - ; HELPER METHODS ; - ;;;;;;;;;;;;;;;;;;*/ - - @Override - public void onStateSet(){ - super.onStateSet(); - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN INPUT PROCESSOR METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean keyDown(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyUp(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyTyped(char character) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean mouseMoved(int screenX, int screenY) { - // TODO Auto-generated method stub - return false; - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN CONTROLLER LISTENER METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean scrolled(int amount) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void connected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public void disconnected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public boolean buttonDown(Controller controller, int buttonCode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean buttonUp(Controller controller, int buttonCode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean axisMoved(Controller controller, int axisCode, float value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean povMoved(Controller controller, int povCode, - PovDirection value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean xSliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean ySliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean accelerometerMoved(Controller controller, - int accelerometerCode, Vector3 value) { - // TODO Auto-generated method stub - return false; - } -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.NxtARCore; +import ve.ucv.ciens.ccg.nxtar.NxtARCore.game_states_t; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.controllers.Controller; +import com.badlogic.gdx.controllers.mappings.Ouya; +import com.badlogic.gdx.graphics.GL10; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +public class OuyaMainMenuState extends MainMenuStateBase{ + private static final String CLASS_NAME = OuyaMainMenuState.class.getSimpleName(); + + private OrthographicCamera pixelPerfectCamera; + private Texture ouyaOButtonTexture; + private Sprite ouyaOButton; + private boolean oButtonPressed; + + public OuyaMainMenuState(final NxtARCore core){ + this.core = core; + this.pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + + startButton.setPosition(-(startButton.getWidth() / 2), -(startButton.getHeight() / 2)); + startButtonBBox.setPosition(startButton.getX(), startButton.getY()); + + float ledYPos = (-(Gdx.graphics.getHeight() / 2) * 0.5f) + (startButton.getY() * 0.5f); + clientConnectedLedOn.setSize(clientConnectedLedOn.getWidth() * 0.5f, clientConnectedLedOn.getHeight() * 0.5f); + clientConnectedLedOn.setPosition(-(clientConnectedLedOn.getWidth() / 2), ledYPos); + + clientConnectedLedOff.setSize(clientConnectedLedOff.getWidth() * 0.5f, clientConnectedLedOff.getHeight() * 0.5f); + clientConnectedLedOff.setPosition(-(clientConnectedLedOff.getWidth() / 2), ledYPos); + + ouyaOButtonTexture = new Texture("data/gfx/gui/OUYA_O.png"); + TextureRegion region = new TextureRegion(ouyaOButtonTexture, ouyaOButtonTexture.getWidth(), ouyaOButtonTexture.getHeight()); + ouyaOButton = new Sprite(region); + ouyaOButton.setSize(ouyaOButton.getWidth() * 0.6f, ouyaOButton.getHeight() * 0.6f); + ouyaOButton.setPosition(startButton.getX() - ouyaOButton.getWidth() - 20, startButton.getY()); + + oButtonPressed = false; + } + + @Override + public void render(float delta) { + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); + + core.batch.setProjectionMatrix(pixelPerfectCamera.combined); + core.batch.begin();{ + if(clientConnected){ + clientConnectedLedOn.draw(core.batch); + }else{ + clientConnectedLedOff.draw(core.batch); + } + startButton.draw(core.batch, 1.0f); + ouyaOButton.draw(core.batch); + }core.batch.end(); + } + + @Override + public void resize(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void show() { + // TODO Auto-generated method stub + + } + + @Override + public void hide() { + // TODO Auto-generated method stub + + } + + @Override + public void pause() { + // TODO Auto-generated method stub + + } + + @Override + public void resume() { + // TODO Auto-generated method stub + + } + + @Override + public void dispose(){ + super.dispose(); + ouyaOButtonTexture.dispose(); + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; BEGIN CONTROLLER LISTENER METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean buttonDown(Controller controller, int buttonCode) { + if(stateActive){ + if(buttonCode == Ouya.BUTTON_O){ + if(!clientConnected){ + core.toast("Can't start the game. No client is connected.", true); + }else{ + oButtonPressed = true; + startButton.setChecked(true); + } + } + + return true; + + }else{ + return false; + } + } + + @Override + public boolean buttonUp(Controller controller, int buttonCode) { + if(stateActive){ + if(buttonCode == Ouya.BUTTON_O){ + if(oButtonPressed){ + oButtonPressed = false; + startButton.setChecked(false); + core.nextState = game_states_t.IN_GAME; + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Start button released."); + } + } + + return true; + + }else{ + return false; + } + } +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/PauseState.java b/src/ve/ucv/ciens/ccg/nxtar/states/PauseState.java index 36f02d8..4b95ffc 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/PauseState.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/PauseState.java @@ -1,198 +1,204 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.NxtARCore; - -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.PovDirection; -import com.badlogic.gdx.math.Vector3; - -public class PauseState extends BaseState { - - public PauseState(final NxtARCore core){ - this.core = core; - } - - @Override - public void render(float delta) { - // TODO Auto-generated method stub - - } - - @Override - public void resize(int width, int height) { - // TODO Auto-generated method stub - - } - - @Override - public void show() { - // TODO Auto-generated method stub - - } - - @Override - public void hide() { - // TODO Auto-generated method stub - - } - - @Override - public void pause() { - // TODO Auto-generated method stub - - } - - @Override - public void resume() { - // TODO Auto-generated method stub - - } - - @Override - public void dispose() { - // TODO Auto-generated method stub - - } - - /*;;;;;;;;;;;;;;;;;; - ; HELPER METHODS ; - ;;;;;;;;;;;;;;;;;;*/ - - @Override - public void onStateSet(){ - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN INPUT PROCESSOR METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean keyDown(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyUp(int keycode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean keyTyped(char character) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean mouseMoved(int screenX, int screenY) { - // TODO Auto-generated method stub - return false; - } - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; END INPUT PROCESSOR METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; BEGIN CONTROLLER LISTENER METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - @Override - public boolean scrolled(int amount) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void connected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public void disconnected(Controller controller) { - // TODO Auto-generated method stub - - } - - @Override - public boolean buttonDown(Controller controller, int buttonCode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean buttonUp(Controller controller, int buttonCode) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean axisMoved(Controller controller, int axisCode, float value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean povMoved(Controller controller, int povCode, - PovDirection value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean xSliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean ySliderMoved(Controller controller, int sliderCode, - boolean value) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean accelerometerMoved(Controller controller, - int accelerometerCode, Vector3 value) { - // TODO Auto-generated method stub - return false; - } - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; END CONTROLLER LISTENER METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.NxtARCore; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.controllers.Controller; +import com.badlogic.gdx.controllers.Controllers; +import com.badlogic.gdx.controllers.PovDirection; +import com.badlogic.gdx.math.Vector3; + +public class PauseState extends BaseState { + + public PauseState(final NxtARCore core){ + this.core = core; + } + + @Override + public void render(float delta) { + // TODO Auto-generated method stub + + } + + @Override + public void resize(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void show() { + // TODO Auto-generated method stub + + } + + @Override + public void hide() { + // TODO Auto-generated method stub + + } + + @Override + public void pause() { + // TODO Auto-generated method stub + + } + + @Override + public void resume() { + // TODO Auto-generated method stub + + } + + @Override + public void dispose() { + // TODO Auto-generated method stub + + } + + /*;;;;;;;;;;;;;;;;;; + ; HELPER METHODS ; + ;;;;;;;;;;;;;;;;;;*/ + + @Override + public void onStateSet(){ + } + + @Override + public void onStateUnset(){ + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; BEGIN INPUT PROCESSOR METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean keyDown(int keycode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean keyUp(int keycode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean keyTyped(char character) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + // TODO Auto-generated method stub + return false; + } + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; END INPUT PROCESSOR METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; BEGIN CONTROLLER LISTENER METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + @Override + public boolean scrolled(int amount) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void connected(Controller controller) { + // TODO Auto-generated method stub + + } + + @Override + public void disconnected(Controller controller) { + // TODO Auto-generated method stub + + } + + @Override + public boolean buttonDown(Controller controller, int buttonCode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean buttonUp(Controller controller, int buttonCode) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean axisMoved(Controller controller, int axisCode, float value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean povMoved(Controller controller, int povCode, + PovDirection value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean xSliderMoved(Controller controller, int sliderCode, + boolean value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean ySliderMoved(Controller controller, int sliderCode, + boolean value) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean accelerometerMoved(Controller controller, + int accelerometerCode, Vector3 value) { + // TODO Auto-generated method stub + return false; + } + /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; END CONTROLLER LISTENER METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/states/TabletMainMenuState.java b/src/ve/ucv/ciens/ccg/nxtar/states/TabletMainMenuState.java index 6897560..6565ffc 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/states/TabletMainMenuState.java +++ b/src/ve/ucv/ciens/ccg/nxtar/states/TabletMainMenuState.java @@ -1,250 +1,156 @@ -/* - * Copyright (C) 2014 Miguel Angel Astor Romero - * - * 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 ve.ucv.ciens.ccg.nxtar.states; - -import ve.ucv.ciens.ccg.nxtar.NxtARCore; -import ve.ucv.ciens.ccg.nxtar.NxtARCore.game_states_t; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.PovDirection; -import com.badlogic.gdx.graphics.GL10; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.math.Vector3; - -public class TabletMainMenuState extends MainMenuStateBase{ - protected static final String CLASS_NAME = TabletMainMenuState.class.getSimpleName(); - - private OrthographicCamera pixelPerfectCamera; - - // Button touch helper fields. - private Vector3 win2world; - private Vector2 touchPointWorldCoords; - private boolean startButtonTouched; - private int startButtonTouchPointer; - - public TabletMainMenuState(final NxtARCore core){ - this.core = core; - pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - startButton.setPosition(-(startButton.getWidth() / 2), -(startButton.getHeight() / 2)); - startButtonBBox.setPosition(startButton.getX(), startButton.getY()); - - win2world = new Vector3(0.0f, 0.0f, 0.0f); - touchPointWorldCoords = new Vector2(); - - startButtonTouched = false; - startButtonTouchPointer = -1; - - float ledYPos = (-(Gdx.graphics.getHeight() / 2) * 0.5f) + (startButton.getY() * 0.5f); - clientConnectedLedOn.setSize(clientConnectedLedOn.getWidth() * 0.5f, clientConnectedLedOn.getHeight() * 0.5f); - clientConnectedLedOn.setPosition(-(clientConnectedLedOn.getWidth() / 2), ledYPos); - - clientConnectedLedOff.setSize(clientConnectedLedOff.getWidth() * 0.5f, clientConnectedLedOff.getHeight() * 0.5f); - clientConnectedLedOff.setPosition(-(clientConnectedLedOff.getWidth() / 2), ledYPos); - } - - @Override - public void render(float delta){ - Gdx.gl.glClearColor(1, 1, 1, 1); - Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); - - core.batch.setProjectionMatrix(pixelPerfectCamera.combined); - core.batch.begin();{ - if(clientConnected){ - clientConnectedLedOn.draw(core.batch); - }else{ - clientConnectedLedOff.draw(core.batch); - } - startButton.draw(core.batch, 1.0f); - }core.batch.end(); - } - - @Override - public void resize(int width, int height){ } - - @Override - public void show(){ } - - @Override - public void hide(){ } - - @Override - public void pause(){ } - - @Override - public void resume(){ } - - @Override - public void dispose(){ - super.dispose(); - } - - /*;;;;;;;;;;;;;;;;;; - ; HELPER METHODS ; - ;;;;;;;;;;;;;;;;;;*/ - - @Override - public void onStateSet(){ - super.onStateSet(); - } - - private void unprojectTouch(int screenX, int screenY){ - win2world.set(screenX, screenY, 0.0f); - pixelPerfectCamera.unproject(win2world); - touchPointWorldCoords.set(win2world.x, win2world.y); - } - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; INPUT PROCESSOR METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button){ - unprojectTouch(screenX, screenY); - - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown(%d, %d, %d, %d)", screenX, screenY, pointer, button)); - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); - - if(!startButton.isDisabled() && startButtonBBox.contains(touchPointWorldCoords)){ - startButton.setChecked(true); - startButtonTouched = true; - startButtonTouchPointer = pointer; - core.nextState = game_states_t.IN_GAME; - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Start button pressed."); - } - - return true; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button){ - unprojectTouch(screenX, screenY); - - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp(%d, %d, %d, %d)", screenX, screenY, pointer, button)); - Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); - - if(!startButton.isDisabled() && startButtonBBox.contains(touchPointWorldCoords)){ - startButton.setChecked(false); - startButtonTouched = false; - startButtonTouchPointer = -1; - Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Start button released."); - } - - return true; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer){ - unprojectTouch(screenX, screenY); - - if(!startButton.isDisabled() && startButtonTouched && pointer == startButtonTouchPointer && !startButtonBBox.contains(touchPointWorldCoords)){ - startButtonTouchPointer = -1; - startButtonTouched = false; - startButton.setChecked(false); - Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Start button released."); - } - - return true; - } - - - /*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; UNUSED CONTROLLER LISTENER METHODS ; - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ - - @Override - public boolean keyDown(int keycode){ - // Unused. - return false; - } - - @Override - public boolean keyUp(int keycode){ - // Unused. - return false; - } - - @Override - public boolean keyTyped(char character){ - // Unused. - return false; - } - - @Override - public boolean mouseMoved(int screenX, int screenY){ - // Unused. - return false; - } - - @Override - public boolean scrolled(int amount){ - // Unused. - return false; - } - - @Override - public void connected(Controller controller){ - // Unused. - } - - @Override - public void disconnected(Controller controller){ - // Unused. - } - - @Override - public boolean buttonDown(Controller controller, int buttonCode){ - // Unused. - return false; - } - - @Override - public boolean buttonUp(Controller controller, int buttonCode){ - // Unused. - return false; - } - - @Override - public boolean axisMoved(Controller controller, int axisCode, float value){ - // Unused. - return false; - } - - @Override - public boolean povMoved(Controller controller, int povCode, PovDirection value){ - // Unused. - return false; - } - - @Override - public boolean xSliderMoved(Controller controller, int sliderCode, boolean value){ - // Unused. - return false; - } - - @Override - public boolean ySliderMoved(Controller controller, int sliderCode, boolean value){ - // Unused. - return false; - } - - @Override - public boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value){ - // Unused. - return false; - } -} +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * 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 ve.ucv.ciens.ccg.nxtar.states; + +import ve.ucv.ciens.ccg.nxtar.NxtARCore; +import ve.ucv.ciens.ccg.nxtar.NxtARCore.game_states_t; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL10; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; + +public class TabletMainMenuState extends MainMenuStateBase{ + private static final String CLASS_NAME = TabletMainMenuState.class.getSimpleName(); + + private OrthographicCamera pixelPerfectCamera; + + // Button touch helper fields. + private Vector3 win2world; + private Vector2 touchPointWorldCoords; + private boolean startButtonTouched; + private int startButtonTouchPointer; + + public TabletMainMenuState(final NxtARCore core){ + this.core = core; + pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + startButton.setPosition(-(startButton.getWidth() / 2), -(startButton.getHeight() / 2)); + startButtonBBox.setPosition(startButton.getX(), startButton.getY()); + + win2world = new Vector3(0.0f, 0.0f, 0.0f); + touchPointWorldCoords = new Vector2(); + + startButtonTouched = false; + startButtonTouchPointer = -1; + + float ledYPos = (-(Gdx.graphics.getHeight() / 2) * 0.5f) + (startButton.getY() * 0.5f); + clientConnectedLedOn.setSize(clientConnectedLedOn.getWidth() * 0.5f, clientConnectedLedOn.getHeight() * 0.5f); + clientConnectedLedOn.setPosition(-(clientConnectedLedOn.getWidth() / 2), ledYPos); + + clientConnectedLedOff.setSize(clientConnectedLedOff.getWidth() * 0.5f, clientConnectedLedOff.getHeight() * 0.5f); + clientConnectedLedOff.setPosition(-(clientConnectedLedOff.getWidth() / 2), ledYPos); + } + + @Override + public void render(float delta){ + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); + + core.batch.setProjectionMatrix(pixelPerfectCamera.combined); + core.batch.begin();{ + if(clientConnected){ + clientConnectedLedOn.draw(core.batch); + }else{ + clientConnectedLedOff.draw(core.batch); + } + startButton.draw(core.batch, 1.0f); + }core.batch.end(); + } + + @Override + public void resize(int width, int height){ } + + @Override + public void show(){ } + + @Override + public void hide(){ } + + @Override + public void pause(){ } + + @Override + public void resume(){ } + + @Override + public void dispose(){ + super.dispose(); + } + + /*;;;;;;;;;;;;;;;;;; + ; HELPER METHODS ; + ;;;;;;;;;;;;;;;;;;*/ + + private void unprojectTouch(int screenX, int screenY){ + win2world.set(screenX, screenY, 0.0f); + pixelPerfectCamera.unproject(win2world); + touchPointWorldCoords.set(win2world.x, win2world.y); + } + + /*;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; INPUT LISTENER METHODS ; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button){ + unprojectTouch(screenX, screenY); + + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown(%d, %d, %d, %d)", screenX, screenY, pointer, button)); + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchDown() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); + + if(!startButton.isDisabled() && startButtonBBox.contains(touchPointWorldCoords)){ + startButton.setChecked(true); + startButtonTouched = true; + startButtonTouchPointer = pointer; + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Start button pressed."); + } + + return true; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button){ + unprojectTouch(screenX, screenY); + + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp(%d, %d, %d, %d)", screenX, screenY, pointer, button)); + Gdx.app.log(TAG, CLASS_NAME + String.format(".touchUp() :: Unprojected touch point: (%f, %f)", touchPointWorldCoords.x, touchPointWorldCoords.y)); + + if(!startButton.isDisabled() && startButtonBBox.contains(touchPointWorldCoords)){ + startButton.setChecked(false); + startButtonTouched = false; + startButtonTouchPointer = -1; + core.nextState = game_states_t.IN_GAME; + Gdx.app.log(TAG, CLASS_NAME + ".touchDown() :: Start button released."); + } + + return true; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer){ + unprojectTouch(screenX, screenY); + + if(!startButton.isDisabled() && startButtonTouched && pointer == startButtonTouchPointer && !startButtonBBox.contains(touchPointWorldCoords)){ + startButtonTouchPointer = -1; + startButtonTouched = false; + startButton.setChecked(false); + Gdx.app.log(TAG, CLASS_NAME + ".touchDragged() :: Start button released."); + } + + return true; + } +} diff --git a/src/ve/ucv/ciens/ccg/nxtar/utils/ProjectConstants.java b/src/ve/ucv/ciens/ccg/nxtar/utils/ProjectConstants.java index 8a0f8f4..e0d15ab 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/utils/ProjectConstants.java +++ b/src/ve/ucv/ciens/ccg/nxtar/utils/ProjectConstants.java @@ -31,7 +31,7 @@ public abstract class ProjectConstants { public static final float OVERSCAN; - public static final String FONT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.,:;!¡?¿"; + public static final String FONT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.,:;!?"; static{ OVERSCAN = Ouya.runningOnOuya ? 0.9f : 1.0f;