Python 如何在单独的模块中调用播放器rect

Python 如何在单独的模块中调用播放器rect,python,pygame,Python,Pygame,我最近实现了一个敌人,它在屏幕上的指定点定期射击。然而,在试图让玩家直选这一点时,它拒绝了。由于敌方等级在房间模块中定义,然后在主游戏模块中定义,因此我不太确定如何在敌方模块中调用玩家rect 工作守则如下: 游戏模块 房间模块 播放器模块 敌方舱 射弹模块 这是你想要的答案,也是你需要的答案。分别为: SomeModule.py: from game import player # imports the Player *instance* you've created in the main

我最近实现了一个敌人,它在屏幕上的指定点定期射击。然而,在试图让玩家直选这一点时,它拒绝了。由于敌方等级在房间模块中定义,然后在主游戏模块中定义,因此我不太确定如何在敌方模块中调用玩家rect

工作守则如下:

游戏模块 房间模块 播放器模块 敌方舱 射弹模块
这是你想要的答案,也是你需要的答案。分别为:

SomeModule.py:

from game import player # imports the Player *instance* you've created in the main module

some_func(player) # as argument
player.another_func # method access
现在,这是你通常访问这类东西的方式,这将是非常好的。但在这种情况下:

a) 您将生成一个全新的游戏循环,因为您将游戏设置放在模块范围内,而不是放在某个函数中,或者,至少,直接放在
下,如果
。导入模块将执行模块范围内的所有代码

b) 您必须直接导入一个非单例实例这一事实本身就是一种代码气味——这个问题的存在本身应该向您发出的信号是,您可能有一个地方,您的代码位必须能够相互通信,但您对调解该过程没有明确的责任


因此,为了解决我承诺答案的第二部分:首先不要让这个问题发生-构建一个专门用于管理玩家和敌人的东西,只导入类定义,然后在管理器中导入它们之间的实例和接口。

有一个你想要的答案,也有一个你需要的答案。分别为:

SomeModule.py:

from game import player # imports the Player *instance* you've created in the main module

some_func(player) # as argument
player.another_func # method access
现在,这是你通常访问这类东西的方式,这将是非常好的。但在这种情况下:

a) 您将生成一个全新的游戏循环,因为您将游戏设置放在模块范围内,而不是放在某个函数中,或者,至少,直接放在
下,如果
。导入模块将执行模块范围内的所有代码

b) 您必须直接导入一个非单例实例这一事实本身就是一种代码气味——这个问题的存在本身应该向您发出的信号是,您可能有一个地方,您的代码位必须能够相互通信,但您对调解该过程没有明确的责任


因此,为了解决我承诺答案的第二部分:首先不要让这个问题发生-构建专门用于管理玩家和敌人的东西,只导入类定义,然后在管理器中导入它们之间的实例和接口。

谢谢!我会开始创作一些你建议的东西谢谢!我会像你建议的那样开始创作
from constants import *
import pygame


class Player(pygame.sprite.Sprite):


    def __init__(self, x, y):

        super().__init__()

        self.image = pygame.Surface([15, 15])
        self.image.fill(BLACK)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
from constants import *
import pygame
from Projectile import Bullet
from pygame.math import Vector2

target = Vector2(400, 400)

class Enemy(pygame.sprite.Sprite):

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

        super().__init__()

        self.image = pygame.Surface([10, 10])
        self.image.fill(RED)

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

        self.previous_time = pygame.time.get_ticks()
        self.shoot_delay = 1000
        self.speed = 12
        self.projectiles = projectiles

    def update(self):

        now = pygame.time.get_ticks()
        if now - self.previous_time > self.shoot_delay:
            self.previous_time = now
            bullet = Bullet(self.rect.x, self.rect.y, target)
            self.projectiles.add(bullet)
import pygame
from constants import *
from pygame.math import Vector2

class Bullet(pygame.sprite.Sprite):

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

        super().__init__()

        self.image = pygame.Surface((10, 10))
        self.image.fill(RED)

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

        self.position = Vector2(self.rect.x, self.rect.y)


        direction = target - self.position

        radius, angle = direction.as_polar()
        self.image = pygame.transform.rotozoom(self.image, -angle, 1)

        self.velocity = direction.normalize() * 11

    def update(self):

        self.position += self.velocity
        self.rect.center = self.position 
from game import player # imports the Player *instance* you've created in the main module

some_func(player) # as argument
player.another_func # method access