Ich bin ja selber kein Ordnungs"hüter", aber wäre es nicht besser, dein Objekte in kleine Klassen zu packen und dann eben die Objekte zu zeichnen (blitten)?
Auch auf die Gefahr hin, dass der Source hier nur so zerfetzt wird, weil wahrscheinlich zig Fehler und Unzulänglichkeiten drinnen sind:
(Das "Player" Objekt ist bei mir ein Flugzeug und wird automatisch
bewegt. Mehr habe ich da jetzt noch nicht, sorry)
Zeile 64-69 ist hier wichtig:
Ich verarbeite den Input (Rufe also die Funktion dafür auf)
Zeichne erst den Hintergrund auf den Schirm,
dann den "Player"
und dann gibt's Flip.
Und das Funktioniert soweit auch wunderbar.
Code: Alles auswählen
import os
import sys
import pygame
from pygame.locals import *
size = height, width = 640, 480
backcolor = 120, 0, 0
caption = "SAS 0.0.5"
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption(caption)
pygame.display.get_surface() # what does this do?
class Player(object):
px = -80
py = 25
def __init__(self, dir, img_name):
self.img = os.path.join(dir, img_name)
self.img_obj = pygame.image.load(self.img).convert()
self.img_obj.set_colorkey((255,0,255))
self.position = [self.px, self.py]
self.speedx = 0.5
self.speedy = 0.1
self.down = 0
def move(self):
# macht hier halt irgendwas und gibt position des spielers zurueck
return self.position
class Background(object):
px = 0
py = 0
def __init__(self, dir, img_name):
self.img = os.path.join(dir, img_name)
self.img_obj = pygame.image.load(self.img)
self.position = [self.px, self.py]
# Eventhandler
def input(events):
for event in events:
if event.type == QUIT:
sys.exit(0)
pygame.quit()
elif event.type == KEYDOWN:
if event.key == pygame.K_ESCAPE:
sys.exit(0)
pygame.quit()
# Mainloop
def MainLoop():
thePlayer = Player("data", "plane00.png")
background = Background("data", "background.png")
while True:
input(pygame.event.get())
screen.fill(backcolor)
screen.blit(background.img_obj, background.position)
thePlayer.move()
screen.blit(thePlayer.img_obj, thePlayer.move())
pygame.display.flip()
# the mainloop
if __name__ == "__main__":
MainLoop()
Zu deinem "blit":
ZielObjekt.blit() nimmt meines Wissens (Objekt, Position) entgegen. Deswegen bei mir Bildschirmobjekt.blit(Objekt.Bild, Objekt.Position).
Du müsstest es also mit screen.blit(landschaft, (0,0)) probieren, um den Hintergrund auf den Screen zu zeichnen, wenn ich nicht ganz daneben liege.
Und mit screen.blit(player, (50,50)) zeichnest deinen Spieler mal statisch. Um den Rest must du dich kümmern.
(offtopic: da fällt mir ein - wann kommt mein Pygame Buch endlich? Ist ja doch schon lange bestellt)
EDIT: argh, zu langsam....