How to place blocks in a grid

Viewed 17

I'm making this game based on pygame and the Vector2 part of pygame and am having trouble placing blocks in the grid spaces that the player can also move around in (they just get placed wherever the cursor is).

import pygame, sys
from pygame.math import Vector2

pygame.init()
tile_size = 16
tile_number = 32
screen = pygame.display.set_mode((tile_size * tile_number, tile_size * tile_number))
clock = pygame.time.Clock()
background = pygame.image.load("background.png").convert_alpha()

class MAIN:
    def __init__(self):
        self.pos = Vector2(0,0)
        self.blocks = []
    
    def draw_player(self):
        player_rect = pygame.Rect(int(self.pos.x * tile_size), int(self.pos.y * tile_size), tile_size, tile_size)
        pygame.draw.rect(screen,(255,0,0), player_rect)

    def place_block(self):
        mouse_pos = Vector2(pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1])
        block_rect = pygame.Rect(mouse_pos.x, mouse_pos.y, tile_size, tile_size)
        self.blocks.append(block_rect)
    
    def break_block(self):
        for block in self.blocks:
            if block.collidepoint(pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1]):
                print("block broken")
                self.blocks.remove(block)
        

    def draw_blocks(self):
        for block in self.blocks:
            pygame.draw.rect(screen,(0,0,0), block)
        

game = MAIN()

while True:
    keys = pygame.key.get_pressed()
    if keys[pygame.K_d]:
        game.pos.x += 1
    if keys[pygame.K_a]:
        game.pos.x -= 1
    if keys[pygame.K_w]:
        game.pos.y -= 1
    if keys[pygame.K_s]:
        game.pos.y += 1
    mouse = pygame.mouse.get_pressed()
    if mouse[2]:
        game.place_block()
    if mouse[0]:
        game.break_block()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
       

    screen.blit(background,(0,0))  
    game.draw_blocks()  
    game.draw_player()

    pygame.display.update()
    clock.tick(20)
0 Answers
Related