Pygame Tutorial Reihe

Gute Links und Tutorials könnt ihr hier posten.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Gibt es das ganze auch als zusammenhängenden Qwellcode

um den überblick nicht zuverlieren was wo drinsteht
tuxfreak
User
Beiträge: 9
Registriert: Donnerstag 28. August 2008, 21:48

Hallo ich bekomme immer folgende Fehlermeldung wenn ich den Code zum Testen ausführe:

Code: Alles auswählen

daniel@media-desktop ~/Desktop/python/pywine $ python pygame_test.py 
Traceback (most recent call last):
  File "pygame_test.py", line 46, in <module>
    main()
  File "pygame_test.py", line 27, in main
    screen((0, 0, 0))
TypeError: 'pygame.Surface' object is not callable
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

wie sieht den deine startsequenz aus

Code: Alles auswählen

    pygame.init()
    try:
        os.environ['SDL_VIDEO_CENTERED'] = '1'
    except:
        pass

    pygame.display.set_icon(pygame.image.load(os.path.join('data', 'FHZITTICON.gif')))

    pygame.display.set_caption('FH-Zitt-Ballergame by Magic LTS')
    pygame.mouse.set_visible(0)
    screen = pygame.display.set_mode(SCREENRECT.size)

    background = pygame.Surface(screen.get_size())
    background.fill((0,0,0))
    boom = pygame.Surface((640,480))
    boom.fill((255,255,255))
tuxfreak
User
Beiträge: 9
Registriert: Donnerstag 28. August 2008, 21:48

Also erstmal weiß ich nicht was du mit Startsequenz meinst. Und zweitens führt dein Code dazu das sich ein Fenster öffnet und sofort wieder schließt. Ich habe ihn um ihn auszuführen so angepasst:

Code: Alles auswählen

#!/usr/bin/env python

import pygame
import os

pygame.init()
try:
    os.environ['SDL_VIDEO_CENTERED'] = '1'
except:
    pass

pygame.display.set_icon(pygame.image.load(os.path.join('/home/daniel', 'test.jpg')))

pygame.display.set_caption('FH-Zitt-Ballergame by Magic LTS')
pygame.mouse.set_visible(0)
screen = pygame.display.set_mode((640,480))

background = pygame.Surface(screen.get_size())
background.fill((0,0,0))
boom = pygame.Surface((640,480))
boom.fill((255,255,255)) 
tuxfreak
User
Beiträge: 9
Registriert: Donnerstag 28. August 2008, 21:48

Das Tutorial hier funktioniert bei mir ja leider nicht (weder unter Ubuntu noch unter Linux Mint, muss wohl an einem Paket liegen ich nehme an ihr nutzt alle Windows) aber ich habe folgendes Tutorial gefunden welches ich sehr gut finde. Es behandelt nämlich einige Themen sehr einfach die hier nicht oder weniger behandelt werden aber die Themen die hier behandelt werden (Bilder) findet man dort nicht. Hier der Link:
http://lorenzod8n.wordpress.com/categor ... -tutorial/
mfg Daniel
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

ok geb ich zu so läuft die Start Sequenz nur bei meinem programm
hier eine Stand Alone Startsequenz

Code: Alles auswählen

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

def main():
        
    pygame.init()
    try:
        os.environ['SDL_VIDEO_CENTERED'] = '1'
    except:
        pass

    #pygame.display.set_icon(pygame.image.load(os.path.join('data', 'ICON.gif')))

    pygame.display.set_caption('Game Sequenc Start')
    pygame.mouse.set_visible(0)
    screen = pygame.display.set_mode((640,480))

    background = pygame.Surface(screen.get_size())
    background.fill((0,0,0))
    boom = pygame.Surface((640,480))
    boom.fill((255,255,255)) 

    while 1:
        event = pygame.event.poll()
        if event.type == QUIT or \
           (event.type == KEYDOWN and event.key == K_q):
            break
        screen.blit(background, (0,0))
        pygame.display.flip()

    pygame.display.quit()

if __name__ == '__main__': main()
BlackJack

Was soll denn das ``try``/``except``!? Und ich würde die Umgebungsvariable *vor* `pygame.init()` setzen.
dino0815
User
Beiträge: 1
Registriert: Mittwoch 17. September 2008, 17:49

Im Abschnit 4.3
Zeile 26 des dortigen Codes

