Bläddra i källkod

added lots of tile pictures, collectable soul bottles, hero animation, spikes, crumbling block, implemented dying, more features for the rendering interface

Kajetan Johannes Hammerle 6 år sedan
förälder
incheckning
c74c3ff7ac
100 ändrade filer med 403 tillägg och 151 borttagningar
  1. 60 30
      levels/00.map
  2. 30 27
      levels/01.map
  3. 21 52
      src/me/hammerle/supersnuvi/entity/AnimatedEntity.java
  4. 5 0
      src/me/hammerle/supersnuvi/entity/Entity.java
  5. 26 0
      src/me/hammerle/supersnuvi/entity/Hero.java
  6. 134 17
      src/me/hammerle/supersnuvi/gamelogic/Level.java
  7. 60 25
      src/me/hammerle/supersnuvi/gamelogic/StateRenderer.java
  8. 32 0
      src/me/hammerle/supersnuvi/rendering/GameRenderer.java
  9. 35 0
      src/me/hammerle/supersnuvi/rendering/IGameRenderer.java
  10. BIN
      src/me/hammerle/supersnuvi/resources/air.png
  11. BIN
      src/me/hammerle/supersnuvi/resources/bottled_soul/bottled_soul.png
  12. BIN
      src/me/hammerle/supersnuvi/resources/bounce_shroom/bounce_shroom.png
  13. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame1.png
  14. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame10.png
  15. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame11.png
  16. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame12.png
  17. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame13.png
  18. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame14.png
  19. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame15.png
  20. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame16.png
  21. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame17.png
  22. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame18.png
  23. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame19.png
  24. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame2.png
  25. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame20.png
  26. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame21.png
  27. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame22.png
  28. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame23.png
  29. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame24.png
  30. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame25.png
  31. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame26.png
  32. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame27.png
  33. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame28.png
  34. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame29.png
  35. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame3.png
  36. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame30.png
  37. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame31.png
  38. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame32.png
  39. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame33.png
  40. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame34.png
  41. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame35.png
  42. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame36.png
  43. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame37.png
  44. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame38.png
  45. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame39.png
  46. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame4.png
  47. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame40.png
  48. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame41.png
  49. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame42.png
  50. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame43.png
  51. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame44.png
  52. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame45.png
  53. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame46.png
  54. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame5.png
  55. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame6.png
  56. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame7.png
  57. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame8.png
  58. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame9.png
  59. BIN
      src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones.png
  60. BIN
      src/me/hammerle/supersnuvi/resources/dirt.png
  61. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt0.png
  62. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt1.png
  63. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt10.png
  64. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt11.png
  65. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt12.png
  66. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt13.png
  67. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt14.png
  68. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt15.png
  69. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt2.png
  70. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt3.png
  71. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt4.png
  72. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt5.png
  73. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt6.png
  74. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt7.png
  75. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt8.png
  76. BIN
      src/me/hammerle/supersnuvi/resources/dirt/dirt9.png
  77. BIN
      src/me/hammerle/supersnuvi/resources/grass.png
  78. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass10.png
  79. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass14.png
  80. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass15.png
  81. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass16.png
  82. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass4.png
  83. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass7.png
  84. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass8.png
  85. BIN
      src/me/hammerle/supersnuvi/resources/grass/grass9.png
  86. BIN
      src/me/hammerle/supersnuvi/resources/sky/sky.png
  87. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi.png
  88. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame1.png
  89. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame2.png
  90. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame3.png
  91. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame4.png
  92. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame5.png
  93. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame6.png
  94. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame7.png
  95. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame8.png
  96. BIN
      src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame9.png
  97. BIN
      src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame1.png
  98. BIN
      src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame2.png
  99. BIN
      src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame3.png
  100. BIN
      src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame4.png

+ 60 - 30
levels/00.map

