Browse Source

added new game examples
added quality option to atlas tool
added more options to shader
minor fixes

Denis Muratshin 12 years ago
parent
commit
0f87930ad1
100 changed files with 2774 additions and 9 deletions
  1. 2 2
      .hg_archival.txt
  2. 3 0
      .hgignore
  3. BIN
      doc.zip
  4. BIN
      examples/Demo/data/images/pl.png
  5. 21 0
      examples/Game/CMakeLists.txt
  6. 19 0
      examples/Game/part3/data/app.icf
  7. 107 0
      examples/Game/part3/data/development.icf
  8. BIN
      examples/Game/part3/data/images/asteroid.png
  9. BIN
      examples/Game/part3/data/images/explosion.png
  10. BIN
      examples/Game/part3/data/images/rocket.png
  11. BIN
      examples/Game/part3/data/images/ship.png
  12. BIN
      examples/Game/part3/data/images/shipengine.png
  13. BIN
      examples/Game/part3/data/images/sky.jpg
  14. BIN
      examples/Game/part3/data/images/ui/bg.jpg
  15. BIN
      examples/Game/part3/data/images/ui/finger.png
  16. BIN
      examples/Game/part3/data/images/ui/joystick.png
  17. BIN
      examples/Game/part3/data/images/ui/logo2.png
  18. BIN
      examples/Game/part3/data/images/ui/menu.png
  19. BIN
      examples/Game/part3/data/images/ui/play.png
  20. 22 0
      examples/Game/part3/data/xmls/ui.xml
  21. 28 0
      examples/Game/part3/game.mkb
  22. 41 0
      examples/Game/part3/src/Enemy.cpp
  23. 15 0
      examples/Game/part3/src/Enemy.h
  24. 76 0
      examples/Game/part3/src/Game.cpp
  25. 35 0
      examples/Game/part3/src/Game.h
  26. 32 0
      examples/Game/part3/src/GameScene.cpp
  27. 16 0
      examples/Game/part3/src/GameScene.h
  28. 64 0
      examples/Game/part3/src/Joystick.cpp
  29. 19 0
      examples/Game/part3/src/Joystick.h
  30. 79 0
      examples/Game/part3/src/MainMenuScene.cpp
  31. 14 0
      examples/Game/part3/src/MainMenuScene.h
  32. 26 0
      examples/Game/part3/src/MyButton.cpp
  33. 13 0
      examples/Game/part3/src/MyButton.h
  34. 67 0
      examples/Game/part3/src/Player.cpp
  35. 18 0
      examples/Game/part3/src/Player.h
  36. 80 0
      examples/Game/part3/src/Rocket.cpp
  37. 17 0
      examples/Game/part3/src/Rocket.h
  38. 20 0
      examples/Game/part3/src/Scene.cpp
  39. 20 0
      examples/Game/part3/src/Scene.h
  40. 33 0
      examples/Game/part3/src/Unit.cpp
  41. 26 0
      examples/Game/part3/src/Unit.h
  42. 183 0
      examples/Game/part3/src/entry_point.cpp
  43. 34 0
      examples/Game/part3/src/example.cpp
  44. 4 0
      examples/Game/part3/src/example.h
  45. 17 0
      examples/Game/part3/src/res.cpp
  46. 10 0
      examples/Game/part3/src/res.h
  47. 19 0
      examples/Game/part4/data/app.icf
  48. 107 0
      examples/Game/part4/data/development.icf
  49. 105 0
      examples/Game/part4/data/fonts/huge.fnt
  50. BIN
      examples/Game/part4/data/fonts/huge_0.png
  51. 105 0
      examples/Game/part4/data/fonts/normal.fnt
  52. BIN
      examples/Game/part4/data/fonts/normal_0.png
  53. BIN
      examples/Game/part4/data/images/asteroid.png
  54. BIN
      examples/Game/part4/data/images/explosion.png
  55. BIN
      examples/Game/part4/data/images/rocket.png
  56. BIN
      examples/Game/part4/data/images/ship.png
  57. BIN
      examples/Game/part4/data/images/shipengine.png
  58. BIN
      examples/Game/part4/data/images/sky.jpg
  59. BIN
      examples/Game/part4/data/images/ui/bg.jpg
  60. BIN
      examples/Game/part4/data/images/ui/box9.png
  61. BIN
      examples/Game/part4/data/images/ui/buttons.png
  62. BIN
      examples/Game/part4/data/images/ui/finger.png
  63. BIN
      examples/Game/part4/data/images/ui/joystick.png
  64. BIN
      examples/Game/part4/data/images/ui/logo2.png
  65. BIN
      examples/Game/part4/data/images/ui/menu.png
  66. BIN
      examples/Game/part4/data/images/ui/play.png
  67. 28 0
      examples/Game/part4/data/xmls/ui.xml
  68. 28 0
      examples/Game/part4/game.mkb
  69. 41 0
      examples/Game/part4/src/Enemy.cpp
  70. 15 0
      examples/Game/part4/src/Enemy.h
  71. 78 0
      examples/Game/part4/src/Game.cpp
  72. 35 0
      examples/Game/part4/src/Game.h
  73. 112 0
      examples/Game/part4/src/GameMenu.cpp
  74. 21 0
      examples/Game/part4/src/GameMenu.h
  75. 69 0
      examples/Game/part4/src/GameScene.cpp
  76. 16 0
      examples/Game/part4/src/GameScene.h
  77. 64 0
      examples/Game/part4/src/Joystick.cpp
  78. 19 0
      examples/Game/part4/src/Joystick.h
  79. 81 0
      examples/Game/part4/src/MainMenuScene.cpp
  80. 14 0
      examples/Game/part4/src/MainMenuScene.h
  81. 48 0
      examples/Game/part4/src/MyButton.cpp
  82. 17 0
      examples/Game/part4/src/MyButton.h
  83. 67 0
      examples/Game/part4/src/Player.cpp
  84. 18 0
      examples/Game/part4/src/Player.h
  85. 80 0
      examples/Game/part4/src/Rocket.cpp
  86. 17 0
      examples/Game/part4/src/Rocket.h
  87. 46 0
      examples/Game/part4/src/Scene.cpp
  88. 41 0
      examples/Game/part4/src/Scene.h
  89. 33 0
      examples/Game/part4/src/Unit.cpp
  90. 26 0
      examples/Game/part4/src/Unit.h
  91. 183 0
      examples/Game/part4/src/entry_point.cpp
  92. 40 0
      examples/Game/part4/src/example.cpp
  93. 4 0
      examples/Game/part4/src/example.h
  94. 17 0
      examples/Game/part4/src/res.cpp
  95. 10 0
      examples/Game/part4/src/res.h
  96. 3 0
      oxygine/src/Box9Sprite.h
  97. 1 1
      oxygine/src/MemoryTexture.cpp
  98. 1 1
      oxygine/src/ProgressBar.h
  99. 3 4
      oxygine/src/core/Mem2Native.cpp
  100. 1 1
      oxygine/src/core/gl/ShaderProgramGL.cpp

+ 2 - 2
.hg_archival.txt

@@ -1,5 +1,5 @@
 repo: b6d71054df5712e643a0685bc3ba54b123db5729
-node: f1b9c180182ddb8b81e770b9f28b981b4a36b73f
+node: 17c6e1b6590ed1521d1c2332dc8e83d5971d897d
 branch: default
 latesttag: oldrender
-latesttagdistance: 74
+latesttagdistance: 85

+ 3 - 0
.hgignore

@@ -89,5 +89,8 @@ examples/TutorialResources/build_tutorialresources_vc10
 examples/Game/part1/build_game_vc
 examples/Game/part1/build_game_vc10/
 examples/Game/part2/build_game_vc10
+examples/Game/part3/build_game_vc10
+examples/Game/part4/build_game_vc10/
+examples/Game - Copy/
 syntax: regexp
 ^build/

BIN
doc.zip


BIN
examples/Demo/data/images/pl.png


+ 21 - 0
examples/Game/CMakeLists.txt

@@ -19,3 +19,24 @@ add_executable(GamePart2
 	${PARTSRC})
 
 target_link_libraries(GamePart2 ${OXYGINE_CORE_LIBS})
+
+
+
+file(GLOB_RECURSE PARTSRC
+		part3/src/*.cpp
+		part3/src/*.h)
+
+add_executable(GamePart3
+	${PARTSRC})
+
+target_link_libraries(GamePart3 ${OXYGINE_CORE_LIBS})
+
+
+file(GLOB_RECURSE PARTSRC
+		part4/src/*.cpp
+		part4/src/*.h)
+
+add_executable(GamePart4
+	${PARTSRC})
+
+target_link_libraries(GamePart4 ${OXYGINE_CORE_LIBS})

+ 19 - 0
examples/Game/part3/data/app.icf

@@ -0,0 +1,19 @@
+[S3E]
+MemSize = 64777216
+DispFixRot=Landscape
+SysGlesVersion=2
+SysStackSize=131072
+
+[Trace]
+ALL=0
+EXT=0
+NONE=0
+DEVICE=0
+FIBRE=0
+THREAD=0
+LOADER=0
+SOUND=0
+FILE=0
+SURFACE=0
+MEMORY=0
+ERROR=0

+ 107 - 0
examples/Game/part3/data/development.icf

@@ -0,0 +1,107 @@
+# Settings ICF file automatically generated by S3E development environment
+
+AccelEnabled                   = Type=bool, Default="true", Value = "true"
+AudioAAC                       = Type=bool, Default="false", Value = "false"
+AudioAACPlus                   = Type=bool, Default="false", Value = "false"
+AudioMIDI                      = Type=bool, Default="true", Value = "true"
+AudioMP3                       = Type=bool, Default="true", Value = "true"
+AudioPCM                       = Type=bool, Default="true", Value = "true"
+AudioQCP                       = Type=bool, Default="false", Value = "false"
+AudioVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"
+BacklightTimeout               = Type=int, Min=0.000000, Max=120000.000000, Default="10000", Value = "10000"
+CompassEnabled                 = Type=bool, Default="true", Value = "true"
+ContactsFromAddrBook           = Type=bool, Default="false", Value = "false"
+DeviceAdvanceSoftkeyPosition   = Type=string, Allowed="Bottom Left" "Bottom Right" "Top Right" "Top Left", Default="Bottom Left", Value = "Bottom Left"
+DeviceArch                     = Type=string, Allowed="<Use Native Architecture>" "ARM4T" "ARM4" "ARM5T" "ARM5TE" "ARM5TEJ" "ARM6" "ARM6K" "ARM6T2" "ARM6Z" "X86" "PPC" "AMD64" "ARM7", Default="<Use Native Architecture>", Value = "<Use Native Architecture>"
+DeviceBackSoftkeyPosition      = Type=string, Allowed="Bottom Left" "Bottom Right" "Top Right" "Top Left", Default="Bottom Right", Value = "Bottom Right"
+DeviceBatteryLevel             = Type=int, Min=0.000000, Max=100.000000, Default="50", Value = "50"
+DeviceClass                    = Type=string, Allowed="UNKNOWN" "SYMBIAN_GENERIC" "SYMBIAN_SERIES60" "SYMBIAN_SERIES60_EMULATOR" "SYMBIAN_UIQ" "SYMBIAN_UIQ_EMULATOR" "BREW_GENERIC" "BREW_QCIF_3D" "BREW_QCIF_25G" "BREW_SQCIF_256" "BREW_QVGA_3G" "WINDOWS_GENERIC" "WINMOBILE_GENERIC" "WINMOBILE_SP" "WINMOBILE_PPC" "LINUX_GENERIC" "LINUX_DESKTOP" "LINUX_EMBED" "WIPI_GENERIC" "NDS_GENERIC" "ARM_SEMIH_GENERIC" "NULCUES_GENERIC" "NGI_GENERIC", Default="WINDOWS_GENERIC", Value = "WINDOWS_GENERIC"
+DeviceFPU                      = Type=string, Allowed="None" "VFP Present", Default="VFP Present", Value = "VFP Present"
+DeviceFreeRAM                  = Type=int, Min=0.000000, Max=2097151.000000, Default="1048576", Value = "1048576"
+DeviceIDInt                    = Type=int, Default="0", Value = "0"
+DeviceIDString                 = Type=string, Default="", Value = ""
+DeviceIMSI                     = Type=string, Default="SIMULATOR_IMSI", Value = "SIMULATOR_IMSI"
+DeviceLSKIsBack                = Type=bool, Default="false", Value = "false"
+DeviceLanguage                 = Type=string, Allowed="UNKNOWN" "ENGLISH" "FRENCH" "GERMAN" "SPANISH" "ITALIAN" "PORTUGUESE" "DUTCH" "TURKISH" "CROATIAN" "CZECH" "DANISH" "FINNISH" "HUNGARIAN" "NORWEGIAN" "POLISH" "RUSSIAN" "SERBIAN" "SLOVAK" "SLOVENIAN" "SWEDISH" "UKRAINIAN" "GREEK" "JAPANESE" "SIMPL_CHINESE" "TRAD_CHINESE" "KOREAN" "ICELANDIC" "FLEMISH" "THAI" "AFRIKAANS" "ALBANIAN" "AMHARIC" "ARABIC" "ARMENIAN" "AZERBAIJANI" "TAGALOG" "BELARUSSIAN" "BENGALI" "BULGARIAN" "BURMESE" "CATALAN" "ESTONIAN" "FARSI" "GAELIC" "GEORGIAN" "GUJARATI" "HEBREW" "HINDI" "INDONESIAN" "IRISH" "KANNADA" "KAZAKH" "KHMER" "LAO" "LATVIAN" "LITHUANIAN" "MACEDONIAN" "MALAY" "MALAYALAM" "MARATHI" "MOLDOVIAN" "MONGOLIAN" "PUNJABI" "ROMANIAN" "SINHALESE" "SOMALI" "SWAHILI" "TAJIK" "TAMIL" "TELUGU" "TIBETAN" "TIGRINYA" "TURKMEN" "URDU" "UZBEK" "VIETNAMESE" "WELSH" "ZULU" "<Use Native Language>", Default="<Use Native Language>", Value = "<Use Native Language>"
+DeviceMainsPower               = Type=bool, Default="false", Value = "false"
+DeviceName                     = Type=string, Default="My Computer", Value = "My Computer"
+DeviceOS                       = Type=string, Allowed="NONE" "SYMBIAN" "BREW" "WINDOWS" "WINMOBILE" "LINUX" "WIPI" "NDS" "ARM_SEMIH" "NUCLEUS" "NGI" "WINCE" "SHARPEMP" "OSX" "IPHONE" "UIQ" "PS3" "X360" "ANDROID" "WEBOS" "QNX", Default="NONE", Value = "NONE"
+DeviceOSVersion                = Type=string, Default="", Value = ""
+DeviceOSVersionNumber          = Type=int, Default="0", Value = "0"
+DevicePhoneNumber              = Type=string, Default="0044123456789", Value = "0044123456789"
+DeviceTimezone                 = Type=string, Default="SYSTEM", Value = "SYSTEM"
+DeviceTotalRAM                 = Type=int, Min=0.000000, Max=2097151.000000, Default="1048576", Value = "1048576"
+DeviceUniqueID                 = Type=string, Default="SIMULATOR_ID", Value = "SIMULATOR_ID"
+DeviceUniqueIDInt              = Type=int, Default="01234567890", Value = "01234567890"
+FileTotalStorageSize           = Type=int, Min=0.000000, Max=2147483648.000000, Default="67108864", Value = "67108864"
+FileUseSeparateRomRam          = Type=bool, Default="true", Value = "true"
+FileUseTotalStorageSize        = Type=bool, Default="false", Value = "false"
+GLAPI                          = Type=string, Allowed="None" "GLES 1.0 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.1 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.0 Common Profile from Imagination POWERVR(TM)" "GLES 1.1 Common Profile from Imagination POWERVR(TM)" "GLES 2.0 from Imagination POWERVR(TM)" "Obey [S3E] SysGlesVersion .icf setting" "GLES 1.1 Common Profile from Qualcomm Snapdragon(TM)" "GLES 2.0 from Qualcomm Snapdragon(TM)" "GLES 2.0 ANGLE" "GLES 2.0 ANGLE DirectX 11", Default="Obey [S3E] SysGlesVersion .icf setting", Value = "Obey [S3E] SysGlesVersion .icf setting"
+GLDontUseHiddenWindow          = Type=bool, Default="false", Value = "false"
+GLTerminateOnSuspend           = Type=bool, Default="false", Value = "false"
+GLUsePVRVFrame                 = Type=bool, Default="false", Value = "false"
+KeyboardHasAlpha               = Type=bool, Default="true", Value = "true"
+KeyboardHasDirection           = Type=bool, Default="true", Value = "true"
+KeyboardHasKeypad              = Type=bool, Default="true", Value = "true"
+KeyboardNumpadRotation         = Type=string, Allowed="Rot0" "Rot90" "Rot180" "Rot270", Default="Rot0", Value = "Rot0"
+LicenseExpiryDate              = Type=int, Min=0.000000, Max=999999995904.000000, Default="0", Value = "0"
+LicenseMinutesRemaining        = Type=int, Min=0.000000, Max=10000000.000000, Default="0", Value = "0"
+LicenseStatus                  = Type=string, Allowed="EXPIRED" "DEMO" "USECOUNT" "EXPIRYDATE" "EXPIRYMINSUSE" "PURCHASE" "SUBSCRIPTION" "UPGRADE" "NONCOMMERCIAL", Default="NONCOMMERCIAL", Value = "NONCOMMERCIAL"
+LicenseUsesRemaining           = Type=int, Min=0.000000, Max=10000000.000000, Default="0", Value = "0"
+LocationAltitude               = Type=float, Min=-2000.000000, Max=100000.000000, Default="60.0", Value = "60.0"
+LocationAvailable              = Type=bool, Default="true", Value = "true"
+LocationHeading                = Type=float, Min=0.000000, Max=359.000000, Default="0.0", Value = "0.0"
+LocationHorizontalAccuracy     = Type=float, Min=0.000000, Max=100000.000000, Default="20.0", Value = "20.0"
+LocationLatitude               = Type=float, Min=-90.000000, Max=90.000000, Default="51.511791", Value = "51.511791"
+LocationLongitude              = Type=float, Min=-180.000000, Max=180.000000, Default="-0.191084", Value = "-0.191084"
+LocationSpeed                  = Type=float, Min=0.000000, Max=10000.000000, Default="0", Value = "0"
+LocationVerticalAccuracy       = Type=float, Min=0.000000, Max=100000.000000, Default="100.0", Value = "100.0"
+MacOSSimulatorCustomSettings   = Type=string, Default="", Value = ""
+MacOSSimulatorDevices_ANDROID  = Type=string, Allowed="Samsung Galaxy S:480x800:512" "HTC Sensation XL:480x800:768" "Samsung Galaxy Note:800x1280:1024" "Motorola Droid Razr:540x960:1024" "Kindle Fire:1024x600:512" "Samsung Galaxy Tab:1024x600:512", Default="Samsung Galaxy S:480x800:512", Value = "Samsung Galaxy S:480x800:512"
+MacOSSimulatorDevices_IPHONE   = Type=string, Allowed="iPhone 3GS:320x480:256" "iPhone 4:640x960:512" "iPhone 5:640x1136:1024" "iPad:768x1024:256" "iPad 2:768x1024:512" "iPad 3:1536x2048:1024", Default="iPhone 3GS:320x480:256", Value = "iPhone 3GS:320x480:256"
+MacOSSimulatorPlatforms        = Type=string, Allowed="IPHONE" "ANDROID", Default="IPHONE", Value = "IPHONE"
+MacOSSimulatorUseCustomSettings = Type=bool, Default="true", Value = "true"
+MemoryPoison                   = Type=bool, Default="true", Value = "true"
+MemoryPoisonAlloc              = Type=int, Min=0.000000, Max=255.000000, Default="170", Value = "170"
+MemoryPoisonFree               = Type=int, Min=0.000000, Max=255.000000, Default="221", Value = "221"
+MemoryPoisonInit               = Type=int, Min=0.000000, Max=255.000000, Default="204", Value = "204"
+PointerAvailable               = Type=bool, Default="true", Value = "true"
+PointerMultiSimulationMode     = Type=bool, Default="false", Value = "false"
+PointerMultiTouchAvailable     = Type=bool, Default="false", Value = "false"
+PointerStylusType              = Type=string, Allowed="INVALID" "STYLUS" "FINGER", Default="INVALID", Value = "INVALID"
+PointerType                    = Type=string, Allowed="INVALID" "MOUSE" "STYLUS", Default="MOUSE", Value = "MOUSE"
+SMSEnabled                     = Type=bool, Default="true", Value = "true"
+SMSReceiveEnabled              = Type=bool, Default="true", Value = "true"
+SocketDNSDelay                 = Type=int, Min=0.000000, Max=30000.000000, Default="0", Value = "0"
+SocketHTTPProxy                = Type=string, Default="", Value = ""
+SocketHostName                 = Type=string, Default="", Value = ""
+SocketNetworkAvailable         = Type=bool, Default="true", Value = "true"
+SocketNetworkLoss              = Type=bool, Default="false", Value = "false"
+SocketNetworkType              = Type=string, Allowed="NONE" "UNKNOWN" "LAN" "WLAN" "GPRS" "UMTS" "EVDO" "CDMA2000" "HSDPA" "WIMAX" "BLUETOOTH" "EDGE" "CDMA" "IDEN" "LTE" "EHRPD" "HSPAPLUS", Default="LAN", Value = "LAN"
+SocketRecvLimit                = Type=int, Min=0.000000, Max=1000000.000000, Default="0", Value = "0"
+SocketSendLimit                = Type=int, Min=0.000000, Max=1000000.000000, Default="0", Value = "0"
+SoundEnabled                   = Type=bool, Default="true", Value = "true"
+SoundRecordEnabled             = Type=bool, Default="true", Value = "true"
+SoundSampleRate                = Type=int, Allowed="8192" "11025" "16000" "22050" "44100", Default="22050", Value = "22050"
+SoundStereo                    = Type=bool, Default="true", Value = "true"
+SoundVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"
+SurfaceDisableWhenGLIsActive   = Type=bool, Default="false", Value = "false"
+SurfaceDoubleBuffer            = Type=bool, Default="false", Value = "false"
+SurfaceHeight                  = Type=int, Min=128.000000, Max=4096.000000, Default="480", Value = "640"
+SurfacePitch                   = Type=int, Min=0.000000, Max=8192.000000, Default="0", Value = "0"
+SurfacePixelType               = Type=string, Allowed="RGB444" "RGB555" "RGB565" "RGB666" "RGB888" "BGR444" "BGR555" "BGR565" "BGR666" "BGR888", Default="RGB565", Value = "RGB565"
+SurfacePredefinedResolution    = Type=string, Allowed="176x200" "176x208" "240x320 (QVGA Portrait)" "240x400" "320x240 (QVGA Landscape)" "320x400" "320x480 (iPhone Portrait)" "400x240" "480x320 (iPhone Landscape)" "360x640 (qHD Portrait)" "640x360 (qHD Landscape)" "480x640 (VGA Portrait)" "480x800 (WVGA Portrait)" "640x480 (VGA Landscape)" "800x400" "800x480 (WVGA Landscape)" "640x960 (iPhone 4 Portrait)" "960x640 (iPhone 4 Landscape)" "640x1136 (iPhone 5 Portrait)" "1136x640 (iPhone 5 Landscape)" "1024x600 (Playbook Landscape)" "600x1024 (Playbook Portrait)" "768x1024 (iPad Portrait)" "1024x768 (iPad Landscape)" "2048x1536 (iPad Retina Landscape)" "1536x2048 (iPad Retina Portrait)", Default="320x480 (iPhone Portrait)", Value = "176x200"
+SurfaceRotation                = Type=string, Allowed="Rot0" "Rot90" "Rot180" "Rot270", Default="Rot0", Value = "Rot0"
+SurfaceUnalign                 = Type=bool, Default="true", Value = "true"
+SurfaceUseMultiBuffers         = Type=bool, Default="true", Value = "true"
+SurfaceWidth                   = Type=int, Min=128.000000, Max=4096.000000, Default="320", Value = "960"
+SymbianSoundLatency            = Type=int, Min=20.000000, Max=1400.000000, Default="120", Value = "120"
+ThreadEnabled                  = Type=bool, Default="true", Value = "true"
+TimerAccuracy                  = Type=int, Min=0.000000, Max=1000.000000, Default="0", Value = "0"
+TimerHiRes                     = Type=bool, Default="false", Value = "false"
+TimerLocaltimeOffsetHours      = Type=string, Allowed="-12" "-11" "-10" "-9" "-8" "-7" "-6" "-5" "-4" "-3" "-2" "-1" "0" "+1" "+2" "+3" "+4" "+5" "+6" "+7" "+8" "+9" "+10" "+11" "+12" "+13" "SYSTEM", Default="SYSTEM", Value = "SYSTEM"
+VibraEnabled                   = Type=bool, Default="true", Value = "true"
+Video3GPP                      = Type=bool, Default="false", Value = "false"
+VideoJPEG                      = Type=bool, Default="true", Value = "true"
+VideoMPEG4                     = Type=bool, Default="true", Value = "true"
+VideoVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"

BIN
examples/Game/part3/data/images/asteroid.png


BIN
examples/Game/part3/data/images/explosion.png


BIN
examples/Game/part3/data/images/rocket.png


BIN
examples/Game/part3/data/images/ship.png


BIN
examples/Game/part3/data/images/shipengine.png


BIN
examples/Game/part3/data/images/sky.jpg


BIN
examples/Game/part3/data/images/ui/bg.jpg


BIN
examples/Game/part3/data/images/ui/finger.png


BIN
examples/Game/part3/data/images/ui/joystick.png


BIN
examples/Game/part3/data/images/ui/logo2.png


BIN
examples/Game/part3/data/images/ui/menu.png


BIN
examples/Game/part3/data/images/ui/play.png


+ 22 - 0
examples/Game/part3/data/xmls/ui.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<resources>
+	<set path = "images/ui" />
+	<atlas>
+		<image file="joystick.png" />
+		<image file="finger.png" />
+		<image file="play.png" />
+		<image file="logo2.png" />
+		<image file="menu.png" />
+		<image file="bg.jpg" />
+	</atlas>
+
+	<set path = "images" />
+	<atlas>
+		<image file="sky.jpg" />
+		<image file="ship.png" />
+		<image file="shipengine.png" />
+		<image file="rocket.png" />
+		<image file="explosion.png" cols="12"/>
+		<image file="asteroid.png"/>
+	</atlas>
+</resources>

+ 28 - 0
examples/Game/part3/game.mkb

@@ -0,0 +1,28 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+}
+
+assets
+{
+	(data)
+}

+ 41 - 0
examples/Game/part3/src/Enemy.cpp

@@ -0,0 +1,41 @@
+#include "Enemy.h"
+#include "res.h"
+
+void Enemy::_init()
+{
+	//you could hit enemy 3 times
+	_hp = 3;
+
+	spSprite sprite = new Sprite;
+	sprite->setResAnim(res::ui.getResAnim("asteroid"));
+	sprite->attachTo(_view);
+	sprite->setAnchor(Vector2(0.5f, 0.5f));
+
+	//it random scale and rotation
+	sprite->setRotation(scalar::randFloat(0, MATH_PI * 2));
+	sprite->setScale(scalar::randFloat(0.5f, 1.0f));
+
+	//it is rotating by tween with random speed
+	float dest = MATH_PI * 2;
+	if (rand() % 2 == 0)
+		dest *= -1;
+	dest += sprite->getRotation();
+	sprite->addTween(Sprite::TweenRotation(dest), rand() % 15000 + 15000, -1);
+}
+
+void Enemy::_update(const UpdateState &us)
+{
+	//nothing to do
+}
+
+void Enemy::explode()
+{
+	//hit by rocket
+	_hp--;
+	if (_hp == 0)
+	{
+		//dead, hide it with alpha tween
+		_dead = true;
+		_view->addTween(Actor::TweenAlpha(0), 300)->setDetachActor(true);
+	}
+}

+ 15 - 0
examples/Game/part3/src/Enemy.h

@@ -0,0 +1,15 @@
+#pragma once
+#include "Unit.h"
+
+DECLARE_SMART(Enemy, spEnemy);
+class Enemy: public Unit
+{
+public:
+
+	void explode();
+
+private:
+	void _init();
+	void _update(const UpdateState &us);
+	int _hp;
+};

+ 76 - 0
examples/Game/part3/src/Game.cpp

@@ -0,0 +1,76 @@
+#include "Game.h"
+#include "Joystick.h"
+#include "Player.h"
+#include "res.h"
+#include "Enemy.h"
+
+Game::Game()
+{
+	
+}
+
+Game::~Game()
+{
+
+}
+
+void Game::init()
+{
+	//scene layer would have size of display
+	setSize(getRoot()->getSize());
+
+	//create background
+	spSprite sky = new Sprite;
+	sky->setResAnim(res::ui.getResAnim("sky"));
+	sky->attachTo(this);
+	
+	//create player ship
+	_player = new Player;
+	_player->init(getSize()/2, this);
+
+	//create separate layer for elements virtual joystick and other UI in future
+	_ui = new Actor;
+	_ui->attachTo(this);
+	//it would be higher than other actors with default priority = 0
+	_ui->setPriority(1);
+
+	//create virtual joystick and attach it to UI
+	_move = new Joystick;
+	_move->attachTo(_ui);
+	_move->setY(getHeight() - _move->getHeight());
+
+	//create virtual joystick and attach it to UI
+	_fire = new Joystick;
+	_fire->attachTo(_ui);
+	_fire->setX(getWidth() - _fire->getWidth());
+	_fire->setY(getHeight() - _fire->getHeight());
+
+
+	//create enemies
+	for (int i = 0; i < 10; ++i)
+	{
+		spEnemy enemy = new Enemy;
+		enemy->init(Vector2(scalar::randFloat(0, getWidth()), scalar::randFloat(0, getHeight())), this);
+	}	
+}
+
+void Game::doUpdate(const UpdateState &us)
+{
+	//update all units
+	//ship, rocket and enemies are in this list
+	for (units::iterator i = _units.begin(); i != _units.end(); )
+	{
+		spUnit unit = *i;
+		unit->update(us);
+
+		if (unit->isDead())
+		{
+			//it is dead. Time to remove it from list
+			i = _units.erase(i);
+		}
+		else
+		{
+			++i;
+		}
+	}
+}

+ 35 - 0
examples/Game/part3/src/Game.h

@@ -0,0 +1,35 @@
+#pragma once
+#include "oxygine-framework.h"
+#include <list>
+using namespace oxygine;
+
+DECLARE_SMART(Player, spPlayer);
+DECLARE_SMART(Joystick, spJoystick);
+DECLARE_SMART(Game, spGame);
+DECLARE_SMART(Rocket, spRocket);
+DECLARE_SMART(Unit, spUnit);
+
+class Game: public Actor
+{
+public:
+	Game();
+	~Game();
+
+	void init();
+
+protected:
+	friend class Rocket;
+	friend class Player;
+	friend class Unit;
+
+	void doUpdate(const UpdateState &us);
+
+	spActor _ui;
+	spJoystick _move;
+	spJoystick _fire;
+
+	spPlayer _player;
+
+	typedef std::list<spUnit> units;
+	units _units;
+};

+ 32 - 0
examples/Game/part3/src/GameScene.cpp

@@ -0,0 +1,32 @@
+#include "GameScene.h"
+#include "MainMenuScene.h"
+#include "MyButton.h"
+#include "res.h"
+
+spGameScene GameScene::instance;
+
+GameScene::GameScene()
+{
+	//create game actor
+	_game = new Game;
+	_game->init();
+	_game->attachTo(_view);
+
+	//create menu button 
+	spActor btn = initActor(new MyButton,
+		arg_resAnim = res::ui.getResAnim("menu"),
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_attachTo = _view);
+	
+	//align it to top right
+	btn->setX(_view->getWidth() - btn->getWidth()/2);
+	btn->setY(btn->getHeight()/2);
+
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &GameScene::onEvent));
+}
+
+void GameScene::onEvent(Event *ev)
+{
+	//clicked to menu button
+	changeScene(MainMenuScene::instance);
+}

+ 16 - 0
examples/Game/part3/src/GameScene.h

@@ -0,0 +1,16 @@
+#pragma once
+#include "Scene.h"
+#include "Game.h"
+
+DECLARE_SMART(GameScene, spGameScene);
+class GameScene: public Scene
+{
+public:
+	static spGameScene instance;
+	GameScene();
+
+
+private:
+	void onEvent(Event *ev);
+	spGame _game;
+};

+ 64 - 0
examples/Game/part3/src/Joystick.cpp

@@ -0,0 +1,64 @@
+#include "Joystick.h"
+#include "res.h"
+
+Joystick::Joystick():_pressed(false), _dir(0,0)
+{
+	setResAnim(res::ui.getResAnim("joystick"));
+	setAlpha(128);
+
+	//handle touch events
+	addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &Joystick::onEvent));
+	addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Joystick::onEvent));
+	addEventListener(TouchEvent::MOVE, CLOSURE(this, &Joystick::onEvent));
+
+	_finger = new Sprite;
+	_finger->setResAnim(res::ui.getResAnim("finger"));
+	_finger->attachTo(this);
+	_finger->setVisible(false);
+	_finger->setAnchor(Vector2(0.5f, 0.5f));
+	_finger->setInputEnabled(false);
+}
+
+void Joystick::onEvent(Event *ev)
+{
+	TouchEvent *te = safeCast<TouchEvent *>(ev);
+
+	//if player touched down
+	if (te->type == TouchEvent::TOUCH_DOWN)
+	{
+		_finger->setVisible(true);
+		setColor(Color::Red);
+		_pressed = true;
+	}
+
+	//if player touched up
+	if (te->type == TouchEvent::TOUCH_UP)
+	{
+		_finger->setVisible(false);
+		setColor(Color::White);
+		_pressed = false;
+	}
+
+	if (te->type == TouchEvent::MOVE)
+	{
+	}
+
+	Vector2 center = getSize()/2;
+	_dir = te->localPosition - center;
+
+	if (_dir.length() > 100)
+		_dir.normalizeTo(100);
+
+	_finger->setPosition(center + _dir);
+
+	if (!_pressed)
+	{
+		_dir = Vector2(0,0);
+	}
+}
+
+bool Joystick::getDirection(Vector2 &dir) const
+{
+	dir = _dir;
+	return _pressed;
+}

+ 19 - 0
examples/Game/part3/src/Joystick.h

@@ -0,0 +1,19 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+DECLARE_SMART(Joystick, spController);
+class Joystick: public Sprite
+{
+public:
+	Joystick();
+	
+	bool getDirection(Vector2 &dir) const;
+
+private:
+	void onEvent(Event *ev);
+	bool _pressed;
+	Vector2 _dir;
+
+	spSprite _finger;
+};

+ 79 - 0
examples/Game/part3/src/MainMenuScene.cpp

@@ -0,0 +1,79 @@
+#include "MainMenuScene.h"
+#include "Sprite.h"
+#include "initActor.h"
+#include "res.h"
+#include "MyButton.h"
+#include "GameScene.h"
+
+spMainMenuScene MainMenuScene::instance;
+
+MainMenuScene::MainMenuScene()
+{
+	//create background
+	spSprite sky = new Sprite;
+	sky->setResAnim(res::ui.getResAnim("bg"));
+	sky->attachTo(_view);
+
+	/*
+	'initActor' is syntax sugar for
+		
+	spSprite logo = new Sprite;
+	logo->setResAnim(res::ui.getResAnim("logo2")),
+	logo->attachTo(_view);
+	*/
+
+	//create logo
+	spSprite logo = initActor(new Sprite,		
+		arg_resAnim = res::ui.getResAnim("logo2"),
+		arg_attachTo = _view);
+	logo->setPosition(_view->getSize() - logo->getSize());
+
+
+	/*
+	spSprite btn = new MyButton;
+	btn->setResAnim(res::ui.getResAnim("play")),
+	btn->setAnchor(Vector2(0.5f, 0.5f));
+	btn->setPosition(_view->getSize()/2);
+	btn->attachTo(_view);	
+	*/
+
+	//create play button at center
+	spSprite btn = initActor(new MyButton,
+		arg_name = "play",
+		arg_resAnim = res::ui.getResAnim("play"),		
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_pos = _view->getSize()/2,
+		arg_attachTo = _view);	
+
+	//handle click to button
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &MainMenuScene::onEvent));
+
+
+	//create menu button 
+	btn = initActor(new MyButton,
+		arg_name = "exit",
+		arg_resAnim = res::ui.getResAnim("menu"),
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_attachTo = _view);
+
+	//align it to top right
+	btn->setX(_view->getWidth() - btn->getWidth()/2);
+	btn->setY(btn->getHeight()/2);
+
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &MainMenuScene::onEvent));
+}
+
+void MainMenuScene::onEvent(Event *ev)
+{
+	string id = ev->currentTarget->getName();
+	if (id == "exit")
+	{
+		core::requestQuit();
+	}
+
+	if (id == "play")
+	{
+		//clicked to play button change scene
+		changeScene(GameScene::instance);
+	}
+}

+ 14 - 0
examples/Game/part3/src/MainMenuScene.h

@@ -0,0 +1,14 @@
+#pragma once
+#include "Scene.h"
+
+DECLARE_SMART(MainMenuScene, spMainMenuScene);
+class MainMenuScene: public Scene
+{
+public:
+	static spMainMenuScene instance;
+
+	MainMenuScene();
+
+private:
+	void onEvent(Event *ev);
+};

+ 26 - 0
examples/Game/part3/src/MyButton.cpp

@@ -0,0 +1,26 @@
+#include "MyButton.h"
+
+MyButton::MyButton()
+{
+	//pressed button should be RED
+	addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &MyButton::onEvent));
+	addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &MyButton::onEvent));
+	addEventListener(TouchEvent::CLICK, CLOSURE(this, &MyButton::onEvent));
+}
+
+void MyButton::onEvent(Event *ev)
+{
+	TouchEvent *event = static_cast<TouchEvent *>(ev);
+	if (ev->type == TouchEvent::TOUCH_DOWN)
+		setColor(Color::Red);
+
+	if (ev->type == TouchEvent::TOUCH_UP)
+		setColor(Color::White);
+
+	if (ev->type == TouchEvent::CLICK)
+	{
+		//clicked button should scale up and down
+		setScale(1.0f);
+		addTween(Actor::TweenScale(1.1f), 300, 1, true);
+	}
+}

+ 13 - 0
examples/Game/part3/src/MyButton.h

@@ -0,0 +1,13 @@
+#pragma once
+#include "Sprite.h"
+using namespace oxygine;
+
+DECLARE_SMART(MyButton, spMyButton);
+class MyButton: public Sprite
+{
+public:
+	MyButton();
+
+private:
+	void onEvent(Event *);
+};

+ 67 - 0
examples/Game/part3/src/Player.cpp

@@ -0,0 +1,67 @@
+#include "Player.h"
+#include "Game.h"
+#include "res.h"
+#include "Joystick.h"
+#include "Rocket.h"
+
+Player::Player():_lastRocketSpawn(0)
+{
+
+}
+
+void Player::_init()
+{
+	//initialize player's ship
+	_view->setPosition(_game->getSize()/2);
+
+	_ship = new Sprite;
+	_ship->setResAnim(res::ui.getResAnim("ship"));
+	_ship->attachTo(_view);
+	_ship->setAnchor(Vector2(0.5f, 0.5f));
+
+	_engine = new Sprite;
+	_engine->setResAnim(res::ui.getResAnim("shipengine"));
+	_engine->attachTo(_ship);
+	//animate engine's fire
+	_engine->addTween(Sprite::TweenColor(Color::Red), 500, -1, true);
+	//by default it is hidden
+	//and would be visible only if ship moves
+	_engine->setVisible(false);
+}
+
+void Player::_update(const UpdateState &us)
+{
+	_engine->setVisible(false);
+
+	Vector2 dir;
+	if (_game->_move->getDirection(dir))
+	{
+		//update player position according to delta time and finger direction from virtual joystick
+		Vector2 pos = _view->getPosition();		
+		pos = pos + dir * (us.dt / 1000.0f) * 5;
+		_view->setPosition(pos);
+
+		//rotate it
+		float angle = atan2f(dir.y, dir.x);
+		_view->setRotation(angle);
+
+		//if player moves show engine's fire
+		_engine->setVisible(true);
+	}
+
+
+	if (_game->_fire->getDirection(dir))
+	{
+		//fire rockets each 300 ms
+		if (_lastRocketSpawn + 300 < us.time)
+		{
+			_lastRocketSpawn = us.time;
+
+			dir.normalize();
+
+			//create rocket
+			spRocket rocket = new Rocket(dir);
+			rocket->init(_view->getPosition(), _game);
+		}		
+	}
+}

+ 18 - 0
examples/Game/part3/src/Player.h

@@ -0,0 +1,18 @@
+#pragma once
+#include "Unit.h"
+
+DECLARE_SMART(Player, spPlayer);
+class Player: public Unit
+{
+public:
+	Player();
+
+	
+protected:
+	void _init();
+	void _update(const UpdateState &us);
+
+	spSprite _engine;	
+	spSprite _ship;	
+	timeMS _lastRocketSpawn;
+};

+ 80 - 0
examples/Game/part3/src/Rocket.cpp

@@ -0,0 +1,80 @@
+#include "Rocket.h"
+#include "res.h"
+#include "Game.h"
+#include "Enemy.h"
+
+Rocket::Rocket(const Vector2 &dir):_dir(dir)
+{	
+}
+
+void Rocket::_init()
+{
+	//initialize rocket's sprite
+	spSprite sp = new Sprite;
+	sp->setResAnim(res::ui.getResAnim("rocket"));
+	sp->setAnchor(Vector2(0.5f, 0.5f));
+	sp->setScale(0);
+	sp->addTween(Sprite::TweenScale(1.0f), 500);
+
+	_view->addChild(sp);
+	_view->setRotation(atan2f(_dir.y, _dir.x));	
+}
+
+void Rocket::_update(const UpdateState &us)
+{
+	//move rocket by it's direction each frame
+	Vector2 pos = _view->getPosition();
+	pos += _dir * (us.dt / 1000.0f) * 500.0f;
+	_view->setPosition(pos);
+
+	//find intersection with Enemies and explode them
+	for (Game::units::iterator i = _game->_units.begin(); i != _game->_units.end(); ++i)
+	{
+		spUnit unit = *i;
+		//list of units has everything, but we need only Enemies
+		spEnemy enemy = dynamic_cast<Enemy*>(unit.get());
+		if (!enemy)
+			continue;
+		
+		Vector2 d = unit->getPosition() - pos;		
+		if (d.length() < 20)
+		{
+			//if rocket is too close to Enemy then try to explode it and explode rocket
+			enemy->explode();
+			explode();
+
+			return;
+		}
+	}
+
+
+	//if rocked out of bounds then explode it
+	RectF bounds(0, 0, _game->getWidth(), _game->getHeight());
+	if (!bounds.pointIn(pos))
+	{
+		explode();
+	}
+}
+
+void Rocket::explode()
+{
+	//we are dead
+	//set this flag to true and it this rocket would be removed from units list in Game::doUpdate
+	_dead = true;
+
+	//create explode sprite
+	spSprite anim = new Sprite;
+	anim->attachTo(_game);
+	anim->setBlendMode(blend_add);
+	anim->setPosition(_view->getPosition());
+	anim->setAnchor(Vector2(0.5f, 0.5f));
+	
+	//run tween with explosion animation
+	spTween tween = anim->addTween(TweenAnim(res::ui.getResAnim("explosion")), 1000);
+	//auto detach sprite when tween is done
+	tween->setDetachActor(true);
+
+	//hide rocket and then detach it
+	tween = _view->addTween(Actor::TweenAlpha(0), 500);
+	tween->setDetachActor(true);
+}

+ 17 - 0
examples/Game/part3/src/Rocket.h

@@ -0,0 +1,17 @@
+#pragma once
+#include "oxygine-framework.h"
+#include "Unit.h"
+
+DECLARE_SMART(Rocket, spRocket);
+class Rocket: public Unit
+{
+public:
+	Rocket(const Vector2 &dir);
+	
+protected:
+	void _init();
+	void _update(const UpdateState &us);
+	void explode();
+
+	Vector2 _dir;
+};

+ 20 - 0
examples/Game/part3/src/Scene.cpp

@@ -0,0 +1,20 @@
+#include "Scene.h"
+
+Scene::Scene()
+{
+	_view = new Actor;
+	_view->setSize(getRoot()->getSize());
+}
+
+void Scene::changeScene(spScene next)
+{
+	//hide current scene
+	spTween tween = _view->addTween(Actor::TweenAlpha(0), 300);
+	//detach when done
+	tween->setDetachActor(true);
+
+	//show next scene
+	getRoot()->addChild(next->getView());
+	next->getView()->setAlpha(0);
+	next->getView()->addTween(Actor::TweenAlpha(255), 300);
+}

+ 20 - 0
examples/Game/part3/src/Scene.h

@@ -0,0 +1,20 @@
+#pragma once
+#include "oxygine-framework.h"
+#include <vector>
+using namespace oxygine;
+
+DECLARE_SMART(Scene, spScene);
+class Scene: public Object
+{
+public:
+	Scene();
+
+	void changeScene(spScene next);
+
+	spActor getView() const {return _view;}
+
+	spActor _view;
+};
+
+
+

+ 33 - 0
examples/Game/part3/src/Unit.cpp

@@ -0,0 +1,33 @@
+#include "Unit.h"
+#include "Game.h"
+
+Unit::Unit():_game(0), _dead(false)
+{
+
+}
+
+void Unit::init(const Vector2 &pos, Game *game)
+{
+	//initialize base
+	_game = game;
+	_view = new Actor;
+	_view->attachTo(game);
+	_view->setPosition(pos);
+
+	//adds to global units list
+	_game->_units.push_back(this);
+
+	//should be overloaded in inherited classes
+	_init();
+}
+
+const Vector2& Unit::getPosition() const
+{
+	return _view->getPosition();
+}
+
+void Unit::update(const UpdateState &us)
+{
+	//should be overloaded in inherited classes
+	_update(us);
+}

+ 26 - 0
examples/Game/part3/src/Unit.h

@@ -0,0 +1,26 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+class Game;
+DECLARE_SMART(Unit, spUnit);
+class Unit: public Object
+{
+public:
+	Unit();
+
+	void init(const Vector2 &pos, Game *game);
+
+	const Vector2& getPosition() const;
+
+	void update(const UpdateState &us);
+	bool isDead() const {return _dead;}
+
+protected:
+	virtual void _init(){}
+	virtual void _update(const UpdateState &us){}
+
+	spActor _view;
+	Game *_game;
+	bool _dead;
+};

+ 183 - 0
examples/Game/part3/src/entry_point.cpp

@@ -0,0 +1,183 @@
+/**
+Attention!
+This file has Oxygine initialization stuff.
+If you just started you don't need to understand it exactly you could check it later. 
+You could start from example.cpp and example.h it has main functions being called from there
+*/
+#include <stdio.h>
+#include "core/Renderer.h"
+#include "RootActor.h"
+#include "DebugActor.h"
+
+#include "example.h"
+
+
+using namespace oxygine;
+
+Renderer renderer;
+Rect viewport;
+
+
+class ExampleRootActor: public RootActor
+{
+public:
+	ExampleRootActor()
+	{
+		//each mobile application should handle focus lost
+		//and free/restore GPU resources
+		addEventListener(RootActor::DEACTIVATE, CLOSURE(this, &ExampleRootActor::onDeactivate));
+		addEventListener(RootActor::ACTIVATE, CLOSURE(this, &ExampleRootActor::onActivate));
+	}
+
+	void onDeactivate(Event *)
+	{
+		core::reset();
+	}
+
+	void onActivate(Event *)
+	{
+		core::restore();
+	}
+};
+
+//called each frame
+int mainloop()
+{
+	example_update();
+	//update our rootActor
+	//Actor::update would be called also for children
+	getRoot()->update();
+
+	Color clear(33, 33, 33, 255);
+	//start rendering and clear viewport
+	if (renderer.begin(0, viewport, &clear))
+	{
+		//begin rendering from RootActor. 
+		getRoot()->render(renderer);
+		//rendering done
+		renderer.end();
+
+		core::swapDisplayBuffers();
+	}
+	
+
+	//update internal components
+	//all input events would be passed to RootActor::instance.handleEvent
+	//if done is true then User requests quit from app.
+	bool done = core::update();
+
+	return done ? 1 : 0;
+}
+
+//it is application entry point
+void run()
+{	
+	//initialize oxygine's internal stuff
+	core::init_desc desc;
+
+#if OXYGINE_SDL
+	//we could setup initial window size on SDL builds
+	//desc.w = 960;
+	//desc.h = 660;
+	//marmalade settings could be changed from emulator's menu
+#endif
+
+	core::init(&desc);	
+	example_preinit();
+	
+	//create RootActor. RootActor is a root node
+	RootActor::instance = new ExampleRootActor();	
+	Point size = core::getDisplaySize();
+	getRoot()->init(size, size);
+	
+	//DebugActor is a helper node it shows FPS and memory usage and other useful stuff
+	DebugActor::initialize();
+
+	//create and add new DebugActor to root actor as child
+	getRoot()->addChild(new DebugActor());
+
+
+	
+	Matrix view = makeViewMatrix(size.x, size.y); 
+
+	viewport = Rect(0, 0, size.x, size.y);
+
+	Matrix proj;
+	//initialize projection matrix
+	Matrix::orthoLH(proj, (float)size.x, (float)size.y, 0, 1);
+	
+	//Renderer is class helper for rendering primitives and batching them
+	//Renderer is lightweight class you could create it many of times
+	renderer.setDriver(IVideoDriver::instance);
+
+	//initialization view and projection matrix 	
+	//where Left Top corner is (0, 0), and right bottom is (width, height)
+	renderer.initCoordinateSystem(size.x, size.y);
+
+	//initialize this example stuff. see example.cpp
+	example_init();
+
+	bool done = false;	
+
+	//here is main game loop
+    while (1)
+    {
+		int done = mainloop();
+		if (done)
+			break;
+    }
+	//so user want to leave application...
+	
+	//lets dump all created objects into log
+	//all created and not freed resources would be displayed
+	ObjectBase::dumpCreatedObjects();
+
+	//lets cleanup everything right now and call ObjectBase::dumpObjects() again
+	//we need to free all allocated resources and delete all created actors
+	//all actors/sprites are smart pointer objects and actually you don't need it remove them by hands
+	//but now we want delete it by hands
+
+	//check example.cpp
+	example_destroy();	
+	
+
+	renderer.cleanup();
+
+	/**releases all internal components and RootActor*/
+	core::release();
+
+	//dump list should be empty now
+	//we deleted everything and could be sure that there aren't any memory leaks
+	ObjectBase::dumpCreatedObjects();
+	//end
+}
+
+#ifdef __S3E__
+int main(int argc, char* argv[])
+{
+    run();
+    return 0;
+}
+#endif
+
+
+#ifdef OXYGINE_SDL
+#include "SDL_main.h"
+extern "C"
+{
+	int main(int argc, char* argv[])
+	{
+		run();
+		return 0;
+	}
+};
+#endif
+
+#ifdef __FLASHPLAYER__
+int main(int argc, char* argv[])
+{
+	printf("test\n");
+	run();
+	return 0;
+}
+#endif

