【问题标题】:Pygame: my bullet class does nothing apart from being drawnPygame:我的子弹类除了被绘制之外什么都不做
【发布时间】:2020-06-13 01:10:55
【问题描述】:

所以我试图制作一个本地多人游戏,我已经创建了迄今为止运行良好的玩家类。

现在我尝试做一个子弹类来为玩家的宇宙飞船创建不同类型的射击,但是在调用我的子弹时,它只会被吸引到玩家在游戏开始时所在的屏幕上并且它不会移动(到目前为止只是试图对其进行编程以使其移动)

代码如下:

import pygame

pygame.init()

#Display screen
screen = pygame.display.set_mode((800, 600))

pygame.display.set_caption("Space Arena")

background = pygame.image.load(r'C:\Users\Bruno\Documents\PythonProjects\Pygame\Multiplayer\Images\background.png').convert_alpha()

playerImg = pygame.image.load(r'C:\Users\Bruno\Documents\PythonProjects\Pygame\Multiplayer\Images\Player.png').convert_alpha()
player2Img = pygame.image.load(r'C:\Users\Bruno\Documents\PythonProjects\Pygame\Multiplayer\Images\Player2.png').convert_alpha()
regular_bullet = pygame.image.load(r'C:\Users\Bruno\Documents\PythonProjects\Pygame\Multiplayer\Images\bullet.png').convert_alpha()


class Player:
    def __init__(self, image, x, y, isPlayer1, isPlayer2):
        self.image = image
        self.x = x
        self.y = y
        self.isPlayer1 = isPlayer1
        self.isPlayer2 = isPlayer2

    def Move(self):
        key_states = pygame.key.get_pressed()
        x_change = 0.2
        y_change = 0.2

        if self.isPlayer1:
            if key_states[pygame.K_a]:
                self.x += -x_change
            if key_states[pygame.K_d]:
                self.x += x_change
            if key_states[pygame.K_w]:
                self.y += -y_change
            if key_states[pygame.K_s]:
                self.y += y_change
        elif self.isPlayer2:
            if key_states[pygame.K_LEFT]:
                self.x += -x_change
            if key_states[pygame.K_RIGHT]:
                self.x += x_change
            if key_states[pygame.K_UP]:
                self.y += -y_change
            if key_states[pygame.K_DOWN]:
                self.y += y_change

    def draw(self, screen):
        screen.blit(self.image,(self.x,self.y))


    def ColorPlayer(self ,image):
        if self.isPlayer1:
            self.image.fill((190,0,0,100), special_flags = pygame.BLEND_ADD)
        if self.isPlayer2:
            self.image.fill((0,0,190,100), special_flags = pygame.BLEND_ADD)

class Bullet():
    def __init__(self, image, bulletx, bullety):
        self.image = image
        self.bulletx = bulletx
        self.bullety = bullety
        self.bullet_state = "ready"

    def draw(self, screen):
        if self.bullet_state == "fire":
            screen.blit(self.image,(self.bulletx,self.bullety))

    def shoot(self):
        change_x = 0.9
        if self.bullet_state == "fire":
            self.bulletx += change_x
        if self.bulletx > 800:
            self.bullet_state = "ready"



def redrawWindow(screen, player, player2, background, player_bullet):
    screen.fill((255,255,255))
    screen.blit(background,(0,0))
    player.draw(screen)
    player2.draw(screen)
    player_bullet.draw(screen)
    pygame.display.update()

def Main():
    done = False

    player = Player(playerImg,200,200,True,False)

    player2 = Player(player2Img,600,200,False,True)

    player1_bullet = Bullet(regular_bullet, player.x, player.y)

    while not done:

        player.Move()
        player2.Move()
        player.ColorPlayer(playerImg)
        player2.ColorPlayer(player2Img)

        redrawWindow(screen, player, player2, background, player1_bullet)

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

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if player1_bullet.bullet_state is "ready":
                        player1_bullet.bullet_state = "fire"
                        player1_bullet.shoot()


Main()

【问题讨论】:

    标签: python oop pygame


    【解决方案1】:

    看起来shoot 实际上是您的子弹的“更新”函数,并且需要在每一帧(如player.Move())中调用其中的代码,以便子弹在发射后继续移动。

    【讨论】:

      【解决方案2】:

      改变子弹位置的唯一代码是 shoot 方法中的这一位。

      def shoot(self):
          change_x = 0.9
          if self.bullet_state == "fire":
              self.bulletx += change_x
      

      没有其他东西可以移动它。您需要有一个移动功能来调整它的位置并在每一帧中调用它。事实上,你的拍摄功能有点奇怪,它看起来更像是移动功能的样子。也许将其重命名为 move() 并在每一帧中调用它?

      对于shoot() 函数来说,该函数有点不寻常,因为它会移动现有子弹而不是发射新子弹。通常,射击方法应该是播放器中的一种方法并创建一个新子弹。子弹实例函数射击和创建新子弹实际上没有意义。此外,您似乎已经对其进行了编码,以便有一颗子弹达到 800 度然后可以重新发射,但您没有任何东西可以将子弹位置重置回玩家所在的位置。

      将“准备就绪”和“开火”状态作为玩家的一种状态可能更有意义,因为玩家可以或不能开火。此外,shoot() 方法在玩家类中更为常见,当它触发时(玩家处于“就绪”状态),它会在玩家位置创建一个新的 Bullet 实例。

      子弹 move() 方法将在每一帧被调用,就像播放器 move() 函数一样。通常一次允许有多个子弹,因此您将保留一个列表,并且必须遍历子弹列表以移动它们(并进行碰撞检查以查看它们是否击中任何东西)。如果子弹飞出屏幕或击中某物,则将子弹从子弹列表中删除。

      【讨论】:

        【解决方案3】:

        你必须改变两件事。

        方法Bullet.shoot() 必须在主应用程序循环中不断调用。请注意,此方法根据项目符号的状态更新项目符号。如果子弹的状态是“fire”,那么子弹就会移动。否则它静止不动。

        更新子弹发射时的位置。子弹总是必须从玩家的位置开始:

        def Main():
            # [...]
        
            while not done:
                # [...]
        
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        done = True
        
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_SPACE:
        
                            if player1_bullet.bullet_state is "ready":
                                player1_bullet.bullet_state = "fire"
                                player1_bullet.bulletx = player.x
                                player1_bullet.bullety = player.y
        
                player1_bullet.shoot()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多