@@ -1,32 +1,62 @@
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128,  97, 128, 128,  97, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,  97, 128, 128,  97, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128,  96,  96, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,  96,  96, 128, 128, 128, 128, 128, 128, 128
 #
-2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 7, 1
-2, 1, 1, 1, 1, 1, 3, 6, 6, 3, 3, 1, 4, 1, 1, 1, 3, 1
-2, 3, 3, 1, 1, 1, 3, 6, 3, 3, 3, 3, 3, 3, 6, 6, 2, 1
-2, 2, 2, 5, 5, 5, 2, 2, 2, 2, 2, 1, 1, 3, 3, 3, 3, 1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, 64, 64, -1, -1, 64, 64, 64, 64, 64, 64, 64, -1, -1, -1, -1, -1, -1, 64, 64, -1, -1, 64, 64, 64, 64, 64, 64, 64, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1
+-1, 22, 20, 20, 20, 20, 20, 20, 23, -1, -1, 32, -1, -1, -1, -1, -1, -1, 22, 20, 20, 20, 20, 20, 20, 23, -1, -1, 32, -1, -1, -1, -1, -1, -1
+-1,  2,  0,  0,  0,  0,  0,  0,  1, 97, 97,  6,  5, 80, 80, -1, -1, -1,  2,  0,  0,  0,  0,  0,  0,  1, 97, 97,  6,  5, 80, 80, -1, -1, -1
+ 4,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  4,  4,  4
 #
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1

+ 30 - 27
levels/01.map

@@ -1,29 +1,32 @@
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128
 #
-2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 2, 2, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1
-2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1
-2, 2, 2, 5, 5, 5, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, 0, 0, -1, -1, 0, 0, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, 0, -1, -1, -1, -1, -1
+-1, -1, -1, 112, 0, 0, -1, -1, -1, -1
+-1, -1, -1, 64, -1, -1, 64, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, 0, 48, 0, 0, 32, 0, -1, -1
+-1, 0, -1, -1, -1, -1, -1, -1, 0, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 #
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+-1, -1, -1, -1, -1, -1, -1, -1, -1, -1

+ 21 - 52
src/me/hammerle/supersnuvi/entity/AnimatedEntity.java

@@ -1,50 +1,37 @@
 package me.hammerle.supersnuvi.entity;
 
 import javafx.scene.image.Image;
-import javafx.scene.paint.Color;
 import me.hammerle.supersnuvi.gamelogic.Level;
