Seite 1 von 1

Pygame: blit lässt nur drei Argumente zu

Verfasst: Mittwoch 31. Oktober 2007, 17:25
von Imperator
Hallo,

Code: Alles auswählen

import pygame, os, sys
from pygame.locals import*
pygame.init()
landschaft = pygame.image.load('Soil01.bmp')
hintergrund = pygame.transform.scale(landschaft, (800, 400))
karte = hintergrund.get_rect()
player = pygame.image.load('Hopsy.bmp')
player_rect = player.get_rect()
background = [hintergrund, karte]
spieler = [player, player_rect]
black = 0, 0, 0
size = width, height = 800, 400
screen = pygame.display.set_mode(size)
screen.fill(black)
while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
            if event.key == K_RETURN:
                pygame.mixer.music.load('Shot1.wav')
                pygame.mixer.music.play()
    screen.blit(background, spieler)
    pygame.display.flip()
Das ist mein Code. Das Problem ist, dass die Methode blit mit der letztenendes alles auf den Bildschirm gebracht wird nur drei Argumente zulässt. Sind es mehr gibt es eine fehlermeldung, und der Bildschirm bleibt schwarz. Wie ihr oben sehen könnt hab ich versucht mehre Sachen in Liste, vorher auch in tupel zu packen und als ein Argument einzutragen. Da kommt dann die Fehlermeldung, dass da Pygame.Surfaces reingehören. Wie kann ich dieses problem umgehen?

Verfasst: Mittwoch 31. Oktober 2007, 17:43
von Leonidas
Naja, du kannst wie die Fehlermeldung besagt dort Surfaces verwenden?!

Vielleicht magst du aber auch mit etwas einfacherem als pygame anfangen. Ein Adressbuch würde mir da in den Sinn kommen...

Verfasst: Mittwoch 31. Oktober 2007, 17:44
von Imperator
Sorry, ich hoofe ihr denkt nicht ich will spamen. Bin jetzt drauf gekommen: Man muss blit einfach mehrmal mit unterschiedlichen argumenten aufrufen. wenn euch bessere Möglichkeiten einfallen wäre ich aber trotzdem dankbar.

Verfasst: Mittwoch 31. Oktober 2007, 17:45
von C4S3
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.... :(

Verfasst: Mittwoch 31. Oktober 2007, 17:48
von BlackJack
Lies die Dokumentation zu Surface.blit(). Du kannst nicht einfach wahllos irgendwelche Objekte an Funktionen übergeben und hoffen das die schon das machen was Du Dir so denkst. :roll:

Verfasst: Mittwoch 31. Oktober 2007, 18:20
von Imperator
Hallo,

@Leonidas: Dafür bräuchte ich doch eine Datenbank, oder? Damit kenn ich mich leider nicht aus. Trotdem danke für den Vorschlag. Ich mach übrigens neben her auch noch andere Sachen, damit es nicht so eintönig wird.

@C4S3: In gewisserweise kommst du nicht zu spät. Ich zitiere mich selbst: 'Wenn euch bessere Möglichkeiten einfallen wäre ich aber trotzdem dankbar.' Das mit dem OOP lass ich mir mal ernsthaft durch den Kopf gehen. Vor allem weil du auch noch so eine schöne Vorlage gepostet hast an der man sich zumindest grob orientieren kann.

Verfasst: Mittwoch 31. Oktober 2007, 18:42
von fred.reichbier
Für ein Adressbuch brauchst nicht zwingend eine Datenbank ;) Falls du bei pygame bleiben willst, würde ich dir empfehlen, einfach mal ein paar Tutorials durchzuarbeiten. Vor allem 'pimans sprite tutorial' hat mir sehr geholfen. Den Code nicht mit Copy & Paste, sondern mit Abschreiben einsetzen, und dann gewinnt man langsam das Verständnis, wie Pygame eigentlich funktioniert. Um der Frage vorzubeugen, ein gutes deutsches Pygame-Tutorial ist mir nicht bekannt. Später dann Libraries einzusetzen ist ebenfalls nicht falsch ;)

Gruß Fred

Verfasst: Mittwoch 31. Oktober 2007, 21:32
von C4S3
Mir kommt vor, dass PyGame generell nicht so gut dokumentiert ist, wie es sein könnte. Wurde, wenn ich mich nicht irre letztens auch in der Mailinglist diskutiert.
Klar, es gibt eine Übersicht der Befehle, wenn aber überall noch ein kleiner Snippet dabei wäre, wäre es gleich noch mal so schön.^^

Ich warte jetzt mal auf mein Buch und dann kann man ja drüber nachdenken, mal ein deutsches Tut zu schreiben.

Thema Adressbuch: ich sage nur "pickle".

Verfasst: Donnerstag 1. November 2007, 10:45
von Imperator
Das mit pickle ist ne gute Idee. Hab ich noch nie benutzt. Wird also langsam Zeit.
@fred.reichbier: Hab einige gelesen, und je mehr verschiedene ich lese desto verwirrender wird es. Die Grundlagen hab ich ja kapiert, aber als dann in einem Tutorial einer der autoren mit einem Modul Levelbase daherkam, das gar nicht existiert, da beschloss ich dann lieber erst mal ein paar Sachen durch Anwenden zu verinnerlichen.

Verfasst: Donnerstag 1. November 2007, 11:22
von Leonidas
C4S3 hat geschrieben:Mir kommt vor, dass PyGame generell nicht so gut dokumentiert ist, wie es sein könnte. Wurde, wenn ich mich nicht irre letztens auch in der Mailinglist diskutiert.
Klar, es gibt eine Übersicht der Befehle, wenn aber überall noch ein kleiner Snippet dabei wäre, wäre es gleich noch mal so schön.^^
Man kann alles besser dokumentieren. Insgesamt fand ich aber die Pygame-Dokumentation durchaus ausreichend, wenn man etwas Ahnung von Python hat. Das Problem war meist eher "wie implementiere ich das" als "wie kann ich ein Surface auf ein anderes kopieren". Daher fände ich eher ein Cookbook für Pygame nützlich :)

Verfasst: Donnerstag 1. November 2007, 19:00
von Imperator

Verfasst: Donnerstag 1. November 2007, 19:34
von fred.reichbier
Imperator, du spielst mit levelbase nicht zufällig auf dieses Tutorial an? Das dort auf Seite 3 importierte 'levelbase' ist das Modul, das auf Seite 2 beschrieben wird, Zitat: Save the script as levelbase.py. ;)

Aber ich finde das Tutorial ehrlichgesagt auch nicht so besonders gut ;)

Gruß Fred

Verfasst: Freitag 2. November 2007, 11:00
von Imperator
nein, das meinte ich eigentlich nicht.