Perplexityy
Perplexityy

Reputation: 569

Issue with blit in Pygame

I'm trying to make a simple platformer game in Pygame, and have created a basic outline of what I want the level to look like. However, in order to move the character around I need to continually fill the screen with colour, which overlaps the map. How should I proceed?

My code:

import pygame
from pygame import *
import sys

WIN_WIDTH = 680 
WIN_HEIGHT = 500 


DISPLAY = (WIN_WIDTH, WIN_HEIGHT) #variable for screen display
DEPTH = 32 #standard
FLAGS = 0 #standard
RED = (0, 0, 255)

class Hero():
    def __init__(self, x, y):
        self.x = x
        self.y = y


    def appearance(self):
        return pygame.image.load('C:\\Users\\admin\\Desktop\\Player1.png')

    def move_right(self):
        self.x += 10
        return self.x


    def move_left(self):
        self.x -= 10
        return self.x





player = Hero(56, 420)
player_img = player.appearance()

x = 0
y = 0

platformx = 0
platformy = 0
WHITE = (255, 255, 255)
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
screen.fill(WHITE)
pygame.display.set_caption("Rum Islands")
timer = pygame.time.Clock()


level = [
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", #45 x 25
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P                    PPPPPPPPPPP           P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P    PPPPPPPP                              P",
        "P                                          P",
        "P                          PPPPPPP         P",
        "P                 PPPPPP                   P",
        "P                                          P",
        "P         PPPPPPP                          P",
        "P                                          P",
        "P                     PPPPPP               P",
        "P                                          P",
        "P   PPPPPPPPPPP                            P",
        "P                                          P",
        "P                 PPPPPPPPPPP              P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]






pygame.key.set_repeat(10,10)

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:
                x = player.move_left()


            elif event.key == pygame.K_RIGHT:
                x = player.move_right()

    screen.fill(WHITE)            
    for row in level:
        for col in row:
            if col == "P":
                pygame.draw.rect(screen, RED, (platformx, platformy, 40, 20))
            platformx += 15
        platformy += 20
        platformx = 0   



    screen.blit(player_img, (x, y))
    pygame.display.update()

Upvotes: 0

Views: 141

Answers (1)

furas
furas

Reputation: 143216

Your code after modification.

Your problem was platformy because you never set it to zero again.

import pygame

# --- constants ---

WIN_WIDTH = 680 
WIN_HEIGHT = 500 

DISPLAY = (WIN_WIDTH, WIN_HEIGHT) #variable for screen display
DEPTH = 32 #standard
FLAGS = 0 #standard

RED = (0, 0, 255)
WHITE = (255, 255, 255)

# --- classes ---

class Hero():

    def __init__(self, x, y):
        self.image = pygame.image.load('C:\\Users\\admin\\Desktop\\Player1.png')
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def move_right(self):
        self.rect.x += 10

    def move_left(self):
        self.rect.x -= 10

    def draw(self, screen):
        screen.blit(self.image, self.rect)

# --- main ---

level = [
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", #45 x 25
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P                    PPPPPPPPPPP           P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P    PPPPPPPP                              P",
        "P                                          P",
        "P                          PPPPPPP         P",
        "P                 PPPPPP                   P",
        "P                                          P",
        "P         PPPPPPP                          P",
        "P                                          P",
        "P                     PPPPPP               P",
        "P                                          P",
        "P   PPPPPPPPPPP                            P",
        "P                                          P",
        "P                 PPPPPPPPPPP              P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "P                                          P",
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
]

# - init -

pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)

pygame.display.set_caption("Rum Islands")
pygame.key.set_repeat(10,10)

# - objects -

player = Hero(56, 420)

# - mainloop -

timer = pygame.time.Clock()

while True:

    # - events -

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:
                player.move_left()

            elif event.key == pygame.K_RIGHT:
                player.move_right()

    # - updates -

    # - draws -

    screen.fill(WHITE)

    platform_x = 0
    platform_y = 0

    for row in level:
        for col in row:
            if col == "P":
                pygame.draw.rect(screen, RED, (platform_x, platform_y, 40, 20))
            platform_x += 15
        platform_y += 20
        platform_x = 0

    player.draw(screen)
    pygame.display.update()

    timer.tick(25)

Upvotes: 2

Related Questions