2013-08-01 11 views
5

Tworzę lobby w grze wieloosobowej, która może zawierać dowolną liczbę graczy w tabeli. Mam następujący kod:ScrollPane libgdx - nie przewija?

camera = new OrthographicCamera(WIDTH,HEIGHT); 
    camera.position.set(WIDTH/2,HEIGHT/2, 0); 
    camera.update(); 

    stage = new Stage(); 
    Gdx.input.setInputProcessor(stage); 
    stage.setCamera(camera); 
    stage.setViewport(WIDTH,HEIGHT,false); 

    ScrollPaneStyle paneStyle = new ScrollPaneStyle(); 
    paneStyle.background = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("cavebg")); 
    paneStyle.vScrollKnob = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("GUI/slidernob")); 
    paneStyle.hScroll = paneStyle.hScrollKnob = paneStyle.vScroll = paneStyle.vScrollKnob; 

    Table container = new Table(); 
    table = new Table(); 
    ScrollPane pane = new ScrollPane(table,paneStyle); 
    container.add(pane).width(WIDTH).height(HEIGHT); 
    container.row(); 
    container.setBounds(0,0,WIDTH,HEIGHT); 
    stage.addActor(container); 

    font = new BitmapFont(); 
    color = new Color(0,0,0,1); 
    style = new TextButtonStyle(); 
    style.font = font; 
    style.up = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("GUI/guibg")); 
    style.fontColor = color; 

    handler = new ChangeHandler(); 
    ArrayList<User> users = FirebaseManager.lobbyUsers; 
    for(int i = 0; i < users.size() || i < 100; i++){ 
     TextButton tmp = new TextButton("",style); 
     tmp.scale(2); 
     //tmp.setText(users.get(i).name); 
     tmp.setText(i+ " asdf"); 
     tmp.addListener(handler); 
     table.add(tmp).width(WIDTH/4f); 
     if(i%2 == 1 && i > 0) 
      table.row(); 
    } 

pomimo sposobu, w jaki tabela wyraźnie rozciąga się poniżej dolnej części ekranu (który powinien być w dolnej części panelu przewijania), nie ma pasek przewijania i klikając i przeciągając nic nie robi.

Zrzut ekranu: enter image description here

Odpowiedz

2

Mój problem polegał na tym, że nie otrzymałem danych wejściowych. Nie powinienem był ustawić procesora wejściowego w konstruktorze, ponieważ poprzedni ekran ustawiał procesor na wartość null, gdy był "ukryty", więc kiedy przeniosłem linię do metody wyświetlania LobbyScreen, zdarzyło się to po ukryciu poprzedniego ekranu , a wejście jest ustawione prawidłowo.

6

Zdajesz rzeczywiście potrzebne są dwie rzeczy. Zewnętrzny pojemnik i wewnętrzny pojemnik. Regularnie korzystasz z dwóch tabel. Oto mały przykład, jak korzystać z scrollPane. Właściwie bez stylu, ale powinno to wyjaśniać.

this.table = new Table(); 
    this.container = new Table(); 
    scroll = new ScrollPane(table); 
    container.add(scroll).width(500f).height(500f); 
    container.row(); 

Tabela jest tabelą, na której należy dodać rzeczy, które powinny być przewijane. Pojemnik to pudełko zewnętrzne. Możesz więc dodać np. Nagłówek nad twoim scrollboksem. Zewnętrzne pudełko (pojemnik) potrzebuje rozmiaru. W przeciwnym razie nie będzie żadnych pasków przewijania lub takich. A ty potrzebujesz wewnętrznego stołu.

Prosty przykład przez dodanie:

style = new LabelStyle(font, Color.WHITE); 
label = new Label(null, style); 
table.add(label); 
table.row(); 
label.setAlignment(1); // align center 

dać więcej wierszy, które można pokazać i będziesz miał panel przewijania. W przeciwnym razie nie ma paska przewijania itp.


Wszystko w jednym. Właśnie spudłowałeś w zewnętrznym kontenerze. Dodaj to i powinno działać. Nie zapomnij ustawić rozmiarów.

+0

dodałem zewnętrzną cointainer i , nadal nie działa. – csga5000

+0

Również, gdzie otrzymałeś Config.VIRTUAL_VIEW_WIDTH? – csga5000

+0

... to jest statyczny float, którego używam w moim programie. Zastąp go pewną wartością – BennX

1

po init ScrollPane należy zgłosić ten pierwszy

mScrollPane.layout(); 
7

może zapomnieć, aby akt etap render(), dodać coś takiego:

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

    stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1/30f)); 
    stage.draw(); 
}