1 package de.jos.game.objects.screen;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.springframework.beans.factory.xml.XmlBeanFactory;
9
10 import com.golden.gamedev.GameEngine;
11 import com.golden.gamedev.gui.TPanel;
12
13 import de.jos.game.Constants;
14 import de.jos.game.objects.ResourceContainer;
15 import de.jos.game.objects.buttons.GameButton;
16 import de.jos.game.objects.buttons.PuzzleLevelButton;
17 import de.jos.game.objects.state.PuzzleLevelState;
18 import de.jos.game.objects.state.PuzzleLevelStateChangedListener;
19
20 /***
21 *
22 * @author root
23 *
24 */
25 public class PuzzleLevelScreen extends MultiPageScreen implements PuzzleLevelStateChangedListener {
26
27 private static Log LOG = LogFactory.getLog(PuzzleLevelScreen.class);
28
29 /*** @deprecated durch puzzleLevelState ersetzen */
30 private Integer selectedLevel = null;
31
32 private static final int LEVELS_PER_PAGE = 10;
33
34 private static final int LEVEL_PER_ROW = 5;
35
36 private Map<Integer, TPanel> pageIdToPanelMap = new HashMap<Integer, TPanel>();
37
38 private final PuzzleLevelState puzzleLevelState;
39
40 public PuzzleLevelScreen(GameEngine gameEngine, ResourceContainer resourceContainer, XmlBeanFactory xmlBeanFactory,
41 PuzzleLevelState puzzleLevelState) {
42 super(gameEngine, resourceContainer, xmlBeanFactory, Screen.START);
43 this.puzzleLevelState = puzzleLevelState;
44 this.puzzleLevelState.registerPuzzleLevelStateChangedListener(this);
45 }
46
47 public void initResources() {
48 super.initResources();
49
50 int numberOfLevels = Integer.parseInt(getString("numberPuzzleLevels"));
51 setNumberOfPages(((numberOfLevels - 1) / LEVELS_PER_PAGE) + 1);
52
53
54 for (int i = 0; i < getNumberOfPages(); i++) {
55 Integer pageId = Integer.valueOf(i + 1);
56
57 TPanel panel = new TPanel(0, 0, Constants.WINDOW_WIDTH, 300);
58 panel.UIResource().put("Background Color", Constants.DEFAULT_BACKGROUND_COLOR);
59 panel.setVisible(false);
60 getFramework().add(panel);
61
62
63 pageIdToPanelMap.put(pageId, panel);
64 }
65
66 for (int i = 1; i <= numberOfLevels; i++) {
67 Integer level = Integer.valueOf(i);
68 Integer pageIndex = Integer.valueOf(((i - 1) / LEVELS_PER_PAGE) + 1);
69
70 GameButton puzzleLevelButton = createGameButton(i, puzzleLevelState.isLevelSolved(level));
71
72 getScreenButtons().add(i - 1, puzzleLevelButton);
73
74 pageIdToPanelMap.get(pageIndex).add(puzzleLevelButton);
75 }
76
77
78 pageIdToPanelMap.get(Integer.valueOf(1)).setVisible(true);
79
80
81 getFramework().validateUI();
82 }
83
84 private GameButton createGameButton(int levelIndex, boolean solved) {
85 int indexOnPage = ((levelIndex - 1) % LEVELS_PER_PAGE);
86
87 int x = 30 + ((indexOnPage) % LEVEL_PER_ROW) * 110;
88 int y = 100 + ((indexOnPage) / LEVEL_PER_ROW) * 100;
89
90 GameButton puzzleLevelButton = new PuzzleLevelButton(this, x, y, levelIndex, solved);
91 return puzzleLevelButton;
92 }
93
94 public void update(long elapsedTime) {
95 super.update(elapsedTime);
96 }
97
98 @Override
99 public void executePagingAction() {
100
101 for (TPanel tmpPanel : pageIdToPanelMap.values()) {
102 tmpPanel.setVisible(false);
103 }
104 pageIdToPanelMap.get(Integer.valueOf(getCurrentPage())).setVisible(true);
105 }
106
107 public Integer getSelectedLevel() {
108 return selectedLevel;
109 }
110
111 public void setSelectedLevel(Integer selectedLevel) {
112 this.selectedLevel = selectedLevel;
113 }
114
115 /***
116 * {@inheritDoc}
117 */
118 public void levelStateChanged(Integer level) {
119 Boolean result = puzzleLevelState.isLevelSolved(level);
120
121 int l = level.intValue();
122
123 GameButton puzzleLevelButton = createGameButton(level.intValue(), result.booleanValue());
124
125 getScreenButtons().add(l - 1, puzzleLevelButton);
126 int pageIndex = ((l - 1) / LEVELS_PER_PAGE) + 1;
127
128 pageIdToPanelMap.get(Integer.valueOf(pageIndex)).add(puzzleLevelButton);
129
130 }
131
132 }