-import me.hammerle.supersnuvi.util.Utils;
 
 public class AnimatedEntity extends Entity
 {
     private int counter;
     private int frame;
     
-    private Image leftFace;
-    private Image rightFace;
-    private Image[] left;
-    private Image[] right;
-    private Image[] leftAir;
-    private Image[] rightAir;
+    protected Image face;
+    protected Image[] move;
+    protected Image[] moveAir;
+    private boolean flipped;
     
     public AnimatedEntity(Level level, double x, double y, double width, double height) 
     {
         super(level, x, y, width, height);
+        flipped = false;
         counter = 0;
-        frame = 0;
-        left = new Image[3];
-        left[0] = Utils.getColoredImage(Color.CYAN, (int) getWidth(), (int) getHeight());
-        left[1] = Utils.getColoredImage(Color.ANTIQUEWHITE, (int) getWidth(), (int) getHeight());
-        left[2] = Utils.getColoredImage(Color.RED, (int) getWidth(), (int) getHeight());
-        right = new Image[3];
-        right[0] = Utils.getColoredImage(Color.CYAN, (int) getWidth(), (int) getHeight());
-        right[1] = Utils.getColoredImage(Color.ANTIQUEWHITE, (int) getWidth(), (int) getHeight());
-        right[2] = Utils.getColoredImage(Color.RED, (int) getWidth(), (int) getHeight());
-        
-        leftAir = new Image[1];
-        leftAir[0] = Utils.getColoredImage(Color.BROWN, (int) getWidth(), (int) getHeight());
-        rightAir = new Image[1];
-        rightAir[0] = Utils.getColoredImage(Color.YELLOW, (int) getWidth(), (int) getHeight());
-        
-        leftFace = Utils.getColoredImage(Color.DARKOLIVEGREEN, (int) getWidth(), (int) getHeight());
-        rightFace = Utils.getColoredImage(Color.DARKSEAGREEN, (int) getWidth(), (int) getHeight());
+        frame = 0;   
     }
 
+    @Override
+    public boolean drawImageFlipped() 
+    {
+        return flipped;
+    }
+    
     @Override
     public Image getImage() 
     {
         counter++;
-        if(counter >= 15)
+        if(counter >= 4)
         {
             counter = 0;
             frame++;
@@ -52,23 +39,14 @@ public class AnimatedEntity extends Entity
         double motionX = getMotionX();
         if(isOnGround())
         {
-            if(motionX < 0)
-            {
-                if(frame >= left.length)
-                {
-                    frame = 0;
-                }
-                setImage(leftFace);
-                return left[frame];
-            }
-            else if(motionX > 0)
+            if(motionX != 0)
             {
-                if(frame >= right.length)
+                if(frame >= move.length)
                 {
                     frame = 0;
                 }
-                setImage(rightFace);
-                return right[frame];
+                flipped = motionX < 0;
+                return move[frame];
             }
             else
             {
@@ -77,23 +55,14 @@ public class AnimatedEntity extends Entity
         }
         else
         {
-            if(motionX < 0)
-            {
-                if(frame >= leftAir.length)
-                {
-                    frame = 0;
-                }
-                setImage(leftFace);
-                return leftAir[frame];
-            }
-            else if(motionX > 0)
+            if(motionX != 0)
             {
-                if(frame >= rightAir.length)
+                if(frame >= moveAir.length)
                 {
                     frame = 0;
                 }
-                setImage(rightFace);
-                return rightAir[frame];
+                flipped = motionX < 0;
+                return moveAir[frame];
             }
             else
             {

+ 5 - 0
src/me/hammerle/supersnuvi/entity/Entity.java

@@ -582,6 +582,11 @@ public class Entity
         this.image = image;
     }
     
+    public boolean drawImageFlipped()
+    {
+        return false;
+    }
+    
     public Image getImage()
     {
         return image;

+ 26 - 0
src/me/hammerle/supersnuvi/entity/Hero.java

@@ -1,14 +1,40 @@
 package me.hammerle.supersnuvi.entity;
 
+import javafx.scene.image.Image;
 import javafx.scene.input.KeyCode;
 import me.hammerle.supersnuvi.gamelogic.Level;
 import me.hammerle.supersnuvi.input.IKeyHandler;
+import me.hammerle.supersnuvi.util.Utils;
 
 public class Hero extends AnimatedEntity
 {
     public Hero(Level level,  double x, double y, double width, double height) 
     {
         super(level, x, y, width, height);
+        
+        face = Utils.getImage("snuvi/snuvi");
+        super.setImage(face);
+        move = new Image[9];
+        move[0] = Utils.getImage("snuvi/snuvi_frame1");
+        move[1] = Utils.getImage("snuvi/snuvi_frame2");
+        move[2] = Utils.getImage("snuvi/snuvi_frame3");
+        move[3] = Utils.getImage("snuvi/snuvi_frame4");
+        move[4] = Utils.getImage("snuvi/snuvi_frame5");
+        move[5] = Utils.getImage("snuvi/snuvi_frame6");
+        move[6] = Utils.getImage("snuvi/snuvi_frame7");
+        move[7] = Utils.getImage("snuvi/snuvi_frame8");
+        move[8] = Utils.getImage("snuvi/snuvi_frame9");
+        
+        moveAir = new Image[9];
+        moveAir[0] = Utils.getImage("snuvi/snuvi_frame1");
+        moveAir[1] = Utils.getImage("snuvi/snuvi_frame2");
+        moveAir[2] = Utils.getImage("snuvi/snuvi_frame3");
+        moveAir[3] = Utils.getImage("snuvi/snuvi_frame4");
+        moveAir[4] = Utils.getImage("snuvi/snuvi_frame5");
+        moveAir[5] = Utils.getImage("snuvi/snuvi_frame6");
+        moveAir[6] = Utils.getImage("snuvi/snuvi_frame7");
+        moveAir[7] = Utils.getImage("snuvi/snuvi_frame8");
+        moveAir[8] = Utils.getImage("snuvi/snuvi_frame9");
     }
 
     @Override

+ 134 - 17
src/me/hammerle/supersnuvi/gamelogic/Level.java

@@ -7,18 +7,23 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
+import javafx.scene.image.Image;
+import javafx.scene.paint.Color;
 import me.hammerle.supersnuvi.entity.Entity;
 import me.hammerle.supersnuvi.entity.Hero;
 import me.hammerle.supersnuvi.input.IKeyHandler;
 import me.hammerle.supersnuvi.rendering.IGameRenderer;
+import me.hammerle.supersnuvi.tiles.BottledSoulTile;
 import me.hammerle.supersnuvi.tiles.Location;
+import me.hammerle.supersnuvi.tiles.StartTile;
 import me.hammerle.supersnuvi.tiles.Tile;
 import me.hammerle.supersnuvi.util.CollisionBox;
 
-public class Level 
+public final class Level 
 {
     private final StateRenderer state;
     private final IGameRenderer renderer;
+    private final Color TRANSPARENT_WHITE = new Color(1, 1, 1, 0.5);
     
     private final String name;
     
@@ -31,9 +36,14 @@ public class Level
     private int[][] foreground;
     
     private final HashMap<Integer, Entity> entities;
+    private Hero hero;
     private int entityCounter;
     
     private boolean shouldReset;
+    private boolean done;
+    
+    private int souls;
+    private final int maxSouls;
     
     public Level(StateRenderer state, File f)
     {
@@ -44,10 +54,22 @@ public class Level
         this.entities = new HashMap<>();
         this.entityCounter = 0;
         this.shouldReset = false;
+        this.done = false;
+        
+        resetLevel();
         
-        // test spawning
-        Hero hero = new Hero(this, 32, 100, 32, 48);
-        entities.put(entityCounter++, hero);
+        int sum = 0;
+        for(int x = 0; x < width; x++)
+        {
+            for(int y = 0; y < height; y++)
+            {
+                if(background2[x][y] == BottledSoulTile.ID)
+                {
+                    sum++;
+                }
+            }
+        }
+        maxSouls = sum;
     }
     
     private String getNiceName(String badName)
@@ -72,19 +94,73 @@ public class Level
     public void finishLevel()
     {
         shouldReset = true;
+        done = true;
     }
     
     public boolean shouldFinish()
+    {
+        return done;
+    }
+    
+    public boolean shouldReset()
     {
         return shouldReset;
     }
     
+    public void scheduleReset()
+    {
+        shouldReset = true;
+    }
+    
     public void resetLevel()
     {
+        souls = 0;
         shouldReset = false;
-        Hero hero = new Hero(this, 32, 100, 32, 48);
+        Hero h = spawnHero();
+        hero = h;
         entities.clear();
-        entities.put(entityCounter++, hero);
+        entities.put(entityCounter++, h);
+    }
+    
+    public Hero spawnHero()
+    {
+        Hero h = (Hero) entities.values().stream().filter(ent -> ent instanceof Hero).findFirst().orElse(null);
+        if(h == null || hero.getX() < 0)
+        {
+            int x = 0;
+            int y;
+            for(; x < width; x++)
+            {
+                for(y = 0; y < height; y++)
+                {
+                    if(background2[x][y] == StartTile.ID)
+                    {
+                        return new Hero(this, renderer.toCoord(x), renderer.toCoord(y), 32, 64);
+                    }
+                }
+            }
+        }
+        else
+        {
+            int x = Math.min(width - 1, renderer.toBlock(h.getX()));
+            int y = 0;
+            for(; x >= 0; x--)
+            {
+                for(y = 0; y < height; y++)
+                {
+                    if(background2[x][y] == StartTile.ID)
+                    {
+                        return new Hero(this, renderer.toCoord(x), renderer.toCoord(y), 32, 64);
+                    }
+                }
+            }
+        }
+        return new Hero(this, 0, 0, 32, 64);
+    }
+    
+    public void increaseSouls()
+    {
+        souls++;
     }
     
     // -------------------------------------------------------------------------
@@ -181,7 +257,7 @@ public class Level
             background = new int[width][height];
             for(int j = 0; j < parts.length; j++)
             {
-                background[j][mod - i] = Integer.parseInt(parts[j]);
+                background[j][mod - i] = Integer.parseInt(parts[j].trim());
             }
             i++;
             while(i < first)
@@ -194,7 +270,7 @@ public class Level
                 }
                 for(int j = 0; j < parts.length; j++)
                 {
-                    background[j][mod - i] = Integer.parseInt(parts[j]);
+                    background[j][mod - i] = Integer.parseInt(parts[j].trim());
                 }
                 i++;
             }
@@ -213,7 +289,7 @@ public class Level
                 }
                 for(int j = 0; j < parts.length; j++)
                 {
-                    background2[j][mod - i] = Integer.parseInt(parts[j]);
+                    background2[j][mod - i] = Integer.parseInt(parts[j].trim());
                 }
                 i++;
             }
@@ -232,7 +308,7 @@ public class Level
                 }
                 for(int j = 0; j < parts.length; j++)
                 {
-                    foreground[j][mod - i] = Integer.parseInt(parts[j]);
+                    foreground[j][mod - i] = Integer.parseInt(parts[j].trim());
                 }
                 i++;
             }
@@ -253,6 +329,21 @@ public class Level
     {
         if(worldLoaded)
         {
+            // setting the right view center
+            double centerX = Math.max(0, hero.getX() - (renderer.getWidth() / 2));
+            double centerY = Math.max(0, hero.getY() - (renderer.getHeight() / 2));
+            renderer.setViewCenter(centerX, centerY);
+            
+            // end
+            
+            if(hero.getY() < 0)
+            {
+                resetLevel();
+                return;
+            }
+            
+            state.tick();
+            
             // doing entity logic first
             entities.values().forEach(entity -> 
             {
@@ -266,26 +357,41 @@ public class Level
             int endX = Math.min(renderer.getLastVisibleBlockX() + 1, width);
             int endY = Math.min(renderer.getLastVisibleBlockY() + 1, height);
             
+            Image sky = state.getTile(128, 0, 0);
             int id;
             for(int x = startX; x < endX; x++)
             {
                 for(int y = startY; y < endY; y++)
                 {
+                    // drawing background 0
+                    // prevents black spots
+                    renderer.drawBlockImage(sky, x, y);
+                    // end
                     id = background[x][y];
                     if(id != -1)
                     {
-                        renderer.drawBlockImage(state.getTile(id), x, y);
+                        renderer.drawBlockImage(state.getTile(id, x, y), x, y);
                     }
                     id = background2[x][y];
                     if(id != -1)
                     {
-                        renderer.drawBlockImage(state.getTile(id), x, y);
+                        renderer.drawBlockImage(state.getTile(id, x, y), x, y);
                     }
                 }
             }
             
             // render entities here
-            entities.values().forEach(en -> renderer.drawImage(en.getImage(), en.getRenderX(), en.getRenderY()));
+            entities.values().forEach(en -> 
+            {
+                if(en.drawImageFlipped())
+                {
+                    renderer.drawFlippedImage(en.getImage(), en.getRenderX(), en.getRenderY());
+                }
+                else
+                {
+                    renderer.drawImage(en.getImage(), en.getRenderX(), en.getRenderY());
+                }
+            });
             // end entity rendering
             
             for(int x = startX; x < endX; x++)
@@ -295,10 +401,21 @@ public class Level
                     id = foreground[x][y];
                     if(id != -1)
                     {
-                        renderer.drawBlockImage(state.getTile(id), x, y);
+                        renderer.drawBlockImage(state.getTile(id, x, y), x, y);
                     }
                 }
             }
+            
+            // rendering souls
+            String s = souls + "/" + maxSouls;
+            double w = renderer.getStringWidth(s) + BottledSoulTile.IMAGE.getWidth();
+            renderer.fillRec(0, 0, w, BottledSoulTile.IMAGE.getHeight(), TRANSPARENT_WHITE);
+            
+            renderer.drawFixedImage(BottledSoulTile.IMAGE, 0, 0);
+            renderer.prepareStringDrawing(Color.BLACK);
+            double d = (BottledSoulTile.IMAGE.getHeight() - renderer.getLineHeight()) / 2;
+            renderer.drawString(s, BottledSoulTile.IMAGE.getWidth(), d);
+            renderer.stopStringDrawing();
         }
     }   
     
@@ -310,7 +427,7 @@ public class Level
     {
         if(x < 0 || y < 0 || x >= width || y >= height)
         {
-            return Tile.FALLBACK_TILE;
+            return StateRenderer.FALLBACK_TILE;
         }
         return state.getInteractionTile(background2[x][y]);
     }
@@ -322,7 +439,7 @@ public class Level
             return CollisionBox.NULL_BOX;
         }
         Tile tile = state.getInteractionTile(background2[x][y]);
-        return tile.getMovementBox().reset().offset(renderer.toCoord(x), renderer.toCoord(y));
+        return tile.getMovementBox(x, y).reset().offset(renderer.toCoord(x), renderer.toCoord(y));
     }
     
     public LinkedList<Location> getTilesInMovementOf(CollisionBox cb)
