Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由于OOP,子弹没有向上移动_Python_Oop_Pygame - Fatal编程技术网

Python 由于OOP,子弹没有向上移动

Python 由于OOP,子弹没有向上移动,python,oop,pygame,Python,Oop,Pygame,我有一个简单的射击游戏使用pygame。我在使子弹的y坐标缓慢上升时遇到了一些问题。我知道这与我编程Player类的方式有关,即使其中有bullet Rect。我想我必须改变它里面的更新功能。这是我的代码: import pygame, random, sys, time pygame.init() #Constants WIDTH = 800 HEIGHT = 500 BLACK = (0, 0, 0) WHITE = (255, 255, 255) # Background Colou

我有一个简单的射击游戏使用pygame。我在使子弹的y坐标缓慢上升时遇到了一些问题。我知道这与我编程Player类的方式有关,即使其中有bullet Rect。我想我必须改变它里面的更新功能。这是我的代码:

import pygame, random, sys, time

pygame.init()

#Constants
WIDTH = 800
HEIGHT = 500

BLACK = (0, 0, 0)
WHITE = (255, 255, 255) # Background Colour
RED = (255, 0, 0)
GREEN = (0, 255, 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, 0, self.width/2, self.width/2)
        self.bullet = pygame.Rect(0, 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.y, self.width, 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)
import pygame,random,sys,time
pygame.init()
#常数
宽度=800
高度=500
黑色=(0,0,0)
白色=(255,255,255)#背景色
红色=(255,0,0)
绿色=(0,255,0)
window=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“pygame射击游戏”)
clock=pygame.time.clock()
fps=60
运行=真
类播放器():
定义初始值(自身、宽度、颜色、x、y):
self.width=宽度
颜色
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,0,self.width/2,self.width/2)
self.bullet=pygame.Rect(0,0,10,20)
self.shoot=False
def抽签(自我,赢):
self.win=win
pygame.draw.rect(self.win,self.color,self.player)#draw player(rect)
pygame.draw.rect(self.win,绿色,self.cartridge)#draw cartridge
如果自拍:
pygame.draw.rect(self.win,BLACK,self.bullet)
def移动(自我):
keys=pygame.key.get_pressed()
如果键[pygame.K#u LEFT]和self.x>0:self.x-=self.vel#我们不做elif,因为我们希望它们能够沿对角线移动
如果键[pygame.K_RIGHT]和self.x0:self.y-=self.vel
如果键[pygame.K_DOWN]和self.y0时:
自.bullet.y-=1
def主(win):
运行=真
玩家=玩家(50,红色,宽度/2,高度/2)
运行时:
win.fill(白色)
时钟滴答声(fps)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
player.move()
player.update()
球员。平局(获胜)
pygame.display.update()
pygame.quit()
sys.exit()
主(窗口)

另外,我如何为每个单独的盒式磁带和子弹创建类,以使整个代码更高效?

update
在主应用程序循环中不断调用。因此,更新不需要额外的动画循环。将循环更改为选择(将
while
更改为
if
):

而self.bullet.y>0:

如果self.bullet.y>0:
自.bullet.y-=1
子弹的起始位置必须在子弹射击时设置,而不是在子弹更新时连续设置:

class Player():
# [...]
def移动(自我):
# [...]
如果键[pygame.K_SPACE]:
self.shot=True

self.bullet.midboottom=self.cartridge.midtop#非常感谢。你认为我应该把玩家类改为只涉及与玩家相关的东西吗?还有一个新的游戏类Bullet and Cartridge?@TheCoder1343是的。考虑创建<代码>弹头类。实施项目符号列表,以便可以发射多个项目符号。子弹应该由
KEYDOWN
事件发射,而不是
pygame.key.get_pressed()
。请参阅。@coder1343,但要小心
pygame.event.get()
只能调用一次。看见