每次在libgdx中单击按钮时如何向前和向后移动Sprite?

Posted

技术标签:

【中文标题】每次在libgdx中单击按钮时如何向前和向后移动Sprite?【英文标题】:How to move Sprite forward and backward every time the button is click in libgdx? 【发布时间】:2017-05-24 06:36:49 【问题描述】:

如何让我的玩家在自上而下的游戏中向前和向后移动。我创建了两个按钮moveForward 按钮和moveBackward 按钮。使用acceleromter 我左右移动我的玩家。我的主要问题是每次单击按钮时播放器都会向前和向后移动。它使用上下键工作,但我不知道如何使用按钮触摸来实现。

这是我在下面编写的代码

// Load the sprite sheet as a texture
    cat = new Texture(Gdx.files.internal("spriteCatsheet.png"));
    catsprite = new Sprite(cat);
    catsprite.setScale(2f);
    player = new Rectangle();
    player.x = Gdx.graphics.getWidth() - player.width - 350; 
    player.y = catPlayerY;
    player.setWidth(25);

我的按钮

    //left_control
    left_paw = new Texture(Gdx.files.internal("left_paw.png"));
    myTextureRegion = new TextureRegion(left_paw);
    myTexRegionDrawable = new TextureRegionDrawable(myTextureRegion);
    moveBackward = new ImageButton(myTexRegionDrawable); //Set the button up
    moveBackward.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("left_paw.png"))));
    //the hover
    moveBackward.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("left_paw_hover.png"))));
    moveBackward.setPosition(10,25);
    stage.addActor(moveBackward); //Add the button to the stage to perform rendering and take input.
    Gdx.input.setInputProcessor(stage);
    moveBackward.addListener(new InputListener()
        @Override
        public void touchUp (InputEvent event, float x, float y, int pointer, int button) 
            System.out.println("Left Button Pressed");
           //Move player Backward
           //player.y -= 300 * Gdx.graphics.getDeltaTime();
        
        @Override
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) 
            System.out.print("Released");

            return true;
        
    );
    stage.addActor(moveBackward);

    //right_control
    right_paw = new Texture(Gdx.files.internal("right_paw.png"));
    myTextureRegion = new TextureRegion(right_paw);
    myTexRegionDrawable = new TextureRegionDrawable(myTextureRegion);
    moveForward = new ImageButton(myTexRegionDrawable); //Set the button up
    moveForward.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("right_paw.png"))));
    //the hover
    moveForward.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("right_paw-hover.png"))));
    moveForward.setPosition(517,25);
    stage.addActor(moveForward); //Add the button to the stage to perform rendering and take input.
    Gdx.input.setInputProcessor(stage);
    moveForward.addListener(new InputListener()
        @Override
        public void touchUp (InputEvent event, float x, float y, int pointer, int button) 
            System.out.println("Right Button Pressed");
             //Move player Forward
             //player.y += 300 * Gdx.graphics.getDeltaTime();

        
        @Override
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) 
            return true;
        
    );
    stage.addActor(moveForward);

渲染

    spriteBatch.draw(currentFrame,player.x, player.y);

     //On keyboard 
    if(Gdx.input.isKeyPressed(Input.Keys.DOWN))player.y -= 300 * Gdx.graphics.getDeltaTime();
    if(Gdx.input.isKeyPressed(Input.Keys.UP)) player.y += 300 * Gdx.graphics.getDeltaTime();
    if(Gdx.input.isKeyPressed(Input.Keys.LEFT)) player.x -= 300 * Gdx.graphics.getDeltaTime();
    if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)) player.x  += 300 * Gdx.graphics.getDeltaTime();

    //Mobile acceleration
    if (Gdx.input.isPeripheralAvailable(Input.Peripheral.Accelerometer)) 
        player.x -= Gdx.input.getAccelerometerX();
        player.y += Gdx.input.getAccelerometerY() /1f;
    
    if (player.x < 0) 
        player.x = 0;
        player.x += Gdx.graphics.getDeltaTime() *20 *delta;
    
    if (player.x > Gdx.graphics.getWidth()-player.getWidth() -150) 
        player.x = Gdx.graphics.getWidth()-player.getWidth() -150;
    

感谢并提前 ^_^

【问题讨论】:

除了在按下按钮时输出一些控制台文本之外,您什么也没做。您应该在侦听器中调用一个方法来移动播放器。 您好 @Madmenyo 先生,我删除了侦听器内部的方法 我删除了这个 player.y += 300 * Gdx.graphics.getDeltaTime(); 它会向前移动,但我认为这不是让玩家向前移动的正确方法,因为它正在捕捉。跨度> getDeltaTime 是平均增量时间(我认为过去 100 帧)。使用getRawDeltaTime 可能不那么活泼。如果它真的(非常明显)活泼/断断续续,那一定是别的东西。 我已经改成getRawDeltaTime 还是有点不稳定/活泼.. 【参考方案1】:

你可以这样使用:

MotionState motionState=MotionState.NONE;

enum MotionState 

    NONE 
        @Override
        public boolean update(Rectangle player) 
           return true;
        
    ,

    UP 
        @Override
        public boolean update(Rectangle player) 
            player.y += 300 * Gdx.graphics.getDeltaTime();
            return false;
        
    ,

    DOWN
        @Override
        public boolean update(Rectangle player) 
            player.y -= 300 * Gdx.graphics.getDeltaTime();
            return false;
        
    ,

    LEFT
        @Override
        public boolean update(Rectangle player)  
            player.x -= 300 * Gdx.graphics.getDeltaTime();
            return false;
        
    ,

    RIGHT
        @Override
        public boolean update(Rectangle player) 
            player.x  += 300 * Gdx.graphics.getDeltaTime();
            return false;
        
    ;

    public abstract boolean update(Rectangle player);

在您的 render() 方法中

if(Gdx.input.isKeyPressed(Input.Keys.DOWN)) motionState = MotionState.DOWN;
if(Gdx.input.isKeyPressed(Input.Keys.UP)) motionState=MotionState.UP;
if(Gdx.input.isKeyPressed(Input.Keys.LEFT)) motionState=MotionState.LEFT;
if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)) motionState=MotionState.RIGHT;

if(motionState.update(player)) motionState=MotionState.NONE;

现在在 Button 的 Listener 方法中

moveBackward.addListener(new InputListener()
    @Override
    public void touchUp (InputEvent event, float x, float y, int pointer, int button) 
       motionState=MotionState.NONE;
    
    @Override
    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) 
         motionState=MotionState.DOWN;  // or what you want 
        return true;
    
);

为前进按钮做。

【讨论】:

【参考方案2】:

除了在按下按钮时输出一些控制台文本之外,您没有做任何事情。您应该在侦听器中调用一个方法来移动播放器。

除此之外,触地得分是“刚刚触碰”,触地得分是“释放”。不是反过来。在您的情况下,您希望具有“按钮保持”功能,因此您需要为每个按钮设置一个标志,该按钮在 touchDown/刚刚按下时激活并在 touchUp/释放时停用。当标志处于活动状态时,这意味着按钮被按住。然后在更新循环中检查按钮/标志 X 是否被按住并施展你的魔法。

【讨论】:

以上是关于每次在libgdx中单击按钮时如何向前和向后移动Sprite?的主要内容,如果未能解决你的问题,请参考以下文章

让玩家根据摄像机角度向前、向右、向左和向后移动

单击当前按钮时无法设置计数器

如何在 Unity 中前进和/或后退?

播放音频文件以在使用键盘弹奏时向前和向后搜索十秒

iOS 8 小部件,在应用程序组之间向前和向后共享数据

javascript中在链表中向前(向后)移动n个节点