2015-09-28 26 views
0

我知道很多問題都被要求解決類似的問題,但我找不到答案。爲什麼我的方法不能持續重複一個動作,直到按下一個libgdx scene2d按鈕並在釋放按鈕時停止它?

問題:我爲我的libgdx遊戲製作了一個屏幕,它看起來像下面的截圖。

enter image description here 我只想通過觸摸輸入。當我按住標有'lower'的按鈕時,它會在中間減少一次。我希望它保持遞減,直到我釋放'下部'按鈕。 我已將按鈕放置在一張桌子上,而桌子上又增加了一個按鈕。要達到什麼樣的,我想我用下面的方法:

TextButton less; //for the button labeled 'lower' 
    .... 

***constructor start**** 
      stage = new Stage(new ScreenViewport()); 
      Gdx.input.setInputProcessor(stage); 
      table = new Table(); 
      table.setFillParent(true); 
      stage.addActor(table); 
    ...... 
    ...... 
      style = new TextButton.TextButtonStyle(); 
      style.up = new TextureRegionDrawable(upRegion); 
      style.down = new TextureRegionDrawable(downRegion); 
      style.font = buttonFont; 
      less = new TextButton("lower", style); 
      table.add(less).expand().fill(); 
    .... 
    .... 
    less.addListener(new ChangeListener() { 
    @Override 
       public void changed(ChangeEvent event, Actor actor) { 
        while(less.isPressed()) { 
         Gdx.app.log("ispressed ","yes"); 
         curLevel--; 
         level.setText("" + curLevel); 
         Gdx.app.log("curLevel: ",curLevel+""); 
         try{ 
          Thread.sleep(1000); 
         }catch (Exception e){ 

         } 
        } 
       } 
    } 
.... 
.... 
***constructor ends**** 

但在改變while循環()變爲無限即使我釋放「少/低」 按鈕。我也嘗試過this問題的解決方案,但這也會導致無限循環。

而且我的項目詳情如下:(如果他們不管):

ext { 
     appName = 'kombat' 
     gdxVersion = '1.5.2' 
     roboVMVersion = '1.0.0-beta-01' 
     box2DLightsVersion = '1.3' 
     ashleyVersion = '1.3.1' 
     aiVersion = '1.4.0' 
    } 

我試圖從GAROS但結果在標籤數量的推移,即使單點觸摸和釋放後減少無限的解決方案。這是我做的遵循GAROS的指示:

  1. 推翻的行爲方法

     package com.zeher.kombat; 
         import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
         import com.badlogic.gdx.scenes.scene2d.ui.TextButton; 
         import com.zeher.kombat.Screens.LevelChooser; 
         /** 
          * Created by zucky on 10/4/2015. 
         */ 
          public class LessButton extends TextButton { 
           LevelChooser lc; 
           public LessButton(String text,TextButton.TextButtonStyle skin,Kombat game) { 
        super(text, skin); 
        this.lc=game.introScreen.lc; 
    
    } 
    @Override 
    public void act(float delta){ 
        if(lc.lowerFlag) { 
         lc.curLevel--; 
         lc.level.setText("" + lc.curLevel); 
        } 
    
    } 
    

    }

  2. 使用的inputListener。

      less.addListener(new InputListener() { 
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
         lowerFlag = true; 
          return false; 
         } 
         public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
          lowerFlag = false; 
          Gdx.app.log("occured: ","touchUp on less"); 
         } 
        }); 
    

但問題是,觸上事件不被解僱和lowerFlag從來沒有切換到錯誤。

請告訴我是什麼導致了這種意想不到的行爲,以及如何按我想要的方式處理按下和按住手勢。

+0

睡覺遊戲線程將暫停你的整個遊戲。相反,如果您需要等待某些內容,請使用延遲操作或libgdx Timer。或者計算增量時間。和ChangeListener不是你想要的,因爲'change()'不會觸發,直到你釋放按鈕。 – Tenfour04

+0

您是否設法解決Sunil問題? – gaRos

+0

@gaRos尚未。 –

回答

1

首先,我要感謝GAROS給了一個暗示。

  1. 我們應該爲這個目的使用的演員是ActorGestureListener。 它應該是這樣的:

    less.addListener(new ActorGestureListener() { 
         public void touchDown(InputEvent event, float x, float y, int pointer, int button) { 
          lowerFlag = true; 
          Gdx.app.log("occured: ","touchDown on less"); //to test whether it works or not 
         } 
    
    
         public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
          lowerFlag = false; 
          Gdx.app.log("occured: ","touchUp on less"); 
         } 
    }); 
    
  2. 現在通過使延伸TEXT按鈕,使得它降低了值,如果標誌爲true一個新的類重寫的行爲方式爲「少」按鈕。使用增量作爲您想要降低curLevel速度的參數。

(如果delta越大越減小,如果越低越減小)。例如,我創建了LessButton.java類。

public class LessButton extends TextButton { 
    LevelChooser lc; 
    public LessButton(String text, TextButton.TextButtonStyle skin,Kombat game) { 
     super(text, skin); 
     this.lc=game.introScreen.lc; 
    } 
    @Override 
    public void act(float delta){ 
     wait+=delta; 
     if(lc.lowerFlag && lc.curLevel>0 && wait>delta*8) { 
      lc.curLevel--; 
      lc.level.setText("" + lc.curLevel); 
      wait=0f; 
     } 
    } 
    } 

3.現在這樣使用它:

 LessButton less; 
     .... 
     less = new LessButton("lower", style,game); 
4

TextButton是一個演員,所以你可以爲它設置一個InputListener

該接口有兩個方法來實現:

less.addListener(new InputListener() { 
     public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 
       lowerFlag = true; 
       return true; 
     } 


    public void touchUp (InputEvent event, float x, float y, int pointer, int button) { 
      lowerFlag = false; 
     } 
}); 

並且覆蓋了按鈕的act方法,如果標誌爲true值越低。使用增量作爲您想要減少的速度的參數curLevel

(如果差值較大下降更多,如果是較低的下降更少)

+0

是因爲我使用舊的libgdx版本嗎? –

+0

問題是,touchDown應該返回true,我只是檢查了InputListener的文檔:「當鼠標按鈕或手指觸摸在任何地方上升時調用,但只有當touchDown先前爲鼠標按鈕或觸摸返回true時。」 – gaRos

+0

好的,謝謝你的努力。你值得讚賞! –

相關問題