二、输入监听

续接上节内容搭建好游戏开始基础设置后,我们来创建输入监听控制类这个输入监听我们想要达到的效果为:既可以进行单次点击也可以进行持续性点击,首先打开core项目首先我们创建一个GameKeys类用来保存按键设定的int值、哪个按键被按下后的布尔数组、实现按键的isdown方法(按一次即为点击一次)和ispress方法(按一次一直响应直至抬起调用keyup方法),具体实现内容如下:

public class GameKeys {
	/**
	 * 游戏中会循环调用update方法来更新keys和pkeys两个数组状态
	 * 开始时两个保存的按键状态相同
	 * 当某个按键被点击以后,会调用setkey方法
	 * keys数组内那个按键的状态会改变而pkeys数组内状态未变
	 * 因此就实现了isdown一直返回一个值而ispressed方法第一次
	 * update方法调用前返回一个值,update方法之后就会反回另一个值
	 * **/	
	private static boolean [] keys;	//保存上次循环时按键的状态
	private static boolean [] pkeys;//保存本次循环时按键的状态
	private static final int NUM_KEYS=8;//声明共计8个按键
	public static final int UP=0;
	public static final int LEFT=1;
	public static final int DOWN=2;
	public static final int RIGHT=3;
	public static final int ENTER=4;
	public static final int ESCAPE=5;
	public static final int SPACE=6;
	public static final int SHIFT=7;
	//每个按键定义的int值
	static {
		keys=new boolean [NUM_KEYS];
		pkeys=new boolean [NUM_KEYS];
		//初始化两个按键状态数组
	}	
	public static boolean isDown(int k){
		return keys[k];	//点击一次是返回
	}	
	public static boolean isPressed(int k){
		return keys[k] && !pkeys[k];
		//长按则返回两个状态的判断值
	}	
	public static void update(){
		for(int i=0;i<NUM_KEYS;i++){
			pkeys[i]=keys[i];
		}
		//更新按键状态
	}	
	public static void setKey(int k,boolean b){
		keys[k]=b;	//修改数组中的按键状态
	}
}
按键类实现之后我们接下来创建调用GameKeys内方法的GameInputProcessor类同时让其继承inputadapt类并覆写inputadapter的两个方法并实现他们如下:
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputAdapter;

public class GameInputProcessor extends InputAdapter{
	/**
	 * 这个类实现了两个方法一个是按键按下和按键抬起两个状态
	 * 当案件按下是调用gamekeys的setkey方法来更改某个按键的
	 * 状态。当按键抬起是同样调用这个方法更改按键的保存状态 
	 * **/
	@Override
	public boolean keyDown(int k) {		
		if(k==Keys.UP){
			GameKeys.setKey(GameKeys.UP, true);
		}
		if(k==Keys.LEFT){
			GameKeys.setKey(GameKeys.LEFT, true);
		}
		if(k==Keys.DOWN){
			GameKeys.setKey(GameKeys.DOWN, true);
		}
		if(k==Keys.RIGHT){
			GameKeys.setKey(GameKeys.RIGHT, true);
		}
		if(k==Keys.ENTER){
			GameKeys.setKey(GameKeys.ENTER, true);
		}
		if(k==Keys.ESCAPE){
			GameKeys.setKey(GameKeys.ESCAPE, true);
		}
		if(k==Keys.SPACE){
			GameKeys.setKey(GameKeys.SPACE, true);
		}
		if(k==Keys.SHIFT_LEFT || k==Keys.SHIFT_RIGHT){
			GameKeys.setKey(GameKeys.SHIFT, true);
		}
		return true;
	}
	@Override
	public boolean keyUp(int k) {
		if(k==Keys.UP){
			GameKeys.setKey(GameKeys.UP,false);
		}
		if(k==Keys.LEFT){
			GameKeys.setKey(GameKeys.LEFT, false);
		}
		if(k==Keys.DOWN){
			GameKeys.setKey(GameKeys.DOWN, false);
		}
		if(k==Keys.RIGHT){
			GameKeys.setKey(GameKeys.RIGHT,false);
		}
		if(k==Keys.ENTER){
			GameKeys.setKey(GameKeys.ENTER, false);
		}
		if(k==Keys.ESCAPE){
			GameKeys.setKey(GameKeys.ESCAPE, false);
		}
		if(k==Keys.SPACE){
			GameKeys.setKey(GameKeys.SPACE, false);
		}
		if(k==Keys.SHIFT_LEFT || k==Keys.SHIFT_RIGHT){
			GameKeys.setKey(GameKeys.SHIFT, false);
		}
		return true;
	}	
}
配置完这两个类之后我们将这两个类注册到游戏进程当中同时每次渲染时调用他们的更新方法。打开core项目中MyGdxGame类然后再create方法内实现注册到进程:

Gdx.input.setInputProcessor(new GameInputProcessor());

render方法内实现更新状态:

GameKeys.update();

至此我们的输入监听设置就配置完了,我们可以在MyGdxGame类的render方法内添加以下代码进行一次测试看一下是否达到了想要实现的效果(点击up键将响应一次而点击down则持续响应)如右图控制台内输出的信息。

本段添加的内容为测试代码:

public void render () {
		Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);		
		if(GameKeys.isDown(GameKeys.DOWN)){
			System.out.println("DOWN is down");
		}		
		if(GameKeys.isPressed(GameKeys.UP)){
			System.out.println("UP is pressed");
		}		
		GameKeys.update();
//此处一定要确认好顺序,因为单次点击实现的效果必须在GameKeys类中的
		//update方法调用前调用,否则update之后其pkeys与keys值都为true。
	}

至此我们就实现了输入监听类,可以正常接收输入事件。同时测试达到效果后将测试代码删除。OK第二节就介绍到这里。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉林南瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值