Okej. Po napisaniu wersji początkowej jestem bardzo zadowolony z wyglądu kodu. Użyłem struktury z pewnego tutoriala i oto rezultat.
W klasie głównej stworzyłem tylko nową instancję TitleEngine i w pętli gry nawołują tylko:
engine.render();
engine.poll();
Mam nadzieję że nie będzie problemu z javą, jest właściwie taka sama jak c++.
package model;
public class Button {
private boolean clicked;
public Button(){
clicked = false;
}
public void setClicked(boolean arg){
this.clicked = arg;
}
public boolean getClicked(){
return this.clicked;
}
}
package model;
import java.util.ArrayList;
import java.util.List;
public class Menu {
private List<Button> buttons = new ArrayList<Button>();
private final int numberOfButtons;
private int currentButton;
public Menu(int noButtons, int currentButton){
this.numberOfButtons = noButtons;
this.currentButton = currentButton;
for(int i = 0; i < numberOfButtons;i++){
buttons.add(new Button());
}
}
public int getCurButton(){
return this.currentButton;
}
public void setCurButton(int button){
this.currentButton = button;
}
public Button getButton(int button){
return buttons.get(button);
}
public int getNoButtons(){
return this.numberOfButtons;
}
}
package control;
import model.Menu;
public class TitleController {
private Menu menu;
public TitleController(Menu menu){
this.menu = menu;
}
public void onDown(){
if (menu.getCurButton() == menu.getNoButtons()-1)
menu.setCurButton(0);
else
menu.setCurButton(menu.getCurButton() + 1);
}
public void onUp(){
if (menu.getCurButton() == 0)
menu.setCurButton(menu.getNoButtons() - 1);
else
menu.setCurButton(menu.getCurButton() - 1);
}
public void onEnter(){
menu.getButton(menu.getCurButton()).setClicked(true);
}
}
package view;
public interface Renderer {
public void render();
}
package view;
import java.awt.Point;
import org.lwjgl.opengl.GL11;
import model.Menu;
public class TitleScreenRenderer implements Renderer{
private final int width = 800, height = 600;
private final int buttonSpacing = 10;
private final int buttonHeight = 74;
private final int buttonWidth = 216;
private final int buttonBorder = 5;
private final Point point = new Point(width - buttonSpacing - buttonWidth + 2, height - buttonSpacing);
private Menu menu;
public TitleScreenRenderer(Menu menu){
this.menu = menu;
}
@Override
public void render() {
for(int i = 0;i<menu.getNoButtons();i++){
//the quad
GL11.glColor3f(0.5f, 0f, 0.5f);
if(menu.getCurButton() == i)
GL11.glColor3f(0.7f, 0f, 0.45f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(point.x, point.y - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x + buttonWidth, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x + buttonWidth, point.y - (i * (buttonHeight + buttonSpacing)));
GL11.glEnd();
//button border
GL11.glLineWidth(buttonBorder);
GL11.glColor3f(0.3f, 0, 0.45f);
GL11.glBegin(GL11.GL_LINES);
//upper
GL11.glVertex2f(point.x, point.y - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x + buttonWidth, point.y - (i * (buttonHeight + buttonSpacing)));
//down
GL11.glVertex2f(point.x, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x + buttonWidth, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
//right
GL11.glVertex2f(point.x, point.y - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
//left
GL11.glVertex2f(point.x + buttonWidth, point.y - (i * (buttonHeight + buttonSpacing)));
GL11.glVertex2f(point.x + buttonWidth, point.y - buttonHeight - (i * (buttonHeight + buttonSpacing)));
GL11.glEnd();
}
}
}
package control;
import org.lwjgl.input.Keyboard;
import model.Menu;
import view.Renderer;
import view.TitleScreenRenderer;
public class TitleEngine {
private TitleController controller;
private Renderer renderer;
private Menu menu;
public TitleEngine(){
this.menu = new Menu(6,0);
this.controller = new TitleController(menu);
this.renderer = new TitleScreenRenderer(menu);
}
public void poll(){
if (Keyboard.next()&& !Keyboard.getEventKeyState()){
if (Keyboard.getEventKey() == Keyboard.KEY_UP)
controller.onUp();
if (Keyboard.getEventKey() == Keyboard.KEY_DOWN)
controller.onDown();
if (Keyboard.getEventKey() == Keyboard.KEY_RETURN || Keyboard.getEventKey() == Keyboard.KEY_SPACE)
controller.onEnter();
}
}
public void render(){
renderer.render();
}
}
Dla tych którzy nie znają javy- w konstruktorach niektórych klas inicjuję swoje klasy klasami z argumentów. Nie znając javy zapewnie pomyślicie że pola w klasie będą tylko kopią tych w argumentach. Ale tak na prawdę w argumentach nie podaję kopii klasy tylko wskaźnik. Tak FYI.
Dla ciekawskich i leniwych to wynik:
http://imageshack.us/photo/my-images/255/menuready.jpg/
Czy ten kod jest "dobry" czy jest w nim jeszcze pare niedociągnięć(chodzi mi tu tylko o strukturę MVC)?