How do you put the "covering" on the cage?



  • I'm working on a Pygame game, and I've got a problem with creating a grid in which if you press one of the cells, the image will appear in the center of the cell.

    The first thought was to create a few pygame.Rect, when pressed, images would appear exactly where this pygame is.Rect. But since the size of the grid is 8x8, you just have to make 64 variables, which I think is not effective.

    If it's not clear what I'm talking about, I've shown it on purpose, how it should be done.

    фотография

    The code (code may seem badly written, but that's all I can):

    import pygame
    from pygame.locals import *
    import os
    import sys
    

    pygame.init()
    pygame.mixer.init()

    motion = "stop"

    screen = pygame.display.set_mode((512, 512))
    pygame.display.set_caption('Main Menu - Limited Space, Endless Ideas')

    clock = pygame.time.Clock()
    allSprites = pygame.sprite.Group()

    Настраиваем директории

    rootPath = os.path.dirname(file)
    resourcesPath = os.path.join(rootPath, "resources")
    texturesPath = os.path.join(resourcesPath, "textures")
    playerPath = os.path.join(texturesPath, "player")
    skinsPath = os.path.join(playerPath, "skins")

    Настраиваем пути текстур

    ground512 = pygame.image.load(os.path.join(texturesPath, "ground512x512.png"))
    box = pygame.image.load(os.path.join(texturesPath, "normalbox.png"))
    box = pygame.transform.scale(box, (64, 64))
    boxSprite = pygame.sprite.Sprite()
    boxSprite.image = box
    boxSprite.rect = box.get_rect()

    Настраиваем шрифт

    font1 = pygame.font.Font('font.ttf', 36)

    grid1 = pygame.Rect((0,0,64,64))
    fakeScreen = screen.copy()
    testSurface = pygame.Surface((512,512))

    screenScrollX = 0
    screenScrollY = 0

    Классы

    class Player(pygame.sprite.Sprite):
    def init(self):
    pygame.sprite.Sprite.init(self)
    self.image = pygame.image.load(os.path.join(skinsPath, "default-1.png"))
    self.image = pygame.transform.scale(self.image, (64, 64))
    self.rect = self.image.get_rect()
    self.rect.center = (128,128)

    def moveRight(self):
        global screenScrollX
        if not self.rect.right > 512:
            self.rect.x += 4
            # screenScrollX -= 8
    
    def moveLeft(self):
        global screenScrollX
        if not self.rect.left < 0:
            self.rect.x -= 4
            # screenScrollX += 8
    
    def moveUp(self):
        global screenScrollY
        if not self.rect.top < 0:
            self.rect.y -= 4
            # screenScrollY += 8
    
    def moveDown(self):
        global screenScrollY
        if not self.rect.bottom > 512:
            self.rect.y += 4
            # screenScrollY -= 8
    
    def moveLeftDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.left < 0:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x -= 4
                # screenScrollX += 8
    
    def moveLeftUp(self):
        global screenScrollX, screenScrollY
        if not self.rect.top < 0:
            if not self.rect.left < 0:
                self.rect.y -= 4
                # screenScrollY += 8
                self.rect.x -= 4
                # screenScrollX += 8
    
    def moveRightDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.right > 512:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x += 4
                # screenScrollX -= 8
    
    def moveRightUp(self):
        global screenScrollX, screenScrollY
        self.rect.y -= 4
        # screenScrollY += 8
        self.rect.x += 4
        # screenScrollX -= 8
    

    player = Player()
    allSprites.add(player)

    def mainMenu():
    global motion
    while True:
    clock.tick(60)

        screen.fill((0,0,0))
    
        posX, posY = pygame.mouse.get_pos()
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYUP:
                motion = "stop"
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if grid1.collidepoint(event.pos):
                        boxSprite = pygame.sprite.Sprite()
                        boxSprite.image = box
                        boxSprite.rect = box.get_rect()
                        boxSprite.rect.x = 0
                        boxSprite.rect.y = 0
                        allSprites.add(boxSprite)
                    else:
                        boxSprite = pygame.sprite.Sprite()
                        boxSprite.image = box
                        boxSprite.rect = box.get_rect()
                        boxSprite.rect.x = posX
                        boxSprite.rect.y = posY
                        allSprites.add(boxSprite)
                
        keys = pygame.key.get_pressed()
        
        #moving
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            motion = "left"
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            motion = "right"
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            motion = "up"
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            motion = "down"
        if keys[pygame.K_LEFT] and keys[K_UP]:
            motion = "leftup"
        if keys[pygame.K_LEFT] and keys[K_DOWN]:
            motion = "leftdown"
        if keys[pygame.K_RIGHT] and keys[K_UP]:
            motion = "rightup"
        if keys[pygame.K_RIGHT] and keys[K_DOWN]:
            motion = "rightdown"
    
        if motion == "left":
            player.moveLeft()
        if motion == "right":
            player.moveRight()
        if motion == "up":
            player.moveUp()
        if motion == "down":
            player.moveDown()
    
        if motion == "leftup":
            player.moveLeftUp()
        if motion == "leftdown":
            player.moveLeftDown()
        if motion == "rightup":
            player.moveRightUp()
        if motion == "rightdown":   
            player.moveRightDown()
    
        # screen.blit(player, (0,0))
        fakeScreen.blit(ground512, (0,0))
        allSprites.update()
        allSprites.draw(fakeScreen)
        text2 = font1.render(str(int(clock.get_fps())), False,
                  (255, 255, 255))
        fakeScreen.blit(text2, (0,0))
        screen.blit(pygame.transform.scale(fakeScreen, (512, 512)), (screenScrollX,screenScrollY))
        pygame.display.flip()
    

    mainMenu()



  • There were only two lines that had to be refilled, and it was just easier to write in the commentaries.

    boxSprite.rect.x = (posX//64)*64
    boxSprite.rect.y = (posY//64)*64
    

    And for the future, give me pictures and pictures, too, the gomber himself had to paint normalbox.png.

    import pygame
    from pygame.locals import *
    import os
    import sys
    

    pygame.init()
    pygame.mixer.init()

    motion = "stop"

    screen = pygame.display.set_mode((512, 512))
    pygame.display.set_caption('Main Menu - Limited Space, Endless Ideas')

    clock = pygame.time.Clock()
    allSprites = pygame.sprite.Group()

    Настраиваем директории

    rootPath = os.path.dirname(file)
    resourcesPath = os.path.join(rootPath, "resources")
    texturesPath = os.path.join(resourcesPath, "textures")
    playerPath = os.path.join(texturesPath, "player")
    skinsPath = os.path.join(playerPath, "skins")

    Настраиваем пути текстур

    ground512 = pygame.image.load(os.path.join(texturesPath, "ground512x512.png"))
    box = pygame.image.load(os.path.join(texturesPath, "normalbox.png"))
    box = pygame.transform.scale(box, (64, 64))
    boxSprite = pygame.sprite.Sprite()
    boxSprite.image = box
    boxSprite.rect = box.get_rect()

    Настраиваем шрифт

    font1 = pygame.font.Font('font.ttf', 36)

    grid1 = pygame.Rect((0, 0, 64, 64))
    fakeScreen = screen.copy()
    testSurface = pygame.Surface((512, 512))

    screenScrollX = 0
    screenScrollY = 0

    Классы

    class Player(pygame.sprite.Sprite):
    def init(self):
    pygame.sprite.Sprite.init(self)
    self.image = pygame.image.load(os.path.join(skinsPath, "default-1.png"))
    self.image = pygame.transform.scale(self.image, (64, 64))
    self.rect = self.image.get_rect()
    self.rect.center = (128, 128)

    def moveRight(self):
        global screenScrollX
        if not self.rect.right > 512:
            self.rect.x += 4
            # screenScrollX -= 8
    
    def moveLeft(self):
        global screenScrollX
        if not self.rect.left < 0:
            self.rect.x -= 4
            # screenScrollX += 8
    
    def moveUp(self):
        global screenScrollY
        if not self.rect.top < 0:
            self.rect.y -= 4
            # screenScrollY += 8
    
    def moveDown(self):
        global screenScrollY
        if not self.rect.bottom > 512:
            self.rect.y += 4
            # screenScrollY -= 8
    
    def moveLeftDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.left < 0:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x -= 4
                # screenScrollX += 8
    
    def moveLeftUp(self):
        global screenScrollX, screenScrollY
        if not self.rect.top < 0:
            if not self.rect.left < 0:
                self.rect.y -= 4
                # screenScrollY += 8
                self.rect.x -= 4
                # screenScrollX += 8
    
    def moveRightDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.right > 512:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x += 4
                # screenScrollX -= 8
    
    def moveRightUp(self):
        global screenScrollX, screenScrollY
        self.rect.y -= 4
        # screenScrollY += 8
        self.rect.x += 4
        # screenScrollX -= 8
    

    player = Player()
    allSprites.add(player)

    def mainMenu():
    global motion
    while True:
    clock.tick(60)

        screen.fill((0, 0, 0))
    
        posX, posY = pygame.mouse.get_pos()
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYUP:
                motion = "stop"
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if grid1.collidepoint(event.pos):
                        boxSprite = pygame.sprite.Sprite()
                        boxSprite.image = box
                        boxSprite.rect = box.get_rect()
                        boxSprite.rect.x = 0
                        boxSprite.rect.y = 0
                        allSprites.add(boxSprite)
                    else:
                        boxSprite = pygame.sprite.Sprite()
                        boxSprite.image = box
                        boxSprite.rect = box.get_rect()
                        print(pygame.mouse.get_pos())
                        boxSprite.rect.x = (posX//64)*64    #изменения тут
                        boxSprite.rect.y = (posY//64)*64    #и тут
                        print(boxSprite.rect.x,boxSprite.rect.y)
                        allSprites.add(boxSprite)
    
        keys = pygame.key.get_pressed()
    
        # moving
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            motion = "left"
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            motion = "right"
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            motion = "up"
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            motion = "down"
        if keys[pygame.K_LEFT] and keys[K_UP]:
            motion = "leftup"
        if keys[pygame.K_LEFT] and keys[K_DOWN]:
            motion = "leftdown"
        if keys[pygame.K_RIGHT] and keys[K_UP]:
            motion = "rightup"
        if keys[pygame.K_RIGHT] and keys[K_DOWN]:
            motion = "rightdown"
    
        if motion == "left":
            player.moveLeft()
        if motion == "right":
            player.moveRight()
        if motion == "up":
            player.moveUp()
        if motion == "down":
            player.moveDown()
    
        if motion == "leftup":
            player.moveLeftUp()
        if motion == "leftdown":
            player.moveLeftDown()
        if motion == "rightup":
            player.moveRightUp()
        if motion == "rightdown":
            player.moveRightDown()
    
        # screen.blit(player, (0,0))
        fakeScreen.blit(ground512, (0, 0))
        allSprites.update()
        allSprites.draw(fakeScreen)
        text2 = font1.render(str(int(clock.get_fps())), False,
                             (255, 255, 255))
        fakeScreen.blit(text2, (0, 0))
        screen.blit(pygame.transform.scale(fakeScreen, (512, 512)), (screenScrollX, screenScrollY))
        pygame.display.flip()
    

    mainMenu()

    result

    result



Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2