Skip to content

Instantly share code, notes, and snippets.

@Mekire
Last active September 10, 2015 02:20
Show Gist options
  • Save Mekire/ad15a1d3834fbeb7e6a5 to your computer and use it in GitHub Desktop.
Save Mekire/ad15a1d3834fbeb7e6a5 to your computer and use it in GitHub Desktop.
import sys
import random
import pygame as pg
from string import ascii_uppercase
SCREEN_SIZE = (500, 500)
CAPTION = "Letter Tiles"
BACKGROUND_COLOR = pg.Color("darkslategray")
class LetterTile(pg.sprite.Sprite):
SIZE = (50, 50)
def __init__(self, letter, pos, *groups):
super(LetterTile, self).__init__(*groups)
self.letter = letter
self.image = self.make_image(letter)
self.rect = self.image.get_rect(topleft=pos)
self.clicked = False
def make_image(self, letter):
image = pg.Surface(LetterTile.SIZE).convert()
rect = image.get_rect()
image.fill(pg.Color("black"))
image.fill(pg.Color("beige"), rect.inflate(-4, -4))
letter = FONT.render(letter, True, pg.Color("black"))
letter_rect =letter.get_rect(center=rect.center)
image.blit(letter, letter_rect)
return image
def check_click(self, pos):
hit = self.rect.collidepoint(pos)
self.clicked = hit
return hit
def update(self, screen_rect):
if self.clicked:
self.rect.move_ip(pg.mouse.get_rel())
self.rect.clamp_ip(screen_rect)
def draw(self, surface):
surface.blit(self.image, self.rect)
class App(object):
def __init__(self):
self.screen = pg.display.get_surface()
self.screen_rect = self.screen.get_rect()
self.clock = pg.time.Clock()
self.fps = 60
self.done = False
self.dragging = False
self.tiles = self.make_tiles()
def make_tiles(self):
tiles = pg.sprite.Group()
for letter in ascii_uppercase:
pos = (random.randrange(self.screen_rect.w),
random.randrange(self.screen_rect.h))
LetterTile(letter, pos, tiles)
return tiles
def event_loop(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.done = True
elif event.type == pg.MOUSEBUTTONDOWN and event.button == 1:
self.on_mouse_down(event)
elif event.type == pg.MOUSEBUTTONUP and event.button == 1:
self.on_mouse_up(event)
def on_mouse_down(self, event):
for tile in self.tiles:
if not self.dragging and tile.check_click(event.pos):
self.dragging = True
pg.mouse.get_rel()
break
def on_mouse_up(self, event):
for tile in self.tiles:
tile.clicked = False
self.dragging = False
def update(self):
self.tiles.update(self.screen_rect)
def render(self):
self.screen.fill(BACKGROUND_COLOR)
self.tiles.draw(self.screen)
pg.display.update()
def main_loop(self):
while not self.done:
self.event_loop()
self.update()
self.render()
self.clock.tick(self.fps)
def main():
global FONT
pg.init()
pg.display.set_caption(CAPTION)
pg.display.set_mode(SCREEN_SIZE)
FONT = pg.font.Font(None, 50)
App().main_loop()
pg.quit()
sys.exit()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment