From e6c65d33e68fdfe3b28bff284c62ead374566504 Mon Sep 17 00:00:00 2001 From: Brian Silverman Date: Wed, 30 May 2007 13:28:45 +0000 Subject: Initial import --- (limited to 'sprites.py') diff --git a/sprites.py b/sprites.py new file mode 100755 index 0000000..245bac3 --- /dev/null +++ b/sprites.py @@ -0,0 +1,120 @@ +import pygtk +pygtk.require('2.0') +import gtk +import gobject +import pango + +sprites = [] +gc = None +window = None +black = None + +class Sprite: + def __init__(self,x,y,image,altlabel=False): + self.x = x + self.y = y + self.setimage(image) + self.label = None + if altlabel: self.draw_label = self.draw_label2 + else: self.draw_label = self.draw_label1 + + def setimage(self,image): + self.image = image + if isinstance(image,gtk.gdk.Pixbuf): + self.width = self.image.get_width() + self.height = self.image.get_height() + else: self.width,self.height=image.get_size() + + + def move(self,pos): + self.inval() + self.x,self.y = pos + self.inval() + + def setshape(self,image): + self.inval() + self.setimage(image) + self.inval() + + def setlayer(self, layer): + if self in sprites: sprites.remove(self) + self.layer = layer + for i in range(len(sprites)): + if layer < sprites[i].layer: sprites.insert(i, self); self.inval(); return + sprites.append(self) + self.inval() + + def hide(self): + if self not in sprites: return + self.inval() + sprites.remove(self) + + def setlabel(self,label): + self.label = label + self.inval() + + def inval(self): + area.invalidate_rect(gtk.gdk.Rectangle(self.x,self.y,self.width,self.height), False) + + def draw(self): + if isinstance(self.image,gtk.gdk.Pixbuf): area.draw_pixbuf(gc, self.image, 0, 0, self.x, self.y) + else: area.draw_drawable(gc,self.image,0,0,self.x,self.y,-1,-1) + if self.label!=None: self.draw_label(self.label) + + def hit(self,pos): + x,y = pos + if xself.x+self.width: return False + if yself.y+self.height: return False + if isinstance(self.image,gtk.gdk.Pixmap): return True + dx,dy = x-self.x, y-self.y + return ord(self.image.get_pixels()[(dy*self.width+dx)*4+3]) == 255 + + def draw_label1(self, label): + fd = pango.FontDescription('Sans') + fd.set_size(7*pango.SCALE) + pl = window.create_pango_layout(str(label)) + pl.set_font_description(fd) + swidth = pl.get_size()[0]/pango.SCALE + sheight = pl.get_size()[1]/pango.SCALE + centerx = self.x+self.width/2 + centery = self.y+self.height/2 + gc.set_foreground(black) + area.draw_layout(gc,centerx-swidth/2,centery-sheight/2,pl) + + def draw_label2(self, label): + fd = pango.FontDescription('Sans') + fd.set_size(9*pango.SCALE) + pl = window.create_pango_layout(str(label)) + pl.set_font_description(fd) + sheight = pl.get_size()[1]/pango.SCALE + centery = self.y+self.height/2 + gc.set_foreground(black) + area.draw_layout(gc,self.x+50,centery-sheight/2,pl) + + +def findsprite(pos): + list = sprites[:] + list.reverse() + for s in list: + if s.hit(pos): return s + return None + +def redrawsprites(): + for s in sprites: s.draw() + +def getpixel(image,x,y): + array = image.get_pixels() + offset = (y*image.get_width()+x)*4 + r,g,b,a = ord(array[offset]),ord(array[offset+1]),ord(array[offset+2]),ord(array[offset+3]) + return (a<<24)+(b<<16)+(g<<8)+r + +def setspritecontext(w,a,g): + global window,area,gc,black + window=w + area =a + gc = g + black = gc.get_colormap().alloc_color('black') + +def spritelist(): return sprites \ No newline at end of file -- cgit v0.9.1