Description:
Add zooming, scrolling, and proper sprite layering (changes from last night).
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
@@ -0,0 +1,60 | |||
|
1 | using System; | |
|
2 | using Microsoft.Xna.Framework; | |
|
3 | using Microsoft.Xna.Framework.Graphics; | |
|
4 | ||
|
5 | namespace isometricparkfna | |
|
6 | { | |
|
7 | public class Camera | |
|
8 | { | |
|
9 | ||
|
10 | public Vector2 position; | |
|
11 | ||
|
12 | float _zoom; | |
|
13 | ||
|
14 | ||
|
15 | public static int world_width { get; set; } | |
|
16 | public static int world_height { get; set; } | |
|
17 | public static Vector2 display_offset { get; set; } | |
|
18 | ||
|
19 | public float zoom | |
|
20 | { | |
|
21 | get { return _zoom; } | |
|
22 | set { _zoom = value; if (zoom < 0.1f) _zoom = 0.1f; } // Negative zoom will flip image | |
|
23 | } | |
|
24 | ||
|
25 | ||
|
26 | public Camera() | |
|
27 | { | |
|
28 | this.zoom = 1.0f; | |
|
29 | position = Vector2.Zero; | |
|
30 | } | |
|
31 | ||
|
32 | public void Move(Vector2 change) | |
|
33 | { | |
|
34 | this.position += change; | |
|
35 | } | |
|
36 | ||
|
37 | public Matrix get_transformation(GraphicsDevice graphicsDevice) | |
|
38 | { | |
|
39 | Viewport viewPort = graphicsDevice.Viewport; | |
|
40 | ||
|
41 | ||
|
42 | Matrix transformation = Matrix.CreateTranslation(new Vector3(-this.position.X, -this.position.Y, 0)) * | |
|
43 | Matrix.CreateScale(new Vector3(this.zoom, this.zoom, 1)) * | |
|
44 | Matrix.CreateTranslation(new Vector3(viewPort.Width * 0.5f, viewPort.Height * 0.5f, 0)); | |
|
45 | ||
|
46 | ||
|
47 | return transformation; | |
|
48 | } | |
|
49 | ||
|
50 | public Vector2 world_to_screen(Vector2 worldPosition) | |
|
51 | { | |
|
52 | return worldPosition - this.position + Camera.display_offset; | |
|
53 | } | |
|
54 | ||
|
55 | public Vector2 screen_to_world(Vector2 screenPosition) | |
|
56 | { | |
|
57 | return screenPosition + this.position - Camera.display_offset; | |
|
58 | } | |
|
59 | } | |
|
60 | } |
@@ -18,3 +18,4 | |||
|
18 | 18 | /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.csproj.CoreCompileInputs.cache |
|
19 | 19 | /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.dll |
|
20 | 20 | /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.pdb |
|
21 | /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.csprojAssemblyReference.cache |
|
1 | NO CONTENT: modified file, binary diff hidden |
@@ -10,6 +10,7 | |||
|
10 | 10 | using isometricparkfna; |
|
11 | 11 | using System.Diagnostics; |
|
12 | 12 | |
|
13 | ||
|
13 | 14 | struct Entity |
|
14 | 15 | { |
|
15 | 16 | public Vector2 loc; |
@@ -44,10 +45,10 | |||
|
44 | 45 | } |
|
45 | 46 | } |
|
46 | 47 | |
|
47 | static class Camera | |
|
48 | { | |
|
49 | static public Vector2 Location = Vector2.Zero; | |
|
50 | } | |
|
48 | //static class Camera | |
|
49 | //{ | |
|
50 | // static public Vector2 Location = Vector2.Zero; | |
|
51 | //} | |
|
51 | 52 | |
|
52 | 53 | class FNAGame : Game |
|
53 | 54 | { |
@@ -61,6 +62,10 | |||
|
61 | 62 | private Song music; |
|
62 | 63 | private SpriteFont font; |
|
63 | 64 | |
|
65 | private Camera camera = new Camera(); | |
|
66 | ||
|
67 | Random random_generator = new Random(); | |
|
68 | ||
|
64 | 69 | int frameRate = 0; |
|
65 | 70 | int frameCounter = 0; |
|
66 | 71 | TimeSpan elapsedTime = TimeSpan.Zero; |
@@ -87,11 +92,13 | |||
|
87 | 92 | |
|
88 | 93 | //new tile stuff |
|
89 | 94 | TileMap myMap = new TileMap(); |
|
90 |
int squaresAcross = 25 |
|
|
91 |
int squaresDown = 25 |
|
|
95 | int squaresAcross = 25; | |
|
96 | int squaresDown = 25; | |
|
92 | 97 | int baseOffsetX = -14; |
|
93 | 98 | int baseOffsetY = -14; |
|
94 | 99 | |
|
100 | GraphicsDevice device; | |
|
101 | ||
|
95 | 102 | |
|
96 | 103 | private static void Main(string[] args) |
|
97 | 104 | { |
@@ -148,6 +155,8 | |||
|
148 | 155 | |
|
149 | 156 | private FNAGame() |
|
150 | 157 | { |
|
158 | //this.device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.) | |
|
159 | ||
|
151 | 160 | GraphicsDeviceManager gdm = new GraphicsDeviceManager(this) |
|
152 | 161 | { |
|
153 | 162 | |
@@ -261,6 +270,37 | |||
|
261 | 270 | } |
|
262 | 271 | |
|
263 | 272 | |
|
273 | if (keyboardCur.IsKeyDown(Keys.Down) && keyboardPrev.IsKeyUp(Keys.Down)) | |
|
274 | { | |
|
275 | this.camera.Move(new Vector2(0, -2)); | |
|
276 | } | |
|
277 | else if (keyboardCur.IsKeyDown(Keys.Up) && keyboardPrev.IsKeyUp(Keys.Up)) | |
|
278 | { | |
|
279 | this.camera.Move(new Vector2(0, 2)); | |
|
280 | ||
|
281 | } | |
|
282 | else if (keyboardCur.IsKeyDown(Keys.Left) && keyboardPrev.IsKeyUp(Keys.Left)) | |
|
283 | { | |
|
284 | this.camera.Move(new Vector2(-2, 0)); | |
|
285 | ||
|
286 | } | |
|
287 | else if (keyboardCur.IsKeyDown(Keys.Right) && keyboardPrev.IsKeyUp(Keys.Right)) | |
|
288 | { | |
|
289 | this.camera.Move(new Vector2(2, 0)); | |
|
290 | ||
|
291 | } | |
|
292 | else if (keyboardCur.IsKeyDown(Keys.Subtract) && keyboardPrev.IsKeyUp(Keys.Subtract)) | |
|
293 | { | |
|
294 | this.camera.zoom -= 0.25f; | |
|
295 | ||
|
296 | } | |
|
297 | else if (keyboardCur.IsKeyDown(Keys.Add) && keyboardPrev.IsKeyUp(Keys.Add)) | |
|
298 | { | |
|
299 | this.camera.zoom += 0.25f; | |
|
300 | ||
|
301 | } | |
|
302 | ||
|
303 | ||
|
264 | 304 | if (keyboardCur.IsKeyDown(Keys.Space) && keyboardPrev.IsKeyUp(Keys.Space)) |
|
265 | 305 | { |
|
266 | 306 | sound.Play(volume, pitch, pan); |
@@ -295,20 +335,36 | |||
|
295 | 335 | |
|
296 | 336 | protected void drawTileAt(int x, int y, int tileIndex, int height) |
|
297 | 337 | { |
|
298 | Vector2 squareOffset = new Vector2(Camera.Location.X % 32, | |
|
299 | Camera.Location.Y % 32); | |
|
338 | Vector2 firstSquare = Vector2.Zero; | |
|
339 | Vector2 squareOffset = Vector2.Zero; | |
|
300 | 340 | |
|
301 | 341 | int offsetX = (int)squareOffset.X; |
|
302 | 342 | int offsetY = (int)squareOffset.Y; |
|
343 | int firstX = (int)firstSquare.X; | |
|
344 | int firstY = (int)firstSquare.Y; | |
|
345 | int rowOffset = 0; | |
|
346 | float maxdepth = ((this.squaresAcross + 1) + ((this.squaresDown + 1) * Tile.TileWidth)) * 10; | |
|
347 | ||
|
348 | ||
|
349 | int mapx = (firstX + x); | |
|
350 | int mapy = (firstY + y); | |
|
351 | float depthOffset = 0.7f - ((mapx + (mapy * Tile.TileWidth)) / maxdepth); | |
|
352 | ||
|
353 | if ((firstY + y) % 2 == 1) | |
|
354 | rowOffset = Tile.OddRowXOffset; | |
|
303 | 355 | |
|
304 | 356 | batch.Draw( |
|
305 | 357 | Tile.TileSetTexture, |
|
306 | 358 | new Rectangle( |
|
307 |
(x * Tile.TileStepX) - offsetX + |
|
|
359 | (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, | |
|
308 | 360 | (y * Tile.TileStepY) - offsetY + baseOffsetY, |
|
309 | 361 | Tile.TileWidth, Tile.TileHeight*height), |
|
310 | 362 | Tile.GetExtendedSourceRectangle(tileIndex, height), |
|
311 |
Color.White |
|
|
363 | Color.White, | |
|
364 | 0.0f, | |
|
365 | Vector2.Zero, | |
|
366 | SpriteEffects.None, | |
|
367 | depthOffset); | |
|
312 | 368 | } |
|
313 | 369 | |
|
314 | 370 | protected override void Draw(GameTime gameTime) |
@@ -324,16 +380,20 | |||
|
324 | 380 | Stopwatch stopWatch = new Stopwatch(); |
|
325 | 381 | stopWatch.Start(); |
|
326 | 382 | GraphicsDevice.Clear(Color.CornflowerBlue); |
|
327 | batch.Begin(); | |
|
383 | batch.Begin(SpriteSortMode.BackToFront, | |
|
384 | BlendState.AlphaBlend, | |
|
385 | null, | |
|
386 | null, | |
|
387 | null, | |
|
388 | null, | |
|
389 | camera.get_transformation(GraphicsDevice)); | |
|
328 | 390 | |
|
329 | 391 | //New tile stuff |
|
330 |
Vector2 firstSquare = |
|
|
331 | Camera.Location.Y / 32); | |
|
392 | Vector2 firstSquare = Vector2.Zero; | |
|
332 | 393 | int firstX = (int)firstSquare.X; |
|
333 | 394 | int firstY = (int)firstSquare.Y; |
|
334 | 395 | |
|
335 |
Vector2 squareOffset = |
|
|
336 | Camera.Location.Y % 32); | |
|
396 | Vector2 squareOffset = Vector2.Zero; | |
|
337 | 397 | |
|
338 | 398 | int offsetX = (int)squareOffset.X; |
|
339 | 399 | int offsetY = (int)squareOffset.Y; |
@@ -344,16 +404,21 | |||
|
344 | 404 | if ((firstY + y) % 2 == 1) |
|
345 | 405 | rowOffset = Tile.OddRowXOffset; |
|
346 | 406 | |
|
347 | for (int x = 0; x < this.squaresAcross; x++) | |
|
348 | { | |
|
407 | for (int x = 0; x < this.squaresAcross; x++) { | |
|
408 | ||
|
409 | ||
|
349 | 410 | batch.Draw( |
|
350 | 411 | Tile.TileSetTexture, |
|
351 | new Rectangle( | |
|
352 |
|
|
|
353 |
|
|
|
354 |
|
|
|
412 | new Rectangle( | |
|
413 | (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, | |
|
414 | (y * Tile.TileStepY) - offsetY + baseOffsetY, | |
|
415 | Tile.TileWidth, Tile.TileHeight), | |
|
355 | 416 | Tile.GetSourceRectangle(1), |
|
356 |
Color.White |
|
|
417 | Color.White, | |
|
418 | 0.0f, | |
|
419 | Vector2.Zero, | |
|
420 | SpriteEffects.None, | |
|
421 | 0.9f); | |
|
357 | 422 | } |
|
358 | 423 | } |
|
359 | 424 | |
@@ -371,7 +436,7 | |||
|
371 | 436 | Vector2 stop = new Vector2(startX + this.squaresAcross* Tile.TileStepX/2, |
|
372 | 437 | this.squaresDown*Tile.TileStepY- baseOffsetY+4); |
|
373 | 438 | |
|
374 | Line.drawLine(batch, start, stop, Color.White); | |
|
439 | Line.drawLine(batch, start, stop, Color.White, 0.8f); | |
|
375 | 440 | |
|
376 | 441 | } |
|
377 | 442 | //Lines going down and to the left: |
@@ -384,34 +449,57 | |||
|
384 | 449 | Vector2 stop_reverse = new Vector2(startX + -(this.squaresAcross * Tile.TileStepX / 2), |
|
385 | 450 | (this.squaresDown * Tile.TileStepY) - baseOffsetY + 4); |
|
386 | 451 | |
|
387 | Line.drawLine(batch, start_reverse, stop_reverse, Color.White); | |
|
452 | Line.drawLine(batch, start_reverse, stop_reverse, Color.White, 0.8f); | |
|
388 | 453 | |
|
389 | 454 | } |
|
390 | 455 | |
|
391 | //int startpos = 140; | |
|
392 | //for (int i = startpos; i < startpos + 4; i++) | |
|
393 | //{ | |
|
394 | // batch.Draw( | |
|
395 | // Tile.TileSetTexture, | |
|
396 | // new Rectangle( | |
|
397 | // ((i - startpos+2) * 2 * Tile.TileStepX) - offsetX + 0 + baseOffsetX, | |
|
398 | // (4 * Tile.TileStepY) - offsetY + baseOffsetY, | |
|
399 | // Tile.TileWidth, Tile.TileHeight), | |
|
400 | // Tile.GetExtendedSourceRectangle(i, 2), | |
|
401 | // Color.White); | |
|
402 | //} | |
|
403 | ||
|
404 | 456 | drawTileAt(4, 4, 140, 3); |
|
405 | 457 | drawTileAt(6, 4, 141, 3); |
|
406 | 458 | drawTileAt(8, 4, 142, 2); |
|
407 | 459 | drawTileAt(10, 4, 142, 3); |
|
460 | drawTileAt(0, 0, 22, 1); | |
|
408 | 461 | |
|
409 | batch.DrawString(font, fps, new Vector2(33, 33), Color.Black); | |
|
410 | batch.DrawString(font, fps, new Vector2(32, 32), Color.White); | |
|
411 | batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(120, 33), Color.Black); | |
|
412 | batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(119, 32), Color.White); | |
|
462 | ||
|
463 | //Warning: creates a flashing effect because tree positions update every 1/60th of a second | |
|
464 | //* | |
|
465 | ||
|
466 | ||
|
467 | ||
|
468 | for (int i = 0; i< 80; i++) | |
|
469 | { | |
|
470 | for (int j = 0; j < 50; j += 1) | |
|
471 | { | |
|
472 | if (this.random_generator.NextDouble() > 0.75) | |
|
473 | { | |
|
474 | drawTileAt(i, j, 142, 2); | |
|
475 | } | |
|
476 | ||
|
477 | ||
|
478 | } | |
|
479 | }//*/ | |
|
480 | ||
|
413 | 481 | |
|
414 | 482 | batch.End(); |
|
483 | ||
|
484 | batch.Begin(SpriteSortMode.BackToFront, | |
|
485 | BlendState.AlphaBlend, | |
|
486 | null, | |
|
487 | null, | |
|
488 | null, | |
|
489 | null); | |
|
490 | ||
|
491 | batch.DrawString(font, fps, new Vector2(33, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | |
|
492 | batch.DrawString(font, fps, new Vector2(32, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); | |
|
493 | batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(120, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | |
|
494 | batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(119, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); | |
|
495 | ||
|
496 | ||
|
497 | batch.DrawString(font, camera.position.ToString(), new Vector2(190, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | |
|
498 | batch.DrawString(font, camera.position.ToString(), new Vector2(189, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); | |
|
499 | ||
|
500 | batch.End(); | |
|
501 | ||
|
502 | ||
|
415 | 503 | stopWatch.Stop(); |
|
416 | 504 | this.drawTime = stopWatch.Elapsed; |
|
417 | 505 |
You need to be logged in to leave comments.
Login now