Libgdx 多点触控不工作
Libgdx multiTouch not working
我正在开发一个游戏,我在这个游戏中使用 Libgdx 库。它可以在 Android 上运行,并且必须在一个屏幕上与两个玩家一起玩。但我无法获得其他玩家的输入。我可以和垫底玩家或顶部玩家一起玩,但不能同时玩。
这是获取输入代码:
public class PlayStateInput implements InputProcessor {
private PlayState playState;
private Vector2 touchPos;
private Vector2 bodyCord;
public PlayStateInput(PlayState playState){
this.playState = playState;
touchPos = new Vector2();
bodyCord = new Vector2();
touchPos.x=Gdx.input.getX();
touchPos.y=Gdx.input.getY();
bodyCord.x=playState.getGameWorld().getPaddle().getBody().getPosition().x;
bodyCord.y=playState.getGameWorld().getPaddle().getBody().getPosition().y;
}
@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) {
if(playState.getGameWorld().getPuck().getCircleRect().contains(screenX,screenY)){
System.out.println("collision");
}
if(screenY > Gdx.graphics.getHeight()/2 && (pointer <= 2)){
playState.getGameWorld().getPaddle2().setBottomPaddle(true);
}
if(screenY < Gdx.graphics.getHeight()/2 && (pointer <= 2)){
playState.getGameWorld().getPaddle().setTopPaddle(true);
}
return false;
}
并在此处使用此输入:
public class Paddle implements GameObject {
private World world;
private Body body;
private Body body2;
private BodyDef bodyDef;
private BodyDef bodyDef2;
private Fixture fixture;
private Fixture fixture2;
private FixtureDef fixtureDef;
private FixtureDef fixtureDef2;
private Circle circleRect;
private Circle circleRect2;
boolean TopPaddle = false;
boolean BottomPaddle = false;
private float PPM=100f;
private float power=100f;
private Vector2 touchPos;
private Sprite sprite;
String koordinatlar;
public Paddle(World world){
this.world = world;
bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set((Gdx.graphics.getWidth()/2)/PPM,(Gdx.graphics.getHeight()/3)/PPM);
body = world.createBody(bodyDef);
fixtureDef = new FixtureDef();
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution=0.3f;
CircleShape circleShape = new CircleShape();
circleShape.setRadius((Gdx.graphics.getWidth()/16)/PPM);
fixtureDef.shape = circleShape;
fixture = body.createFixture(fixtureDef);
circleRect = new Circle(body.getPosition().x,body.getPosition().y,(Gdx.graphics.getWidth()/16));
Sprite.split(ImageLoader.playButtonRegion.getTexture(),20,20);
sprite = new Sprite(ImageLoader.paddle);
sprite.setSize((Gdx.graphics.getWidth()/8),(Gdx.graphics.getWidth()/8));
sprite.setPosition((Gdx.graphics.getWidth()/2)-30f,(Gdx.graphics.getHeight()/3)-30f);
touchPos = new Vector2();
}
@Override
public void render(SpriteBatch sb) {
sprite.draw(sb);
sprite.setPosition(body.getPosition().x*PPM-30f,body.getPosition().y*PPM-30f);
}
@Override
public void update(float delta) {
touchPos.x=Gdx.input.getX()/PPM;
touchPos.y=Gdx.input.getY()/PPM;
System.out.println(touchPos);
if (TopPaddle) {
body.setLinearVelocity(power*(touchPos.x-body.getPosition().x),power*(touchPos.y-body.getPosition().y));
body.setAngularVelocity(0.0f);
if(Gdx.input.getY()>Gdx.graphics.getHeight()/2){
body.setLinearVelocity(0f,0f);
}
//System.out.println(Gdx.input.getX()+" "+Gdx.input.getY());
}
}
我希望,我说清楚了。
我想我明白了你的问题,你依赖于一次只接受一个输入这一事实。因此,如果两个玩家同时提供输入,您将忽略其中一个。
有多种方法可以解决您的多点触控输入问题,但我将着手解释一种简单的技术 - 修改自 this answer。
为了让两个玩家都能接受输入,您需要两个变量 - 我将它们称为 topTouchPos
和 bottomTouchPos
。这些中的每一个都将是一个 Vector2
,就像您当前的 touchPos
一样,它们将按如下方式计算(在您的 update
方法中):
//Initialise both vectors to vectors that can't be touched (negative)
Vector2 topTouchPos = new Vector2(-1,-1), bottomTouchPos = new Vector2(-1,-1);
//Two people can have up to 20 fingers (most touchscreen devices will have a lower limit anyway)
for (int i = 0; i < 20; i++) {
//Check if this finger ID is touched
if (Gdx.input.isTouched(i)) {
//Classify it as either the top or bottom player
bool bottom = Gdx.input.getY(i) > Gdx.graphics.getHeight()/2;
if (bottom) bottomTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i));
else topTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i));
}
}
当您进入主游戏代码时,您必须检查两个玩家。如果 topTouchPos
或 bottomTouchPos
不是负数,则使用他们各自球员的接触值。
希望这对您有所帮助(我没有测试过任何代码,因此请注意任何拼写错误)。
我正在开发一个游戏,我在这个游戏中使用 Libgdx 库。它可以在 Android 上运行,并且必须在一个屏幕上与两个玩家一起玩。但我无法获得其他玩家的输入。我可以和垫底玩家或顶部玩家一起玩,但不能同时玩。
这是获取输入代码:
public class PlayStateInput implements InputProcessor {
private PlayState playState;
private Vector2 touchPos;
private Vector2 bodyCord;
public PlayStateInput(PlayState playState){
this.playState = playState;
touchPos = new Vector2();
bodyCord = new Vector2();
touchPos.x=Gdx.input.getX();
touchPos.y=Gdx.input.getY();
bodyCord.x=playState.getGameWorld().getPaddle().getBody().getPosition().x;
bodyCord.y=playState.getGameWorld().getPaddle().getBody().getPosition().y;
}
@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) {
if(playState.getGameWorld().getPuck().getCircleRect().contains(screenX,screenY)){
System.out.println("collision");
}
if(screenY > Gdx.graphics.getHeight()/2 && (pointer <= 2)){
playState.getGameWorld().getPaddle2().setBottomPaddle(true);
}
if(screenY < Gdx.graphics.getHeight()/2 && (pointer <= 2)){
playState.getGameWorld().getPaddle().setTopPaddle(true);
}
return false;
}
并在此处使用此输入:
public class Paddle implements GameObject {
private World world;
private Body body;
private Body body2;
private BodyDef bodyDef;
private BodyDef bodyDef2;
private Fixture fixture;
private Fixture fixture2;
private FixtureDef fixtureDef;
private FixtureDef fixtureDef2;
private Circle circleRect;
private Circle circleRect2;
boolean TopPaddle = false;
boolean BottomPaddle = false;
private float PPM=100f;
private float power=100f;
private Vector2 touchPos;
private Sprite sprite;
String koordinatlar;
public Paddle(World world){
this.world = world;
bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set((Gdx.graphics.getWidth()/2)/PPM,(Gdx.graphics.getHeight()/3)/PPM);
body = world.createBody(bodyDef);
fixtureDef = new FixtureDef();
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution=0.3f;
CircleShape circleShape = new CircleShape();
circleShape.setRadius((Gdx.graphics.getWidth()/16)/PPM);
fixtureDef.shape = circleShape;
fixture = body.createFixture(fixtureDef);
circleRect = new Circle(body.getPosition().x,body.getPosition().y,(Gdx.graphics.getWidth()/16));
Sprite.split(ImageLoader.playButtonRegion.getTexture(),20,20);
sprite = new Sprite(ImageLoader.paddle);
sprite.setSize((Gdx.graphics.getWidth()/8),(Gdx.graphics.getWidth()/8));
sprite.setPosition((Gdx.graphics.getWidth()/2)-30f,(Gdx.graphics.getHeight()/3)-30f);
touchPos = new Vector2();
}
@Override
public void render(SpriteBatch sb) {
sprite.draw(sb);
sprite.setPosition(body.getPosition().x*PPM-30f,body.getPosition().y*PPM-30f);
}
@Override
public void update(float delta) {
touchPos.x=Gdx.input.getX()/PPM;
touchPos.y=Gdx.input.getY()/PPM;
System.out.println(touchPos);
if (TopPaddle) {
body.setLinearVelocity(power*(touchPos.x-body.getPosition().x),power*(touchPos.y-body.getPosition().y));
body.setAngularVelocity(0.0f);
if(Gdx.input.getY()>Gdx.graphics.getHeight()/2){
body.setLinearVelocity(0f,0f);
}
//System.out.println(Gdx.input.getX()+" "+Gdx.input.getY());
}
}
我希望,我说清楚了。
我想我明白了你的问题,你依赖于一次只接受一个输入这一事实。因此,如果两个玩家同时提供输入,您将忽略其中一个。
有多种方法可以解决您的多点触控输入问题,但我将着手解释一种简单的技术 - 修改自 this answer。
为了让两个玩家都能接受输入,您需要两个变量 - 我将它们称为 topTouchPos
和 bottomTouchPos
。这些中的每一个都将是一个 Vector2
,就像您当前的 touchPos
一样,它们将按如下方式计算(在您的 update
方法中):
//Initialise both vectors to vectors that can't be touched (negative)
Vector2 topTouchPos = new Vector2(-1,-1), bottomTouchPos = new Vector2(-1,-1);
//Two people can have up to 20 fingers (most touchscreen devices will have a lower limit anyway)
for (int i = 0; i < 20; i++) {
//Check if this finger ID is touched
if (Gdx.input.isTouched(i)) {
//Classify it as either the top or bottom player
bool bottom = Gdx.input.getY(i) > Gdx.graphics.getHeight()/2;
if (bottom) bottomTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i));
else topTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i));
}
}
当您进入主游戏代码时,您必须检查两个玩家。如果 topTouchPos
或 bottomTouchPos
不是负数,则使用他们各自球员的接触值。
希望这对您有所帮助(我没有测试过任何代码,因此请注意任何拼写错误)。