如何使用 pygame 从 Class 获取变量

How to get a variable from a Class using pygame

我正在制作游戏,目前正在尝试使用拼贴系统对敌人进行编码。我有这样的关卡图(显然要大得多):

level_1 = [
'                       ',
'                       ',
'P             E      E ',
'XXXXX XXXXXXXXXXX XXXXX',]

X 代表玩家无法掉落的碰撞箱。 P 是玩家的起始位置,E 是敌人。我能够通过玩家和敌人的精灵显示和过渡。我有一个玩家 class:

class Player(pygame.sprite.Sprite):
    def __init__(self, pos):
        super().__init__()
        self.reversed = False
        my_spritesheet = Spritesheet('texture.png')
        self.character1 = [my_spritesheet.parse_sprite('MainCharacterP1.png'), my_spritesheet.parse_sprite('MaincharacterP3.png'), my_spritesheet.parse_sprite('MainCharacterP2.png'), my_spritesheet.parse_sprite('MaincharacterP3.png'), my_spritesheet.parse_sprite('MainCharacterP4.png')]
        self.revcharacter1 = [my_spritesheet.parse_sprite('RevMaincharacter.png'), my_spritesheet.parse_sprite('RevMainCharacterP2.png'), my_spritesheet.parse_sprite('RevMaincharacterP3.png'), my_spritesheet.parse_sprite('RevMainCharacterP4.png'), my_spritesheet.parse_sprite('RevMaincharacterP3.png'),my_spritesheet.parse_sprite('RevMainCharacterP2.png')]
        self.character = [self.character1, self.revcharacter1]
        self.index = 0
        self.character_index = 0
        self.animation_speed = 0.2
        self.index_tracked = 0
        self.indexactive = False
        self.image = self.character[self.character_index][self.index]
        self.rect = self.image.get_rect(topleft = pos)
        self.position = self.rect

        self.direction = pygame.math.Vector2(0, 0)
        self.speed_x = 10
        self.speed_y = 10

我在另一个 pygame 文件中有一个敌​​人 class,

class Enemy(pygame.sprite.Sprite):
def __init__(self, pos):
    super().__init__()
    zombie_sprite = Spritesheet('zombie.png')
    self.zombie = [zombie_sprite.parse_sprite('Zombie1.png'), zombie_sprite.parse_sprite('Zombie2.png'), zombie_sprite.parse_sprite('Zombie3.png'), zombie_sprite.parse_sprite('Zombie4.png'), zombie_sprite.parse_sprite('Zombie3.png')]
    self.revzombie = [zombie_sprite.parse_sprite('RevZombie1.png'), zombie_sprite.parse_sprite('RevZombie2.png'), zombie_sprite.parse_sprite('RevZombie3.png'), zombie_sprite.parse_sprite('RevZombie4.png'), zombie_sprite.parse_sprite('RevZombie3.png')]
    self.enemy = [self.zombie, self.revzombie]
    self.character_index = 0
    self.index = 0
    self.image = self.enemy[self.character_index][self.index]
    self.rect = self.image.get_rect(topleft = pos)


#part I need help with
    def move_enemy(self):
        player = Player(self)
        if player.position.x < 500:
            print(player.position.x)

我还有一个级别 class(也在不同的 pygame 文件中):

class Level:

#Initializes the game
def __init__(self, level_data, surface):

    #level setup

    self.display_surface = surface
    self.setup_level(level_data)
    self.world_shift = 0
    self.world_y_shift = 0

#Gets the level started with getting the information in other Classes/.py files
def setup_level(self, layout):
    self.tiles = pygame.sprite.Group()
    self.player = pygame.sprite.GroupSingle()
    self.enemy = pygame.sprite.Group()

    #Goes through the level map from levels.py
    for row_index, row in enumerate(layout):
        for col_index, cell in enumerate(row):
            x = col_index * tile_size[current_level]
            y = row_index * tile_size[current_level]
            if cell == 'X':
                tile = Tile((x, y), tile_size[current_level])
                self.tiles.add(tile)
            elif cell == 'P':
                player_sprite = Player((x, y))
                self.player.add(player_sprite)
            elif cell == 'E':
                enemy_sprite = Enemy((x, y))
                self.enemy.add((enemy_sprite))

我只需要知道如何从我的敌人 class.

中的 Player 和 Level class 访问不同的变量

(我试图让它在玩家距离敌人 500 像素以内时,敌人就会攻击。我还有很多代码可以让玩家移动、相机移动、背景图像,等等)

只需传递第二个类似于您的玩家变量的参数 def move_enemy(self) 方法如下:

  • def move_enemy(self, player)

然后在调用函数时传递播放器变量,例如:

  • #an_enemy and player1 declarations
  • an_enemy.move_enemy(player1)

编辑:删除不再需要的行 player = Player(self) 传递玩家变量,所有其他代码仍然有效

使用 import Player from file 访问播放器属性。在 player.py 文件

中说播放器 class
from player import Player
...
        def move_enemy(self, player):
            player = Player(10,20)
            if player.position.x < 500:
                print(player.position.x)

在那种情况下,您的播放器对象将始终处于同一位置。但是,我认为您想从动态对象访问属性的值。

你应该用通用变量在 enemy 中编写你的函数。然后在 main 中使用 player object

调用该函数

在enemy.py

def move_enemy(self, position):
    # player = Player(10,20)
    if position.x < 500:
        print(position.x)

在main.py

从播放器导入播放器 从敌人进口敌人

player_ = Player(x,y)
enemy = Enemy(x2,y2)
enemy.move_enemy(player_.position)