Seite 2 von 3
Verfasst: Mittwoch 10. September 2008, 13:00
von sea-live
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()
Verfasst: Mittwoch 10. September 2008, 13:05
von BlackJack
Was soll denn das ``try``/``except``!? Und ich würde die Umgebungsvariable *vor* `pygame.init()` setzen.
Skript-Fehler in 4.3
Verfasst: Mittwoch 17. September 2008, 20:04
von dino0815
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):
Verfasst: Samstag 20. September 2008, 16:57
von tuxfreak
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()
Verfasst: Samstag 20. September 2008, 18:42
von name
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.
Verfasst: Samstag 20. September 2008, 22:49
von Leonidas
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.
Verfasst: Samstag 20. September 2008, 23:16
von BlackJack
Wobei ``==`` bei `None` IMHO nicht so schlimm ist wie ``is`` bei kleinen Zahlen oder Wahrheitswerten.
Verfasst: Sonntag 21. September 2008, 14:49
von name
BlackJack hat geschrieben:Wobei ``==`` bei `None` IMHO nicht so schlimm ist wie ``is`` bei kleinen Zahlen oder Wahrheitswerten.
Natuerlich.
Verfasst: Sonntag 2. November 2008, 18:15
von raecher-der-enterbten
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!
Verfasst: Sonntag 2. November 2008, 19:34
von Leonidas
Wieso installierst du es nicht einfach über deinen Paketmanager?
Verfasst: Sonntag 2. November 2008, 19:36
von raecher-der-enterbten
schon passiert, hatte vergessen es hier reinzuschreiben. danke
mfg
raecher-der-enterbten
Verfasst: Montag 3. November 2008, 19:38
von sea-live
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()
Verfasst: Montag 3. November 2008, 22:44
von Leonidas
Das Built-in ``file`` zu überschreiben gilt gemeinhin als eher schlechte Idee.
Verfasst: Montag 3. November 2008, 23:31
von 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)``.
Verfasst: Samstag 2. Mai 2009, 11:08
von Basti91
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?
Verfasst: Samstag 2. Mai 2009, 13:32
von BlackJack
@Basti91: Animieren bedeutet, dass über die Zeit immer andere Bilder angezeigt werden müssen. Das musst Du von Hand implementieren. Bei jedem Update ein anderes Bild zu blitten, wäre wahrscheinlich zu schnell, also könnte man eine Verzögerung einbauen, zum Beispiel einen Zähler benutzen um nur alle x Frames ein anderes Bild zu nehmen.
Die `Tileset`-Klasse sieht übrigens extrem unpythonisch aus. Lass da mal die ganzen doppelten Unterstriche und die Getter/Setter weg. Ungetestet:
Code: Alles auswählen
class Tileset(object):
def __init__(self, image_filename, colorkey, tile_width, tile_height):
self._image = None
self.image = (image_filename, colorkey)
self.tile_width = tile_width
self.tile_height = tile_height
self.tile_types = dict()
def _get_image(self):
return self._image
def _set_image(self, filename_and_colorkey):
self._image = load_image(*filename_and_colorkey)
image = property(_get_image, _set_image)
@property
def tile_size(self):
return (self.tile_width, self.tile_height)
def add_tile(self, tile_content):
self.tile_types[tile_content] = TileType(tile_content,
0,
0,
self.tile_width,
self.tile_height)
def get_tile(self, tile):
return self.tile_types.get(tile)
Die Asymmetrie bei den Typen bei den letzten beiden Methoden ist unschön.
Verfasst: Samstag 2. Mai 2009, 16:27
von str1442
load_image() nutzt einmal is zum Prüfen auf einen Integer, -> [wiki]FAQ[/wiki]. Auf None immer mit is prüfen. Schau dir mal PEP8 (im Wiki suchen) an. Den ganzen Code des "Grundprogramms" am besten in eine Funktion packen (bis auf importe und Konstanten wie breite / hoehe (die man grossschreiben sollte)).
EDIT: Falsche FAQ verlinkt.
Verfasst: Sonntag 3. Mai 2009, 15:41
von Basti91
Und wie bekomme ich jetzt so ne Ani hin? Hab jetzt schon mehrere Versuche gestartet die Bilder nacheinander laufen zu lassen aber nichts funzt -.-
Hab versucht ne Fuktion zu schreiben mit der ich es hinbekomme aber das wird iwie nichts:
Code: Alles auswählen
import pygame
import random
breite=800
hoehe=800
screen = pygame.display.set_mode((breite,hoehe))
clock = pygame.time.Clock()
def Mario_rechts():
Mariorechts1= pygame.image.load("mario1.gif")
Mariorechts2= pygame.image.load("mario2.gif")
Mariorechts3= pygame.image.load("mario3.gif")
Mariorechts4= pygame.image.load("mario4.gif")
Mariorechts5= pygame.image.load("mario5.gif")
Mariorechts6= pygame.image.load("mario6.gif")
MarioX=68
MarioY=602
mario=screen.blit(Mariorechts1,(MarioX,MarioY))
mario=screen.blit(Mariorechts2,(MarioX,MarioY))
mario=screen.blit(Mariorechts3,(MarioX,MarioY))
mario=screen.blit(Mariorechts4,(MarioX,MarioY))
mario=screen.blit(Mariorechts5,(MarioX,MarioY))
mario=screen.blit(Mariorechts6,(MarioX,MarioY))
Mario_rechts()
Verfasst: Sonntag 3. Mai 2009, 15:58
von BlackJack
@Basti91: Du darfst nicht einfach alle Bilder *sofort* nacheinander "blitten", das sieht man natürlich nicht. Du musst halt in regelmässigen Abständen ein anderes Bild nehmen.
Das kapselt man am besten in ein Objekt, dass die Zeit berücksichtigt um zu entscheiden welches Bild gezeichnet werden soll.
Verfasst: Sonntag 3. Mai 2009, 16:02
von Basti91
thx schonmal für die schnelle Antwort, wie bekomm ich denn diese Zeitabstände hin?