moved decoding of layers up to TileMap
[2dworld.git] / tiledtmxloader3 / examples / 02_render_features / 02_5_dynamic_sprites.py
blob813b3bd0e19228a2bbc31ca7ad773dc622854387
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
4 """
6 This is the pygame minimal example.
8 """
11 __revision__ = "$Rev$"
12 __version__ = "3.0.0." + __revision__[6:-2]
13 __author__ = 'DR0ID @ 2009-2011'
15 import sys
16 import os
17 import random
18 from random import randint
20 import pygame
22 try:
23 import _path
24 except:
25 pass
27 import tiledtmxloader
29 # -----------------------------------------------------------------------------
31 def main():
32 """
33 Main method.
34 """
35 args = sys.argv[1:]
36 if len(args) < 1:
37 path_to_map = os.path.join(os.pardir, "001-1.tmx")
38 print(("usage: python %s your_map.tmx\n\nUsing default map '%s'\n" % \
39 (os.path.basename(__file__), path_to_map)))
40 else:
41 path_to_map = args[0]
43 demo_pygame(path_to_map)
45 # -----------------------------------------------------------------------------
47 def demo_pygame(file_name):
48 """
49 This is the demo showing the usage of dynamic sprites
50 """
52 # parser the map (it is done here to initialize the
53 # window the same size as the map if it is small enough)
54 world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name)
56 # init pygame and set up a screen
57 pygame.init()
58 pygame.display.set_caption("tiledtmxloader - " + file_name + \
59 " - keys: arrows, 0-9")
60 screen_width = min(1024, world_map.pixel_width)
61 screen_height = min(768, world_map.pixel_height)
62 screen = pygame.display.set_mode((screen_width, screen_height))
64 # load the images using pygame
65 resources = tiledtmxloader.helperspygame.ResourceLoaderPygame()
66 resources.load(world_map)
68 # prepare map rendering
69 assert world_map.orientation == "orthogonal"
71 # renderer
72 renderer = tiledtmxloader.helperspygame.RendererPygame()
74 # cam_offset is for scrolling
75 cam_world_pos_x = 0
76 cam_world_pos_y = 0
78 # set initial cam position and size
79 renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \
80 screen_width, screen_height, "topleft")
82 # retrieve the layers
83 sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources)
85 # dynamic sprites
86 my_sprites = [create_dude(world_map.pixel_width, world_map.pixel_height) for x in range(300)]
88 # layer add/remove dynamic sprites
89 num_keys = [pygame.K_0, pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, \
90 pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9]
92 # variables for the main loop
93 clock = pygame.time.Clock()
94 running = True
95 # set up timer for fps printing
96 pygame.time.set_timer(pygame.USEREVENT, 1000)
98 # mainloop
99 while running:
100 dt = clock.tick()
102 # event handling
103 for event in pygame.event.get():
104 if event.type == pygame.QUIT:
105 running = False
106 elif event.type == pygame.USEREVENT:
107 print("fps: ", clock.get_fps())
108 elif event.type == pygame.KEYDOWN:
109 if event.key == pygame.K_ESCAPE:
110 running = False
111 elif event.key == pygame.K_UP:
112 cam_world_pos_y -= world_map.tileheight
113 elif event.key == pygame.K_DOWN:
114 cam_world_pos_y += world_map.tileheight
115 elif event.key == pygame.K_RIGHT:
116 cam_world_pos_x += world_map.tilewidth
117 elif event.key == pygame.K_LEFT:
118 cam_world_pos_x -= world_map.tilewidth
119 elif event.key == pygame.K_r:
120 print("resetting layers!")
121 sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources)
122 elif event.key in num_keys:
123 # find out which layer to manipulate
124 idx = num_keys.index(event.key)
125 # make sure this layer exists
126 if idx < len(world_map.layers):
127 # sprite_layers[idx] = tiledtmxloader.helperspygame.SpriteLayer.collapse(sprite_layers[idx])
128 # print "layer %s has collapse level: %s" % \
129 # (idx, sprite_layers[idx].get_collapse_level())
130 if sprite_layers[idx].contains_sprite(my_sprites[0]):
131 sprite_layers[idx].remove_sprites(my_sprites)
132 print("removed dude sprites from layer", idx)
133 else:
134 sprite_layers[idx].add_sprites(my_sprites)
135 print("added dude sprites to layer", idx)
136 else:
137 print("no such layer or more than 10 layers: " + str(idx))
139 # update sprites position
140 for spr in my_sprites:
141 spr.update(dt)
143 # adjust camera to position according to the keypresses
144 renderer.set_camera_position(cam_world_pos_x, cam_world_pos_y, "topleft")
146 # clear screen, might be left out if every pixel is redrawn anyway
147 screen.fill((0, 0, 0))
149 # render the map
150 for sprite_layer in sprite_layers:
151 if sprite_layer.is_object_group:
152 # we dont draw the object group layers
153 # you should filter them out if not needed
154 continue
155 else:
156 renderer.render_layer(screen, sprite_layer)
158 pygame.display.flip()
160 # -----------------------------------------------------------------------------
162 def create_dude(world_width, world_height):
164 Creates a random dude.
166 position_x = randint(0, world_width)
167 position_y = randint(0, world_height)
168 image = pygame.Surface((randint(40, 60), randint(70, 80)), pygame.SRCALPHA)
169 image.fill((randint(0, 255), randint(0, 255), randint(0, 255), 200))
170 return Dude(image, position_x, position_y)
172 # -----------------------------------------------------------------------------
174 class Dude(tiledtmxloader.helperspygame.SpriteLayer.Sprite):
176 This is a dynamic sprite. Imagine it is an animal or hero or
177 similar moving around the world.
180 def __init__(self, img, start_pos_x, start_pos_y):
182 Constructor.
184 super(Dude, self).__init__(img, img.get_rect())
185 self.velocity_x = 0
186 self.velocity_y = 0
187 self.position_x = start_pos_x
188 self.position_y = start_pos_y
189 self.rect.center = (self.position_x, self.position_y)
191 def update(self, dt):
193 Update the movement of the dudue.
195 if random.random() < 0.025:
196 if self.velocity_x:
197 self.velocity_x = 0
198 self.velocity_y = 0
199 else:
200 self.velocity_x = randint(-10, 10) * 0.005
201 self.velocity_y = randint(-10, 10) * 0.005
202 self.position_x += self.velocity_x * dt
203 self.position_y += self.velocity_y * dt
204 self.rect.center = (self.position_x, self.position_y)
206 # -----------------------------------------------------------------------------
208 if __name__ == '__main__':
210 main()