2017-01-02 2 views
0

Ich versuche, ein einfaches Jump'n'Run-Spiel in Pygame zu machen, und habe eine grundlegende Umriss von dem, wie ich das Level aussehen soll erstellt. Um das Zeichen jedoch zu verschieben, muss ich den Bildschirm kontinuierlich mit Farbe füllen, die die Karte überlappt. Wie soll ich vorgehen?Problem mit Blit in Pygame

Mein 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() 
+0

Wenn Ihre Map das gesamte Fenster ausfüllt (mit 'pygame.draw.rect()'), müssen Sie 'fill()' nicht verwenden. Also zuerst Code ohne 'fill (WHITE)') – furas

+0

oder einfach 'fill (WHITE)' vor dem Zeichnen der Karte - wie Sie in allen Tutorials sehen können. – furas

+0

BTW: Sie müssen 'level = ...' nicht innerhalb von 'while' zuweisen - Sie können es vor' while' machen. – furas

Antwort

2

Ihr Code nach der Änderung.

Ihr Problem war platformy, weil Sie es nie wieder auf Null setzen.

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)