All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mini2Dx.libgdx.LibgdxInput Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright 2019 See AUTHORS file
 *
 * 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 org.mini2Dx.libgdx;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.ControllerListener;
import com.badlogic.gdx.controllers.Controllers;
import org.mini2Dx.core.Input;
import org.mini2Dx.core.input.GamePad;
import org.mini2Dx.core.input.GamePadConnectionListener;
import org.mini2Dx.core.input.nswitch.SwitchDualJoyConGamePad;
import org.mini2Dx.core.input.nswitch.SwitchJoyConLGamePad;
import org.mini2Dx.core.input.nswitch.SwitchJoyConRGamePad;
import org.mini2Dx.core.input.ps4.PS4GamePad;
import org.mini2Dx.core.input.xbox.XboxGamePad;
import org.mini2Dx.gdx.InputProcessor;
import org.mini2Dx.gdx.utils.Array;
import org.mini2Dx.gdx.utils.Queue;
import org.mini2Dx.libgdx.input.*;

public class LibgdxInput implements Input, ControllerListener {
	private final Array connectedGamePads = new Array();
	private final Array disconnectedGamePads = new Array();
	private final Queue connectedGamePadQueue = new Queue<>();

	private LibgdxInputProcessor gdxInputProcessor = null;
	private GamePadConnectionListener connectionListener = null;

	private boolean initialised = false;
	private boolean onScreenKeyboardVisible = false;

	public LibgdxInput() {
		super();
		Controllers.addListener(this);
	}

	public void updateGamePads() {
		init();
		reconnectGamePads();
		connectNewGamePads();
	}

	private void init() {
		if(initialised) {
			return;
		}

		for(Controller controller : Controllers.getControllers()) {
			connectedGamePadQueue.addLast(controller);
		}
		initialised = true;
	}

	private void reconnectGamePads() {
		for(int i = disconnectedGamePads.size - 1; i >= 0; i--) {
			final LibgdxGamePad gamePad = (LibgdxGamePad) disconnectedGamePads.get(i);
			if(!gamePad.isConnected()) {
				continue;
			}
			connectedGamePads.add(gamePad);
			disconnectedGamePads.removeIndex(i);

			notifyGamePadConnected(gamePad);
		}
	}

	private void connectNewGamePads() {
		while(!connectedGamePadQueue.isEmpty()) {
			final Controller controller = connectedGamePadQueue.removeFirst();

			boolean existingController = false;
			for(int i = 0; i < connectedGamePads.size; i++) {
				if(LibgdxGamePad.getInstanceId(controller).equals(connectedGamePads.get(i).getInstanceId())) {
					//Already connected
					existingController = true;
					break;
				}
			}

			if(existingController) {
				continue;
			}
			final GamePad gamePad = new LibgdxGamePad(controller);
			connectedGamePads.add(gamePad);
			notifyGamePadConnected(gamePad);
		}
	}

	private void notifyGamePadConnected(GamePad gamePad) {
		if(connectionListener == null) {
			return;
		}
		connectionListener.onConnect(gamePad);
	}

	private void notifyGamePadDisconnected(GamePad gamePad) {
		if(connectionListener == null) {
			return;
		}
		connectionListener.onDisconnect(gamePad);
	}

	@Override
	public void setInputProcessor(InputProcessor inputProcessor) {
		if(gdxInputProcessor == null) {
			gdxInputProcessor = new LibgdxInputProcessor(inputProcessor);
			Gdx.input.setInputProcessor(gdxInputProcessor);
		} else {
			gdxInputProcessor.setInputProcessor(inputProcessor);
		}
	}

	@Override
	public void setGamePadConnectionListener(GamePadConnectionListener listener, boolean notifyExisting) {
		this.connectionListener = listener;

		if(!notifyExisting) {
			return;
		}
		for(int i = connectedGamePads.size - 1; i >= 0; i--) {
			listener.onConnect(connectedGamePads.get(i));
		}
	}

	@Override
	public boolean isOnScreenKeyboardVisible() {
		return onScreenKeyboardVisible;
	}

	@Override
	public void setOnScreenKeyboardVisible(boolean visible) {
		this.onScreenKeyboardVisible = visible;

		Gdx.input.setOnscreenKeyboardVisible(visible);
	}

	@Override
	public Array getGamePads() {
		return connectedGamePads;
	}

	@Override
	public PS4GamePad newPS4GamePad(GamePad gamePad) {
		return new LibgdxPS4GamePad(gamePad);
	}

	@Override
	public SwitchDualJoyConGamePad newSwitchDualJoyConGamePad(GamePad gamePad) {
		return null;
	}

	@Override
	public SwitchJoyConLGamePad newSwitchJoyConLGamePad(GamePad gamePad) {
		return null;
	}

	@Override
	public SwitchJoyConRGamePad newSwitchJoyConRGamePad(GamePad gamePad) {
		return null;
	}

	@Override
	public XboxGamePad newXboxGamePad(GamePad gamePad) {
		return new LibgdxXboxGamePad(gamePad);
	}

	@Override
	public int getX() {
		return Gdx.input.getX();
	}

	@Override
	public int getY() {
		return Gdx.input.getY();
	}

	@Override
	public boolean isKeyJustPressed(int key) {
		return Gdx.input.isKeyJustPressed(key);
	}

	@Override
	public boolean isKeyDown(int key) {
		return Gdx.input.isKeyPressed(key);
	}

	@Override
	public boolean isKeyUp(int key) {
		return !Gdx.input.isKeyPressed(key);
	}

	@Override
	public boolean justTouched() {
		return Gdx.input.justTouched();
	}

	@Override
	public boolean isClipboardSupported() {
		return true;
	}

	@Override
	public boolean hasClipboardContents() {
		return Gdx.app.getClipboard().hasContents();
	}

	@Override
	public String getClipboardContents() {
		return Gdx.app.getClipboard().getContents();
	}

	@Override
	public void setClipboardContents(String contents) {
		Gdx.app.getClipboard().setContents(contents);
	}

	@Override
	public void connected(Controller controller) {
		connectedGamePadQueue.addLast(controller);
	}

	@Override
	public void disconnected(Controller controller) {
		for(int i = connectedGamePads.size - 1; i >= 0; i--) {
			final LibgdxGamePad gamePad = (LibgdxGamePad) connectedGamePads.get(i);
			if(gamePad.getInstanceId().equals(LibgdxGamePad.getInstanceId(controller))) {
				disconnectedGamePads.add(gamePad);
				connectedGamePads.removeIndex(i);

				notifyGamePadDisconnected(gamePad);
				break;
			}
		}
	}

	@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;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy