app.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import datetime
  2. import pyglet as pyg
  3. import pyglet.window.key as key
  4. import pyglet.window.mouse as mouse
  5. import cocos
  6. from cocos.director import director
  7. from .camera import camera
  8. from .verkolst import verkolst
  9. from . import keyboard_state, mouse_state
  10. class CocostratUI(cocos.layer.Layer):
  11. is_event_handler = True
  12. def __init__(self):
  13. from .ui.status_bar import StatusBar
  14. from .ui.province_info import ProvinceInfo
  15. import app.ui.map_overlay as overlays
  16. super().__init__()
  17. self.province_info = ProvinceInfo()
  18. self.province_info.position = (director.window.width+450, director.window.height)
  19. self.add(self.province_info)
  20. # self.add_step_button()
  21. self.status_bar = StatusBar()
  22. self.add(self.status_bar)
  23. self.hl_province = None
  24. self.hl_province_sprite = cocos.sprite.Sprite('highlight_hex.png',
  25. position=(100, 100))
  26. self.hl_province_sprite.visible = False
  27. self.overlays = [
  28. overlays.FoodOverlay(self, verkolst['overlay']),
  29. overlays.PopsOverlay(self, verkolst['overlay'], 'lc'),
  30. overlays.PopsOverlay(self, verkolst['overlay'], 'mc'),
  31. overlays.PopsOverlay(self, verkolst['overlay'], 'uc'),
  32. overlays.TradeDistanceOverlay(self, verkolst['overlay']),
  33. ]
  34. self.click_sound = pyg.media.load('assets/sound_effects/tap1.wav', streaming=False)
  35. self.knock_sound = pyg.media.load('assets/sound_effects/tap2.wav', streaming=False)
  36. self.on_turn_start()
  37. def on_turn_start(self):
  38. self.status_bar.on_turn_start()
  39. self.province_info.on_turn_start()
  40. for overlay in self.overlays:
  41. overlay.update()
  42. def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
  43. if buttons & mouse.MIDDLE:
  44. x1, y1 = camera.screen_to_world(x-dx, y-dy)
  45. x2, y2 = camera.screen_to_world(x, y)
  46. d_world = (x2-x1, y2-y1)
  47. cam = camera.cam_position
  48. camera.cam_position = (cam[0] - d_world[0], cam[1] - d_world[1])
  49. def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
  50. if abs(scroll_y) == 1:
  51. camera.zoom(scroll_y)
  52. def on_mouse_press(self, x, y, buttons, modifiers):
  53. if buttons & mouse.LEFT:
  54. x, y = camera.screen_to_world(x, y)
  55. self.hl_province = verkolst['terrain'].get_at_pixel(x, y)
  56. if self.hl_province:
  57. self.click_sound.play()
  58. self.hl_province_sprite.position = self.hl_province.center
  59. self.hl_province_sprite.visible = True
  60. self.province_info.set_province(self.hl_province)
  61. for overlay in self.overlays:
  62. overlay.update()
  63. elif buttons & mouse.RIGHT:
  64. if self.hl_province is not None:
  65. self.knock_sound.play()
  66. self.hl_province = None
  67. self.hl_province_sprite.visible = False
  68. self.province_info.set_province(None)
  69. for overlay in self.overlays:
  70. overlay.update()
  71. def toggle_overlay(self, overlay_idx):
  72. for idx, overlay in enumerate(self.overlays):
  73. if idx == overlay_idx:
  74. overlay.toggle()
  75. else:
  76. overlay.disable()
  77. verkolst['overlay'].visible = any(overlay.enabled for overlay in self.overlays)
  78. def on_key_press(self, symbol, modifiers):
  79. if symbol == key.F1:
  80. verkolst.process_turn()
  81. self.on_turn_start()
  82. elif symbol == key.F2:
  83. self.toggle_overlay(0)
  84. elif symbol == key.F3:
  85. self.toggle_overlay(1)
  86. elif symbol == key.F4:
  87. self.toggle_overlay(2)
  88. elif symbol == key.F5:
  89. self.toggle_overlay(3)
  90. elif symbol == key.F6:
  91. self.toggle_overlay(4)
  92. def main():
  93. from os.path import dirname, abspath, split, join
  94. import pyglet.image
  95. from pyglet import gl
  96. pyglet.image.Texture.default_mag_filter = gl.GL_NEAREST
  97. pyglet.image.Texture.default_min_filter = gl.GL_LINEAR
  98. # Must specify full path for Pycharm debugger to work... ugh
  99. base_dir = split(dirname(abspath(__file__)))[0]
  100. pyg.resource.path = [
  101. join(base_dir, 'assets/map/'),
  102. join(base_dir, 'assets/sprites/'),
  103. join(base_dir, 'assets/gui/'),
  104. join(base_dir, 'assets/sound_effects/')
  105. ]
  106. pyg.resource.reindex()
  107. # print(pyg.resource._default_loader._index)
  108. director.init(width=1920, height=1080, autoscale=True, resizable=True,
  109. audio_backend='pyglet')
  110. director.window.push_handlers(keyboard_state)
  111. director.window.push_handlers(mouse_state)
  112. verkolst.init('Verkolst.tmx')
  113. camera.init()
  114. camera.add(verkolst['terrain'])
  115. camera.add(verkolst['rivers'])
  116. camera.add(verkolst['buildings'])
  117. camera.add(verkolst['nations'])
  118. camera.add(verkolst['overlay'])
  119. ui = CocostratUI()
  120. camera.overlay_layer.add(ui.hl_province_sprite)
  121. main_scene = cocos.scene.Scene(camera, ui)
  122. director.run(main_scene)
  123. if __name__ == '__main__':
  124. main()