微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由于OOP,子弹不能向上移动

如何解决由于OOP,子弹不能向上移动

我有一个使用pygame的简单射击游戏。我在使子弹头的y坐标缓慢增大时遇到一些问题。我知道这与我编写Player类的方式有关,即使其中包含项目符号Rect也是如此。我想我必须更改其中的更新功能。这是我的代码

import pygame,random,sys,time

pygame.init()

#Constants
WIDTH = 800
HEIGHT = 500

BLACK = (0,0)
WHITE = (255,255,255) # Background Colour
RED = (255,0)
GREEN = (0,0)

window = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Pygame Shooter Game")

clock = pygame.time.Clock()
fps = 60

run = True

class Player():
    def __init__(self,width,colour,x,y):
        self.width = width
        self.colour = colour
        self.x = x
        self.y = y
        self.vel = 5
        self.shoot = False
        self.player = pygame.Rect(self.x,self.y,self.width,self.width)
        self.cartridge = pygame.Rect(0,self.width/2,self.width/2)
        self.bullet = pygame.Rect(0,10,20)
        self.shoot = False

    def draw(self,win):
        self.win = win
        pygame.draw.rect(self.win,self.colour,self.player) # Draw player(rect)
        pygame.draw.rect(self.win,GREEN,self.cartridge) #Draw cartridge
        if self.shoot:
            pygame.draw.rect(self.win,BLACK,self.bullet)
        
    def move(self):
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and self.x > 0: self.x -= self.vel # We don't do elif cuz we want them to be able to move diagonally
        if keys[pygame.K_RIGHT] and self.x < WIDTH-self.width: self.x += self.vel
        if keys[pygame.K_UP] and self.y > 0: self.y -= self.vel
        if keys[pygame.K_DOWN] and self.y < HEIGHT-self.width: self.y += self.vel

        if keys[pygame.K_SPACE]:
            self.shoot = True
    
    def update(self):
        self.player = pygame.Rect(self.x,self.width)
        self.cartridge.midbottom = self.player.midtop
        self.bullet.midbottom = self.cartridge.midtop

        if self.shoot:
            while self.bullet.y > 0:
                self.bullet.y -= 1

def main(win):
    run = True 

    player = Player(50,RED,WIDTH/2,HEIGHT/2)

    while run:
        win.fill(WHITE)
        clock.tick(fps)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        player.move()
        player.update()
        player.draw(win)
        pygame.display.update()

    pygame.quit()
    sys.exit()

main(window)

此外,我如何为每个弹药筒和项目符号创建创建类,以使整个代码更高效?

解决方法

update在主应用程序循环中被连续调用。因此,此更新不需要其他动画循环。将循环更改为选择项(将while更改为if):

while self.bullet.y > 0:

if self.bullet.y > 0:
    self.bullet.y -= 1

必须在射击子弹时设置子弹的起始位置,而不是在更新子弹时连续设置子弹的起始位置:

class Player():
    # [...]

    def move(self):
        # [...]

        if keys[pygame.K_SPACE]:
            self.shoot = True
            self.bullet.midbottom = self.cartridge.midtop # <--- INSERT

    def update(self):
        self.player = pygame.Rect(self.x,self.y,self.width,self.width)
        self.cartridge.midbottom = self.player.midtop
        # self.bullet.midbottom = self.cartridge.midtop     <--- DELETE
        
        if self.shoot:
            if self.bullet.y > 0:                         # <--- if (not while)
                self.bullet.y -= 1

另请参阅:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。