Improved Lab experiment
[2dworld.git] / lab_motor.py
blob17d16fa50c0a02df4d7d93f1f0cbe67943d169e5
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
4 import sys
5 import os
6 import math
7 import engine
8 import pygame
10 from hero import avatar_hero
12 MAP = "maps/lab.tmx"
13 HERO_DIR = "avatars/crono"
15 SCREEN_WIDTH = 640
16 SCREEN_HEIGHT = 480
18 # Este es el programa principal, invocado desde más abajo
19 def init():
20 """
21 Main method.
22 """
23 args = sys.argv[1:]
24 if len(args) < 1:
25 path_to_map = os.path.join(os.curdir, MAP)
26 print(("usage: python %s your_map.tmx\n\nUsing default map '%s'\n" % \
27 (os.path.basename(__file__), path_to_map)))
28 else:
29 path_to_map = args[0]
31 # Inicializa pygame y abre una ventana
32 pygame.init()
33 pygame.display.set_caption("Map viewer")
35 global screen, hero
36 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
37 # Crea el avatar del heroe
38 hero = create_hero(HERO_DIR)
40 # Inicializa el mundo
41 global renderer, sprite_layers, metadata_layer, tile_properties, hero_pos_x, hero_pos_y
42 renderer, sprite_layers, metadata_layer, tile_properties, hero_pos_x, hero_pos_y = engine.game.init(screen, path_to_map, hero)
43 #engine.game.loop(screen, renderer, sprite_layers, metadata_layer, tile_properties, hero, hero_pos_x, hero_pos_y)
45 global clock
46 clock = pygame.time.Clock()
48 global direction
49 direction = 1
51 def turn(change):
52 global direction
53 direction += change
54 direction = direction % 4
55 direction_x, direction_y = [(0,-1), (1,0), (0,1), (-1,0)][direction]
57 hero.update(direction_x, direction_y, action_type = engine.actor.STAND)
59 engine.game.draw(screen, renderer, hero, sprite_layers)
60 pygame.display.flip()
62 # event handling
63 for event in pygame.event.get():
64 if event.type == pygame.QUIT:
65 sys.exit(0)
66 elif event.type == pygame.KEYDOWN:
67 if event.key == pygame.K_ESCAPE:
68 sys.exit(0)
70 def right():
71 turn(1)
73 def left():
74 turn(-1)
76 BLOCK = 1
77 GOAL = 2
79 FORWARD = 0
80 RIGHT = 1
81 LEFT = -1
83 def look(dir=FORWARD):
84 global screen, renderer, sprite_layers, metadata_layer, tile_properties, hero, hero_pos_x, hero_pos_y, clock
86 global direction
87 lookdir = (direction + dir) % 4
88 direction_x, direction_y = [(0,-1), (1,0), (0,1), (-1,0)][lookdir]
90 # make sure the hero moves with same speed in all directions (diagonal!)
91 dir_len = math.hypot(direction_x, direction_y)
92 dir_len = dir_len if dir_len else 1.0
94 # update position
95 step_x = direction_x * 4
96 step_y = direction_y * 4
98 # event handling
99 for event in pygame.event.get():
100 if event.type == pygame.QUIT:
101 sys.exit(0)
102 elif event.type == pygame.KEYDOWN:
103 if event.key == pygame.K_ESCAPE:
104 sys.exit(0)
106 if metadata_layer is not None:
107 try:
108 if engine.game.check_collision(hero_pos_x+step_x, hero_pos_y+step_y, hero.width, hero.height, \
109 metadata_layer, tile_properties, 'block'):
110 return BLOCK
111 except:
112 pass
114 if metadata_layer is not None:
115 try:
116 if engine.game.check_collision(hero_pos_x+step_x, hero_pos_y+step_y, hero.width, hero.height, \
117 metadata_layer, tile_properties, 'goal'):
118 return GOAL
119 except:
120 pass
122 def forward():
123 global screen, renderer, sprite_layers, metadata_layer, tile_properties, hero, hero_pos_x, hero_pos_y, clock
124 dt = clock.tick()
125 speed = 0.075 * 2.
127 global direction
128 direction = direction % 4
129 direction_x, direction_y = [(0,-1), (1,0), (0,1), (-1,0)][direction]
131 # make sure the hero moves with same speed in all directions (diagonal!)
132 dir_len = math.hypot(direction_x, direction_y)
133 dir_len = dir_len if dir_len else 1.0
135 # update position
136 step_x = speed * dt * direction_x / dir_len
137 step_y = speed * dt * direction_y / dir_len
139 if metadata_layer is not None:
140 try:
141 step_x, step_y = engine.game.check_movement(hero_pos_x, hero_pos_y, step_x, step_y, \
142 hero.width, hero.height, metadata_layer, tile_properties)
143 except:
144 pass
146 hero_pos_x += step_x
147 hero_pos_y += step_y
148 hero.rect.midbottom = (hero_pos_x, hero_pos_y)
150 hero.update(step_x, step_y, action_type = engine.actor.WALK)
152 engine.game.draw(screen, renderer, hero, sprite_layers)
153 pygame.display.flip()
155 end = False
157 if metadata_layer is not None:
158 try:
159 if engine.game.check_collision(hero_pos_x, hero_pos_y, hero.width, hero.height, \
160 metadata_layer, tile_properties, 'goal'):
161 print "YAY!!! GOAL!!!"
162 end = True
163 except:
164 pass
166 if end:
167 sys.exit(0)
169 # event handling
170 for event in pygame.event.get():
171 if event.type == pygame.QUIT:
172 sys.exit(0)
173 elif event.type == pygame.KEYDOWN:
174 if event.key == pygame.K_ESCAPE:
175 sys.exit(0)
177 def create_hero(directory):
179 Creates the hero sprite.
181 hero = avatar_hero(directory)
182 #hero = engine.vehicle.vehicle("avatars/vehicles", "car.png")
183 return hero