2 # -*- coding: utf-8 -*-
6 This is the pygame minimal example.
11 __revision__
= "$Rev$"
12 __version__
= "3.0.0." + __revision__
[6:-2]
13 __author__
= 'DR0ID @ 2009-2011'
18 from random
import randint
29 # -----------------------------------------------------------------------------
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
)))
43 demo_pygame(path_to_map
)
45 # -----------------------------------------------------------------------------
47 def demo_pygame(file_name
):
49 This is the demo showing the usage of dynamic sprites
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
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"
72 renderer
= tiledtmxloader
.helperspygame
.RendererPygame()
74 # cam_offset is for scrolling
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")
83 sprite_layers
= tiledtmxloader
.helperspygame
.get_layers_from_map(resources
)
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()
95 # set up timer for fps printing
96 pygame
.time
.set_timer(pygame
.USEREVENT
, 1000)
103 for event
in pygame
.event
.get():
104 if event
.type == pygame
.QUIT
:
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
:
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
)
134 sprite_layers
[idx
].add_sprites(my_sprites
)
135 print("added dude sprites to layer", idx
)
137 print("no such layer or more than 10 layers: " + str(idx
))
139 # update sprites position
140 for spr
in my_sprites
:
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))
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
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
):
184 super(Dude
, self
).__init
__(img
, img
.get_rect())
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:
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__':