问题描述
我有一个使用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
另请参阅: