Python Forum
[PyGame] 2D BoardGame Pygame
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] 2D BoardGame Pygame
#3
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
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.
Reply


Messages In This Thread
2D BoardGame Pygame - by Josh_Python890 - Aug-13-2019, 11:59 AM
RE: 2D BoardGame Pygame - by metulburr - Aug-13-2019, 12:32 PM
RE: 2D BoardGame Pygame - by Windspar - Aug-13-2019, 02:18 PM
RE: 2D BoardGame Pygame - by Windspar - Aug-13-2019, 06:25 PM
RE: 2D BoardGame Pygame - by SheeppOSU - Aug-14-2019, 02:32 AM
RE: 2D BoardGame Pygame - by Windspar - Aug-15-2019, 09:02 PM

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020