+ 34 - 0
examples/Game/part3/src/example.cpp

@@ -0,0 +1,34 @@
+#include "oxygine-framework.h"
+#include "res.h"
+#include "Game.h"
+#include "MainMenuScene.h"
+#include "GameScene.h"
+using namespace oxygine;
+
+
+void example_preinit()
+{
+}
+
+void example_init()
+{
+	//load resources
+	res::load();
+
+	GameScene::instance = new GameScene;
+	MainMenuScene::instance = new MainMenuScene;
+	getRoot()->addChild(MainMenuScene::instance->getView());
+}
+
+void example_update()
+{
+
+}
+
+void example_destroy()
+{
+	MainMenuScene::instance = 0;
+	GameScene::instance = 0;
+
+	res::free();
+}

+ 4 - 0
examples/Game/part3/src/example.h

@@ -0,0 +1,4 @@
+void example_preinit();
+void example_init();
+void example_destroy();
+void example_update();

+ 17 - 0
examples/Game/part3/src/res.cpp

@@ -0,0 +1,17 @@
+#include "res.h"
+
+namespace res
+{
+	Resources ui;
+
+	void load()
+	{
+		ui.loadXML("xmls/ui.xml");
+	}
+
+	void free()
+	{
+		ui.free();
+
+	}
+}

+ 10 - 0
examples/Game/part3/src/res.h

@@ -0,0 +1,10 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+namespace res
+{
+	extern Resources ui;
+	void load();
+	void free();
+}

+ 19 - 0
examples/Game/part4/data/app.icf

@@ -0,0 +1,19 @@
+[S3E]
+MemSize = 64777216
+DispFixRot=Landscape
+SysGlesVersion=2
+SysStackSize=131072
+
+[Trace]
+ALL=0
+EXT=0
+NONE=0
+DEVICE=0
+FIBRE=0
+THREAD=0
+LOADER=0
+SOUND=0
+FILE=0
+SURFACE=0
+MEMORY=0
+ERROR=0

+ 107 - 0
examples/Game/part4/data/development.icf

@@ -0,0 +1,107 @@
+# Settings ICF file automatically generated by S3E development environment
+
+AccelEnabled                   = Type=bool, Default="true", Value = "true"
+AudioAAC                       = Type=bool, Default="false", Value = "false"
+AudioAACPlus                   = Type=bool, Default="false", Value = "false"
+AudioMIDI                      = Type=bool, Default="true", Value = "true"
+AudioMP3                       = Type=bool, Default="true", Value = "true"
+AudioPCM                       = Type=bool, Default="true", Value = "true"
+AudioQCP                       = Type=bool, Default="false", Value = "false"
+AudioVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"
+BacklightTimeout               = Type=int, Min=0.000000, Max=120000.000000, Default="10000", Value = "10000"
+CompassEnabled                 = Type=bool, Default="true", Value = "true"
+ContactsFromAddrBook           = Type=bool, Default="false", Value = "false"
+DeviceAdvanceSoftkeyPosition   = Type=string, Allowed="Bottom Left" "Bottom Right" "Top Right" "Top Left", Default="Bottom Left", Value = "Bottom Left"
+DeviceArch                     = Type=string, Allowed="<Use Native Architecture>" "ARM4T" "ARM4" "ARM5T" "ARM5TE" "ARM5TEJ" "ARM6" "ARM6K" "ARM6T2" "ARM6Z" "X86" "PPC" "AMD64" "ARM7", Default="<Use Native Architecture>", Value = "<Use Native Architecture>"
+DeviceBackSoftkeyPosition      = Type=string, Allowed="Bottom Left" "Bottom Right" "Top Right" "Top Left", Default="Bottom Right", Value = "Bottom Right"
+DeviceBatteryLevel             = Type=int, Min=0.000000, Max=100.000000, Default="50", Value = "50"
+DeviceClass                    = Type=string, Allowed="UNKNOWN" "SYMBIAN_GENERIC" "SYMBIAN_SERIES60" "SYMBIAN_SERIES60_EMULATOR" "SYMBIAN_UIQ" "SYMBIAN_UIQ_EMULATOR" "BREW_GENERIC" "BREW_QCIF_3D" "BREW_QCIF_25G" "BREW_SQCIF_256" "BREW_QVGA_3G" "WINDOWS_GENERIC" "WINMOBILE_GENERIC" "WINMOBILE_SP" "WINMOBILE_PPC" "LINUX_GENERIC" "LINUX_DESKTOP" "LINUX_EMBED" "WIPI_GENERIC" "NDS_GENERIC" "ARM_SEMIH_GENERIC" "NULCUES_GENERIC" "NGI_GENERIC", Default="WINDOWS_GENERIC", Value = "WINDOWS_GENERIC"
+DeviceFPU                      = Type=string, Allowed="None" "VFP Present", Default="VFP Present", Value = "VFP Present"
+DeviceFreeRAM                  = Type=int, Min=0.000000, Max=2097151.000000, Default="1048576", Value = "1048576"
+DeviceIDInt                    = Type=int, Default="0", Value = "0"
+DeviceIDString                 = Type=string, Default="", Value = ""
+DeviceIMSI                     = Type=string, Default="SIMULATOR_IMSI", Value = "SIMULATOR_IMSI"
+DeviceLSKIsBack                = Type=bool, Default="false", Value = "false"
+DeviceLanguage                 = Type=string, Allowed="UNKNOWN" "ENGLISH" "FRENCH" "GERMAN" "SPANISH" "ITALIAN" "PORTUGUESE" "DUTCH" "TURKISH" "CROATIAN" "CZECH" "DANISH" "FINNISH" "HUNGARIAN" "NORWEGIAN" "POLISH" "RUSSIAN" "SERBIAN" "SLOVAK" "SLOVENIAN" "SWEDISH" "UKRAINIAN" "GREEK" "JAPANESE" "SIMPL_CHINESE" "TRAD_CHINESE" "KOREAN" "ICELANDIC" "FLEMISH" "THAI" "AFRIKAANS" "ALBANIAN" "AMHARIC" "ARABIC" "ARMENIAN" "AZERBAIJANI" "TAGALOG" "BELARUSSIAN" "BENGALI" "BULGARIAN" "BURMESE" "CATALAN" "ESTONIAN" "FARSI" "GAELIC" "GEORGIAN" "GUJARATI" "HEBREW" "HINDI" "INDONESIAN" "IRISH" "KANNADA" "KAZAKH" "KHMER" "LAO" "LATVIAN" "LITHUANIAN" "MACEDONIAN" "MALAY" "MALAYALAM" "MARATHI" "MOLDOVIAN" "MONGOLIAN" "PUNJABI" "ROMANIAN" "SINHALESE" "SOMALI" "SWAHILI" "TAJIK" "TAMIL" "TELUGU" "TIBETAN" "TIGRINYA" "TURKMEN" "URDU" "UZBEK" "VIETNAMESE" "WELSH" "ZULU" "<Use Native Language>", Default="<Use Native Language>", Value = "<Use Native Language>"
+DeviceMainsPower               = Type=bool, Default="false", Value = "false"
+DeviceName                     = Type=string, Default="My Computer", Value = "My Computer"
+DeviceOS                       = Type=string, Allowed="NONE" "SYMBIAN" "BREW" "WINDOWS" "WINMOBILE" "LINUX" "WIPI" "NDS" "ARM_SEMIH" "NUCLEUS" "NGI" "WINCE" "SHARPEMP" "OSX" "IPHONE" "UIQ" "PS3" "X360" "ANDROID" "WEBOS" "QNX", Default="NONE", Value = "NONE"
+DeviceOSVersion                = Type=string, Default="", Value = ""
+DeviceOSVersionNumber          = Type=int, Default="0", Value = "0"
+DevicePhoneNumber              = Type=string, Default="0044123456789", Value = "0044123456789"
+DeviceTimezone                 = Type=string, Default="SYSTEM", Value = "SYSTEM"
+DeviceTotalRAM                 = Type=int, Min=0.000000, Max=2097151.000000, Default="1048576", Value = "1048576"
+DeviceUniqueID                 = Type=string, Default="SIMULATOR_ID", Value = "SIMULATOR_ID"
+DeviceUniqueIDInt              = Type=int, Default="01234567890", Value = "01234567890"
+FileTotalStorageSize           = Type=int, Min=0.000000, Max=2147483648.000000, Default="67108864", Value = "67108864"
+FileUseSeparateRomRam          = Type=bool, Default="true", Value = "true"
+FileUseTotalStorageSize        = Type=bool, Default="false", Value = "false"
+GLAPI                          = Type=string, Allowed="None" "GLES 1.0 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.1 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.0 Common Profile from Imagination POWERVR(TM)" "GLES 1.1 Common Profile from Imagination POWERVR(TM)" "GLES 2.0 from Imagination POWERVR(TM)" "Obey [S3E] SysGlesVersion .icf setting" "GLES 1.1 Common Profile from Qualcomm Snapdragon(TM)" "GLES 2.0 from Qualcomm Snapdragon(TM)" "GLES 2.0 ANGLE" "GLES 2.0 ANGLE DirectX 11", Default="Obey [S3E] SysGlesVersion .icf setting", Value = "Obey [S3E] SysGlesVersion .icf setting"
+GLDontUseHiddenWindow          = Type=bool, Default="false", Value = "false"
+GLTerminateOnSuspend           = Type=bool, Default="false", Value = "false"
+GLUsePVRVFrame                 = Type=bool, Default="false", Value = "false"
+KeyboardHasAlpha               = Type=bool, Default="true", Value = "true"
+KeyboardHasDirection           = Type=bool, Default="true", Value = "true"
+KeyboardHasKeypad              = Type=bool, Default="true", Value = "true"
+KeyboardNumpadRotation         = Type=string, Allowed="Rot0" "Rot90" "Rot180" "Rot270", Default="Rot0", Value = "Rot0"
+LicenseExpiryDate              = Type=int, Min=0.000000, Max=999999995904.000000, Default="0", Value = "0"
+LicenseMinutesRemaining        = Type=int, Min=0.000000, Max=10000000.000000, Default="0", Value = "0"
+LicenseStatus                  = Type=string, Allowed="EXPIRED" "DEMO" "USECOUNT" "EXPIRYDATE" "EXPIRYMINSUSE" "PURCHASE" "SUBSCRIPTION" "UPGRADE" "NONCOMMERCIAL", Default="NONCOMMERCIAL", Value = "NONCOMMERCIAL"
+LicenseUsesRemaining           = Type=int, Min=0.000000, Max=10000000.000000, Default="0", Value = "0"
+LocationAltitude               = Type=float, Min=-2000.000000, Max=100000.000000, Default="60.0", Value = "60.0"
+LocationAvailable              = Type=bool, Default="true", Value = "true"
+LocationHeading                = Type=float, Min=0.000000, Max=359.000000, Default="0.0", Value = "0.0"
+LocationHorizontalAccuracy     = Type=float, Min=0.000000, Max=100000.000000, Default="20.0", Value = "20.0"
+LocationLatitude               = Type=float, Min=-90.000000, Max=90.000000, Default="51.511791", Value = "51.511791"
+LocationLongitude              = Type=float, Min=-180.000000, Max=180.000000, Default="-0.191084", Value = "-0.191084"
+LocationSpeed                  = Type=float, Min=0.000000, Max=10000.000000, Default="0", Value = "0"
+LocationVerticalAccuracy       = Type=float, Min=0.000000, Max=100000.000000, Default="100.0", Value = "100.0"
+MacOSSimulatorCustomSettings   = Type=string, Default="", Value = ""
+MacOSSimulatorDevices_ANDROID  = Type=string, Allowed="Samsung Galaxy S:480x800:512" "HTC Sensation XL:480x800:768" "Samsung Galaxy Note:800x1280:1024" "Motorola Droid Razr:540x960:1024" "Kindle Fire:1024x600:512" "Samsung Galaxy Tab:1024x600:512", Default="Samsung Galaxy S:480x800:512", Value = "Samsung Galaxy S:480x800:512"
+MacOSSimulatorDevices_IPHONE   = Type=string, Allowed="iPhone 3GS:320x480:256" "iPhone 4:640x960:512" "iPhone 5:640x1136:1024" "iPad:768x1024:256" "iPad 2:768x1024:512" "iPad 3:1536x2048:1024", Default="iPhone 3GS:320x480:256", Value = "iPhone 3GS:320x480:256"
+MacOSSimulatorPlatforms        = Type=string, Allowed="IPHONE" "ANDROID", Default="IPHONE", Value = "IPHONE"
+MacOSSimulatorUseCustomSettings = Type=bool, Default="true", Value = "true"
+MemoryPoison                   = Type=bool, Default="true", Value = "true"
+MemoryPoisonAlloc              = Type=int, Min=0.000000, Max=255.000000, Default="170", Value = "170"
+MemoryPoisonFree               = Type=int, Min=0.000000, Max=255.000000, Default="221", Value = "221"
+MemoryPoisonInit               = Type=int, Min=0.000000, Max=255.000000, Default="204", Value = "204"
+PointerAvailable               = Type=bool, Default="true", Value = "true"
+PointerMultiSimulationMode     = Type=bool, Default="false", Value = "false"
+PointerMultiTouchAvailable     = Type=bool, Default="false", Value = "false"
+PointerStylusType              = Type=string, Allowed="INVALID" "STYLUS" "FINGER", Default="INVALID", Value = "INVALID"
+PointerType                    = Type=string, Allowed="INVALID" "MOUSE" "STYLUS", Default="MOUSE", Value = "MOUSE"
+SMSEnabled                     = Type=bool, Default="true", Value = "true"
+SMSReceiveEnabled              = Type=bool, Default="true", Value = "true"
+SocketDNSDelay                 = Type=int, Min=0.000000, Max=30000.000000, Default="0", Value = "0"
+SocketHTTPProxy                = Type=string, Default="", Value = ""
+SocketHostName                 = Type=string, Default="", Value = ""
+SocketNetworkAvailable         = Type=bool, Default="true", Value = "true"
+SocketNetworkLoss              = Type=bool, Default="false", Value = "false"
+SocketNetworkType              = Type=string, Allowed="NONE" "UNKNOWN" "LAN" "WLAN" "GPRS" "UMTS" "EVDO" "CDMA2000" "HSDPA" "WIMAX" "BLUETOOTH" "EDGE" "CDMA" "IDEN" "LTE" "EHRPD" "HSPAPLUS", Default="LAN", Value = "LAN"
+SocketRecvLimit                = Type=int, Min=0.000000, Max=1000000.000000, Default="0", Value = "0"
+SocketSendLimit                = Type=int, Min=0.000000, Max=1000000.000000, Default="0", Value = "0"
+SoundEnabled                   = Type=bool, Default="true", Value = "true"
+SoundRecordEnabled             = Type=bool, Default="true", Value = "true"
+SoundSampleRate                = Type=int, Allowed="8192" "11025" "16000" "22050" "44100", Default="22050", Value = "22050"
+SoundStereo                    = Type=bool, Default="true", Value = "true"
+SoundVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"
+SurfaceDisableWhenGLIsActive   = Type=bool, Default="false", Value = "false"
+SurfaceDoubleBuffer            = Type=bool, Default="false", Value = "false"
+SurfaceHeight                  = Type=int, Min=128.000000, Max=4096.000000, Default="480", Value = "640"
+SurfacePitch                   = Type=int, Min=0.000000, Max=8192.000000, Default="0", Value = "0"
+SurfacePixelType               = Type=string, Allowed="RGB444" "RGB555" "RGB565" "RGB666" "RGB888" "BGR444" "BGR555" "BGR565" "BGR666" "BGR888", Default="RGB565", Value = "RGB565"
+SurfacePredefinedResolution    = Type=string, Allowed="176x200" "176x208" "240x320 (QVGA Portrait)" "240x400" "320x240 (QVGA Landscape)" "320x400" "320x480 (iPhone Portrait)" "400x240" "480x320 (iPhone Landscape)" "360x640 (qHD Portrait)" "640x360 (qHD Landscape)" "480x640 (VGA Portrait)" "480x800 (WVGA Portrait)" "640x480 (VGA Landscape)" "800x400" "800x480 (WVGA Landscape)" "640x960 (iPhone 4 Portrait)" "960x640 (iPhone 4 Landscape)" "640x1136 (iPhone 5 Portrait)" "1136x640 (iPhone 5 Landscape)" "1024x600 (Playbook Landscape)" "600x1024 (Playbook Portrait)" "768x1024 (iPad Portrait)" "1024x768 (iPad Landscape)" "2048x1536 (iPad Retina Landscape)" "1536x2048 (iPad Retina Portrait)", Default="320x480 (iPhone Portrait)", Value = "176x200"
+SurfaceRotation                = Type=string, Allowed="Rot0" "Rot90" "Rot180" "Rot270", Default="Rot0", Value = "Rot0"
+SurfaceUnalign                 = Type=bool, Default="true", Value = "true"
+SurfaceUseMultiBuffers         = Type=bool, Default="true", Value = "true"
+SurfaceWidth                   = Type=int, Min=128.000000, Max=4096.000000, Default="320", Value = "960"
+SymbianSoundLatency            = Type=int, Min=20.000000, Max=1400.000000, Default="120", Value = "120"
+ThreadEnabled                  = Type=bool, Default="true", Value = "true"
+TimerAccuracy                  = Type=int, Min=0.000000, Max=1000.000000, Default="0", Value = "0"
+TimerHiRes                     = Type=bool, Default="false", Value = "false"
+TimerLocaltimeOffsetHours      = Type=string, Allowed="-12" "-11" "-10" "-9" "-8" "-7" "-6" "-5" "-4" "-3" "-2" "-1" "0" "+1" "+2" "+3" "+4" "+5" "+6" "+7" "+8" "+9" "+10" "+11" "+12" "+13" "SYSTEM", Default="SYSTEM", Value = "SYSTEM"
+VibraEnabled                   = Type=bool, Default="true", Value = "true"
+Video3GPP                      = Type=bool, Default="false", Value = "false"
+VideoJPEG                      = Type=bool, Default="true", Value = "true"
+VideoMPEG4                     = Type=bool, Default="true", Value = "true"
+VideoVolumeDefault             = Type=int, Min=0.000000, Max=256.000000, Default="256", Value = "256"

