gpt4 book ai didi

java - LibGDX - 自定义点击监听器?

转载 作者:太空狗 更新时间:2023-10-29 15:41:36 25 4
gpt4 key购买 nike

我想制作我自己的 Button 类,它将有一个 Sprite,每当我触摸它时它就会增长或旋转等,该类还将有一个 Draw 和 Update 函数。

要检查我是否触摸它,我可以检查 sprite 矩形是否包含触摸在屏幕类的 touchdown 和 touchup 方法中的位置。

我不想那样做,我想做类似 android 按钮点击监听器的东西,这可能吗?

有点像

myCoolButton.setOnClickListener(new CoolButtonClassClickListener(

public void OnTouchDown() {

}

public void OnTouchUp() {
}
});

可能吗?

最佳答案

当然可以,我也是这么做的。

public interface FFListener
{
public void onClick(FFListenerButton flb);
}

public class FFListenerButton extends FFButton
{
private FFListener ffListener;

public FFListenerButton(Rectangle bounds, CharSequence text, FFListener ffListener)
{
super(bounds, text);
this.ffListener = ffListener;
}

@Override
protected void action()
{
ffListener.onClick(this);
}
}

public abstract class FFButton 
{
private Rectangle bounds;
private CharSequence text;
private boolean selected;
private boolean hidden;
private boolean active;
private boolean disabled;

public FFButton(Rectangle bounds, CharSequence text)
{
this.bounds = bounds;
this.text = text;
this.hidden = false;
this.active = false;
this.disabled = false;
}

protected abstract void action();

public void execute()
{
if(disabled == false)
{
action();
}
}


public boolean contains(float x, float y)
{
return bounds.contains(x, y);
}

public float x()
{
return bounds.x;
}

public float y()
{
return bounds.y;
}

public float width()
{
return bounds.width;
}

public float height()
{
return bounds.height;
}

public void drawBounds(ShapeRenderer shapeRenderer)
{
if(hidden != true)
{
shapeRenderer.rect(x(), y(), width(), height(), 0, 0, 0);
}
}

public CharSequence getText()
{
return text;
}

public FFButton setText(String text)
{
this.text = text;
return this;
}

public void drawText(SpriteBatch batch)
{
if(hidden != true)
{
Resources.bitmapFont.draw(batch, getText(), x()+(width()/8), y()+height()*0.75f); //black magic, please adjust
}
}

public boolean getSelected()
{
return selected;
}

public FFButton setSelected(boolean selected)
{
this.selected = selected;
return this;
}

public boolean isActive()
{
return active;
}

public FFButton setActive(boolean active)
{
this.active = active;
return this;
}

public boolean isHidden()
{
return hidden;
}

public FFButton setHidden(boolean hidden)
{
this.hidden = hidden;
return this;
}

public Rectangle getBounds()
{
return bounds;
}

public boolean isDisabled()
{
return disabled;
}

public void setDisabled(boolean disabled)
{
this.disabled = disabled;
}
}

虽然从技术上讲这使用了一个 Rectangle 并使用 ShapeRenderer 来渲染它,但将它换成 Sprite 确实不难。之后,您可以使用 contains 询问点击是否包含,如果是,则从外部调用 execute()。

这样创建:

backButton = new FFListenerButton(new Rectangle(400, 20, 60, 30), "Back", this);

并像这样处理事件:

@Override
public void onClick(FFListenerButton clb)
{
if(clb == backButton)
{
backButtonPressed();
}
else if(clb == selectButton)
{
...
}
}

这使用我的 AbstractMenuScreen 类将事件委托(delegate)给按钮(如果它们被单击):

public abstract class AbstractMenuScreen extends BaseScreen
{
protected List<FFButton> buttons;

public AbstractMenuScreen(List<FFButton> buttons)
{
this.buttons = buttons;
}

@Override
public void render(float delta)
{
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

Resources.batch.setProjectionMatrix(Resources.normalProjection);

Resources.batch.begin();
for(int i = 0; i < buttons.size(); i++)
{
FFButton b = buttons.get(i);
if(b.isHidden() != true)
{
b.drawText(Resources.batch);
}
}

Resources.batch.end();

Resources.shapeRenderer.setColor(Color.WHITE);
Resources.shapeRenderer.begin(ShapeType.Line);
for(int i = 0; i < buttons.size(); i++)
{
FFButton b = buttons.get(i);
if(b.isHidden() != true)
{
b.drawBounds(Resources.shapeRenderer);
}
}
Resources.shapeRenderer.end();

Resources.shapeRenderer.setColor(Color.RED);
Resources.shapeRenderer.begin(ShapeType.Line);
for(int i = 0; i < buttons.size(); i++)
{
FFButton b = buttons.get(i);
if(b.isHidden() != true)
{
if(b.isActive() == true)
{
b.drawBounds(Resources.shapeRenderer);
}
}
}
Resources.shapeRenderer.end();

Resources.shapeRenderer.setColor(Color.MAGENTA);
Resources.shapeRenderer.begin(ShapeType.Line);
for(int i = 0; i < buttons.size(); i++)
{
FFButton b = buttons.get(i);
if(b.isHidden() != true)
{
if(b.getSelected() == true)
{
b.drawBounds(Resources.shapeRenderer);
}
}
}
Resources.shapeRenderer.end();
}

@Override
public void show()
{
Gdx.input.setInputProcessor(this);
}

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button)
{
float pointerX = InputTransform.getCursorToModelX(windowWidth, screenX);
float pointerY = InputTransform.getCursorToModelY(windowHeight, screenY);
for(int i = 0; i < buttons.size(); i++)
{
if(buttons.get(i).contains(pointerX, pointerY))
{
if(buttons.get(i).isHidden() != true)
{
buttons.get(i).setSelected(true);
}
}
}
return true;
}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button)
{
float pointerX = InputTransform.getCursorToModelX(windowWidth, screenX);
float pointerY = InputTransform.getCursorToModelY(windowHeight, screenY);
for(int i = 0; i < buttons.size(); i++)
{
if(buttons.get(i).contains(pointerX, pointerY) && buttons.get(i).getSelected())
{
buttons.get(i).execute();
}
buttons.get(i).setSelected(false);
}
return true;
}
...

然后你这样扩展:

public class ServerClientPickScreen extends AbstractMenuScreen implements FFListener
{
private FFButton backButton;
private FFButton clientButton;
private FFButton serverButton;

public ServerClientPickScreen()
{
super(new ArrayList<FFButton>());
backButton = new FFListenerButton(new Rectangle(400, 20, 60, 30), "Back", this);
clientButton = new FFListenerButton(new Rectangle(260, 140, 80, 30), "Client", this);
serverButton = new FFListenerButton(new Rectangle(140, 140, 80, 30), "Server", this);
buttons.add(backButton);
buttons.add(clientButton);
buttons.add(serverButton);
....

关于java - LibGDX - 自定义点击监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24219170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com