@@ -353,7 +470,7 @@ public class Level
             return CollisionBox.NULL_BOX;
         }
         Tile tile = state.getInteractionTile(background2[x][y]);
-        return tile.getCollisionBox().reset().offset(renderer.toCoord(x), renderer.toCoord(y));
+        return tile.getCollisionBox(x, y).reset().offset(renderer.toCoord(x), renderer.toCoord(y));
     }
     
     public LinkedList<Location> getTilesCollidingWith(CollisionBox cb)

+ 60 - 25
src/me/hammerle/supersnuvi/gamelogic/StateRenderer.java

@@ -4,22 +4,17 @@ import java.io.File;
 import java.util.Arrays;
 import java.util.HashMap;
 import javafx.scene.image.Image;
-import javafx.scene.image.WritableImage;
 import javafx.scene.input.KeyCode;
 import javafx.scene.paint.Color;
 import me.hammerle.supersnuvi.input.IKeyHandler;
 import me.hammerle.supersnuvi.rendering.IGameRenderer;
 import me.hammerle.supersnuvi.savegame.SimpleConfig;
-import me.hammerle.supersnuvi.tiles.Goal;
-import me.hammerle.supersnuvi.tiles.Ice;
-import me.hammerle.supersnuvi.tiles.TrampolinTile;
-import me.hammerle.supersnuvi.tiles.Tile;
-import me.hammerle.supersnuvi.tiles.Water;
+import me.hammerle.supersnuvi.tiles.*;
 
 public class StateRenderer
 {
     // constants
-    private static final Image FALLBACK_IMAGE = new WritableImage(1, 1);
+    public static final ColoredBaseTile FALLBACK_TILE = new ColoredBaseTile(Color.TRANSPARENT);
     
     // rendering
     private final IGameRenderer renderer;   
@@ -57,36 +52,64 @@ public class StateRenderer
     // tile stuff
     // -------------------------------------------------------------------------
     
-    private void registerTile(int id, int r, int g, int b, int opacity)
-    {
-        registeredTiles.put(id, new Tile(new Color(r / 255d, g / 255d, b / 255d, opacity / 255d)));
-    }
-    
     private void registerTiles()
     {
-        registeredTiles.put(1, new Tile("air"));
-        registeredTiles.put(2, new Tile("dirt").setDefaultCollisionBox());
-        registeredTiles.put(3, new Tile("grass").setDefaultCollisionBox());
+        // dirt
+        for(int i = 0; i < 16; i++)
+        {
+            registeredTiles.put(i, new BaseTile("dirt/dirt" + i));
+        }
+        
+        // grass
+        registeredTiles.put(20, new BaseTile("grass/grass4"));
+        registeredTiles.put(21, new BaseTile("grass/grass7"));
+        registeredTiles.put(22, new BaseTile("grass/grass8"));
+        registeredTiles.put(23, new BaseTile("grass/grass9"));
+        registeredTiles.put(28, new BaseTile("grass/grass10"));
+        registeredTiles.put(29, new BaseTile("grass/grass14"));
+        registeredTiles.put(30, new BaseTile("grass/grass15"));
+        registeredTiles.put(31, new BaseTile("grass/grass16"));
+        
+        // bottled soul
+        registeredTiles.put(BottledSoulTile.ID, new BottledSoulTile());
+        
+        // bounce shroom
+        registeredTiles.put(48, new TrampolinTile());
         
-        registeredTiles.put(4, new TrampolinTile().setDefaultCollisionBox());
+        // crumbling stones
+        registeredTiles.put(64, new CrumblingStoneTile());
+        
+        // spike trap
+        registeredTiles.put(80, new SpikeTile());
+        
+        // water
+        registeredTiles.put(96, new WaterTile(true));
+        registeredTiles.put(97, new WaterTile(false));
+        
+        // snuvi start block
+        registeredTiles.put(StartTile.ID, new StartTile());
+        
+        // sky
+        registeredTiles.put(128, new SkyTile());
+        /*registeredTiles.put(4, new TrampolinTile().setDefaultCollisionBox());
         registeredTiles.put(5, new Ice().setDefaultCollisionBox());
         registeredTiles.put(6, new Water());
-        registeredTiles.put(7, new Goal());
+        registeredTiles.put(7, new Goal());*/
     }
     
-    public Image getTile(int id)
+    public Image getTile(int id, int x, int y)
     {
         Tile tile = registeredTiles.get(id);
         if(tile == null)
         {
-            return FALLBACK_IMAGE;
+            return FALLBACK_TILE.getImage(x, y);
         }
-        return tile.getImage();
+        return tile.getImage(x, y);
     }
     
     public Tile getInteractionTile(int id)
     {
-        return registeredTiles.getOrDefault(id, Tile.FALLBACK_TILE);
+        return registeredTiles.getOrDefault(id, FALLBACK_TILE);
     }
     
     // -------------------------------------------------------------------------
@@ -138,10 +161,6 @@ public class StateRenderer
         {
             currentLevel.tick(keys);
             
-            if(keys.isKeyJustReleased(KeyCode.ESCAPE) > 0)
-            {
-                currentLevel = null;
-            }
             // doing that here to prevent concurent modification
             if(currentLevel.shouldFinish())
             {
@@ -149,6 +168,17 @@ public class StateRenderer
                 config.set("level." + currentLevel.getName(), true);
                 currentLevel = null;
                 config.save();
+                return;
+            }
+            
+            if(currentLevel.shouldReset())
+            {
+                currentLevel.resetLevel();
+            }
+            
+            if(keys.isKeyJustReleased(KeyCode.ESCAPE) > 0)
+            {
+                currentLevel = null;
             }
         }
         else
@@ -289,4 +319,9 @@ public class StateRenderer
                 lineHeight + 1, 
                 Color.GRAY);
     }
