2017-01-05 6 views
0

私は 'P'文字列がある領域に表示するプラットフォームを手に入れようとしています。すべてのプラットフォームで座標の代わりに文字列を使用してレベルを作成しようとしています。ここではサンプル...ここ 文字列を使用してプラットフォームを表示する(Pygame)

class Level_01(Level): 

    def __init__(self, player): 

     self.background = forest_bg 

     Level.__init__(self, player) 

     platforms = [] 

     x = y = 0 
     level = ['   ', 
       'P   ', 
       '   ', 
       ' P   ', 
       '   ', 
       'PPPPPPPPPPPP',] 

     # build the level 
     for row in level: 
      for col in row: 
       if col == 'P': 
        P = Platform(x, y) 
        platforms.append(P) 
       x += 90 
      y += 90 
      x = 0 

がプロジェクト全体では...あなたはargumenst x,y

P = Platform(x, y) 

Platform()を作成するが、あなたが何もしないので

import pygame 

pygame.init() 

#Screen Size 
screen_size = 1024, 576 
screen_width = 1024 
screen_height = 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 

#Forest Background 
forest_bg = pygame.image.load('forest.png') 

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

velocity = 6 

move_left = False 
move_right = False 

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


#Player Class 
class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y): 

     pygame.sprite.Sprite.__init__(self) 

     self.x = 0 
     self.y = 0 
     self.image = fresco 
     self.rect = self.image.get_rect() 

    def handle_keys(self): 

     key = pygame.key.get_pressed() 
     velocity = 8 

     #Move Right 
     if key[pygame.K_d]: 
      self.rect.x += velocity 

     #Move Left 
     elif key[pygame.K_a]: 
      self.rect.x -= velocity 
      pygame.transform.flip(self.image, True, False) 

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

player = Player(0,0) 


class Platform(pygame.sprite.Sprite): 

    def __init__(self, x, y): 
     super().__init__() 

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


class Level(object): 
    """ This is a generic super-class used to define a level. 
     Create a child class for each level with level-specific 
     info. """ 

    def __init__(self, player): 
     """ Constructor. Pass in a handle to player. Needed for when moving platforms 
      collide with the player. """ 
     self.platform_list = pygame.sprite.Group() 
     self.player = player 

     # Background image 
     self.background = None 

    # Update everything on this level 
    def update(self): 
     """ Update everything in this level.""" 
     self.platform_list.update() 

     #self.enemy_list.update() <--- NOTE: Use this late :3 

    def draw(self, screen): 
     """ Draw everything on this level. """ 

     # Draw all the sprite lists that we have 
     self.platform_list.draw(screen) 
     #self.enemy_list.draw(screen) <--- Use it later :3 


class Level_01(Level): 

    def __init__(self, player): 

     self.background = forest_bg 

     Level.__init__(self, player) 

     platforms = [] 

     x = y = 0 
     level = ['   ', 
       'P   ', 
       '   ', 
       ' P   ', 
       '   ', 
       'PPPPPPPPPPPP',] 

     # build the level 
     for row in level: 
      for col in row: 
       if col == 'P': 
        P = Platform(x, y) 
        platforms.append(P) 
       x += 90 
      y += 90 
      x = 0 

level_list = [] 
level_list.append(Level_01(player)) 

# Set the current level 
current_level_no = 0 
current_level = level_list[current_level_no] 

active_sprite_list = pygame.sprite.Group() 
player.level = current_level 

#Game Loop 
while not gameStart: 

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


    #Background 
    screen.blit(forest_bg,(0,0)) 

    #Player Updates 
    player.handle_keys() 
    player.draw(screen) 

    #Level Updates 
    current_level.update() 
    current_level.draw(screen) 
    active_sprite_list.draw(screen) 
    # Updates Screen 
    pygame.display.update() 

    #FPS 
    clock.tick(60) 

pygame.quit() 
+0

BTW:すべてのクラスと関数を 'pygame.init()'の前に置き、読みやすくします。誰もそれを見つけることができないように、クラス間に 'player = Player(0,0)'を作成します。 [コードを構成する方法](https://github.com/furas/python-examples/blob/master/pygame/__templates__/1__simple__.py)を参照してください。 – furas

答えて

0

あなたの問題があるのですこの情報。

あなたは__init__

self.rect.x = x 
self.rect.y = y 

または短い

self.rect = self.image.get_rect(x=x, y=y) 

でこの値を覚えする必要があるそして、あなたはクラスでところでPlayer()


同じ問題を抱えている:より有効に利用しますself.rect.xself.rect.yの代わりに、すべてのクラスでself.xself.yあなたは衝突をチェックするためにそれを使用することができますので、 - player.rect.colliderect(some_element.rect)またはplayer.rect.collidepoint(mouse_pos)

でもpygame.sprite.Group()はそれがそれらを描画するself.imageself.rectを使用しているため、すべての要素がself.rect内の位置や大きさを持っていることを期待しています。

関連する問題