# # scriptedfun.com # # Screencast #3 # Arinoid - The Paddle # import os, pygame from pygame.locals import * SCREENRECT = Rect(0, 0, 640, 480) def paddleimage(spritesheet): paddle = pygame.Surface((55, 11)).convert() # left half paddle.blit(spritesheet.imgat((261, 143, 27, 11)), (0, 0)) # right half paddle.blit(spritesheet.imgat((289, 143, 28, 11)), (27, 0)) paddle.set_colorkey(paddle.get_at((0, 0)), RLEACCEL) return paddle class Spritesheet: def __init__(self, filename): self.sheet = pygame.image.load(os.path.join('data', filename)).convert() def imgat(self, rect, colorkey = None): rect = Rect(rect) image = pygame.Surface(rect.size).convert() image.blit(self.sheet, (0, 0), rect) if colorkey is not None: if colorkey is -1: colorkey = image.get_at((0, 0)) image.set_colorkey(colorkey, RLEACCEL) return image def imgsat(self, rects, colorkey = None): imgs = [] for rect in rects: imgs.append(self.imgat(rect, colorkey)) return imgs class Arena: tileside = 31 numxtiles = 12 numytiles = 14 topx = (SCREENRECT.width - SCREENRECT.width/tileside*tileside)/2 topy = (SCREENRECT.height - SCREENRECT.height/tileside*tileside)/2 rect = Rect(topx + tileside, topy + tileside, tileside*numxtiles, tileside*numytiles) def __init__(self): self.background = pygame.Surface(SCREENRECT.size).convert() def drawtile(self, tile, x, y): self.background.blit(tile, (self.topx + self.tileside*x, \ self.topy + self.tileside*y)) def makebg(self, tilenum): for x in range(self.numxtiles): for y in range(self.numytiles): self.drawtile(self.tiles[tilenum], x + 1, y + 1) class Paddle(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.rect = self.image.get_rect() self.rect.bottom = self.arena.rect.bottom - self.arena.tileside def update(self): self.rect.centerx = pygame.mouse.get_pos()[0] self.rect.clamp_ip(self.arena.rect) def main(): pygame.init() screen = pygame.display.set_mode(SCREENRECT.size) spritesheet = Spritesheet('arinoid_master.bmp') Arena.tiles = spritesheet.imgsat([(129, 321, 31, 31), # purple - 0 (161, 321, 31, 31), # dark blue - 1 (129, 353, 31, 31), # red - 2 (161, 353, 31, 31), # green - 3 (129, 385, 31, 31)]) # blue - 4 Paddle.image = paddleimage(spritesheet) # make background arena = Arena() arena.makebg(0) # you may change the background color here screen.blit(arena.background, (0, 0)) pygame.display.update() Paddle.arena = arena # keep track of sprites all = pygame.sprite.RenderUpdates() Paddle.containers = all # keep track of time clock = pygame.time.Clock() paddle = Paddle() # game loop while 1: # get input for event in pygame.event.get(): if event.type == QUIT \ or (event.type == KEYDOWN and \ event.key == K_ESCAPE): return # clear sprites all.clear(screen, arena.background) # update sprites all.update() # redraw sprites dirty = all.draw(screen) pygame.display.update(dirty) # maintain frame rate clock.tick(30) if __name__ == '__main__': main()