+ 105 - 0
examples/Game/part4/data/fonts/huge.fnt

@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<font>
+  <info face="Comic Sans MS" size="-48" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="1,1" outline="2"/>
+  <common lineHeight="67" base="53" scaleW="512" scaleH="512" pages="1" packed="0" alphaChnl="1" redChnl="0" greenChnl="0" blueChnl="0"/>
+  <pages>
+    <page id="0" file="huge_0.png" />
+  </pages>
+  <chars count="95">
+    <char id="32" x="499" y="149" width="7" height="5" xoffset="-3" yoffset="64" xadvance="21" page="0" chnl="15" />
+    <char id="33" x="180" y="51" width="12" height="43" xoffset="-1" yoffset="13" xadvance="11" page="0" chnl="15" />
+    <char id="34" x="131" y="216" width="23" height="19" xoffset="-1" yoffset="13" xadvance="21" page="0" chnl="15" />
+    <char id="35" x="391" y="0" width="45" height="43" xoffset="-3" yoffset="13" xadvance="40" page="0" chnl="15" />
+    <char id="36" x="0" y="0" width="34" height="53" xoffset="-1" yoffset="11" xadvance="33" page="0" chnl="15" />
+    <char id="37" x="307" y="46" width="41" height="42" xoffset="0" yoffset="13" xadvance="39" page="0" chnl="15" />
+    <char id="38" x="0" y="98" width="35" height="42" xoffset="-2" yoffset="15" xadvance="31" page="0" chnl="15" />
+    <char id="39" x="499" y="129" width="12" height="19" xoffset="4" yoffset="13" xadvance="21" page="0" chnl="15" />
+    <char id="40" x="57" y="0" width="21" height="52" xoffset="-1" yoffset="13" xadvance="18" page="0" chnl="15" />
+    <char id="41" x="35" y="0" width="21" height="52" xoffset="-1" yoffset="13" xadvance="18" page="0" chnl="15" />
+    <char id="42" x="75" y="223" width="29" height="23" xoffset="-3" yoffset="13" xadvance="25" page="0" chnl="15" />
+    <char id="43" x="24" y="223" width="28" height="25" xoffset="1" yoffset="26" xadvance="29" page="0" chnl="15" />
+    <char id="44" x="234" y="211" width="15" height="15" xoffset="2" yoffset="48" xadvance="21" page="0" chnl="15" />
+    <char id="45" x="264" y="211" width="25" height="9" xoffset="2" yoffset="36" xadvance="29" page="0" chnl="15" />
+    <char id="46" x="250" y="211" width="13" height="10" xoffset="4" yoffset="47" xadvance="21" page="0" chnl="15" />
+    <char id="47" x="362" y="0" width="28" height="44" xoffset="-2" yoffset="13" xadvance="25" page="0" chnl="15" />
+    <char id="48" x="255" y="137" width="33" height="41" xoffset="-2" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="49" x="476" y="129" width="22" height="40" xoffset="3" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="50" x="446" y="129" width="29" height="40" xoffset="0" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="51" x="299" y="90" width="30" height="42" xoffset="-1" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="52" x="220" y="138" width="34" height="41" xoffset="-3" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="53" x="140" y="96" width="31" height="42" xoffset="-1" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="54" x="204" y="95" width="31" height="42" xoffset="-1" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="55" x="150" y="139" width="34" height="41" xoffset="-2" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="56" x="172" y="96" width="31" height="42" xoffset="-1" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="57" x="322" y="133" width="32" height="41" xoffset="-2" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="58" x="498" y="170" width="13" height="28" xoffset="4" yoffset="26" xadvance="21" page="0" chnl="15" />
+    <char id="59" x="81" y="182" width="15" height="35" xoffset="2" yoffset="26" xadvance="21" page="0" chnl="15" />
+    <char id="60" x="53" y="223" width="21" height="24" xoffset="3" yoffset="26" xadvance="29" page="0" chnl="15" />
+    <char id="61" x="105" y="216" width="25" height="19" xoffset="2" yoffset="29" xadvance="29" page="0" chnl="15" />
+    <char id="62" x="0" y="224" width="23" height="26" xoffset="4" yoffset="26" xadvance="29" page="0" chnl="15" />
+    <char id="63" x="355" y="132" width="29" height="41" xoffset="-1" yoffset="15" xadvance="27" page="0" chnl="15" />
+    <char id="64" x="282" y="0" width="46" height="45" xoffset="-1" yoffset="13" xadvance="45" page="0" chnl="15" />
+    <char id="65" x="77" y="140" width="36" height="41" xoffset="-1" yoffset="15" xadvance="35" page="0" chnl="15" />
+    <char id="66" x="289" y="133" width="32" height="41" xoffset="0" yoffset="15" xadvance="30" page="0" chnl="15" />
+    <char id="67" x="72" y="97" width="34" height="42" xoffset="-2" yoffset="14" xadvance="30" page="0" chnl="15" />
+    <char id="68" x="36" y="98" width="35" height="42" xoffset="1" yoffset="15" xadvance="35" page="0" chnl="15" />
+    <char id="69" x="329" y="0" width="32" height="44" xoffset="0" yoffset="13" xadvance="30" page="0" chnl="15" />
+    <char id="70" x="107" y="96" width="32" height="42" xoffset="-1" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="71" x="391" y="44" width="38" height="42" xoffset="-2" yoffset="15" xadvance="33" page="0" chnl="15" />
+    <char id="72" x="470" y="87" width="38" height="41" xoffset="0" yoffset="15" xadvance="37" page="0" chnl="15" />
+    <char id="73" x="415" y="130" width="30" height="40" xoffset="-2" yoffset="15" xadvance="26" page="0" chnl="15" />
+    <char id="74" x="437" y="0" width="35" height="43" xoffset="-1" yoffset="15" xadvance="32" page="0" chnl="15" />
+    <char id="75" x="473" y="0" width="31" height="43" xoffset="0" yoffset="15" xadvance="29" page="0" chnl="15" />
+    <char id="76" x="268" y="90" width="30" height="42" xoffset="-1" yoffset="15" xadvance="26" page="0" chnl="15" />
+    <char id="77" x="261" y="47" width="45" height="42" xoffset="-1" yoffset="15" xadvance="42" page="0" chnl="15" />
+    <char id="78" x="349" y="45" width="41" height="42" xoffset="-1" yoffset="15" xadvance="39" page="0" chnl="15" />
+    <char id="79" x="389" y="88" width="40" height="41" xoffset="-1" yoffset="15" xadvance="38" page="0" chnl="15" />
+    <char id="80" x="385" y="131" width="29" height="41" xoffset="-1" yoffset="15" xadvance="26" page="0" chnl="15" />
+    <char id="81" x="164" y="0" width="47" height="50" xoffset="-2" yoffset="15" xadvance="42" page="0" chnl="15" />
+    <char id="82" x="185" y="139" width="34" height="41" xoffset="-1" yoffset="15" xadvance="31" page="0" chnl="15" />
+    <char id="83" x="15" y="183" width="37" height="39" xoffset="-2" yoffset="17" xadvance="33" page="0" chnl="15" />
+    <char id="84" x="0" y="141" width="38" height="41" xoffset="-2" yoffset="15" xadvance="33" page="0" chnl="15" />
+    <char id="85" x="430" y="44" width="37" height="42" xoffset="-1" yoffset="15" xadvance="35" page="0" chnl="15" />
+    <char id="86" x="114" y="139" width="35" height="41" xoffset="-1" yoffset="15" xadvance="32" page="0" chnl="15" />
+    <char id="87" x="206" y="51" width="54" height="42" xoffset="-2" yoffset="15" xadvance="50" page="0" chnl="15" />
+    <char id="88" x="430" y="87" width="39" height="41" xoffset="-2" yoffset="15" xadvance="35" page="0" chnl="15" />
+    <char id="89" x="468" y="44" width="36" height="42" xoffset="-3" yoffset="15" xadvance="31" page="0" chnl="15" />
+    <char id="90" x="39" y="141" width="37" height="41" xoffset="-2" yoffset="15" xadvance="33" page="0" chnl="15" />
+    <char id="91" x="212" y="0" width="20" height="50" xoffset="0" yoffset="15" xadvance="18" page="0" chnl="15" />
+    <char id="92" x="153" y="52" width="26" height="43" xoffset="1" yoffset="15" xadvance="26" page="0" chnl="15" />
+    <char id="93" x="233" y="0" width="19" height="50" xoffset="-1" yoffset="15" xadvance="18" page="0" chnl="15" />
+    <char id="94" x="155" y="214" width="27" height="16" xoffset="1" yoffset="11" xadvance="29" page="0" chnl="15" />
+    <char id="95" x="290" y="210" width="40" height="8" xoffset="-5" yoffset="55" xadvance="30" page="0" chnl="15" />
+    <char id="96" x="216" y="213" width="17" height="15" xoffset="0" yoffset="12" xadvance="27" page="0" chnl="15" />
+    <char id="97" x="265" y="179" width="30" height="30" xoffset="-1" yoffset="26" xadvance="27" page="0" chnl="15" />
+    <char id="98" x="32" y="54" width="30" height="43" xoffset="-1" yoffset="13" xadvance="28" page="0" chnl="15" />
+    <char id="99" x="414" y="173" width="28" height="30" xoffset="-2" yoffset="26" xadvance="25" page="0" chnl="15" />
+    <char id="100" x="0" y="54" width="31" height="43" xoffset="-2" yoffset="13" xadvance="28" page="0" chnl="15" />
+    <char id="101" x="296" y="175" width="30" height="30" xoffset="-2" yoffset="26" xadvance="27" page="0" chnl="15" />
+    <char id="102" x="253" y="0" width="28" height="46" xoffset="-2" yoffset="13" xadvance="24" page="0" chnl="15" />
+    <char id="103" x="330" y="89" width="29" height="42" xoffset="-2" yoffset="26" xadvance="25" page="0" chnl="15" />
+    <char id="104" x="123" y="52" width="29" height="43" xoffset="0" yoffset="13" xadvance="28" page="0" chnl="15" />
+    <char id="105" x="0" y="183" width="14" height="40" xoffset="0" yoffset="16" xadvance="13" page="0" chnl="15" />
+    <char id="106" x="140" y="0" width="23" height="51" xoffset="-4" yoffset="17" xadvance="19" page="0" chnl="15" />
+    <char id="107" x="93" y="52" width="29" height="43" xoffset="-1" yoffset="13" xadvance="26" page="0" chnl="15" />
+    <char id="108" x="193" y="51" width="12" height="43" xoffset="0" yoffset="13" xadvance="13" page="0" chnl="15" />
+    <char id="109" x="97" y="182" width="40" height="33" xoffset="-1" yoffset="25" xadvance="37" page="0" chnl="15" />
+    <char id="110" x="138" y="181" width="28" height="32" xoffset="-1" yoffset="25" xadvance="25" page="0" chnl="15" />
+    <char id="111" x="327" y="175" width="28" height="30" xoffset="-2" yoffset="26" xadvance="25" page="0" chnl="15" />
+    <char id="112" x="63" y="53" width="29" height="43" xoffset="-1" yoffset="25" xadvance="26" page="0" chnl="15" />
+    <char id="113" x="360" y="88" width="28" height="42" xoffset="-2" yoffset="26" xadvance="25" page="0" chnl="15" />
+    <char id="114" x="205" y="181" width="26" height="31" xoffset="-1" yoffset="26" xadvance="23" page="0" chnl="15" />
+    <char id="115" x="471" y="170" width="26" height="30" xoffset="-2" yoffset="26" xadvance="23" page="0" chnl="15" />
+    <char id="116" x="53" y="183" width="27" height="39" xoffset="-2" yoffset="18" xadvance="23" page="0" chnl="15" />
+    <char id="117" x="443" y="171" width="27" height="30" xoffset="-1" yoffset="26" xadvance="25" page="0" chnl="15" />
+    <char id="118" x="356" y="174" width="28" height="30" xoffset="-2" yoffset="26" xadvance="23" page="0" chnl="15" />
+    <char id="119" x="167" y="181" width="37" height="31" xoffset="-2" yoffset="26" xadvance="33" page="0" chnl="15" />
+    <char id="120" x="232" y="180" width="32" height="30" xoffset="-2" yoffset="26" xadvance="28" page="0" chnl="15" />
+    <char id="121" x="236" y="94" width="31" height="42" xoffset="-2" yoffset="26" xadvance="27" page="0" chnl="15" />
+    <char id="122" x="385" y="173" width="28" height="30" xoffset="-1" yoffset="26" xadvance="26" page="0" chnl="15" />
+    <char id="123" x="116" y="0" width="23" height="51" xoffset="-3" yoffset="13" xadvance="18" page="0" chnl="15" />
+    <char id="124" x="79" y="0" width="12" height="52" xoffset="4" yoffset="11" xadvance="20" page="0" chnl="15" />
+    <char id="125" x="92" y="0" width="23" height="51" xoffset="-3" yoffset="13" xadvance="18" page="0" chnl="15" />
+    <char id="126" x="183" y="213" width="32" height="15" xoffset="-2" yoffset="29" xadvance="29" page="0" chnl="15" />
+  </chars>
+</font>

BIN
examples/Game/part4/data/fonts/huge_0.png


+ 105 - 0
examples/Game/part4/data/fonts/normal.fnt

