2016-12-30 6 views
0

Ich versuche, ein Bild von Gras in einem bestimmten Bereich auf mein Spiel zu übertragen, aber ich habe Probleme, weil es in einer Klasse ist. Ich möchte so etwas wie dies zu tun ..Eine Entität in einer Klasse positionieren (Pygame)

grass_platform.draw(screen, (200, 200)) 

HINWEIS: Ich weiß, das eigentlich nicht

funktioniert Hier ist mein Code ...

import pygame 

pygame.init() 

#Screen Size 
screen_size = [1024,576] 

#Display Window 
screen = pygame.display.set_mode(screen_size) 
pygame.display.set_caption('The Adventures of Fresco the Explorer') 

#Clock 
clock = pygame.time.Clock() 

#Colors 
black = (0,0,0) 
white = (255,255,255) 

#Game Start 
gameStart = False 

#Backgrounds 
forest = pygame.image.load('forest.png') 

#Gravity 
gravity =-10 
fall = True 

#Player 
fresco = pygame.image.load('fresco v2.png').convert() 
fresco = pygame.transform.scale(fresco,(32,136)) 

class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y, filename): 

     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.image = fresco 
     self.rect = self.image.get_rect() 

    def update (self): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_a: 
       self.rect.x -= 6 
       self.image = pygame.transform.flip(fresco, True, False) 

      elif event.key == pygame.K_d: 
       self.rect.x += 6 
       self.image = pygame.transform.flip(fresco, False, False) 

      elif event.key == pygame.K_w: 
       self.rect.y -= 20 

    def draw(self, screen): 
     screen.blit(self.image, self.rect) 

player = Player(0, 0, 'fresco v2.png') 

#Grass Platform 
grass = pygame.image.load('grass.png') 
grass = pygame.transform.scale(grass, (90, 90)) 

class Grass (pygame.sprite.Sprite): 

    def __init__(self, filename): 

     self.image = grass 
     self.rect = self.image.get_rect() 


    def draw(self, screen): 
     screen.blit(self.image,self.rect) 

grass_platform = Grass('grass.png') 

#Game Loop 
while not gameStart: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      gameStart = True 

    #Background Blitted 
    screen.blit(forest,(0,0)) 

    #Falling Event 
    if fall == True: 
     if gravity: 
      player.rect.y -= gravity 

    #Class Blitted 
    player.update() 
    player.draw(screen) 
    grass_platform.draw(screen) 

    #Updates Screen 
    pygame.display.update() 

    #FPS 
    clock.tick(30) 

pygame.quit() 
+0

in '__init__' Sie' brauchen self.rect.x = x' und 'self.rect.y = y' – furas

+0

Code lesbarer Put alle Klassen am Anfang zu machen. Und benutze das geladene Bild als Argument, dh.'Gras (Gras)' oder laden Sie Bild innerhalb der Klasse. – furas

Antwort

0

Ich weiß nicht, ob ich Sie verstanden richtig, aber wenn Sie meinen, nur einen Koordinatenparameter zu übergeben und auf diese Position zu blitzen, sollte das ziemlich einfach sein.

class Grass (pygame.sprite.Sprite): 

    def __init__(self, filename): 

     self.image = grass 
     self.rect = self.image.get_rect() 


    def draw(self, screen, pos): 
     screen.blit(self.image, pos) 

und dann, wenn Sie zeichnen() Sie dies nur tun:

grass_platform.draw(screen, (300, 200)) 

oder auf der anderen Seite, wenn Sie die Position halten wollen könnten Sie diesen Code auf der init Methode hinzufügen :

def __init__(self, filename, x, y): 
    self.x = x 
    self.y = y 

und dann

später acces
0

Einige Anmerkungen:

  • Player und Grass sind Subklassen von Sprite, so dass sie bereits eine Zeichenfunktion, die genau das tut, was Sie tun. Entferne sie einfach.

  • der folgende Teil

    #Falling Event 
    if fall == True: 
        if gravity: 
         player.rect.y -= gravity 
    

    ist auf die Player Klasse spezifisch und soll auf die Player Klasse Update-Funktion

  • Bei Verwendung der Sprite Klasse, das rect Attribut wird verwendet, bewegt werden zu speichern die Position des Sprites, daher die x und y Attribut in Ihrer Player Klasse nicht viel Sinn machen. Entfernen Sie sie, und verwenden Sie die x und y Parameter die x und y Attribut des rect stattdessen ändern:

    self.rect = self.image.get_rect(x=x, y=y) 
    
  • Wenn Sie also grass_platform an einer bestimmten Position ziehen wollen, nur ändern, es ist rect, zum Beispiel:

    grass_platform.rect.topleft = (200, 200) 
    
  • statt draw und update auf jedem Ihrer Sprites Aufruf manuell, nur, sondern sie in eine Group und rufen draw und update auf diesem Group.

Verwandte Themen