Für alle die, die ihn noch nicht selber verbessert haben oder einfach diese Zeile auskommentierten um das Skript laufen zu lassen:

In Zeile 26 steht:
26 screen((0, 0, 0))

Der Fehler (Damit ihn auch weiterhin jeder sieht ;) ..)
  • File "test.py", line 45, in <module>
    main()
    File "test.py", line 26, in main
    screen((0, 0, 0))
    TypeError: 'pygame.Surface' object is not callable
Sollte aber:
26 screen.fill((0, 0, 0))
heißen ;)

Währe schön, wenn die im Tutorial noch geändert werden jkönnte, da es bestimmt viele (wie auch mich eine Zeit lang) davon abhält sich mit PyGame oder zumindest mit diesem Tutorial zu beschäftigen, wenn der erste Code-Test schon fehl schlägt .. und man erstmal denkt die Installation ist nicht korrekt. :)

Mfg, Dino
  • Traceback (most recent call last):
tuxfreak
User
Beiträge: 9
Registriert: Donnerstag 28. August 2008, 21:48

Hier hat sich glaube ich auch ein Fehler eingeschlichen:

Code: Alles auswählen

if _image.get_alpha() == None:
    _image = image.convert()
else:
    _image = image.convert_alpha()
sollte so aussehen:

Code: Alles auswählen

if _image.get_alpha() == None:
    _image = _image.convert()
else:
    _image = _image.convert_alpha()
der unterschied sind die "_" vor image.convert()
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

tuxfreak hat geschrieben:Hier hat sich glaube ich auch ein Fehler eingeschlichen:

Code: Alles auswählen

if _image.get_alpha() == None:
    _image = image.convert()
else:
    _image = image.convert_alpha()
sollte so aussehen:

Code: Alles auswählen

if _image.get_alpha() == None:
    _image = _image.convert()
else:
    _image = _image.convert_alpha()
der unterschied sind die "_" vor image.convert()
Aua, None immer mit "is" vergleichen.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

name hat geschrieben:Aua, None immer mit "is" vergleichen.
Um dem Kontext zu geben: None ist ein Singleton, d.h. es existiert immer nur eine einzige Instanz davon, daher kann man hier auf Objektidentität testen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Wobei ``==`` bei `None` IMHO nicht so schlimm ist wie ``is`` bei kleinen Zahlen oder Wahrheitswerten.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

BlackJack hat geschrieben:Wobei ``==`` bei `None` IMHO nicht so schlimm ist wie ``is`` bei kleinen Zahlen oder Wahrheitswerten.
Natuerlich.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
raecher-der-enterbten
User
Beiträge: 4
Registriert: Freitag 1. August 2008, 20:00

Hallo,
eine kleine inhaltliche Frage: Ich wollte mich mal an pygame versuchen, wollte es installieren, doch es kommt die Meldung:

Hunting dependencies...
SDL : found 1.2.12
FONT : not found
IMAGE : not found
MIXER : not found
SMPEG : found 0.4.5
PNG : not found
JPEG : not found
SCRAP : found

Was muss ich dagegen machen?

Vielen Dank im Vorraus
mfg
raecher-der-enterbten

-->ich habe Ubuntu 8.04, SDL und diess SMPEG schon nachinstalliert!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wieso installierst du es nicht einfach über deinen Paketmanager?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
raecher-der-enterbten
User
Beiträge: 4
Registriert: Freitag 1. August 2008, 20:00

schon passiert, hatte vergessen es hier reinzuschreiben. danke :)

mfg

raecher-der-enterbten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

ja und geht es jetzt
um images zu laden verwende ich funktionen

Code: Alles auswählen

def load_image(file):
    file = os.path.join('data', 'images', file)
    try:
        surface = pygame.image.load(file)
    except pygame.error:
        raise SystemExit, '"%s" %s not found'%(file, pygame.get_error())
    return surface.convert_alpha()

def load_images(*files):
    imgs = []
    for file in files:
        imgs.append(load_image(file))
    return imgs   

def load_image_alpha(file, colorkey=None):
    file = os.path.join('data', 'images', file)
    try:
        surface = pygame.image.load(file)
    except pygame.error:
        raise SystemExit, '"%s" %s not found'%(file, pygame.get_error())
    if colorkey is not None:
        if colorkey is -1:
            colorkey = surface.get_at((0,0))
        surface.set_colorkey(colorkey, RLEACCEL)
    return surface.convert_alpha()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Built-in ``file`` zu überschreiben gilt gemeinhin als eher schlechte Idee.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Das simple Hilfsfunktionen einfach so das Programm abbrechen halte ich auch für etwas unglücklich.

