栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

LibGDX-自定义点击监听器?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LibGDX-自定义点击监听器?

当然可以,那正是我所做的。

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确实不难。之后,您可以仅询问with包含单击是否包含单击,然后从外部调用execute()。

像这样创建:

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

并处理如下事件:

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

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

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); ....


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/464157.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号