如何使用 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)
我正在制作游戏,目前正在尝试使用拼贴系统对敌人进行编码。我有这样的关卡图(显然要大得多):
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 文件
中说播放器 classfrom 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)