Die `load_images()` ist vielleicht übertrieben, weil die Implementierung ein wirklich einfacher Einzeiler sein könnte: ``return map(load_image, filenames)``.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Hab ne frage zu Tileset.

Also ich hab jetzt ein Grundprogramm (Jump and Run). Wollte die Figur jetzt animieren aber weiss nicht genua wie ich beide Elemente zusammenführen kann. Kann mir jemand helfen?

Hier die Codes:

Grundprogramm

Code: Alles auswählen

import pygame
import random

breite=800
hoehe=800
screen = pygame.display.set_mode((breite,hoehe))

clock = pygame.time.Clock()

boden1=pygame.image.load("Boden1.png")
Hintergrund=pygame.image.load("Hintergrund.png")
Hintergrund2=pygame.image.load("hintergrund2.png")
Mariorechts=pygame.image.load("mario.gif")
Mariolinks=pygame.image.load("mario2links.png")

Mario=Mariorechts
MarioX=100
MarioY=602
Hintergrundx=0
Bodenx=0
JumpNichtmoeglich=True
Jump=False
Bewegung=False
rechts=False
links=False
running=True
JumpAktiv=False
Fallen=False
while running:
    hintergrund=screen.blit(Hintergrund,(Hintergrundx,0))
    hintergrund2=screen.blit(Hintergrund2,(900,0))
    boden=screen.blit(boden1,(Bodenx,hoehe-100))
    mario=screen.blit(Mario,(MarioX,MarioY))
    
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RIGHT:
                if JumpAktiv == False:
                    Bewegung=True
                    rechts=True
            elif event.key==pygame.K_LEFT:
                if JumpAktiv == False:
                    Bewegung=True
                    links=True
            elif event.key==pygame.K_SPACE:
                if MarioY==602:
                    Jump=True
                    JumpAktiv=True

                
        elif event.type == pygame.KEYUP:
            if event.key==pygame.K_RIGHT:
                Bewegung=False
                rechts=False
            elif event.key==pygame.K_LEFT:
                Bewegung=False
                rechts=False
    if Jump:
        MarioY-=20
        if MarioY < 300:
            Jump=False
    if Bewegung:
        if rechts:
            MarioX+=20
            Mario=Mariorechts
        elif links:
            if MarioX != 0:
                MarioX+=-20
            Mario=Mariolinks

    if MarioY < 300: #Fallen
        Fallen=True
    else:
        JumpAktiv=False
    if Fallen:
        MarioY+=20
        if MarioY>600:
            Fallen=False



So nun hier meine Tileset Klasse, bei der ich nicht genau weiss wie ich sie einbauen kann:

Code: Alles auswählen

def loadImage(filename, colorkey = None):
    image = pygame.image.load(filename)

    if image.get_alpha() == None:
        image = image.convert()
    else:
        image = image.convert_alpha()

    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))

        image.set_colorkey(colorkey, RLEACCEL)

    return image

class Tileset(object):
    def __init__(self, image ,colorkey ,tileWidth, tileHeight):
        self.__image = loadImage(image,colorkey)
        self.__tileWidth = tileWidth
        self.__tileHeight = tileHeight

        self.__tileTypes = dict()

    def getImage(self):
        return self.__image

    def setImage(self, image, colorkey):
        self.__image = loadImage(image,colorkey )
        
    def getTileWidth(self):
        return self.__tileWidth

    def getTileHeight(self):
        return self.__tileHeight

    def getTileSize(self):
        return (self.__tileWidth, self.__tileHeight)
    
    def addTile(self, Mario, tileWidth,tileHeight ):
        self.__tileTypes[Mario] = TileType(Mario, 0, 0, self.__tileWidth, self.__tileHeight)

    def getTile(self, Mario):
        try:
            return self.__tileTypes[Mario]
        except KeyError:
            return None



Hab mir noch überlegt anstatt diesem ganen Quellcode mit animierten .gifs zu arbeiten, aber anscheined unterstützt python diese nicht, da immer nur der erste Frame angezeigt wird. Ist mir da ein Fehler unterlaufen oder gehts das wirklich nicht?
Antworten