@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<font>
+  <info face="Comic Sans MS" size="-32" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="1,1" outline="0"/>
+  <common lineHeight="45" base="36" scaleW="512" scaleH="128" pages="1" packed="0" alphaChnl="0" redChnl="4" greenChnl="4" blueChnl="4"/>
+  <pages>
+    <page id="0" file="normal_0.png" />
+  </pages>
+  <chars count="95">
+    <char id="32" x="507" y="0" width="3" height="1" xoffset="-1" yoffset="44" xadvance="14" page="0" chnl="15" />
+    <char id="33" x="107" y="32" width="6" height="26" xoffset="1" yoffset="11" xadvance="8" page="0" chnl="15" />
+    <char id="34" x="78" y="85" width="12" height="10" xoffset="1" yoffset="11" xadvance="14" page="0" chnl="15" />
+    <char id="35" x="250" y="0" width="28" height="26" xoffset="-1" yoffset="11" xadvance="27" page="0" chnl="15" />
+    <char id="36" x="0" y="0" width="20" height="34" xoffset="1" yoffset="8" xadvance="22" page="0" chnl="15" />
+    <char id="37" x="308" y="0" width="25" height="26" xoffset="1" yoffset="10" xadvance="26" page="0" chnl="15" />
+    <char id="38" x="406" y="0" width="21" height="26" xoffset="0" yoffset="12" xadvance="21" page="0" chnl="15" />
+    <char id="39" x="91" y="85" width="6" height="10" xoffset="4" yoffset="11" xadvance="14" page="0" chnl="15" />
+    <char id="40" x="55" y="0" width="12" height="32" xoffset="0" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="41" x="42" y="0" width="12" height="32" xoffset="0" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="42" x="43" y="86" width="17" height="13" xoffset="-1" yoffset="11" xadvance="17" page="0" chnl="15" />
+    <char id="43" x="61" y="86" width="16" height="13" xoffset="2" yoffset="20" xadvance="20" page="0" chnl="15" />
+    <char id="44" x="140" y="84" width="7" height="8" xoffset="3" yoffset="34" xadvance="14" page="0" chnl="15" />
+    <char id="45" x="173" y="54" width="14" height="3" xoffset="3" yoffset="26" xadvance="20" page="0" chnl="15" />
+    <char id="46" x="168" y="84" width="6" height="4" xoffset="4" yoffset="34" xadvance="14" page="0" chnl="15" />
+    <char id="47" x="116" y="59" width="17" height="25" xoffset="0" yoffset="12" xadvance="16" page="0" chnl="15" />
+    <char id="48" x="426" y="27" width="20" height="25" xoffset="0" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="49" x="227" y="53" width="13" height="24" xoffset="3" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="50" x="190" y="54" width="18" height="24" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="51" x="40" y="60" width="18" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="52" x="169" y="58" width="20" height="24" xoffset="0" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="53" x="0" y="62" width="19" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="54" x="78" y="59" width="18" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="55" x="361" y="27" width="21" height="25" xoffset="0" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="56" x="59" y="60" width="18" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="57" x="447" y="27" width="20" height="25" xoffset="0" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="58" x="503" y="53" width="6" height="16" xoffset="4" yoffset="19" xadvance="14" page="0" chnl="15" />
+    <char id="59" x="290" y="53" width="8" height="20" xoffset="3" yoffset="19" xadvance="14" page="0" chnl="15" />
+    <char id="60" x="30" y="88" width="12" height="14" xoffset="3" yoffset="19" xadvance="20" page="0" chnl="15" />
+    <char id="61" x="98" y="85" width="14" height="9" xoffset="3" yoffset="23" xadvance="20" page="0" chnl="15" />
+    <char id="62" x="16" y="88" width="13" height="15" xoffset="4" yoffset="19" xadvance="20" page="0" chnl="15" />
+    <char id="63" x="152" y="58" width="16" height="25" xoffset="1" yoffset="12" xadvance="18" page="0" chnl="15" />
+    <char id="64" x="168" y="0" width="29" height="27" xoffset="0" yoffset="11" xadvance="30" page="0" chnl="15" />
+    <char id="65" x="383" y="27" width="21" height="25" xoffset="1" yoffset="12" xadvance="23" page="0" chnl="15" />
+    <char id="66" x="488" y="27" width="19" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="67" x="405" y="27" width="20" height="25" xoffset="0" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="68" x="383" y="0" width="22" height="26" xoffset="1" yoffset="12" xadvance="23" page="0" chnl="15" />
+    <char id="69" x="448" y="0" width="19" height="26" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="70" x="97" y="59" width="18" height="25" xoffset="1" yoffset="12" xadvance="19" page="0" chnl="15" />
+    <char id="71" x="246" y="27" width="23" height="25" xoffset="0" yoffset="12" xadvance="22" page="0" chnl="15" />
+    <char id="72" x="222" y="27" width="23" height="25" xoffset="1" yoffset="12" xadvance="25" page="0" chnl="15" />
+    <char id="73" x="209" y="54" width="17" height="24" xoffset="0" yoffset="12" xadvance="17" page="0" chnl="15" />
+    <char id="74" x="360" y="0" width="22" height="26" xoffset="0" yoffset="12" xadvance="21" page="0" chnl="15" />
+    <char id="75" x="468" y="0" width="19" height="26" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="76" x="20" y="62" width="19" height="25" xoffset="0" yoffset="12" xadvance="18" page="0" chnl="15" />
+    <char id="77" x="279" y="0" width="28" height="26" xoffset="0" yoffset="12" xadvance="28" page="0" chnl="15" />
+    <char id="78" x="334" y="0" width="25" height="26" xoffset="1" yoffset="12" xadvance="26" page="0" chnl="15" />
+    <char id="79" x="121" y="32" width="26" height="25" xoffset="0" yoffset="12" xadvance="26" page="0" chnl="15" />
+    <char id="80" x="134" y="58" width="17" height="25" xoffset="0" yoffset="12" xadvance="17" page="0" chnl="15" />
+    <char id="81" x="68" y="0" width="29" height="31" xoffset="0" yoffset="12" xadvance="28" page="0" chnl="15" />
+    <char id="82" x="468" y="27" width="19" height="25" xoffset="1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="83" x="270" y="27" width="22" height="25" xoffset="0" yoffset="12" xadvance="22" page="0" chnl="15" />
+    <char id="84" x="173" y="28" width="24" height="25" xoffset="-1" yoffset="12" xadvance="22" page="0" chnl="15" />
+    <char id="85" x="293" y="27" width="22" height="25" xoffset="1" yoffset="12" xadvance="24" page="0" chnl="15" />
+    <char id="86" x="316" y="27" width="22" height="25" xoffset="0" yoffset="12" xadvance="22" page="0" chnl="15" />
+    <char id="87" x="216" y="0" width="33" height="26" xoffset="0" yoffset="12" xadvance="33" page="0" chnl="15" />
+    <char id="88" x="148" y="32" width="24" height="25" xoffset="-1" yoffset="12" xadvance="23" page="0" chnl="15" />
+    <char id="89" x="339" y="27" width="21" height="25" xoffset="-1" yoffset="12" xadvance="20" page="0" chnl="15" />
+    <char id="90" x="198" y="28" width="23" height="25" xoffset="-1" yoffset="12" xadvance="22" page="0" chnl="15" />
+    <char id="91" x="139" y="0" width="11" height="31" xoffset="1" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="92" x="90" y="32" width="16" height="26" xoffset="1" yoffset="12" xadvance="18" page="0" chnl="15" />
+    <char id="93" x="127" y="0" width="11" height="31" xoffset="0" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="94" x="113" y="85" width="16" height="8" xoffset="2" yoffset="9" xadvance="20" page="0" chnl="15" />
+    <char id="95" x="175" y="83" width="24" height="3" xoffset="-2" yoffset="38" xadvance="20" page="0" chnl="15" />
+    <char id="96" x="130" y="85" width="9" height="8" xoffset="1" yoffset="9" xadvance="18" page="0" chnl="15" />
+    <char id="97" x="342" y="53" width="18" height="18" xoffset="0" yoffset="19" xadvance="18" page="0" chnl="15" />
+    <char id="98" x="0" y="35" width="17" height="26" xoffset="1" yoffset="11" xadvance="19" page="0" chnl="15" />
+    <char id="99" x="470" y="53" width="16" height="18" xoffset="0" yoffset="19" xadvance="16" page="0" chnl="15" />
+    <char id="100" x="488" y="0" width="18" height="26" xoffset="0" yoffset="11" xadvance="19" page="0" chnl="15" />
+    <char id="101" x="361" y="53" width="18" height="18" xoffset="0" yoffset="19" xadvance="18" page="0" chnl="15" />
+    <char id="102" x="151" y="0" width="16" height="28" xoffset="0" yoffset="11" xadvance="16" page="0" chnl="15" />
+    <char id="103" x="18" y="35" width="17" height="26" xoffset="0" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="104" x="36" y="33" width="17" height="26" xoffset="1" yoffset="11" xadvance="18" page="0" chnl="15" />
+    <char id="105" x="241" y="53" width="7" height="24" xoffset="1" yoffset="13" xadvance="9" page="0" chnl="15" />
+    <char id="106" x="27" y="0" width="14" height="32" xoffset="-2" yoffset="13" xadvance="13" page="0" chnl="15" />
+    <char id="107" x="72" y="32" width="17" height="26" xoffset="1" yoffset="11" xadvance="17" page="0" chnl="15" />
+    <char id="108" x="114" y="32" width="6" height="26" xoffset="1" yoffset="11" xadvance="9" page="0" chnl="15" />
+    <char id="109" x="265" y="53" width="24" height="20" xoffset="1" yoffset="18" xadvance="25" page="0" chnl="15" />
+    <char id="110" x="380" y="53" width="17" height="18" xoffset="0" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="111" x="398" y="53" width="17" height="18" xoffset="0" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="112" x="198" y="0" width="17" height="27" xoffset="0" yoffset="18" xadvance="17" page="0" chnl="15" />
+    <char id="113" x="54" y="33" width="17" height="26" xoffset="-1" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="114" x="0" y="88" width="15" height="18" xoffset="0" yoffset="19" xadvance="15" page="0" chnl="15" />
+    <char id="115" x="487" y="53" width="15" height="18" xoffset="0" yoffset="19" xadvance="16" page="0" chnl="15" />
+    <char id="116" x="249" y="53" width="15" height="23" xoffset="0" yoffset="14" xadvance="15" page="0" chnl="15" />
+    <char id="117" x="416" y="53" width="17" height="18" xoffset="0" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="118" x="434" y="53" width="17" height="18" xoffset="0" yoffset="19" xadvance="16" page="0" chnl="15" />
+    <char id="119" x="299" y="53" width="22" height="18" xoffset="0" yoffset="19" xadvance="22" page="0" chnl="15" />
+    <char id="120" x="322" y="53" width="19" height="18" xoffset="0" yoffset="19" xadvance="19" page="0" chnl="15" />
+    <char id="121" x="428" y="0" width="19" height="26" xoffset="-1" yoffset="19" xadvance="18" page="0" chnl="15" />
+    <char id="122" x="452" y="53" width="17" height="18" xoffset="0" yoffset="19" xadvance="17" page="0" chnl="15" />
+    <char id="123" x="113" y="0" width="13" height="31" xoffset="-1" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="124" x="21" y="0" width="5" height="33" xoffset="4" yoffset="9" xadvance="13" page="0" chnl="15" />
+    <char id="125" x="98" y="0" width="14" height="31" xoffset="-1" yoffset="11" xadvance="12" page="0" chnl="15" />
+    <char id="126" x="148" y="84" width="19" height="7" xoffset="0" yoffset="22" xadvance="20" page="0" chnl="15" />
+  </chars>
+</font>

BIN
examples/Game/part4/data/fonts/normal_0.png


BIN
examples/Game/part4/data/images/asteroid.png


BIN
examples/Game/part4/data/images/explosion.png


BIN
examples/Game/part4/data/images/rocket.png


BIN
examples/Game/part4/data/images/ship.png


BIN
examples/Game/part4/data/images/shipengine.png


BIN
examples/Game/part4/data/images/sky.jpg


BIN
examples/Game/part4/data/images/ui/bg.jpg


BIN
examples/Game/part4/data/images/ui/box9.png


BIN
examples/Game/part4/data/images/ui/buttons.png


BIN
examples/Game/part4/data/images/ui/finger.png


BIN
examples/Game/part4/data/images/ui/joystick.png


BIN
examples/Game/part4/data/images/ui/logo2.png


BIN
examples/Game/part4/data/images/ui/menu.png


BIN
examples/Game/part4/data/images/ui/play.png


+ 28 - 0
examples/Game/part4/data/xmls/ui.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<resources>
+	<set path = "images/ui" />
+	<atlas>
+		<image file="joystick.png" />
+		<image file="finger.png" />
+		<image file="play.png" />
+		<image file="logo2.png" />
+		<image file="menu.png" />
+		<image file="box9.png" />
+		<image file="bg.jpg" />
+		<image file="buttons.png" rows="5" cols="2"/>
+	</atlas>
+
+	<set path = "fonts" />
+	<font file="normal.fnt"/>
+	<font id="big" file="huge.fnt"/>
+
+	<set path = "images" />
+	<atlas>
+		<image file="sky.jpg" />
+		<image file="ship.png" />
+		<image file="shipengine.png" />
+		<image file="rocket.png" />
+		<image file="explosion.png" cols="12"/>
+		<image file="asteroid.png"/>
+	</atlas>
+</resources>

+ 28 - 0
examples/Game/part4/game.mkb

@@ -0,0 +1,28 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+}
+
+assets
+{
+	(data)
+}

+ 41 - 0
examples/Game/part4/src/Enemy.cpp

@@ -0,0 +1,41 @@
+#include "Enemy.h"
+#include "res.h"
+
+void Enemy::_init()
+{
+	//you could hit enemy 3 times
+	_hp = 3;
+
+	spSprite sprite = new Sprite;
+	sprite->setResAnim(res::ui.getResAnim("asteroid"));
+	sprite->attachTo(_view);
+	sprite->setAnchor(Vector2(0.5f, 0.5f));
+
+	//it random scale and rotation
+	sprite->setRotation(scalar::randFloat(0, MATH_PI * 2));
+	sprite->setScale(scalar::randFloat(0.5f, 1.0f));
+
+	//it is rotating by tween with random speed
+	float dest = MATH_PI * 2;
+	if (rand() % 2 == 0)
+		dest *= -1;
+	dest += sprite->getRotation();
+	sprite->addTween(Sprite::TweenRotation(dest), rand() % 12000 + 10000, -1);
+}
+
+void Enemy::_update(const UpdateState &us)
+{
+	//nothing to do
+}
+
+void Enemy::explode()
+{
+	//hit by rocket
+	_hp--;
+	if (_hp == 0)
+	{
+		//dead, hide it with alpha tween
+		_dead = true;
+		_view->addTween(Actor::TweenAlpha(0), 300)->setDetachActor(true);
+	}
+}

+ 15 - 0
examples/Game/part4/src/Enemy.h

@@ -0,0 +1,15 @@
+#pragma once
+#include "Unit.h"
+
+DECLARE_SMART(Enemy, spEnemy);
+class Enemy: public Unit
+{
+public:
+
+	void explode();
+
+private:
+	void _init();
+	void _update(const UpdateState &us);
+	int _hp;
+};

+ 78 - 0
examples/Game/part4/src/Game.cpp

@@ -0,0 +1,78 @@
+#include "Game.h"
+#include "Joystick.h"
+#include "Player.h"
+#include "res.h"
+#include "Enemy.h"
+
+Game::Game()
+{
+	
+}
+
+Game::~Game()
+{
+
+}
+
+void Game::init()
+{
+	//scene layer would have size of display
+	setSize(getRoot()->getSize());
+
+	//create background
+	spSprite sky = new Sprite;
+	sky->setResAnim(res::ui.getResAnim("sky"));
+	sky->attachTo(this);
+	
+	//create separate layer for elements virtual joystick and other UI in future
+	_ui = new Actor;
+	_ui->attachTo(this);
+	//it would be higher than other actors with default priority = 0
+	_ui->setPriority(1);
+
+	//create virtual joystick and attach it to UI
+	_move = new Joystick;
+	_move->attachTo(_ui);
+	_move->setY(getHeight() - _move->getHeight());
+
+	//create virtual joystick and attach it to UI
+	_fire = new Joystick;
+	_fire->attachTo(_ui);
+	_fire->setX(getWidth() - _fire->getWidth());
+	_fire->setY(getHeight() - _fire->getHeight());
+
+
+	//create enemies
+	for (int i = 0; i < 10; ++i)
+	{
+		spEnemy enemy = new Enemy;
+		enemy->init(Vector2(scalar::randFloat(0, getWidth()), scalar::randFloat(0, getHeight())), this);
+	}	
+
+
+	//create player ship
+	_player = new Player;
+	_player->init(getSize()/2, this);
+
+}
+
+void Game::doUpdate(const UpdateState &us)
+{
+	//update all units
+	//ship, rocket and enemies are in this list
+	for (units::iterator i = _units.begin(); i != _units.end(); )
+	{
+		spUnit unit = *i;
+		unit->update(us);
+
+		if (unit->isDead())
+		{
+			//it is dead. Time to remove it from list
+			i = _units.erase(i);
+		}
+		else
+		{
+			++i;
+		}
+	}
+}

