Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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 Pygame中向上射弹的故障排除_Python_Python 3.x_Animation_Pygame_Python Requests - Fatal编程技术网

Python Pygame中向上射弹的故障排除

Python Pygame中向上射弹的故障排除,python,python-3.x,animation,pygame,python-requests,Python,Python 3.x,Animation,Pygame,Python Requests,我正在写一个双人坦克游戏,类似于一个被称为“坦克麻烦”的游戏。当然,我现在还处于初级阶段,我有点被一个特别的小虫子卡住了。目前,下面的代码使我能够显示我的精灵,能够在所有方向上移动,也能够拍摄投射物。然而,唯一的问题是它只能向左或向右发射射弹。有没有人对如何改变这一点有什么建议,使坦克可以朝上、朝下、朝下射击?它只能左右射击,即使它面朝上或向下,这有点奇怪。我在访问y轴和让弹丸沿y轴移动时遇到问题 如果有人能找到如何做到这一点,并告诉我新代码是什么以及放在哪里,那将非常有用。这是我的密码: im

我正在写一个双人坦克游戏,类似于一个被称为“坦克麻烦”的游戏。当然,我现在还处于初级阶段,我有点被一个特别的小虫子卡住了。目前,下面的代码使我能够显示我的精灵,能够在所有方向上移动,也能够拍摄投射物。然而,唯一的问题是它只能向左或向右发射射弹。有没有人对如何改变这一点有什么建议,使坦克可以朝上、朝下、朝下射击?它只能左右射击,即使它面朝上或向下,这有点奇怪。我在访问y轴和让弹丸沿y轴移动时遇到问题

如果有人能找到如何做到这一点,并告诉我新代码是什么以及放在哪里,那将非常有用。这是我的密码:

import pygame
pygame.init()

screen = pygame.display.set_mode((500,500))

pygame.display.set_caption("Game")
tankImg = pygame.image.load("tank1.png")
downTank = tankImg 
leftTank = pygame.image.load("left1.png")
rightTank = pygame.image.load("right1.png")
upTank = pygame.image.load("up1.png")
bg = pygame.image.load("background.png")


screenWidth = 500
screenHeight = 500

clock = pygame.time.Clock()

class player(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.left = False
        self.right = False
        self.up = False
        self.down = False

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

class projectile(object):
    def __init__(self,x, y, radius, color, facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel = 8 * facing 

    def draw(self,screen):
        pygame.draw.circle(screen, self.color, (self.x,self.y), self.radius)

def redraw():
    screen.blit(bg, (0,0))
    tank.draw(screen)

    for bullet in bullets:
        bullet.draw(screen)

    pygame.display.update()

run = True
tank = player(300, 410, 16, 16)
bullets = []
while run:

    clock.tick(30)

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

    for bullet in bullets:
        if bullet.x < screenWidth and bullet.x > 0:
            bullet.x += bullet.vel
        elif bullet.y > screenHeight and bullet.y > 0:
            bullet.y += bullet.vel 
        else:
            bullets.pop(bullets.index(bullet))



    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and tank.x > tank.vel:
        tank.left = True
        tankImg = leftTank
        tank.x -= tank.vel
        facing = -1
    if keys[pygame.K_RIGHT] and tank.x < 500 - tank.width:
        tank.right = True
        tankImg = rightTank
        tank.x += tank.vel
        facing = 1
    if keys[pygame.K_UP] and tank.y > tank.vel:
        tank.up = True
        tankImg = upTank
        tank.y -= tank.vel
        facing = 1
    if keys[pygame.K_DOWN] and tank.y < 500 - tank.height:
        down = True
        tankImg = downTank
        tank.y += tank.vel
        facing = -1
    if keys[pygame.K_SPACE]:
        if len(bullets) < 1:
            bullets.append(projectile(round(tank.x + tank.width // 2), round(tank.y + tank.height // 2), 4, (0,0,0),facing))

    redraw()

pygame.quit()
导入pygame
pygame.init()
screen=pygame.display.set_模式((500500))
pygame.display.set_标题(“游戏”)
tankImg=pygame.image.load(“tank1.png”)
下水箱=水箱
leftTank=pygame.image.load(“left1.png”)
rightTank=pygame.image.load(“right1.png”)
upTank=pygame.image.load(“up1.png”)
bg=pygame.image.load(“background.png”)
屏幕宽度=500
屏幕高度=500
clock=pygame.time.clock()
类播放器(对象):
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=5
self.left=False
self.right=False
self.up=False
self.down=False
def提取(自身,屏幕):
屏幕blit(tankImg,(self.x,self.y))
类(对象):
定义初始(自、x、y、半径、颜色、面):
self.x=x
self.y=y
自半径=半径
self.color=颜色
自我面对
self.vel=8*端面
def提取(自身,屏幕):
pygame.draw.circle(屏幕,self.color,(self.x,self.y),self.radius)
def redraw():
屏幕光点(背景,(0,0))
坦克.牵引(屏幕)
对于子弹中的子弹:
子弹画(屏幕)
pygame.display.update()
运行=真
坦克=玩家(300、410、16、16)
项目符号=[]
运行时:
时钟滴答(30)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
对于子弹中的子弹:
如果bullet.x<屏幕宽度,bullet.x>0:
bullet.x+=bullet.vel
elif bullet.y>屏幕高度和bullet.y>0:
bullet.y+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和tank.x>tank.vel:
tank.left=真
坦克img=左坦克
油箱.x-=油箱.vel
正面=-1
如果键[pygame.K_RIGHT]和tank.x<500-tank.width:
tank.right=正确
油箱img=右油箱
油箱.x+=油箱.vel
朝向=1
如果键[pygame.K_UP]和tank.y>tank.vel:
tank.up=真
tankImg=上岸
油箱.y-=油箱.vel
朝向=1
如果键[pygame.K_DOWN]和tank.y<500-tank.height:
向下=真
坦克img=下坦克
油箱.y+=油箱.vel
正面=-1
如果键[pygame.K_SPACE]:
如果长度(项目符号)<1:
子弹。附加(炮弹(圆形(坦克x+坦克宽度//2),圆形(坦克y+坦克高度//2),4,(0,0,0),正面))
重画
pygame.quit()

当前,如果bullet.x介于0和屏幕宽度之间,则满足第一个条件,而不检查第二个条件

for bullet in bullets:
    if bullet.x < screenWidth and bullet.x > 0:
        # When this is True then the "elif" is not run
        bullet.x += bullet.vel
    elif bullet.y > screenHeight and bullet.y > 0:
        bullet.y += bullet.vel 
    else:
        bullets.pop(bullets.index(bullet))
对于项目符号中的项目符号:
如果bullet.x<屏幕宽度,bullet.x>0:
#如果这是真的,则不运行“elif”
bullet.x+=bullet.vel
elif bullet.y>屏幕高度和bullet.y>0:
bullet.y+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
您应该有一个条件,确保项目符号同时处于x和y边界,以便更新x和y

for bullet in bullets:
    if 0 < bullet.x < screenWidth and 0 < bullet.y < screenHeight:
        bullet.x += bullet.vel
        bullet.y += bullet.vel 
    else:
        bullets.pop(bullets.index(bullet))
对于项目符号中的项目符号:
如果0

您可以组合这样的条件,检查一个值是否在两个值之间,例如so
min
当前,如果bullet.x在0和屏幕宽度之间,则满足第一个条件,而不检查第二个条件

for bullet in bullets:
    if bullet.x < screenWidth and bullet.x > 0:
        # When this is True then the "elif" is not run
        bullet.x += bullet.vel
    elif bullet.y > screenHeight and bullet.y > 0:
        bullet.y += bullet.vel 
    else:
        bullets.pop(bullets.index(bullet))
对于项目符号中的项目符号:
如果bullet.x<屏幕宽度,bullet.x>0:
#如果这是真的,则不运行“elif”
bullet.x+=bullet.vel
elif bullet.y>屏幕高度和bullet.y>0:
bullet.y+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
您应该有一个条件,确保项目符号同时处于x和y边界,以便更新x和y

for bullet in bullets:
    if 0 < bullet.x < screenWidth and 0 < bullet.y < screenHeight:
        bullet.x += bullet.vel
        bullet.y += bullet.vel 
    else:
        bullets.pop(bullets.index(bullet))
对于项目符号中的项目符号:
如果0

您可以将这样的条件组合起来,检查一个值是否介于两个值之间,例如so
min

问题是由代码的该部分引起的:

如果bullet.x0:
bullet.x+=bullet.vel
elif bullet.y>屏幕高度和bullet.y>0:
bullet.y+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
只要项目符号在窗口边界内,第一个条件的计算结果为
True
。这导致子弹只能在x方向移动

方向
属性添加到类
投射物
中,而不是
面向
属性。此外,添加一种方法(
move
)来移动射弹。此方法忽略窗口的边界:

类投射物(对象):
判定元件