diff options
author | Starla Insigna <hatkirby@fourisland.com> | 2009-01-30 09:40:40 -0500 |
---|---|---|
committer | Starla Insigna <hatkirby@fourisland.com> | 2009-01-30 09:40:40 -0500 |
commit | aa3d2a1e1d13b04a8c5801629e077668214bc3ff (patch) | |
tree | 91b616e4527259368f368c23ce2cf525544e5bf5 /src | |
parent | 58c3529f14de0e5142e0ba0927d3c7aa9288c799 (diff) | |
download | fourpuzzle-aa3d2a1e1d13b04a8c5801629e077668214bc3ff.tar.gz fourpuzzle-aa3d2a1e1d13b04a8c5801629e077668214bc3ff.tar.bz2 fourpuzzle-aa3d2a1e1d13b04a8c5801629e077668214bc3ff.zip |
Added viewpoint scrolling
Now, maps can be larger than (20,15) and the map will scroll as the hero walks across the middle. However, Southward and Eastward middle-traversing appears to warp reality just a little and there are a few kinks that need to be straightened out. Map layer caching has also been added because the lower and upper layers of a map never change, so they are cached after the first rendering.
Diffstat (limited to 'src')
5 files changed, 118 insertions, 53 deletions
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java index bc0073e..d02c7ed 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java | |||
@@ -11,6 +11,8 @@ import com.fourisland.fourpuzzle.gamestate.mapview.event.EventList; | |||
11 | import com.fourisland.fourpuzzle.gamestate.mapview.event.HeroEvent; | 11 | import com.fourisland.fourpuzzle.gamestate.mapview.event.HeroEvent; |
12 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; | 12 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; |
13 | import java.awt.Dimension; | 13 | import java.awt.Dimension; |
14 | import java.awt.Graphics2D; | ||
15 | import java.awt.image.BufferedImage; | ||
14 | import java.util.HashMap; | 16 | import java.util.HashMap; |
15 | import java.util.Vector; | 17 | import java.util.Vector; |
16 | 18 | ||
@@ -185,4 +187,61 @@ public abstract class Map { | |||
185 | this.music = music; | 187 | this.music = music; |
186 | } | 188 | } |
187 | 189 | ||
190 | BufferedImage lowerLayer = null; | ||
191 | public BufferedImage renderLower() | ||
192 | { | ||
193 | if (lowerLayer == null) | ||
194 | { | ||
195 | lowerLayer = new BufferedImage(size.width*16, size.height*16, BufferedImage.TYPE_INT_ARGB); | ||
196 | Graphics2D g = lowerLayer.createGraphics(); | ||
197 | ChipSet chipSetObj = ChipSet.getChipSet(chipSet); | ||
198 | int i,x,y; | ||
199 | for (i=0;i<mapData.size();i++) | ||
200 | { | ||
201 | for (y=0;y<size.height;y++) | ||
202 | { | ||
203 | for (x=0;x<size.width;x++) | ||
204 | { | ||
205 | int tile = mapData.get(i).get(x+(y*size.width)); | ||
206 | if (chipSetObj.getChipSetData().get(tile).getLayer() != Layer.Above) | ||
207 | { | ||
208 | g.drawImage(chipSetObj.getImage(tile), x*16, y*16, null); | ||
209 | } | ||
210 | } | ||
211 | } | ||
212 | } | ||
213 | } | ||
214 | |||
215 | return lowerLayer; | ||
216 | |||
217 | } | ||
218 | |||
219 | BufferedImage upperLayer = null; | ||
220 | public BufferedImage renderUpper() | ||
221 | { | ||
222 | if (upperLayer == null) | ||
223 | { | ||
224 | upperLayer = new BufferedImage(size.width*16, size.height*16, BufferedImage.TYPE_INT_ARGB); | ||
225 | Graphics2D g = upperLayer.createGraphics(); | ||
226 | ChipSet chipSetObj = ChipSet.getChipSet(chipSet); | ||
227 | int i,x,y; | ||
228 | for (i=0;i<mapData.size();i++) | ||
229 | { | ||
230 | for (y=0;y<size.height;y++) | ||
231 | { | ||
232 | for (x=0;x<size.width;x++) | ||
233 | { | ||
234 | int tile = mapData.get(i).get(x+(y*size.width)); | ||
235 | if (chipSetObj.getChipSetData().get(tile).getLayer() == Layer.Above) | ||
236 | { | ||
237 | g.drawImage(chipSetObj.getImage(tile), x*16, y*16, null); | ||
238 | } | ||
239 | } | ||
240 | } | ||
241 | } | ||
242 | } | ||
243 | |||
244 | return upperLayer; | ||
245 | } | ||
246 | |||
188 | } | 247 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java index 36406af..dbc8aca 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java | |||
@@ -21,6 +21,7 @@ import com.fourisland.fourpuzzle.util.Functions; | |||
21 | import com.fourisland.fourpuzzle.util.ResourceNotFoundException; | 21 | import com.fourisland.fourpuzzle.util.ResourceNotFoundException; |
22 | import java.awt.Graphics2D; | 22 | import java.awt.Graphics2D; |
23 | import java.awt.event.KeyEvent; | 23 | import java.awt.event.KeyEvent; |
24 | import java.awt.image.BufferedImage; | ||
24 | import java.util.logging.Level; | 25 | import java.util.logging.Level; |
25 | import java.util.logging.Logger; | 26 | import java.util.logging.Logger; |
26 | 27 | ||
@@ -162,59 +163,54 @@ public class MapViewGameState implements GameState { | |||
162 | } | 163 | } |
163 | 164 | ||
164 | public void render(Graphics2D g) | 165 | public void render(Graphics2D g) |
165 | { | 166 | { |
166 | /* TODO Add code that checks to see if the map has been switched | 167 | /* TODO Fix viewpoint scrolling code. Currently, when the Hero moves |
167 | * or if the hero has moved in such a way so as to move the | 168 | * South or East across the scroll barrier, it warps reality a little, |
168 | * viewpoint. If one or more of these conditions are filled, the | 169 | * while the other two directions scroll fine. |
169 | * already existing below code should run along with a snippet that | ||
170 | * saves a cache of the current viewpoint. If not, the previously | ||
171 | * mentioned cache should be displayed rather than re-rendering the | ||
172 | * map. | ||
173 | */ | 170 | */ |
174 | ChipSet chipSet = ChipSet.getChipSet(currentMap.getChipSet()); | 171 | |
175 | int i,x,y; | 172 | int x,y; |
176 | for (i=0;i<currentMap.getMapData().size();i++) | 173 | HeroEvent hero = Game.getHeroEvent(); |
174 | if (hero.getLocation().x > 10) | ||
177 | { | 175 | { |
178 | for (y=0;y<currentMap.getSize().height;y++) | 176 | if (hero.getLocation().x < (currentMap.getSize().width - 9)) |
179 | { | 177 | { |
180 | for (x=0;x<currentMap.getSize().width;x++) | 178 | x = (hero.getLocation().x - 10) * 16; |
181 | { | 179 | x += hero.getMovingX(); |
182 | int tile = currentMap.getMapData().get(i).get(x+(y*currentMap.getSize().width)); | 180 | } else { |
183 | if (chipSet.getChipSetData().get(tile).getLayer() != Layer.Above) | 181 | x = (currentMap.getSize().width - 20) * 16; |
184 | { | ||
185 | g.drawImage(chipSet.getImage(tile), x*16, y*16, null); | ||
186 | } | ||
187 | } | ||
188 | } | 182 | } |
183 | } else { | ||
184 | x = 0; | ||
189 | } | 185 | } |
190 | /* | 186 | |
191 | MapViewer mv = new MapViewer(currentMap, new com.alienfactory.javamappy.viewer.render.J2SE14Renderer(currentMap), Game.WIDTH, Game.HEIGHT); | 187 | if (hero.getLocation().y > 7) |
192 | mv.setBlockX(Game.getSaveFile().getHero().getLocation().x); | 188 | { |
193 | mv.setBlockY(Game.getSaveFile().getHero().getLocation().y); | 189 | if (hero.getLocation().y < (currentMap.getSize().height - 7)) |
194 | mv.setPixelX((4 - Game.getSaveFile().getHero().getMoveTimer()) * 4); | 190 | { |
195 | mv.draw(g, true);*/ | 191 | y = (hero.getLocation().y - 7) * 16; |
196 | Game.getSaveFile().getHero().render(g); | 192 | y += hero.getMovingY(); |
193 | } else { | ||
194 | y = (currentMap.getSize().height - 15) * 16; | ||
195 | } | ||
196 | } else { | ||
197 | y = 0; | ||
198 | } | ||
199 | |||
200 | g.drawImage(currentMap.renderLower(), 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); | ||
201 | |||
202 | BufferedImage eventLayer = new BufferedImage(currentMap.getSize().width*16, currentMap.getSize().height*16, BufferedImage.TYPE_INT_ARGB); | ||
203 | Graphics2D g2 = eventLayer.createGraphics(); | ||
204 | hero.render(g2); | ||
197 | 205 | ||
198 | EventList events = currentMap.getEvents(); | 206 | EventList events = currentMap.getEvents(); |
199 | for (LayerEvent event : events) | 207 | for (LayerEvent event : events) |
200 | { | 208 | { |
201 | event.render(g); | 209 | event.render(g2); |
202 | } | 210 | } |
203 | 211 | ||
204 | for (i=0;i<currentMap.getMapData().size();i++) | 212 | g.drawImage(eventLayer, 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); |
205 | { | 213 | g.drawImage(currentMap.renderUpper(), 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); |
206 | for (y=0;y<currentMap.getSize().height;y++) | ||
207 | { | ||
208 | for (x=0;x<currentMap.getSize().width;x++) | ||
209 | { | ||
210 | int tile = currentMap.getMapData().get(i).get(x+(y*currentMap.getSize().width)); | ||
211 | if (chipSet.getChipSetData().get(tile).getLayer() == Layer.Above) | ||
212 | { | ||
213 | g.drawImage(chipSet.getImage(tile), x*16, y*16, null); | ||
214 | } | ||
215 | } | ||
216 | } | ||
217 | } | ||
218 | } | 214 | } |
219 | 215 | ||
220 | public void initCurrentMap(String mapName) | 216 | public void initCurrentMap(String mapName) |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/AbstractEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/AbstractEvent.java index c0ea634..7e8dd0d 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/AbstractEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/AbstractEvent.java | |||
@@ -124,37 +124,43 @@ public abstract class AbstractEvent implements Event { | |||
124 | 124 | ||
125 | public int getRenderX() | 125 | public int getRenderX() |
126 | { | 126 | { |
127 | int x = (getLocation().x * 16) - 4; | 127 | return (getLocation().x * 16) - 4 + getMovingX(); |
128 | 128 | } | |
129 | |||
130 | public int getRenderY() | ||
131 | { | ||
132 | return (getLocation().y * 16) - 16 + getMovingY(); | ||
133 | } | ||
134 | |||
135 | public int getMovingX() | ||
136 | { | ||
129 | if (isMoving()) | 137 | if (isMoving()) |
130 | { | 138 | { |
131 | if (getDirection() == Direction.West) | 139 | if (getDirection() == Direction.West) |
132 | { | 140 | { |
133 | x -= (4 - moveTimer) * 4; | 141 | return -((4 - moveTimer) * 4); |
134 | } else if (getDirection() == Direction.East) | 142 | } else if (getDirection() == Direction.East) |
135 | { | 143 | { |
136 | x += (4 - moveTimer) * 4; | 144 | return (4 - moveTimer) * 4; |
137 | } | 145 | } |
138 | } | 146 | } |
139 | 147 | ||
140 | return x; | 148 | return 0; |
141 | } | 149 | } |
142 | 150 | ||
143 | public int getRenderY() | 151 | public int getMovingY() |
144 | { | 152 | { |
145 | int y = (getLocation().y * 16) - 16; | ||
146 | |||
147 | if (isMoving()) | 153 | if (isMoving()) |
148 | { | 154 | { |
149 | if (getDirection() == Direction.North) | 155 | if (getDirection() == Direction.North) |
150 | { | 156 | { |
151 | y -= (4 - moveTimer) * 4; | 157 | return -((4 - moveTimer) * 4); |
152 | } else if (getDirection() == Direction.South) | 158 | } else if (getDirection() == Direction.South) |
153 | { | 159 | { |
154 | y += (4 - moveTimer) * 4; | 160 | return (4 - moveTimer) * 4; |
155 | } | 161 | } |
156 | } | 162 | } |
157 | 163 | ||
158 | return y; | 164 | return 0; |
159 | } | 165 | } |
160 | } | 166 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java index 310c2a2..887e52b 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/Event.java | |||
@@ -28,6 +28,9 @@ public interface Event { | |||
28 | public int getRenderX(); | 28 | public int getRenderX(); |
29 | public int getRenderY(); | 29 | public int getRenderY(); |
30 | 30 | ||
31 | public int getMovingX(); | ||
32 | public int getMovingY(); | ||
33 | |||
31 | public Direction getDirection(); | 34 | public Direction getDirection(); |
32 | public void setDirection(Direction direction); | 35 | public void setDirection(Direction direction); |
33 | 36 | ||
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java index 64ca592..c0c2c3b 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; | 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; |
7 | 7 | ||
8 | import com.fourisland.fourpuzzle.gamestate.mapview.Map; | ||
8 | import java.util.concurrent.Future; | 9 | import java.util.concurrent.Future; |
9 | 10 | ||
10 | /** | 11 | /** |