0

我正在尝试让我的角色在 pygame 中拍摄。我无法让子弹从他的位置移动,如果它碰到屏幕边缘就停下来。我想要的是它继续移动,直到它与屏幕边缘碰撞。每当我运行以下代码时,它都会崩溃:

class BULLET(pygame.sprite.Sprite):
def __init__(self, speed, location):
    self.pos = [0,0]
    pygame.sprite.Sprite.__init__(self)
    self.image = SHOWBULLET
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = location
    self.rect.center = location
    self.speed = speed
def move(self):
    if AMMO > 0:
        if event.type == pygame.MOUSEBUTTONDOWN and Gun.image == NOGUN:
            held_down = True
            if held_down == True:
                self.rect.centerx = Player.rect.centerx
                self.rect.centery = Player.rect.centery
                if Player.direction == 0:
                    self.direction = 0
                    while self.rect.top >= screen.get_rect().top:
                        self.rect.top = self.rect.top + 20
                        if self.rect.top <=   screen.get_rect().top:
                            break
4

2 回答 2

1

我想你会想用这种方式来构建你的游戏。这是一个缩写版本,包含我认为相关的内容,但存在一些问题,但本质上

  • 你的子弹在发射后根本不应该关心玩家。
  • 子弹应该从玩家在 HoldMouseButton 事件发生时站立的位置开始。在那之后,它应该继续在它的路径上不间断。
  • 我认为如果长时间按住鼠标,您会希望玩家射出许多子弹。我认为您当前的代码不会那样做。实际上,子弹应该关心任何事件,除了 TickEvents 帮助它在屏幕上移动。另一方面,玩家应该关心鼠标按钮是否被按住,并且只要鼠标按钮被按住就应该发射子弹。
  • 此外,了解一点 MVC 架构可能会有所帮助。看看这个基本教程

希望这可以帮助。

class Bullet:
    def __init__(self, velocity, start_position):
        self.pos = start_position
        self.velocity = velocity
        self.visible = True

    def notify(self, event):
        if isinstance(event, TickEvent):
            self.move(event.time_passed)

    def move(self, time):
        self.pos += velocity * time

class Charactor:
    def __init__(self, position, event_manager, sprite_manager, etc.):
        self.state = 'MOVING'
        self.pos = position
        self.direction = direction

    def notify(self, event):
        if isinstance(event, HoldMouseButtonEvent()):
            self.state = 'SHOOTING'
        elif isinstance(event, ReleaseMouseButtonEvent()):
            self.state = 'MOVING'
        elif isinstance(event, TickEvent()):
            if self.state == 'SHOOTING':
                self.shoot()
            elif self.state == 'MOVING':
                self.move()

    def shoot(self):
        sprite_manager.add(Bullet(BULLET_VELOCITY * self.direction, self.pos))
于 2013-06-26T15:29:56.623 回答
0

你的移动功能应该忽略与玩家有关的一切。从头开始。它应该在每个滴答声中更新它的位置(也许通过调用move()每个滴答声)并且它应该朝着自己的方向前进并检查它自己与墙壁/边缘的碰撞

修复了你的 init 方法

def __init__(self, speed, location, direction):
    self.pos = location
    pygame.sprite.Sprite.__init__(self)
    self.image = SHOWBULLET
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = location
    self.rect.center = location
    self.speed = speed
    self.direction = direction

您的移动方法,但可能需要从头开始重做

您的移动方法应该有两个部分:

1)向您想要的方向移动子弹一个增量

if (direction == 0) {
    self.pos = newPosition; // replace new position with a calculation for up
} else if (direction == 1) {
    self.pos = newPosition; // this new position should be one increment right
} etc...

2) 检查子弹是否离开屏幕

if (self.pos[0] > width || self.pos[0] < 0 || self.pos[1] > height || self.pos[1] < 0) {
    //return false;
}

return true;
于 2013-06-26T14:24:05.523 回答