Begun YAML-based loading system
+import os
+import imp
+import yaml
+from Collage import Collage
+from Surface import SurfaceSet
+from Stage import Stage, Layer
+
+classpath = ['classes', 'Richter']
+
+def findClass(classname):
+ "A fun bit of metaprogramming, loading a class based on its name"
+ mod = imp.find_module(classname, classpath)
+ try:
+ c = imp.load_module(classname, *mod)
+ mod[0].close()
+ return eval("c.%s" % classname)
+ finally:
+ mod[0].close()
+
+
+class Level:
+ def __init__(self, dir):
+ self.env = {}
+ self.load(dir)
+
+
+ def load(self, dir):
+ f = open(os.path.join(dir, 'level.yaml'), 'r')
+ layers = yaml.safe_load(f)
+ f.close()
+
+ self.stage = Stage()
+
+ for layer in layers:
+ print layer
+ collage = None
+ surfaces = None
+ scale = 1.0
+ parallax = 1.0
+
+ print 'Name:', layer['name']
+ if layer.has_key('collage'):
+ collage = Collage(os.path.join(dir, 'collages', layer['collage']))
+ if layer.has_key('surfaces'):
+ surfaces = SurfaceSet(os.path.join(dir, 'surfaces', layer['surfaces']))
+ if layer.has_key('properties'):
+ if layer['properties'].has_key('scale'):
+ scale = layer['properties']['scale']
+ if layer['properties'].has_key('parallax'):
+ parallax = layer['properties']['parallax']
+
+ new_layer = Layer(collage, surfaces, scale, parallax)
+ self.stage.addLayerBack(new_layer)
+
+ if layer.has_key('things'):
+ self.compileThings(new_layer, layer['things'])
+
+
+ def compileThings(self, layer, things):
+ for (name, t) in things.iteritems():
+ c = findClass(t['class'])
+ properties = {}
+ if t.has_key('properties'):
+ properties = t['properties']
+ self.env[name] = c(**properties)
+ layer.add(self.env[name])
+from Actor import Actor
+from Sprite import *
+
+class Richter(Actor):
+ def __init__(self, **kwargs):
+ Actor.__init__(self, **kwargs)
+
+ self.defineState('walk_l',
+ Sprite(['Sprites/Richter/richter%d.png' % n for n in range(0,8)],
+ framerate=10.0, scale=2.0, gravity=(CENTER,BOTTOM)))
+ self.defineState('walk_r',
+ Sprite(['Sprites/Richter/richter%d.png' % n for n in range(0,8)], mirror=True,
+ framerate=10.0, scale=2.0, gravity=(CENTER,BOTTOM)))
+ self.defineState('idle_l',
+ Sprite("Sprites/Richter/richter0.png", scale=2.0, gravity=(CENTER,BOTTOM)))
+ self.defineState('idle_r',
+ Sprite("Sprites/Richter/richter0.png", mirror=True, scale=2.0, gravity=(CENTER,BOTTOM)))
+ self.setState('idle_r')
+
+ self.delta = [0,0]
+ self.jumping = False
+ self.grounded = self.collideDelta((0,-1))
+
+
+ def jump(self):
+ if not self.jumping and self.grounded:
+ self.delta[1] = 15.0
+ self.jumping = True
+ self.grounded = False
+
+
+ def jumpCancel(self):
+ self.jumping = False
+ if self.delta[1] > 0.0:
+ self.delta[1] = 0.0
+
+
+ def bounce(self):
+ self.delta[1] = -self.delta[1]
+
+
+ def walkRight(self):
+ self.delta[0] = 2
+ self.setState('walk_r')
+
+
+ def walkLeft(self):
+ self.delta[0] = -2
+ self.setState('walk_l')
+
+
+ def idle(self):
+ if self.currentstate == 'walk_l':
+ self.setState('idle_l')
+ else:
+ self.setState('idle_r')
+ self.delta[0] = 0
+
+
+ def update(self):
+ if self.grounded:
+ self.delta[1] = 0
+ else:
+ if self.delta[1] > -15.0:
+ self.delta[1] -= 0.5
+ if self.grounded and self.delta[0] != 0:
+ # Climb up inclines (visually poetic, is it not?)
+ if self.collideDelta(self.delta):
+ delta = list(self.delta)
+ for delta[1] in range(1, abs(delta[0]) + 1):
+ if not self.collideDelta(delta):
+ self.delta = delta
+ break
+ # ... and walk down slopes
+ else:
+ self.delta[1] = -abs(self.delta[0])
+ self.move(self.delta)
+ self.grounded = self.collideDelta((0,-1))
-texture img/star.png
-tile 232 421
-tile 390 193
-tile 548 66
-tile 311 367
-tile 430 12
-tile 88 64
-tile 90 123
-tile 286 370
-tile 263 100
-tile 338 84
-tile 231 47
-tile 132 415
-tile 399 183
-tile 111 470
-tile 445 67
-tile 427 159
-tile 237 103
-tile 533 223
-tile 26 409
-tile 382 87
-tile 507 82
-tile 329 380
-tile 381 417
-tile 518 317
-tile 378 197
-tile 607 463
-tile 502 274
-tile 406 235
-tile 185 249
-tile 448 412
-tile 418 29
-tile 248 121
-tile 177 85
-tile 327 352
-tile 466 39
-tile 591 306
-tile 106 95
-tile 570 209
-tile 163 466
-tile 100 185
-tile 376 469
-tile 586 33
-tile 383 251
-tile 178 209
-tile 121 211
-tile 408 289
-tile 539 222
-tile 476 245
-tile 282 274
-tile 557 90
-tile 249 80
-tile 563 447
-tile 18 229
-tile 255 244
-tile 358 354
-tile 563 323
-tile 292 28
-tile 497 241
-tile 379 67
-tile 260 51
-tile 159 163
-tile 209 304
-tile 541 28
-tile 635 475
-tile 479 130
-tile 473 45
-tile 127 308
-tile 281 420
-tile 332 28
-tile 177 478
-tile 413 12
-tile 265 403
-tile 216 147
-tile 105 117
-tile 64 417
-tile 164 137
-tile 131 416
-tile 386 67
-tile 511 111
-tile 239 419
-tile 600 445
-tile 356 369
-tile 314 266
-tile 153 473
-tile 239 221
-tile 359 135
-tile 288 133
-tile 511 449
-tile 234 401
-tile 333 71
-tile 40 78
-tile 426 235
-tile 251 195
-tile 324 432
-tile 25 334
-tile 205 37
-tile 219 284
-tile 358 414
-tile 260 395
-tile 202 22
-tile 594 64
-tile 187 39
-tile 71 231
-tile 428 5
-tile 180 302
-tile 435 93
-tile 10 161
-tile 45 113
-tile 224 99
-tile 46 401
-tile 196 465
-tile 432 376
-tile 194 342
-tile 375 76
-tile 437 174
-tile 197 275
-tile 208 92
-tile 195 118
-tile 618 202
-tile 554 406
+texture img/star.png
+tile 232 421
+tile 390 193
+tile 548 66
+tile 311 367
+tile 430 12
+tile 88 64
+tile 90 123
+tile 286 370
+tile 263 100
+tile 338 84
+tile 231 47
+tile 132 415
+tile 399 183
+tile 111 470
+tile 445 67
+tile 427 159
+tile 237 103
+tile 533 223
+tile 26 409
+tile 382 87
+tile 507 82
+tile 329 380
+tile 381 417
+tile 518 317
+tile 378 197
+tile 607 463
+tile 502 274
+tile 406 235
+tile 185 249
+tile 448 412
+tile 418 29
+tile 248 121
+tile 177 85
+tile 327 352
+tile 466 39
+tile 591 306
+tile 106 95
+tile 570 209
+tile 163 466
+tile 100 185
+tile 376 469
+tile 586 33
+tile 383 251
+tile 178 209
+tile 121 211
+tile 408 289
+tile 539 222
+tile 476 245
+tile 282 274
+tile 557 90
+tile 249 80
+tile 563 447
+tile 18 229
+tile 255 244
+tile 358 354
+tile 563 323
+tile 292 28
+tile 497 241
+tile 379 67
+tile 260 51
+tile 159 163
+tile 209 304
+tile 541 28
+tile 635 475
+tile 479 130
+tile 473 45
+tile 127 308
+tile 281 420
+tile 332 28
+tile 177 478
+tile 413 12
+tile 265 403
+tile 216 147
+tile 105 117
+tile 64 417
+tile 164 137
+tile 131 416
+tile 386 67
+tile 511 111
+tile 239 419
+tile 600 445
+tile 356 369
+tile 314 266
+tile 153 473
+tile 239 221
+tile 359 135
+tile 288 133
+tile 511 449
+tile 234 401
+tile 333 71
+tile 40 78
+tile 426 235
+tile 251 195
+tile 324 432
+tile 25 334
+tile 205 37
+tile 219 284
+tile 358 414
+tile 260 395
+tile 202 22
+tile 594 64
+tile 187 39
+tile 71 231
+tile 428 5
+tile 180 302
+tile 435 93
+tile 10 161
+tile 45 113
+tile 224 99
+tile 46 401
+tile 196 465
+tile 432 376
+tile 194 342
+tile 375 76
+tile 437 174
+tile 197 275
+tile 208 92
+tile 195 118
+tile 618 202
+tile 554 406
-main:
- collage: example1
- surfaces: example1
- things:
-
- player:
- class: Richter
- properties: {position: [64,64]}
- events:
- collide(self, obj): |
- if obj == zombie1:
- print "ZOMBIE!"
- enterRegion(self, region): |
- print "region"
-
- candelabra:
- class: Sprite
- args:
- file:
- - Sprites/candelabra_short/cand_s_1.png
- - Sprites/candelabra_short/cand_s_2.png
- - Sprites/candelabra_short/cand_s_3.png
- - Sprites/candelabra_short/cand_s_4.png
- position: [64,64]
- scale: 2.0
- gravity: [CENTER,BOTTOM]
- framerate: 10.0
- init: |
- candelabra.play()
-
-
- zombie1:
- class: Zombie
- events:
- collide(self, obj): |
- print "GRAAAR!", obj
-
-stars:
- collage: stars
+- name: main
+ collage: example1
+ surfaces: example1
+ things:
+
+ player:
+ class: Richter
+ properties: {position: [64,64]}
+ events:
+ collide(self, obj): |
+ if obj == zombie1:
+ print "ZOMBIE!"
+ enterRegion(self, region): |
+ print "region"
+
+ candelabra:
+ class: Sprite
+ properties:
+ file:
+ - Sprites/candelabra_short/cand_s_1.png
+ - Sprites/candelabra_short/cand_s_2.png
+ - Sprites/candelabra_short/cand_s_3.png
+ - Sprites/candelabra_short/cand_s_4.png
+ position: [64,64]
+ scale: 2.0
+ gravity: [CENTER,BOTTOM]
+ framerate: 10.0
+ init: |
+ candelabra.play()
+
+ zombie1:
+ class: Zombie
+ properties: {position: [512, 64]}
+ events:
+ collide(self, obj): |
+ print "GRAAAR!", obj
+
+- name: stars
+ parallax: 0.25
+ collage: stars