+ 35 - 0
examples/Game/part4/src/Game.h

@@ -0,0 +1,35 @@
+#pragma once
+#include "oxygine-framework.h"
+#include <list>
+using namespace oxygine;
+
+DECLARE_SMART(Player, spPlayer);
+DECLARE_SMART(Joystick, spJoystick);
+DECLARE_SMART(Game, spGame);
+DECLARE_SMART(Rocket, spRocket);
+DECLARE_SMART(Unit, spUnit);
+
+class Game: public Actor
+{
+public:
+	Game();
+	~Game();
+
+	void init();
+
+protected:
+	friend class Rocket;
+	friend class Player;
+	friend class Unit;
+
+	void doUpdate(const UpdateState &us);
+
+	spActor _ui;
+	spJoystick _move;
+	spJoystick _fire;
+
+	spPlayer _player;
+
+	typedef std::list<spUnit> units;
+	units _units;
+};

+ 112 - 0
examples/Game/part4/src/GameMenu.cpp

@@ -0,0 +1,112 @@
+#include "GameMenu.h"
+#include "MainMenuScene.h"
+#include "MyButton.h"
+#include "res.h"
+
+spGameMenu GameMenu::instance;
+
+GameMenu::GameMenu()
+{
+	//initialize dialog background
+	_bg = initActor(new Box9Sprite,
+		arg_attachTo = _view,		
+		arg_resAnim = res::ui.getResAnim("box9"),
+		arg_pos = _view->getSize()/2 - Vector2(300, 300)/2);
+
+	_bg->setGuides(30, 30, 30, 30);
+
+
+	//create holder for button and text
+	_buttons = new Actor;
+	_buttons->attachTo(_view);
+
+	float y = _view->getHeight()/2 - 80;
+
+	//initialize TextStyle for TextActor
+	//TextStyle is plain struct with "setting" for Text
+	TextStyle style;
+	style.font = res::ui.getResFont("big")->getFont();
+	//vertical align
+	style.vAlign = TextStyle::VALIGN_BOTTOM;
+	//horizontal align
+	style.hAlign = TextStyle::HALIGN_CENTER;
+
+	spTextActor paused = initActor(new TextActor,
+		arg_style = style,
+		//colored text by "html" tags
+		arg_htmlText = "Paused<div c='00FF00'>!</div>",
+		arg_x = _view->getWidth()/2,
+		arg_y = y,
+		arg_attachTo = _buttons,
+		arg_alpha = 128);
+
+	//animate with infinity loops "Paused!" text
+	paused->addTween(Actor::TweenAlpha(255), 1200, -1, true);
+	paused->addTween(Actor::TweenScale(1.1f), 1200, -1, true);
+
+	y += 70;
+	
+
+	//'buttons' image has 2 columns and 5 rows
+	//game actually uses only 2 selected randomly
+	const ResAnim *btns = res::ui.getResAnim("buttons");
+	//create 2 buttons
+	const char *txt[2] = {"Continue", "Exit"};
+	for (int i = 0; i < 2; ++i)
+	{	
+		//select random frame of image
+		const AnimationFrame &frame = btns->getFrame(rand() % btns->getColumns(), rand() % btns->getRows());
+
+		//MyButton is user class inherited from Sprite
+		spMyButton button = initActor(new MyButton,
+			arg_resAnim = frame,
+			arg_anchor = Vector2(0.5f, 0.5f),
+			arg_attachTo = _buttons);
+
+		button->setX(_view->getWidth()/2);
+		button->setY(y);
+		button->setText(txt[i]);
+
+		y+= button->getHeight() + 10;
+
+		button->setName(txt[i]);
+		//handle click on button
+		//each Object could have unique name. In this example button has the same name as text
+		button->addEventListener(TouchEvent::CLICK, CLOSURE(this, &GameMenu::onEvent));		
+	}
+}
+
+void GameMenu::_show()
+{	
+	//before showing dialog hide buttons
+	_buttons->setAlpha(0);
+
+	//animate background
+	//set default small size
+	_bg->setSize(_bg->getAnimFrame().getSize());
+
+	//and modify height and then width by tween
+	spTweenQueue tq = new TweenQueue;
+	tq->add(Actor::TweenHeight(300), 500);
+	tq->add(Actor::TweenWidth(300), 500);
+	//and show buttons when done
+	tq->setDoneCallback(CLOSURE(this, &GameMenu::showButtons));
+	_bg->addTween(tq);
+}
+
+void GameMenu::showButtons(Event *ev)
+{
+	//tween activated from GameMenu::_show is done
+	//fade in buttons and text
+	_buttons->addTween(Actor::TweenAlpha(255), 300);
+}
+
+void GameMenu::onEvent(Event *ev)
+{
+	//button clicked
+	//remember it's name. It would asked later from GameScene.cpp
+	_lastClicked = ev->currentTarget->getName();
+
+	//hide dialog
+	hide();
+}

+ 21 - 0
examples/Game/part4/src/GameMenu.h

@@ -0,0 +1,21 @@
+#pragma once
+#include "Scene.h"
+
+DECLARE_SMART(GameMenu, spGameMenu);
+class GameMenu: public Scene
+{
+public:
+	static spGameMenu instance;
+
+	GameMenu();
+	const string& getLastClicked() const {return _lastClicked;}
+
+private:
+	void onEvent(Event *ev);
+	void showButtons(Event *ev);
+	void _show();
+
+	spBox9Sprite _bg;
+	spActor _buttons;
+	string _lastClicked;
+};

+ 69 - 0
examples/Game/part4/src/GameScene.cpp

@@ -0,0 +1,69 @@
+#include "GameScene.h"
+#include "MainMenuScene.h"
+#include "MyButton.h"
+#include "res.h"
+#include "GameMenu.h"
+
+spGameScene GameScene::instance;
+
+GameScene::GameScene()
+{
+	//create game actor
+	_game = new Game;
+	_game->init();
+	_game->attachTo(_view);
+
+	//Game Actor would have own Clock.
+	//clock is internal time of each Actor
+	//by default own clock has only RootActor
+	//clock could be paused and all children of this Actor would be paused to
+	_game->setClock(new Clock);
+
+	//create menu button 
+	spActor btn = initActor(new MyButton,
+		arg_resAnim = res::ui.getResAnim("menu"),
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_attachTo = _view);
+	
+	//align it to top right
+	btn->setX(_view->getWidth() - btn->getWidth()/2);
+	btn->setY(btn->getHeight()/2);
+
+	//handle click to menu
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &GameScene::onEvent));
+
+	//subscribe to Hidden Event from GameMenu
+	GameMenu::instance->addEventListener(GameScene::HiddenEvent::EVENT, CLOSURE(this, &GameScene::onEvent));
+}
+
+void GameScene::onEvent(Event *ev)
+{	
+	if (ev->type == TouchEvent::CLICK)
+	{
+		//menu button clicked
+		//pause game by pausing it's clock
+		_game->getClock()->pause();
+
+		//show GameMenu dialog
+		GameMenu::instance->show();
+	}
+
+
+	if (ev->type == GameScene::HiddenEvent::EVENT)
+	{
+		//event from GameMenu called after GameMenu::instance->hide()
+		const string &name = GameMenu::instance->getLastClicked();
+		if (name == "Exit")		
+		{
+			//if "Exit" button was clicked
+			changeScene(MainMenuScene::instance);
+		}
+		else
+		{
+			//"Continue" button was clicked
+			//dialog already hidden
+			//just resume Clock to continue game
+			_game->getClock()->resume();
+		}
+	}
+}

+ 16 - 0
examples/Game/part4/src/GameScene.h

@@ -0,0 +1,16 @@
+#pragma once
+#include "Scene.h"
+#include "Game.h"
+
+DECLARE_SMART(GameScene, spGameScene);
+class GameScene: public Scene
+{
+public:
+	static spGameScene instance;
+	GameScene();
+
+
+private:
+	void onEvent(Event *ev);
+	spGame _game;
+};

+ 64 - 0
examples/Game/part4/src/Joystick.cpp

@@ -0,0 +1,64 @@
+#include "Joystick.h"
+#include "res.h"
+
+Joystick::Joystick():_pressed(false), _dir(0,0)
+{
+	setResAnim(res::ui.getResAnim("joystick"));
+	setAlpha(128);
+
+	//handle touch events
+	addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &Joystick::onEvent));
+	addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Joystick::onEvent));
+	addEventListener(TouchEvent::MOVE, CLOSURE(this, &Joystick::onEvent));
+
+	_finger = new Sprite;
+	_finger->setResAnim(res::ui.getResAnim("finger"));
+	_finger->attachTo(this);
+	_finger->setVisible(false);
+	_finger->setAnchor(Vector2(0.5f, 0.5f));
+	_finger->setInputEnabled(false);
+}
+
+void Joystick::onEvent(Event *ev)
+{
+	TouchEvent *te = safeCast<TouchEvent *>(ev);
+
+	//if player touched down
+	if (te->type == TouchEvent::TOUCH_DOWN)
+	{
+		_finger->setVisible(true);
+		setColor(Color::Red);
+		_pressed = true;
+	}
+
+	//if player touched up
+	if (te->type == TouchEvent::TOUCH_UP)
+	{
+		_finger->setVisible(false);
+		setColor(Color::White);
+		_pressed = false;
+	}
+
+	if (te->type == TouchEvent::MOVE)
+	{
+	}
+
+	Vector2 center = getSize()/2;
+	_dir = te->localPosition - center;
+
+	if (_dir.length() > 100)
+		_dir.normalizeTo(100);
+
+	_finger->setPosition(center + _dir);
+
+	if (!_pressed)
+	{
+		_dir = Vector2(0,0);
+	}
+}
+
+bool Joystick::getDirection(Vector2 &dir) const
+{
+	dir = _dir;
+	return _pressed;
+}

+ 19 - 0
examples/Game/part4/src/Joystick.h

@@ -0,0 +1,19 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+DECLARE_SMART(Joystick, spController);
+class Joystick: public Sprite
+{
+public:
+	Joystick();
+	
+	bool getDirection(Vector2 &dir) const;
+
+private:
+	void onEvent(Event *ev);
+	bool _pressed;
+	Vector2 _dir;
+
+	spSprite _finger;
+};

+ 81 - 0
examples/Game/part4/src/MainMenuScene.cpp

@@ -0,0 +1,81 @@
+#include "MainMenuScene.h"
+#include "Sprite.h"
+#include "initActor.h"
+#include "res.h"
+#include "MyButton.h"
+#include "GameScene.h"
+
+spMainMenuScene MainMenuScene::instance;
+
+MainMenuScene::MainMenuScene()
+{
+	//create background
+	spSprite sky = new Sprite;
+	sky->setResAnim(res::ui.getResAnim("bg"));
+	sky->attachTo(_view);
+
+	/*
+	'initActor' is syntax sugar for
+		
+	spSprite logo = new Sprite;
+	logo->setResAnim(res::ui.getResAnim("logo2")),
+	logo->attachTo(_view);
+	*/
+
+	//create logo
+	spSprite logo = initActor(new Sprite,		
+		arg_resAnim = res::ui.getResAnim("logo2"),
+		arg_attachTo = _view);
+	logo->setPosition(_view->getSize() - logo->getSize());
+
+
+	/*
+	spSprite btn = new MyButton;
+	btn->setResAnim(res::ui.getResAnim("play")),
+	btn->setAnchor(Vector2(0.5f, 0.5f));
+	btn->setPosition(_view->getSize()/2);
+	btn->attachTo(_view);	
+	*/
+
+	//create play button at center
+	spSprite btn = initActor(new MyButton,
+		arg_name = "play",
+		arg_resAnim = res::ui.getResAnim("play"),		
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_pos = _view->getSize()/2,
+		arg_attachTo = _view);	
+
+	//handle click to button
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &MainMenuScene::onEvent));
+
+
+	//create menu button 
+	btn = initActor(new MyButton,
+		arg_name = "exit",
+		arg_resAnim = res::ui.getResAnim("menu"),
+		arg_anchor = Vector2(0.5f, 0.5f),
+		arg_attachTo = _view);
+
+	//align it to top right
+	btn->setX(_view->getWidth() - btn->getWidth()/2);
+	btn->setY(btn->getHeight()/2);
+
+	btn->addEventListener(TouchEvent::CLICK, CLOSURE(this, &MainMenuScene::onEvent));
+}
+
+void MainMenuScene::onEvent(Event *ev)
+{
+	string id = ev->currentTarget->getName();
+	if (id == "exit")
+	{
+		//request quit
+		core::requestQuit();
+	}
+
+	if (id == "play")
+	{
+		//clicked to play button
+		//change scene
+		changeScene(GameScene::instance);
+	}
+}

+ 14 - 0
examples/Game/part4/src/MainMenuScene.h

@@ -0,0 +1,14 @@
+#pragma once
+#include "Scene.h"
+
+DECLARE_SMART(MainMenuScene, spMainMenuScene);
+class MainMenuScene: public Scene
+{
+public:
+	static spMainMenuScene instance;
+
+	MainMenuScene();
+
+private:
+	void onEvent(Event *ev);
+};

+ 48 - 0
examples/Game/part4/src/MyButton.cpp

@@ -0,0 +1,48 @@
+#include "MyButton.h"
+#include "res.h"
+
+MyButton::MyButton()
+{
+	//pressed button should be RED
+	addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &MyButton::onEvent));
+	addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &MyButton::onEvent));
+	addEventListener(TouchEvent::CLICK, CLOSURE(this, &MyButton::onEvent));
+}
+
+void MyButton::onEvent(Event *ev)
+{
+	TouchEvent *event = static_cast<TouchEvent *>(ev);
+	if (ev->type == TouchEvent::TOUCH_DOWN)
+		setColor(Color::Red);
+
+	if (ev->type == TouchEvent::TOUCH_UP)
+		setColor(Color::White);
+
+	if (ev->type == TouchEvent::CLICK)
+	{
+		//clicked button should scale up and down
+		setScale(1.0f);
+		addTween(Actor::TweenScale(1.1f), 300, 1, true);
+	}
+}
+
+void MyButton::setText(const string &txt)
+{
+	if (!_text)
+	{		
+		//create TextActor if it wasn't created yet
+		TextStyle style;
+		style.font = res::ui.getResFont("normal")->getFont();
+		style.vAlign = TextStyle::VALIGN_MIDDLE;
+		style.hAlign = TextStyle::HALIGN_CENTER;
+
+		//attach it to MyButton and set the same size as button
+		//text would be centered
+		_text = initActor(new TextActor,
+			arg_style = style,
+			arg_size = getSize(),
+			arg_attachTo = this);
+	}
+
+	_text->setText(txt);
+}

+ 17 - 0
examples/Game/part4/src/MyButton.h

@@ -0,0 +1,17 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+DECLARE_SMART(MyButton, spMyButton);
+class MyButton: public Sprite
+{
+public:
+	MyButton();
+
+	void setText(const string &txt);
+
+private:
+	void onEvent(Event *);
+
+	spTextActor _text;
+};

+ 67 - 0
examples/Game/part4/src/Player.cpp

@@ -0,0 +1,67 @@
+#include "Player.h"
+#include "Game.h"
+#include "res.h"
+#include "Joystick.h"
+#include "Rocket.h"
+
+Player::Player():_lastRocketSpawn(0)
+{
+
+}
+
+void Player::_init()
+{
+	//initialize player's ship
+	_view->setPosition(_game->getSize()/2);
+
+	_ship = new Sprite;
+	_ship->setResAnim(res::ui.getResAnim("ship"));
+	_ship->attachTo(_view);
+	_ship->setAnchor(Vector2(0.5f, 0.5f));
+
+	_engine = new Sprite;
+	_engine->setResAnim(res::ui.getResAnim("shipengine"));
+	_engine->attachTo(_ship);
+	//animate engine's fire
+	_engine->addTween(Sprite::TweenColor(Color::Red), 500, -1, true);
+	//by default it is hidden
+	//and would be visible only if ship moves
+	_engine->setVisible(false);
+}
+
+void Player::_update(const UpdateState &us)
+{
+	_engine->setVisible(false);
+
+	Vector2 dir;
+	if (_game->_move->getDirection(dir))
+	{
+		//update player position according to delta time and finger direction from virtual joystick
+		Vector2 pos = _view->getPosition();		
+		pos = pos + dir * (us.dt / 1000.0f) * 5;
+		_view->setPosition(pos);
+
+		//rotate it
+		float angle = atan2f(dir.y, dir.x);
+		_view->setRotation(angle);
+
+		//if player moves show engine's fire
+		_engine->setVisible(true);
+	}
+
+
+	if (_game->_fire->getDirection(dir))
+	{
+		//fire rockets each 300 ms
+		if (_lastRocketSpawn + 300 < us.time)
+		{
+			_lastRocketSpawn = us.time;
+
+			dir.normalize();
+
+			//create rocket
+			spRocket rocket = new Rocket(dir);
+			rocket->init(_view->getPosition(), _game);
+		}		
+	}
+}