+    
+    public void tick()
+    {
+        registeredTiles.values().forEach(tile -> tile.tick());
+    }
 }

+ 32 - 0
src/me/hammerle/supersnuvi/rendering/GameRenderer.java

@@ -195,6 +195,19 @@ public class GameRenderer extends AnimationTimer implements IGameRenderer
         context.drawImage(image, offsetX + x, offsetY - y);
     }
     
+    @Override
+    public void drawFixedImage(Image image, double x, double y)
+    {
+        context.drawImage(image, x, y);
+    }
+    
+    @Override
+    public void drawFlippedImage(Image image, double x, double y)
+    {
+        context.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), 
+                offsetX + x + image.getWidth(), offsetY - y, -image.getWidth(), image.getHeight());
+    }
+    
     @Override
     public void drawBlockImage(Image image, int x, int y)
     {
@@ -257,4 +270,23 @@ public class GameRenderer extends AnimationTimer implements IGameRenderer
     {
         return b * TILE_SIZE;
     }
+
+    @Override
+    public double getWidth() 
+    {
+        return canvas.getWidth();
+    }
+
+    @Override
+    public double getHeight() 
+    {
+        return canvas.getHeight();
+    }
+
+    @Override
+    public void setViewCenter(double x, double y) 
+    {
+        cameraX = x;
+        cameraY = y;
+    }
 }

