2016-03-26 5 views
0

私は幾分滑りやすい2dになりました。私のプロジェクトでは、ボタンのようなもので遊んでいました。私はイメージを描き、座標のクリックを聞いて、それはかなり不必要に見える50行のようになった。抽象的なコンポーネントクラスはどのように滑らかな2dで使用されますか?

しかし、私はこのスレッドを見たSlick 2d Button Listener;悲しいことにそれは死んだので助けにはならなかった。その男がやっていたことは本当に効率的だったように見えましたが、私はこれまでどのように使っているのか知ることができませんでした。誰かが私に説明したり、それを使う方法を教えてくれれば、それはすばらしいことになるでしょう。

答えて

0

私は、私はこれを行うことができる方法を発見ボタンクラスで私が書いたいくつかのテストの後、私はスリック2Dで

protected Shape hitbox;  
private boolean inside = false;  

public void render(GameContainer container, Graphics g) { 
    . 
    .//drawing the picture of the button 
    . 
    if(inside && container.getInput().isMousePressed(Input.MOUSE_LEFT_BUTTON)){ 
     //someone clicked the button 
    } 
} 
public void init(GameContainer container) { 
    //setting a hitbox up to recognize when the mouse is over the picture/button 
    hitbox = new Rectangle(/*dimensions of your picture*/); 
} 


public void update(GameContainer container, int delta) { 
    //this code finds out if the mouse is over the button 
    int mouseX = container.getInput().getMouseX(); 
    int mouseY = container.getInput().getMouseY(); 
    inside = hitbox.contains(mouseX, mouseY)) 
} 
+0

はい、これは動作しますが、何をしようとしているのは、新しいコンポーネントを作成することです。ちょうどいくつかのパラメータを使ってinitメソッド内で初期化し、renderメソッドでレンダリングすることができます。私はほとんどそれを働かせてきた。 – Hamish

+0

プライベートアレイを作成できます。 初期化では、コンポーネントを作成して配列に追加します。 レンダリングメソッドでは、配列の各コンポーネントを繰り返し処理し、これらのコンポーネントのレンダー機能を呼び出します。 – Alex

0

を、このようなボタンを実装:

import org.newdawn.slick.Color; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Input; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.geom.Rectangle; 
import org.newdawn.slick.geom.Shape; 
import org.newdawn.slick.gui.AbstractComponent; 
import org.newdawn.slick.gui.GUIContext; 

public class Button extends AbstractComponent{ 

protected int width; 
protected int height; 
protected int x; 
protected int y; 
protected int mouseX; 
protected int mouseY; 
protected boolean pressed; 
protected Shape hitbox; 
protected boolean over; 
protected String text; 

public Button(GUIContext container, int x, int y, int width, int height, String text) { 
    super(container); 
    setLocation(x, y); 
    this.width = width; 
    this.height = height; 
    this.text = text; 
    hitbox = new Rectangle(x, y, width, height); 
} 

@Override 
public int getHeight() { 
    return height; 
} 

@Override 
public int getWidth() { 
    return width; 
} 

@Override 
public int getX() { 
    return x; 
} 

@Override 
public int getY() { 
    return y; 
} 

public boolean isPressed() { 
    return pressed; 
} 
public void update(GUIContext container) { 
    mouseX = container.getInput().getMouseX(); 
    mouseY = container.getInput().getMouseY(); 
    over = hitbox.contains(mouseX, mouseY); 

    if (over && container.getInput().isMousePressed(Input.MOUSE_LEFT_BUTTON)) { 
     pressed = true; 
    }else{ 
     pressed = false; 
    } 
} 

@Override 
public void render(GUIContext container, Graphics g) throws SlickException { 
    g.setColor(Color.blue); 
    g.fillRect(x, y, width, height); 
    g.setColor(Color.black); 
    g.drawString(text, x + width/2, y + height/2); 
} 
@Override 
public void setLocation(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

をし、それを使用します私のフレームに私は単に書く:

import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.BasicGameState; 
import org.newdawn.slick.state.StateBasedGame; 

public class Menu extends BasicGameState{ 
    public static final int ID = 1; 
    private StateBasedGame game; 
    private Button button; 

    public int getID() { 
     return ID; 
    } 

    @Override 
    public void init(GameContainer container, StateBasedGame game) throws SlickException { 
    this.game = game; 
    button = new Button(container, 1280/2, 720/2, 200, 200, "Works"); 
    } 

    @Override 
    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { 
    button.render(container, g); 
    } 

    @Override 
    public void update(GameContainer container, StateBasedGame game, int delta) { 
    button.update(container); 
    if (button.isPressed()) { 
     System.out.println("Works"); 
    } 
} 

}