ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

pygame/python problem

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

itchy

Anmeldungsdatum:
29. September 2008

Beiträge: 10

Hi ich beschäftige mich neuerdings, mit dem pygame modul und bin leider an einer Sache hängengeblieben die ich mir nicht erklären kann:

42  class planet(pygame.sprite.Sprite):
 	
 	def __init__(self):
		....
 		
	def move(self, key):
 	
 	    xMove, yMove = 0, 0   	
52     	    if (key == K_RIGHT):
      	        xMove = self.x_dist
    	    elif (key == K_LEFT):
    	        xMove = -self.x_dist
etc.

Das Problem ist wenn ich das als Scripte asuführe erhalte ich die Fehlermeldung

Traceback (most recent call last):
  File "test.py", line 42, in <module>
    class planet(pygame.sprite.Sprite):
  File "test.py", line 52, in planet
    if (key == K_RIGHT):
NameError: name 'key' is not defined

was mich etwas verwundert da die variable key im funktionskopf übergeben wird, hoffe ihr könnt mir weiterhelfen lg

DasIch

Avatar von DasIch

Anmeldungsdatum:
2. November 2005

Beiträge: 1130

Poste mal ein ausführbares Beispiel, den bei dem was du gezeigt hast dürfte dass tatsächlich nicht sein.

itchy

(Themenstarter)

Anmeldungsdatum:
29. September 2008

Beiträge: 10

ich stell einfach mal den kompletten sourcecode rein

#!/usr/bin/envirement python
# -*- coding: utf8 -*-


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

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

class orbitpy:
	"""main class for init etc"""
	
	def __init__(self, width=640, height=480):
		pygame.init()
		self.width = width
		self.height = height 
		self.screen = pygame.display.set_mode((self.width,self.height))

	def loadsprites(self):
		self.planet = planet()
		self.planet_sprites = pygame.sprite.RenderPlain((self.planet))

	def mainloop(self):
		self.loadsprites()
		while 1:
			for event in pygame.event.get():
				if event.type == pygame.QUIT:
				    sys.exit()
				elif event.type == KEYDOWN:
  				    if ((event.key == K_RIGHT)
					or (event.key == K_LEFT)
    			    or (event.key == K_UP)
    			    or (event.key == K_DOWN)):
	    				self.planet.move(event.key)
			self.planet_sprites.draw(self.screen)	
			pygame.display.flip()			
					

class planet(pygame.sprite.Sprite):
	
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image, self.rect = load_image('planet.png',-1)
		self.x_dist, self.y_dist = 0.2, 0.2 
		
	def move(self, key):
  	
  		xMove, yMove = 0, 0   	
      	if (key == K_RIGHT):
      	    xMove = self.x_dist
    	elif (key == K_LEFT):
    	    xMove = -self.x_dist
    	elif (key == K_UP):
            yMove = -self.y_dist
    	elif (key == K_DOWN):
            yMove = self.y_dist
    	self.rect.move_ip(xMove,yMove)
				  
if __name__=="__main__":
	mainwindow = orbitpy()
	mainwindow.mainloop()

achja und noch das helpers modul ,welches ich von der pygame page übernommen hab

#!/usr/bin/envirement python
# -*- coding: utf8 -*-

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

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

def load_image(name, colorkey=None):
    fullname = os.path.join('data', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Cannot load image:', name
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()

test (Kopie).tar.gz (2.0 KiB)
Download test (Kopie).tar.gz

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@itchy: Das sieht alles nur korrekt eingerückt aus, Du mischt aber Tabs und Leerzeichen beim einrücken, d.h. die Zeile 52 steht eigentlich auf Klassenebene und wird beim Ausführen der class-Anweisung schon ausgeführt. Und zum dem Zeitpunkt ist tatsächlich noch keine Name key definiert.

Insgesamt solltest Du mal einen Blick in den Style Guide werfen: http://wiki.python.de/PEP_8_(Übersetzung)

Sternchen-Importe sollte man vermeiden, weil man so ganz schnell mal Probleme bekommt nachzuvollziehen woher ein Name eigentlich kommt, oder das Namen aus einem Module welche aus einem anderen verdecken. Letztendlich führt man mit Sternchen-Importen das Konzept von Modulen als Namensräumen ad absurdum. Ausnahme wäre hier pygame.locals, dass explizit für einen Sternchen-Import vorgesehen ist. Wobei ich persönlich das auch nicht verwenden würde. Die Konstanten sind auch alle in pygame definiert.

Klassennamen werden per Konvention in "CamelCase" geschrieben, also Planet statt planet. Man kann dann nicht nur sehen von welchen Objekten man neue Klassen ableiten kann, sondern hat auch gleich offensichliche Namen um ein einzelnes Exemplar einer Klasse zu benennen: planet = Planet().

Bei Klassen sollte man versuchen, das Objekt in der __init__()-Methode möglichst vollständig zu initialisieren und nicht in anderen Methoden neue Attribute einzuführen. Das macht ein Programm unübersichtlicher.

Python kennt die Wahrheitswerte True und False. while True: ist IMHO verständlicher als while 1:.

Der Test auf die Bewegungstasten liesse sich auch so schreiben:

1
2
                elif (event.type == KEYDOWN and
                      event.key in (K_RIGHT, K_LEFT, K_UP, K_DOWN):

Klammern um Bedingungen bei if und while sind nicht notwendig, also if key == K_RIGHT: ist ausreichend. (Im Beispiel oben habe ich sie nur gesetzt, weil die Bedingung über zwei Zeilen geht.)

DasIch

Avatar von DasIch

Anmeldungsdatum:
2. November 2005

Beiträge: 1130

Die Einrückung passt nicht, deswegen tritt wahrscheinlich das Problem auf.

Ansonsten solltest du dir mal PEP 8 anschauen.

Antworten |