+ 18 - 0
examples/Game/part4/src/Player.h

@@ -0,0 +1,18 @@
+#pragma once
+#include "Unit.h"
+
+DECLARE_SMART(Player, spPlayer);
+class Player: public Unit
+{
+public:
+	Player();
+
+	
+protected:
+	void _init();
+	void _update(const UpdateState &us);
+
+	spSprite _engine;	
+	spSprite _ship;	
+	timeMS _lastRocketSpawn;
+};

+ 80 - 0
examples/Game/part4/src/Rocket.cpp

@@ -0,0 +1,80 @@
+#include "Rocket.h"
+#include "res.h"
+#include "Game.h"
+#include "Enemy.h"
+
+Rocket::Rocket(const Vector2 &dir):_dir(dir)
+{	
+}
+
+void Rocket::_init()
+{
+	//initialize rocket's sprite
+	spSprite sp = new Sprite;
+	sp->setResAnim(res::ui.getResAnim("rocket"));
+	sp->setAnchor(Vector2(0.5f, 0.5f));
+	sp->setScale(0);
+	sp->addTween(Sprite::TweenScale(1.0f), 500);
+
+	_view->addChild(sp);
+	_view->setRotation(atan2f(_dir.y, _dir.x));	
+}
+
+void Rocket::_update(const UpdateState &us)
+{
+	//move rocket by it's direction each frame
+	Vector2 pos = _view->getPosition();
+	pos += _dir * (us.dt / 1000.0f) * 500.0f;
+	_view->setPosition(pos);
+
+	//find intersection with Enemies and explode them
+	for (Game::units::iterator i = _game->_units.begin(); i != _game->_units.end(); ++i)
+	{
+		spUnit unit = *i;
+		//list of units has everything, but we need only Enemies
+		spEnemy enemy = dynamic_cast<Enemy*>(unit.get());
+		if (!enemy)
+			continue;
+		
+		Vector2 d = unit->getPosition() - pos;		
+		if (d.length() < 20)
+		{
+			//if rocket is too close to Enemy then try to explode it and explode rocket
+			enemy->explode();
+			explode();
+
+			return;
+		}
+	}
+
+
+	//if rocked out of bounds then explode it
+	RectF bounds(0, 0, _game->getWidth(), _game->getHeight());
+	if (!bounds.pointIn(pos))
+	{
+		explode();
+	}
+}
+
+void Rocket::explode()
+{
+	//we are dead
+	//set this flag to true and it this rocket would be removed from units list in Game::doUpdate
+	_dead = true;
+
+	//create explode sprite
+	spSprite anim = new Sprite;
+	anim->attachTo(_game);
+	anim->setBlendMode(blend_add);
+	anim->setPosition(_view->getPosition());
+	anim->setAnchor(Vector2(0.5f, 0.5f));
+	
+	//run tween with explosion animation
+	spTween tween = anim->addTween(TweenAnim(res::ui.getResAnim("explosion")), 1000);
+	//auto detach sprite when tween is done
+	tween->setDetachActor(true);
+
+	//hide rocket and then detach it
+	tween = _view->addTween(Actor::TweenAlpha(0), 500);
+	tween->setDetachActor(true);
+}

+ 17 - 0
examples/Game/part4/src/Rocket.h

@@ -0,0 +1,17 @@
+#pragma once
+#include "oxygine-framework.h"
+#include "Unit.h"
+
+DECLARE_SMART(Rocket, spRocket);
+class Rocket: public Unit
+{
+public:
+	Rocket(const Vector2 &dir);
+	
+protected:
+	void _init();
+	void _update(const UpdateState &us);
+	void explode();
+
+	Vector2 _dir;
+};

+ 46 - 0
examples/Game/part4/src/Scene.cpp

@@ -0,0 +1,46 @@
+#include "Scene.h"
+
+Scene::Scene()
+{
+	_view = new Actor;
+	_view->setSize(getRoot()->getSize());
+}
+
+void Scene::changeScene(spScene next)
+{
+	//hide current scene
+	hide();
+
+	//show next scene
+	next->show();
+}
+
+void Scene::show()
+{
+	//add scene view to root
+	getRoot()->addChild(_view);
+	//and fade in
+	_view->setAlpha(0);
+	_view->addTween(Actor::TweenAlpha(255), 300);
+
+	//call virtual method (overloaded in inherited classes)
+	_show();
+}
+
+void Scene::hide()
+{
+	spTween tween = _view->addTween(Actor::TweenAlpha(0), 300);
+	//detach when done
+	tween->setDetachActor(true);
+	//and call Scene::hidden	
+	tween->setDoneCallback(CLOSURE(this, &Scene::hidden));
+}
+
+void Scene::hidden(Event *ev)
+{
+	//hidden called by Tween
+	//notify HiddenEvent listeners
+
+	HiddenEvent he(this);
+	dispatchEvent(&he);
+}

+ 41 - 0
examples/Game/part4/src/Scene.h

@@ -0,0 +1,41 @@
+#pragma once
+#include "oxygine-framework.h"
+#include <vector>
+using namespace oxygine;
+
+DECLARE_SMART(Scene, spScene);
+class Scene: public EventDispatcher
+{
+public:
+	Scene();
+
+	//declare own Event type
+	//it would be fired when scene would completely hidden
+	class HiddenEvent: public Event
+	{
+	public:
+		//define unique int ID with makefourcc 'SHid' = SceneHidden
+		enum {EVENT = makefourcc('S', 'H', 'i', 'd')};
+
+		HiddenEvent(Scene *scene_):Event(EVENT), scene(scene_){};
+		Scene *scene;
+	};
+
+	void show();
+
+	//fires HiddenEvent when scene completed hidden
+	void hide();	
+
+	void changeScene(spScene next);
+	spActor getView() const {return _view;}
+
+protected:
+	virtual void _show(){}
+	virtual void _hide(){}
+
+	void hidden(Event *ev);
+	spActor _view;
+};
+
+
+

+ 33 - 0
examples/Game/part4/src/Unit.cpp

@@ -0,0 +1,33 @@
+#include "Unit.h"
+#include "Game.h"
+
+Unit::Unit():_game(0), _dead(false)
+{
+
+}
+
+void Unit::init(const Vector2 &pos, Game *game)
+{
+	//initialize base
+	_game = game;
+	_view = new Actor;
+	_view->attachTo(game);
+	_view->setPosition(pos);
+
+	//adds to global units list
+	_game->_units.push_back(this);
+
+	//should be overloaded in inherited classes
+	_init();
+}
+
+const Vector2& Unit::getPosition() const
+{
+	return _view->getPosition();
+}
+
+void Unit::update(const UpdateState &us)
+{
+	//should be overloaded in inherited classes
+	_update(us);
+}

+ 26 - 0
examples/Game/part4/src/Unit.h

@@ -0,0 +1,26 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+class Game;
+DECLARE_SMART(Unit, spUnit);
+class Unit: public Object
+{
+public:
+	Unit();
+
+	void init(const Vector2 &pos, Game *game);
+
+	const Vector2& getPosition() const;
+
+	void update(const UpdateState &us);
+	bool isDead() const {return _dead;}
+
+protected:
+	virtual void _init(){}
+	virtual void _update(const UpdateState &us){}
+
+	spActor _view;
+	Game *_game;
+	bool _dead;
+};

+ 183 - 0
examples/Game/part4/src/entry_point.cpp

@@ -0,0 +1,183 @@
+/**
+Attention!
+This file has Oxygine initialization stuff.
+If you just started you don't need to understand it exactly you could check it later. 
+You could start from example.cpp and example.h it has main functions being called from there
+*/
+#include <stdio.h>
+#include "core/Renderer.h"
+#include "RootActor.h"
+#include "DebugActor.h"
+
+#include "example.h"
+
+
+using namespace oxygine;
+
+Renderer renderer;
+Rect viewport;
+
+
+class ExampleRootActor: public RootActor
+{
+public:
+	ExampleRootActor()
+	{
+		//each mobile application should handle focus lost
+		//and free/restore GPU resources
+		addEventListener(RootActor::DEACTIVATE, CLOSURE(this, &ExampleRootActor::onDeactivate));
+		addEventListener(RootActor::ACTIVATE, CLOSURE(this, &ExampleRootActor::onActivate));
+	}
+
+	void onDeactivate(Event *)
+	{
+		core::reset();
+	}
+
+	void onActivate(Event *)
+	{
+		core::restore();
+	}
+};
+
+//called each frame
+int mainloop()
+{
+	example_update();
+	//update our rootActor
+	//Actor::update would be called also for children
+	getRoot()->update();
+
+	Color clear(33, 33, 33, 255);
+	//start rendering and clear viewport
+	if (renderer.begin(0, viewport, &clear))
+	{
+		//begin rendering from RootActor. 
+		getRoot()->render(renderer);
+		//rendering done
+		renderer.end();
+
+		core::swapDisplayBuffers();
+	}
+	
+
+	//update internal components
+	//all input events would be passed to RootActor::instance.handleEvent
+	//if done is true then User requests quit from app.
+	bool done = core::update();
+
+	return done ? 1 : 0;
+}
+
+//it is application entry point
+void run()
+{	
+	//initialize oxygine's internal stuff
+	core::init_desc desc;
+
+#if OXYGINE_SDL
+	//we could setup initial window size on SDL builds
+	//desc.w = 960;
+	//desc.h = 660;
+	//marmalade settings could be changed from emulator's menu
+#endif
+
+	core::init(&desc);	
+	example_preinit();
+	
+	//create RootActor. RootActor is a root node
+	RootActor::instance = new ExampleRootActor();	
+	Point size = core::getDisplaySize();
+	getRoot()->init(size, size);
+	
+	//DebugActor is a helper node it shows FPS and memory usage and other useful stuff
+	DebugActor::initialize();
+
+	//create and add new DebugActor to root actor as child
+	getRoot()->addChild(new DebugActor());
+
+
+	
+	Matrix view = makeViewMatrix(size.x, size.y); 
+
+	viewport = Rect(0, 0, size.x, size.y);
+
+	Matrix proj;
+	//initialize projection matrix
+	Matrix::orthoLH(proj, (float)size.x, (float)size.y, 0, 1);
+	
+	//Renderer is class helper for rendering primitives and batching them
+	//Renderer is lightweight class you could create it many of times
+	renderer.setDriver(IVideoDriver::instance);
+
+	//initialization view and projection matrix 	
+	//where Left Top corner is (0, 0), and right bottom is (width, height)
+	renderer.initCoordinateSystem(size.x, size.y);
+
+	//initialize this example stuff. see example.cpp
+	example_init();
+
+	bool done = false;	
+
+	//here is main game loop
+    while (1)
+    {
+		int done = mainloop();
+		if (done)
+			break;
+    }
+	//so user want to leave application...
+	
+	//lets dump all created objects into log
+	//all created and not freed resources would be displayed
+	ObjectBase::dumpCreatedObjects();
+
+	//lets cleanup everything right now and call ObjectBase::dumpObjects() again
+	//we need to free all allocated resources and delete all created actors
+	//all actors/sprites are smart pointer objects and actually you don't need it remove them by hands
+	//but now we want delete it by hands
+
+	//check example.cpp
+	example_destroy();	
+	
+
+	renderer.cleanup();
+
+	/**releases all internal components and RootActor*/
+	core::release();
+
+	//dump list should be empty now
+	//we deleted everything and could be sure that there aren't any memory leaks
+	ObjectBase::dumpCreatedObjects();
+	//end
+}
+
+#ifdef __S3E__
+int main(int argc, char* argv[])
+{
+    run();
+    return 0;
+}
+#endif
+
+
+#ifdef OXYGINE_SDL
+#include "SDL_main.h"
+extern "C"
+{
+	int main(int argc, char* argv[])
+	{
+		run();
+		return 0;
+	}
+};
+#endif
+
+#ifdef __FLASHPLAYER__
+int main(int argc, char* argv[])
+{
+	printf("test\n");
+	run();
+	return 0;
+}
+#endif

+ 40 - 0
examples/Game/part4/src/example.cpp

@@ -0,0 +1,40 @@
+#include "oxygine-framework.h"
+#include "res.h"
+#include "Game.h"
+#include "MainMenuScene.h"
+#include "GameScene.h"
+#include "GameMenu.h"
+using namespace oxygine;
+
+
+void example_preinit()
+{
+}
+
+void example_init()
+{
+	//load resources
+	res::load();
+
+	//create all scenes
+	GameMenu::instance = new GameMenu;
+	GameScene::instance = new GameScene;
+	MainMenuScene::instance = new MainMenuScene;
+
+	//show main menu
+	MainMenuScene::instance->show();
+}
+
+void example_update()
+{
+
+}
+
+void example_destroy()
+{
+	MainMenuScene::instance = 0;
+	GameScene::instance = 0;
+	GameMenu::instance = 0;
+
+	res::free();
+}

+ 4 - 0
examples/Game/part4/src/example.h

@@ -0,0 +1,4 @@
+void example_preinit();
+void example_init();
+void example_destroy();
+void example_update();

+ 17 - 0
examples/Game/part4/src/res.cpp

@@ -0,0 +1,17 @@
+#include "res.h"
+
+namespace res
+{
+	Resources ui;
+
+	void load()
+	{
+		ui.loadXML("xmls/ui.xml");
+	}
+
+	void free()
+	{
+		ui.free();
+
+	}
+}

+ 10 - 0
examples/Game/part4/src/res.h

@@ -0,0 +1,10 @@
+#pragma once
+#include "oxygine-framework.h"
+using namespace oxygine;
+
+namespace res
+{
+	extern Resources ui;
+	void load();
+	void free();
+}

+ 3 - 0
oxygine/src/Box9Sprite.h

@@ -21,6 +21,9 @@ namespace oxygine
 		void setVerticalMode(StretchMode m);
 		void setHorizontalMode(StretchMode m);
 
+		/**
+		Set distance from left, right, top and bottom edges
+		*/
 		void setGuides(float x1, float x2, float y1, float y2);
 		void setVerticalGuides(float x1, float x2);
 		void setHorizontalGuides(float y1, float y2);

+ 1 - 1
oxygine/src/MemoryTexture.cpp

@@ -466,7 +466,7 @@ namespace oxygine
 						break;
 					}
 					_image.format = tf;
-					_offset = sizeof(pvr_header);
+					_offset = sizeof(pvr_header) + header->meta_data_size;
 					_image.pitch = (buffer.getSize() - _offset) / _image.h;
 					_buffer.swap(buffer.data);
 				}

+ 1 - 1
oxygine/src/ProgressBar.h

@@ -41,7 +41,7 @@ namespace oxygine
 		void doRender(const RenderState &rs);
 
 		RectF getDestRect() const;
-		void _update();
+		virtual void _update();
 
 		void animFrameChanged(const AnimationFrame &f);
 

+ 3 - 4
oxygine/src/core/Mem2Native.cpp

@@ -21,12 +21,11 @@ namespace oxygine
 	}
 
 	void Mem2Native::push(spMemoryTexture src, spNativeTexture dest)
-	{			
-		//_messages.send(src.get(), dest.get());
-
+	{	
 		src->addRef();
 		dest->addRef();
-		_messages.post(0, src.get(), dest.get());
+		_messages.send(0, src.get(), dest.get());
+		//_messages.post(0, src.get(), dest.get());
 	}
 	
 	bool Mem2Native::isEmpty()

+ 1 - 1
oxygine/src/core/gl/ShaderProgramGL.cpp

@@ -27,7 +27,7 @@ namespace oxygine
 			vector<char> bf;
 			bf.resize(length);
 			glGetShaderInfoLog(shader, bf.size(), NULL, &bf.front());
-			log::message("shader compiled: %s", &bf.front());
+			log::messageln("shader compiled: %s", &bf.front());
 
 			GLint success;
 			glGetShaderiv(shader, GL_COMPILE_STATUS, &success);

Some files were not shown because too many files changed in this diff