Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.31 KB | None | 0 0
  1. from collections import defaultdict
  2.  
  3. import tmx
  4. from cymunk.cymunk import Vec2d
  5. from kivent_maps.map_utils import _load_obj_models, _load_tile_map, _load_tile_properties
  6. from kivent_maps.map_utils import _load_tilesets
  7. from kivy.app import App, platform
  8. from kivy.core.window import Window, Keyboard
  9. from kivy.clock import Clock
  10. from kivy.uix.widget import Widget
  11. from kivy.properties import StringProperty
  12. from kivent_core.managers.resource_managers import texture_manager
  13. from os.path import dirname, join, abspath, basename
  14. from kivent_maps import map_utils
  15. import kivent_cymunk
  16. from kivent_maps.map_system import MapSystem
  17.  
  18. Window.size = (1600, 900)
  19.  
  20.  
  21. def get_asset_path(asset, asset_loc):
  22. return join(dirname(dirname(abspath(__file__))), asset_loc, asset)
  23.  
  24.  
  25.  
  26. keys = defaultdict(lambda: False)
  27. texture_manager.load_atlas(join(dirname(dirname(abspath(__file__))), 'assets',
  28. 'background_objects.atlas'))
  29.  
  30.  
  31. class Game(Widget):
  32. def __init__(self, **kwargs):
  33. super(Game, self).__init__(**kwargs)
  34. map_render_args = {'zones': ['general'], 'frame_count': 2, 'gameview': 'camera1',
  35. 'shader_source': get_asset_path('positionshader.glsl', 'assets/glsl')}
  36. map_anim_args = {'zones': ['general'], }
  37. map_poly_args = {'zones': ['general'], 'frame_count': 2, 'gameview': 'camera1',
  38. 'shader_source': 'poscolorshader.glsl'}
  39. self.map_layers, self.map_layer_animators = map_utils.load_map_systems(
  40. 4, self.gameworld, map_render_args, map_anim_args, map_poly_args)
  41. self.moving = False
  42. self.gameworld.init_gameworld(
  43. ['cymunk_physics', 'position', 'color', 'camera1', 'tile_map']
  44. + self.map_layers + self.map_layer_animators, callback=self.init_game)
  45.  
  46. def parse_tmx(self, filename, gameworld):
  47. '''
  48. Uses the tmx library to load the TMX into an object and then calls all the
  49. util functions with the relevant data.
  50. Args:
  51. filename (str): Name of the tmx file.
  52. gameworld (Gameworld): instance of the gameworld.
  53. Return:
  54. str: name of the loaded map which is the filename
  55. '''
  56. texture_manager = gameworld.managers['texture_manager']
  57. model_manager = gameworld.managers['model_manager']
  58. map_manager = gameworld.managers['map_manager']
  59. animation_manager = gameworld.managers['animation_manager']
  60.  
  61. # Get tilemap object with all the data from tmx
  62. tilemap = tmx.TileMap.load(filename)
  63. tiles, tiles_z, objects, objects_z, tile_ids, objmodels = \
  64. _load_tile_map(tilemap.layers, tilemap.width,
  65. _load_tile_properties(tilemap.tilesets))
  66. _load_tilesets(tilemap.tilesets, dirname(filename), tile_ids,
  67. texture_manager.load_atlas,
  68. model_manager.load_textured_rectangle,
  69. animation_manager.load_animation)
  70.  
  71. _load_obj_models(objmodels, model_manager.load_textured_rectangle,
  72. model_manager.load_model)
  73. name = '.'.join(basename(filename).split('.')[:-1])
  74. map_manager.load_map(name, tilemap.width, tilemap.height,
  75. tiles, len(tiles_z),
  76. objects, sum([len(o) for o in objects]),
  77. tilemap.orientation)
  78. loaded_map = map_manager.maps[name]
  79. loaded_map.tile_size = (tilemap.tilewidth, tilemap.tileheight)
  80. loaded_map.z_index_map = tiles_z + objects_z
  81. if tilemap.staggerindex:
  82. loaded_map.stagger_index = tilemap.staggerindex
  83. if tilemap.staggeraxis:
  84. loaded_map.stagger_axis = tilemap.staggeraxis
  85. if tilemap.hexsidelength:
  86. loaded_map.hex_side_length = tilemap.hexsidelength
  87.  
  88. self.map_size = [tilemap.width, tilemap.height]
  89. return name
  90.  
  91. def init_game(self):
  92. self.move_to = None
  93. self.setup_states()
  94. self.set_state()
  95. self.setup_tile_map()
  96. self.add_player()
  97. self.camera1.render_system_order = reversed(self.map_layers)
  98. self.camera1.entity_to_focus = self.player_id
  99. self.camera1.focus_entity = True
  100. Clock.schedule_interval(self.update, 1 / 60)
  101.  
  102. def add_player(self):
  103. pos = self.current_map.get_tile_position(*self.player_tile)
  104. print('starting position', pos)
  105. renderer_name = 'map_layer%d' % self.current_map.z_index_map[1]
  106. shape_dict = {'inner_radius': 0, 'outer_radius': 0, 'mass': 0, 'offset': (0, 0)}
  107. col_shape = {'shape_type': 'circle', 'elasticity': .5, 'collision_type': 1, 'shape_info': shape_dict,
  108. 'friction': 1.0}
  109. col_shapes = [col_shape]
  110. physics_component = {'main_shape': 'circle',
  111. 'velocity': (0, 0), 'position': pos, 'angle': 0,
  112. 'angular_velocity': 0, 'vel_limit': 0,
  113. 'ang_vel_limit': 0, 'mass': 0, 'col_shapes': col_shapes}
  114. component_data = {'position': pos,
  115. renderer_name: {'model': 'asteroid', 'texture': 'asteroid1', 'size': [20, 20]},
  116. 'rotate': 0,
  117. 'cymunk_physics': physics_component}
  118. systems = ['position', renderer_name, 'rotate', 'cymunk_physics']
  119. self.player_id = self.gameworld.init_entity(component_data, systems)
  120. self.player = self.gameworld.entities[self.player_id]
  121.  
  122. def setup_tile_map(self):
  123. filename = get_asset_path('isometric.tmx', 'assets/maps/')
  124. map_manager = self.gameworld.managers['map_manager']
  125. map_name = self.parse_tmx(filename, self.gameworld)
  126. map_utils.init_entities_from_map(map_manager.maps[map_name], self.gameworld.init_entity)
  127. self.current_map = map_manager.maps[map_name]
  128. # print(self.current_map.width)
  129. self.player_tile = (self.map_size[0]-1, self.map_size[1]-1)
  130.  
  131. def on_touch_up(self, touch):
  132. print(self.camera1.convert_from_screen_to_world(touch.pos))
  133.  
  134. def setup_states(self):
  135. self.gameworld.add_state(state_name='main', systems_added=self.map_layers,
  136. systems_unpaused=self.map_layer_animators + self.map_layers)
  137.  
  138. def set_state(self):
  139. self.gameworld.state = 'main'
  140.  
  141. def update(self, dt):
  142. direction = None
  143. if keys.get(Keyboard.keycodes['down']):
  144. direction = (1, 0)
  145. keys[Keyboard.keycodes['down']] = False
  146. elif keys.get(Keyboard.keycodes['right']):
  147. direction = (0, 1)
  148. keys[Keyboard.keycodes['right']] = False
  149. elif keys.get(Keyboard.keycodes['up']):
  150. direction = (-1, 0)
  151. keys[Keyboard.keycodes['up']] = False
  152. elif keys.get(Keyboard.keycodes['left']):
  153. direction = (0, -1)
  154. keys[Keyboard.keycodes['left']] = False
  155. if direction:
  156. print('moving from', self.player_tile)
  157. x = direction[0] + self.player_tile[0]
  158. y = direction[1] + self.player_tile[1]
  159. go = True
  160. go = False if (x < 0 or y < 0) else go
  161. go = False if (x > self.map_size[0]-1 or y > self.map_size[0]-1) else go
  162. go = False if (x == self.player_tile[0] and y == self.player_tile[1]) else go
  163. if go:
  164. entity = self.gameworld.entities[self.player_id]
  165. coords = self.current_map.get_tile_position(x, y)
  166. self.player_tile = (x, y)
  167. print('moving to', coords, self.player_tile)
  168. entity.cymunk_physics.body.position = Vec2d(coords)
  169. else:
  170. print('too far or same tile', x, y)
  171. self.gameworld.update(dt)
  172.  
  173.  
  174. class DebugPanel(Widget):
  175. fps = StringProperty(None)
  176.  
  177. def __init__(self, **kwargs):
  178. super(DebugPanel, self).__init__(**kwargs)
  179. Clock.schedule_once(self.update_fps)
  180.  
  181. def update_fps(self, dt):
  182. self.fps = str(int(Clock.get_fps()))
  183. Clock.schedule_once(self.update_fps, .1)
  184.  
  185.  
  186. class YourAppNameApp(App):
  187. pass
  188.  
  189.  
  190. if __name__ == '__main__':
  191. if platform != 'android':
  192. def on_key_down(window, keycode, *rest):
  193. keys[keycode] = True
  194.  
  195. def on_key_up(window, keycode, *rest):
  196. keys[keycode] = False
  197.  
  198. Window.bind(on_key_down=on_key_down, on_key_up=on_key_up)
  199.  
  200. YourAppNameApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement