diff options
author | Starla Insigna <hatkirby@fourisland.com> | 2009-01-27 14:28:43 -0500 |
---|---|---|
committer | Starla Insigna <hatkirby@fourisland.com> | 2009-01-27 14:28:43 -0500 |
commit | 9ca53b553cfaf488f7e8e678721bf9e655fa377e (patch) | |
tree | fa110584eb1b083fbe0e005ab9f235f3a8f931f1 /src | |
parent | cd6b39590b8aced78fc2f6ed0c345fb9af1960c0 (diff) | |
download | fourpuzzle-9ca53b553cfaf488f7e8e678721bf9e655fa377e.tar.gz fourpuzzle-9ca53b553cfaf488f7e8e678721bf9e655fa377e.tar.bz2 fourpuzzle-9ca53b553cfaf488f7e8e678721bf9e655fa377e.zip |
Fixed "walk-thru-me" bug
Previously, Map's checkForCollision did not properly check collision and would allow an event to initiate movement to a location another event was already moving to (but wasn't at yet).
Diffstat (limited to 'src')
9 files changed, 133 insertions, 43 deletions
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java index 3e9c717..62270bf 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java | |||
@@ -20,7 +20,7 @@ public abstract class Map { | |||
20 | 20 | ||
21 | public abstract void initalize(); | 21 | public abstract void initalize(); |
22 | 22 | ||
23 | public void initalize(Dimension size) | 23 | protected void initalize(Dimension size) |
24 | { | 24 | { |
25 | setSize(size); | 25 | setSize(size); |
26 | mapData = new Vector<HashMap<Integer,Integer>>(); | 26 | mapData = new Vector<HashMap<Integer,Integer>>(); |
@@ -31,7 +31,7 @@ public abstract class Map { | |||
31 | { | 31 | { |
32 | return size; | 32 | return size; |
33 | } | 33 | } |
34 | public void setSize(Dimension size) | 34 | private void setSize(Dimension size) |
35 | { | 35 | { |
36 | if ((size.width < 20) || (size.height < 15)) | 36 | if ((size.width < 20) || (size.height < 15)) |
37 | { | 37 | { |
@@ -58,7 +58,7 @@ public abstract class Map { | |||
58 | 58 | ||
59 | return null; | 59 | return null; |
60 | } | 60 | } |
61 | 61 | ||
62 | public boolean checkForCollision(int x, int y, Direction toMove) | 62 | public boolean checkForCollision(int x, int y, Direction toMove) |
63 | { | 63 | { |
64 | if ((toMove == Direction.North) && (y == 0)) | 64 | if ((toMove == Direction.North) && (y == 0)) |
@@ -75,48 +75,22 @@ public abstract class Map { | |||
75 | return true; | 75 | return true; |
76 | } | 76 | } |
77 | 77 | ||
78 | for (LayerEvent ev : events) | 78 | if ((toMove == Direction.North) && (checkForEventCollision(x, y-1))) |
79 | { | ||
80 | if (ev.getLayer() == Layer.Middle) | ||
81 | { | ||
82 | if ((ev.getLocation().y == (y - 1)) && (ev.getLocation().x == x) && (toMove == Direction.North)) | ||
83 | { | ||
84 | return true; | ||
85 | } | ||
86 | |||
87 | if ((ev.getLocation().x == (x - 1)) && (ev.getLocation().y == y) && (toMove == Direction.West)) | ||
88 | { | ||
89 | return true; | ||
90 | } | ||
91 | |||
92 | if ((ev.getLocation().y == (y + 1)) && (ev.getLocation().x == x) && (toMove == Direction.South)) | ||
93 | { | ||
94 | return true; | ||
95 | } | ||
96 | |||
97 | if ((ev.getLocation().x == (x + 1)) && (ev.getLocation().y == y) && (toMove == Direction.East)) | ||
98 | { | ||
99 | return true; | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | |||
104 | if ((Game.getHeroEvent().getLocation().y == (y - 1)) && (Game.getHeroEvent().getLocation().x == x) && (toMove == Direction.North)) | ||
105 | { | 79 | { |
106 | return true; | 80 | return true; |
107 | } | 81 | } |
108 | 82 | ||
109 | if ((Game.getHeroEvent().getLocation().x == (x - 1)) && (Game.getHeroEvent().getLocation().y == y) && (toMove == Direction.West)) | 83 | if ((toMove == Direction.West) && (checkForEventCollision(x-1, y))) |
110 | { | 84 | { |
111 | return true; | 85 | return true; |
112 | } | 86 | } |
113 | 87 | ||
114 | if ((Game.getHeroEvent().getLocation().y == (y + 1)) && (Game.getHeroEvent().getLocation().x == x) && (toMove == Direction.South)) | 88 | if ((toMove == Direction.South) && (checkForEventCollision(x, y+1))) |
115 | { | 89 | { |
116 | return true; | 90 | return true; |
117 | } | 91 | } |
118 | 92 | ||
119 | if ((Game.getHeroEvent().getLocation().x == (x + 1)) && (Game.getHeroEvent().getLocation().y == y) && (toMove == Direction.East)) | 93 | if ((toMove == Direction.East) && (checkForEventCollision(x+1, y))) |
120 | { | 94 | { |
121 | return true; | 95 | return true; |
122 | } | 96 | } |
@@ -156,6 +130,27 @@ public abstract class Map { | |||
156 | 130 | ||
157 | return false; | 131 | return false; |
158 | } | 132 | } |
133 | |||
134 | private boolean checkForEventCollision(int x, int y) | ||
135 | { | ||
136 | for (LayerEvent ev : events) | ||
137 | { | ||
138 | if (ev.getLayer() == Layer.Middle) | ||
139 | { | ||
140 | if (ev.isOccupyingSpace(x, y)) | ||
141 | { | ||
142 | return true; | ||
143 | } | ||
144 | } | ||
145 | } | ||
146 | |||
147 | if (Game.getHeroEvent().isOccupyingSpace(x, y)) | ||
148 | { | ||
149 | return true; | ||
150 | } | ||
151 | |||
152 | return false; | ||
153 | } | ||
159 | 154 | ||
160 | private String chipSet; | 155 | private String chipSet; |
161 | public String getChipSet() { | 156 | public String getChipSet() { |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java index 3d8d15d..48653c0 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java | |||
@@ -159,6 +159,14 @@ public class MapViewGameState implements GameState { | |||
159 | 159 | ||
160 | public void render(Graphics2D g) | 160 | public void render(Graphics2D g) |
161 | { | 161 | { |
162 | /* TODO Add code that checks to see if the map has been switched | ||
163 | * or if the hero has moved in such a way so as to move the | ||
164 | * viewpoint. If one or more of these conditions are filled, the | ||
165 | * already existing below code should run along with a snippet that | ||
166 | * saves a cache of the current viewpoint. If not, the previously | ||
167 | * mentioned cache should be displayed rather than re-rendering the | ||
168 | * map. | ||
169 | */ | ||
162 | ChipSet chipSet = ChipSet.getChipSet(currentMap.getChipSet()); | 170 | ChipSet chipSet = ChipSet.getChipSet(currentMap.getChipSet()); |
163 | int i,x,y; | 171 | int i,x,y; |
164 | for (i=0;i<currentMap.getMapData().size();i++) | 172 | for (i=0;i<currentMap.getMapData().size();i++) |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java index fbcfd7a..71b507f 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java | |||
@@ -32,4 +32,6 @@ public interface Event { | |||
32 | public void startMoving(Direction direction); | 32 | public void startMoving(Direction direction); |
33 | 33 | ||
34 | public Layer getLayer(); | 34 | public Layer getLayer(); |
35 | |||
36 | public boolean isOccupyingSpace(int x, int y); | ||
35 | } | 37 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java index 50e16c8..6e8c359 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java | |||
@@ -12,6 +12,7 @@ import com.fourisland.fourpuzzle.Direction; | |||
12 | import com.fourisland.fourpuzzle.Game; | 12 | import com.fourisland.fourpuzzle.Game; |
13 | import com.fourisland.fourpuzzle.GameCharacter; | 13 | import com.fourisland.fourpuzzle.GameCharacter; |
14 | import com.fourisland.fourpuzzle.gamestate.mapview.CharSet; | 14 | import com.fourisland.fourpuzzle.gamestate.mapview.CharSet; |
15 | import com.fourisland.fourpuzzle.util.Functions; | ||
15 | 16 | ||
16 | /** | 17 | /** |
17 | * | 18 | * |
@@ -65,6 +66,10 @@ public class HeroEvent implements Event { | |||
65 | } | 66 | } |
66 | } | 67 | } |
67 | 68 | ||
69 | /* TODO Change the specification of GameCharacter | ||
70 | * to require an EventGraphic instead of a graphic name | ||
71 | * and offset | ||
72 | */ | ||
68 | GameCharacter toDraw = Game.getSaveFile().getParty().getLeader(); | 73 | GameCharacter toDraw = Game.getSaveFile().getParty().getLeader(); |
69 | if (!toDraw.getGraphic().equals("blank")) | 74 | if (!toDraw.getGraphic().equals("blank")) |
70 | { | 75 | { |
@@ -147,5 +152,20 @@ public class HeroEvent implements Event { | |||
147 | { | 152 | { |
148 | return Layer.Middle; | 153 | return Layer.Middle; |
149 | } | 154 | } |
155 | |||
156 | public boolean isOccupyingSpace(int x, int y) | ||
157 | { | ||
158 | if (getLocation().equals(new Point(x,y))) | ||
159 | { | ||
160 | return true; | ||
161 | } | ||
162 | |||
163 | if (Functions.isMovingTo(this, x, y)) | ||
164 | { | ||
165 | return true; | ||
166 | } | ||
167 | |||
168 | return false; | ||
169 | } | ||
150 | 170 | ||
151 | } | 171 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java index 05192ce..4f8b51c 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java | |||
@@ -11,6 +11,7 @@ import java.awt.Point; | |||
11 | import java.util.ArrayList; | 11 | import java.util.ArrayList; |
12 | import com.fourisland.fourpuzzle.Direction; | 12 | import com.fourisland.fourpuzzle.Direction; |
13 | import com.fourisland.fourpuzzle.gamestate.mapview.Map; | 13 | import com.fourisland.fourpuzzle.gamestate.mapview.Map; |
14 | import com.fourisland.fourpuzzle.util.Functions; | ||
14 | 15 | ||
15 | /** | 16 | /** |
16 | * | 17 | * |
@@ -209,4 +210,19 @@ public class LayerEvent implements Event { | |||
209 | this.label = string; | 210 | this.label = string; |
210 | } | 211 | } |
211 | 212 | ||
213 | public boolean isOccupyingSpace(int x, int y) | ||
214 | { | ||
215 | if (getLocation().equals(new Point(x,y))) | ||
216 | { | ||
217 | return true; | ||
218 | } | ||
219 | |||
220 | if (Functions.isMovingTo(this, x, y)) | ||
221 | { | ||
222 | return true; | ||
223 | } | ||
224 | |||
225 | return false; | ||
226 | } | ||
227 | |||
212 | } \ No newline at end of file | 228 | } \ No newline at end of file |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java index 077f42e..52b75de 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java | |||
@@ -17,6 +17,14 @@ import java.util.logging.Logger; | |||
17 | * @author hatkirby | 17 | * @author hatkirby |
18 | */ | 18 | */ |
19 | public class SpecialEvent { | 19 | public class SpecialEvent { |
20 | |||
21 | /* TODO Create a manager for SpecialEvent action threads that | ||
22 | * controls when they are executed and allows MapViewGameState | ||
23 | * to poll it to see if it is currently managing any action | ||
24 | * threads. If it is, MapViewGameState should be able to prevent | ||
25 | * certain actions from occuring (unless the action thread is | ||
26 | * ParallelProcess) such as keyboard input. | ||
27 | */ | ||
20 | 28 | ||
21 | /** | 29 | /** |
22 | * Display a message on the screen. | 30 | * Display a message on the screen. |
@@ -120,11 +128,7 @@ public class SpecialEvent { | |||
120 | */ | 128 | */ |
121 | public void MoveEventWait() | 129 | public void MoveEventWait() |
122 | { | 130 | { |
123 | try { | 131 | MoveEventThread.moveAll(); |
124 | MoveEventThread.moveEventWait.await(); | ||
125 | } catch (InterruptedException ex) { | ||
126 | Logger.getLogger(SpecialEvent.class.getName()).log(Level.SEVERE, null, ex); | ||
127 | } | ||
128 | } | 132 | } |
129 | 133 | ||
130 | /** | 134 | /** |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/movement/MovementType.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/movement/MovementType.java index 5d5822e..7b9ee0c 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/movement/MovementType.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/movement/MovementType.java | |||
@@ -13,6 +13,7 @@ import com.fourisland.fourpuzzle.Direction; | |||
13 | */ | 13 | */ |
14 | public interface MovementType { | 14 | public interface MovementType { |
15 | 15 | ||
16 | // TODO Rename the following method to getNextDirection | ||
16 | public Direction startMoving(); | 17 | public Direction startMoving(); |
17 | 18 | ||
18 | } | 19 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java index ab160f1..2ee4dca 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java | |||
@@ -20,9 +20,10 @@ import java.util.logging.Logger; | |||
20 | */ | 20 | */ |
21 | public class MoveEventThread implements Runnable { | 21 | public class MoveEventThread implements Runnable { |
22 | 22 | ||
23 | public static volatile CountDownLatch moveEventWait = new CountDownLatch(0); | ||
24 | public static volatile int countMoveEventThreads = 0; | 23 | public static volatile int countMoveEventThreads = 0; |
25 | public static volatile List<Event> events = new Vector<Event>(); | 24 | |
25 | static volatile List<Event> events = new Vector<Event>(); | ||
26 | static volatile CountDownLatch moveEventWait = new CountDownLatch(0); | ||
26 | 27 | ||
27 | Event ev; | 28 | Event ev; |
28 | MoveEvent[] actions; | 29 | MoveEvent[] actions; |
@@ -51,6 +52,10 @@ public class MoveEventThread implements Runnable { | |||
51 | moveEventWait.countDown(); | 52 | moveEventWait.countDown(); |
52 | } | 53 | } |
53 | 54 | ||
55 | /* TODO Rename the two following methods (isHeroMoving and isOtherMoving) | ||
56 | * to isHeroActive and isOtherActive respectively. | ||
57 | */ | ||
58 | |||
54 | public static boolean isHeroMoving() | 59 | public static boolean isHeroMoving() |
55 | { | 60 | { |
56 | return (events.contains(Game.getHeroEvent())); | 61 | return (events.contains(Game.getHeroEvent())); |
@@ -60,5 +65,14 @@ public class MoveEventThread implements Runnable { | |||
60 | { | 65 | { |
61 | return (events.contains(event)); | 66 | return (events.contains(event)); |
62 | } | 67 | } |
68 | |||
69 | public static void moveAll() | ||
70 | { | ||
71 | try { | ||
72 | moveEventWait.await(); | ||
73 | } catch (InterruptedException ex) { | ||
74 | Logger.getLogger(MoveEventThread.class.getName()).log(Level.SEVERE, null, ex); | ||
75 | } | ||
76 | } | ||
63 | 77 | ||
64 | } | 78 | } |
diff --git a/src/com/fourisland/fourpuzzle/util/Functions.java b/src/com/fourisland/fourpuzzle/util/Functions.java index 038ca46..9966a2f 100644 --- a/src/com/fourisland/fourpuzzle/util/Functions.java +++ b/src/com/fourisland/fourpuzzle/util/Functions.java | |||
@@ -48,6 +48,36 @@ public class Functions { | |||
48 | 48 | ||
49 | return false; | 49 | return false; |
50 | } | 50 | } |
51 | |||
52 | public static boolean isMovingTo(Event ev, int x, int y) | ||
53 | { | ||
54 | if (ev.isMoving() == false) | ||
55 | { | ||
56 | return false; | ||
57 | } | ||
58 | |||
59 | if ((ev.getDirection() == Direction.North) && ((ev.getLocation().y-1) == y) && (ev.getLocation().x == x)) | ||
60 | { | ||
61 | return true; | ||
62 | } | ||
63 | |||
64 | if ((ev.getDirection() == Direction.West) && (ev.getLocation().y == y) && ((ev.getLocation().x-1) == x)) | ||
65 | { | ||
66 | return true; | ||
67 | } | ||
68 | |||
69 | if ((ev.getDirection() == Direction.South) && ((ev.getLocation().y+1) == y) && (ev.getLocation().x == x)) | ||
70 | { | ||
71 | return true; | ||
72 | } | ||
73 | |||
74 | if ((ev.getDirection() == Direction.East) && (ev.getLocation().y == y) && ((ev.getLocation().x+1) == x)) | ||
75 | { | ||
76 | return true; | ||
77 | } | ||
78 | |||
79 | return false; | ||
80 | } | ||
51 | 81 | ||
52 | public static Direction oppositeDirection(Direction dir) | 82 | public static Direction oppositeDirection(Direction dir) |
53 | { | 83 | { |