Aug-13-2019, 02:18 PM
When you want to build something. Just break it down into parts.
Like for grids. There a couple of ways to handle it. One you can do it by math. Two you can handle it by a list of list of rects.
Example
Like for grids. There a couple of ways to handle it. One you can do it by math. Two you can handle it by a list of list of rects.
Example
import pygame import os from pygame.sprite import Sprite, Group class State: def on_draw(self, surface): pass def on_event(self, event): pass def on_update(self, delta): pass class Engine: @classmethod def setup(cls, caption, width, height, center=False): pygame.display.set_caption(caption) cls.surface = pygame.display.set_mode((width, height)) cls.rect = cls.surface.get_rect() cls.clock = pygame.time.Clock() cls.running = False cls.delta = 0 cls.fps = 30 if center: os.environ['SDL_VIDEO_CENTERED'] = '1' cls.state = State() @classmethod def mainloop(cls): cls.running = True while cls.running: for event in pygame.event.get(): cls.state.on_event(event) cls.state.on_update(cls.delta) cls.state.on_draw(cls.surface) pygame.display.flip() cls.delta = cls.clock.tick(cls.fps) class SimpleSprite(Sprite): @classmethod def load_image(cls): cls.image = pygame.Surface((38, 38)) cls.image.fill(pygame.Color('dodgerblue')) def __init__(self, position, anchor="topleft"): Sprite.__init__(self) self.image = SimpleSprite.image self.rect = self.image.get_rect() setattr(self.rect, anchor, position) class MouseGrab: def __init__(self): self.selected = None self.home_rect = None self.grab_position = None def grab(self, pos, sprites): for sprite in sprites: if sprite.rect.collidepoint(pos): self.grab_position = (pos[0] - sprite.rect.x, pos[1] - sprite.rect.y) self.home_rect = sprite.rect.copy() self.selected = sprite return def drop(self, pos, grid): if self.selected: for col in grid: for rect in col: if rect.collidepoint(pos): self.selected.rect.center = rect.center self.selected = None return def move(self, pos): if self.selected: x = pos[0] - self.grab_position[0] y = pos[1] - self.grab_position[1] self.selected.rect.topleft = x, y class Example(State): def __init__(self): self.grid = [] self.sprites = Group() self.mouse = MouseGrab() grid_size = 40, 40 for x in range(0, Engine.rect.width, grid_size[0]): col = [] for y in range(0, Engine.rect.height, grid_size[1]): col.append(pygame.Rect(x, y, grid_size[0], grid_size[1])) self.grid.append(col) sprite = SimpleSprite((60, 60), 'center') sprite.add(self.sprites) sprite = SimpleSprite((420, 220), 'center') sprite.add(self.sprites) def on_draw(self, surface): surface.fill(pygame.Color('black')) self.sprites.draw(surface) def on_event(self, event): if event.type == pygame.QUIT: Engine.running = False elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: self.mouse.grab(event.pos, self.sprites) elif event.type == pygame.MOUSEBUTTONUP: if event.button == 1: self.mouse.drop(event.pos, self.grid) elif event.type == pygame.MOUSEMOTION: self.mouse.move(event.pos) def main(): pygame.init() Engine.setup("Example", 800, 600, True) SimpleSprite.load_image() Engine.state = Example() Engine.mainloop() if __name__ == "__main__": main()
99 percent of computer problems exists between chair and keyboard.