+ 35 - 0
src/me/hammerle/supersnuvi/rendering/IGameRenderer.java

@@ -84,6 +84,22 @@ public interface IGameRenderer
      */
     public void drawImage(Image image, double x, double y);
     
+    /** Draws a fixed image at the desired position
+     *
+     * @param image the image
+     * @param x the x coord of the position
+     * @param y the y coord of the position
+     */
+    public void drawFixedImage(Image image, double x, double y);
+    
+    /** Draws a flipped image at the desired position
+     *
+     * @param image the image
+     * @param x the x coord of the position
+     * @param y the y coord of the position
+     */
+    public void drawFlippedImage(Image image, double x, double y);
+    
     /** Draws an image at the desired block position
      *
      * @param image the image
@@ -151,4 +167,23 @@ public interface IGameRenderer
      * @return a coord
      */
     public double toCoord(int b);
+    
+    /** Gets the width of the window
+     *
+     * @return the width
+     */
+    public double getWidth();
+
+    /** Gets the height of the window
+     *
+     * @return the height
+     */
+    public double getHeight();
+    
+    /** Sets the view center
+     *
+     * @param x the x coordinate
+     * @param y the y coordinate
+     */
+    public void setViewCenter(double x, double y);
 }

BIN
src/me/hammerle/supersnuvi/resources/air.png


BIN
src/me/hammerle/supersnuvi/resources/bottled_soul/bottled_soul.png


BIN
src/me/hammerle/supersnuvi/resources/bounce_shroom/bounce_shroom.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame1.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame10.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame11.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame12.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame13.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame14.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame15.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame16.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame17.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame18.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame19.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame2.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame20.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame21.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame22.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame23.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame24.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame25.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame26.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame27.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame28.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame29.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame3.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame30.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame31.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame32.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame33.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame34.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame35.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame36.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame37.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame38.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame39.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame4.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame40.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame41.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame42.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame43.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame44.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame45.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame46.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame5.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame6.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame7.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame8.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones _frame9.png


BIN
src/me/hammerle/supersnuvi/resources/crumbling_stones/crumbling_stones.png


BIN
src/me/hammerle/supersnuvi/resources/dirt.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt0.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt1.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt10.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt11.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt12.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt13.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt14.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt15.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt2.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt3.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt4.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt5.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt6.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt7.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt8.png


BIN
src/me/hammerle/supersnuvi/resources/dirt/dirt9.png


BIN
src/me/hammerle/supersnuvi/resources/grass.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass10.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass14.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass15.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass16.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass4.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass7.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass8.png


BIN
src/me/hammerle/supersnuvi/resources/grass/grass9.png


BIN
src/me/hammerle/supersnuvi/resources/sky/sky.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame1.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame2.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame3.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame4.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame5.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame6.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame7.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame8.png


BIN
src/me/hammerle/supersnuvi/resources/snuvi/snuvi_frame9.png


BIN
src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame1.png


BIN
src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame2.png


BIN
src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame3.png


BIN
src/me/hammerle/supersnuvi/resources/spike_trap/spike_trap_frame4.png


Vissa filer visades inte eftersom för många filer har ändrats