the world is a pixel
Posts tagged pygame
Python Fast XML Parsing
Dec 25th

Here is a useful tip on Python XML decoding.
I was extending xml.sax.ContentHandler class in a example to decode maps for a Pygame application when my connection went down and I noticed that the program stop working raising a exception regarded a call to urlib (a module for retrieve resources by url). I noticed that the module was getting the remote DTD schema to validate the XML.
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
This is not a requirement for my applications and it’s a huge performance overhead when works (almost 1 second for each map loaded) and when the applications is running in a environment without Internet it just waits for almost a minute and then fail with the remain decoding. A dirty workaround is open the XML file and get rid of the line containing the DTD reference.
But the correct way to programming XML decoding when we are not concerned on validate a XML schema is just the xml.parsers.expat. Instead of using a interface you just have to set some callback functions with the behaviors we want. This is a example from the documentation:
import xml.parsers.expat # 3 handler functions def start_element(name, attrs): print 'Start element:', name, attrs def end_element(name): print 'End element:', name def char_data(data): print 'Character data:', repr(data) p = xml.parsers.expat.ParserCreate() p.StartElementHandler = start_element p.EndElementHandler = end_element p.CharacterDataHandler = char_data p.Parse("""<?xml version="1.0"?> <parent id="top"><child1 name="paul">Text goes here</child1> <child2 name="fred">More text</child2> </parent>""", 1)
The output:
Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
Pygame: Running Orcs
Dec 11th
Here is a Pygame Sprite animation using the approach presented by Joe Wreschnig and Nicolas Crovatti. It’s not yet exactly what I need but is very suitable.
import pygame, random from pygame.locals import * class Char(pygame.sprite.Sprite): x,y = (100,0) def __init__(self, img, frames=1, modes=1, w=32, h=32, fps=3): pygame.sprite.Sprite.__init__(self) original_width, original_height = img.get_size() self._w = w self._h = h self._framelist = [] for i in xrange(int(original_width/w)): self._framelist.append(img.subsurface((i*w,0,w,h))) self.image = self._framelist[0] self._start = pygame.time.get_ticks() self._delay = 1000 / fps self._last_update = 0 self._frame = 0 self.update(pygame.time.get_ticks(), 100, 100) def set_pos(self, x, y): self.x = x self.y = y def get_pos(self): return (self.x,self.y) def update(self, t, width, height): # postion self.y+=1 if(self.y>width): self.x = random.randint(0,height-self._w) self.y = -self._h # animation if t - self._last_update > self._delay: self._frame += 1 if self._frame >= len(self._framelist): self._frame = 0 self.image = self._framelist[self._frame] self._last_update = t SCREEN_W, SCREEN_H = (320, 320) def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_W, SCREEN_H)) background = pygame.image.load("field.png") img_orc = pygame.image.load("orc.png") orc = Char(img_orc, 4, 1, 32, 48) while pygame.event.poll().type != KEYDOWN: screen.blit(background, (0,0)) screen.blit(orc.image, orc.get_pos()) orc.update(pygame.time.get_ticks(), SCREEN_W, SCREEN_H) pygame.display.update() pygame.time.delay(10) if __name__ == '__main__': main()
Here is it working:
Uptade: I put this source and images at the OpenPixel project in Github
Pygame Simple Key Handling
Dec 10th
Here’s a simple key handle in Pygame wheres you move a circle using keyboard.
import pygame from pygame.locals import * def main(): x,y = (100,100) pygame.init() screen = pygame.display.set_mode((400, 400)) while 1: pygame.time.delay(1000/60) # exit handle for event in pygame.event.get(): if event.type == QUIT: return elif event.type == KEYDOWN and event.key == K_ESCAPE: return # keys handle key=pygame.key.get_pressed() if key[K_LEFT]: x-=1 if key[K_RIGHT]: x+=1 if key[K_UP]: y-=1 if key[K_DOWN]: y+=1 # fill background and draw a white circle screen.fill((255,255,255)) pygame.draw.circle(screen, (0,0,0), [x,y], 30) pygame.display.flip() if __name__ == '__main__': main()
Here’s a video of it working:
Function pygame.key.get_pressed Returns a sequence of boolean values representing the state of every key on the keyboard. It’s very useful because usually on others game platforms I have to create it by myself.
This approach allow me to handle more than one key at time. For example, left and up keys can be pressed and each one is handled separately creating a diagonal movement.












