Python pygame-按键事件-行未更新位置

Python pygame-按键事件-行未更新位置,python,line,pygame,keydown,Python,Line,Pygame,Keydown,我正在制作一个两人游戏,应该是这样的: 在游戏中,射手(绿色和蓝色,由玩家控制)可以相互射击。 如果子弹 1.与墙碰撞(灰色),墙被摧毁。 2.击中射手,失去生命(射手)。 游戏(应该是)回合制,当玩家达到0健康时结束 我的问题 1.我的射手的枪管没有更新/旋转。 2.是否有更好的方法检测是否按下(ny)键。 *射手、子弹、墙都是职业 我的代码 (如果未提及任何有助于回答问题的功能,请发表评论) 导入数学、随机、pygame def事件\ U句柄(事件,回合): 如果匝数=1: c_s=p1

我正在制作一个两人游戏,应该是这样的:

在游戏中,射手(绿色和蓝色,由玩家控制)可以相互射击。
如果子弹
1.与墙碰撞(灰色),墙被摧毁。
2.击中射手,失去生命(射手)。
游戏(应该是)回合制,当玩家达到
0
健康时结束

我的问题
1.我的射手的枪管没有更新/旋转。
2.是否有更好的方法检测是否按下(ny)键。
*射手、子弹、墙都是职业

我的代码
(如果未提及任何有助于回答问题的功能,请发表评论)

导入数学、随机、pygame
def事件\ U句柄(事件,回合):
如果匝数=1:
c_s=p1
elif转角==2:
c_s=p2
其他:
一无所获
如果event.type==pygame.KEYDOWN:
key=pygame.key.get_pressed()
#下一站
如果键[pygame.K_q]:
c_.s.next_x-=1
如果键[pygame.K_e]:
c_.s.next_x+=1
#角度
如果键[pygame.K_w]:
c_.角度+=弧度(1)
如果键[pygame.K_s]:
c_.角度-=弧度(1)
#功率(速度)
如果键[pygame.K_d]:
c_.速度+=0.1
如果键[pygame.K_a]:
c_.速度-=0.1
def draw_all(金块、射手、墙壁、表面):
#抽签投手
对于射手中的射手:
射手,快走
射手。抽签(表面)
#抽子弹
对于bullet in bullist:
子弹重力()
子弹,移动
子弹。碰撞(射手、墙、金块)
子弹射出(表面,金块)
子弹画(表面)
#墙
wall.update()
墙.绘制(表面)
pygame.draw.aaline(表面,(255255255),(0400),(640400))
def角度(A、B、BC、θ):
C=[0,0]
α=数学常数2(A[1]-B[1],A[0]-B[0])-θ
C[0]=int(四舍五入(B[0]+BC*math.cos(alpha),0))
C[1]=int(四舍五入(B[1]+BC*math.sin(alpha),0))
返回C
职业射手:
定义初始值(自身、位置、大小、颜色、最大值、最小值):
self.pos=pos
self.size=大小
self.rect=pygame.rect(位置、大小)
自我健康=100
self.color=颜色
自转角=0
自身速度=0
self.max=xmax
self.min=xmin
self.next_x=pos[0]
self.color2=[]
对于彩色的i:
i=i-100
如果i<0:
i=0
self.color2.append(一)
def绘图(自、表面):
全球C
pygame.draw.rect(曲面,自.颜色,自.rect)
c=角度(自正中左、自正中心、,
20,弧度(自转角))
如果c!=C和C!=[95,392]:
打印c
C=C
pygame.draw.line(曲面、自彩色2、自矩形中心、c、3)
##不需要其他函数或类
#全球的
圈数=1
C=[]
#皮加梅
(宽度、高度)=(640480)
screen=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题('Shooter'))
clock=pygame.time.clock()
#游戏演员
射手=[]
项目符号=[]
p1=射手((400400),(30,-15),(255,0,0),0,0)
p2=射手((100400),(30,-15),(0255,0),0,0)
射手。伸展([p1,p2])
墙=墙(100)
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
pygame.quit()
打破
其他:事件句柄(事件,回合)
如果未运行:
打破
屏幕填充((0,0,0))
#游戏绘制逻辑+游戏逻辑
全部抽签(子弹、射手、墙、屏幕)
pygame.display.flip()
时钟滴答(40)

我做错了什么?如果您正在使用key.get\u pressed,则根本不需要检测key\u down事件。只需删除
if event.type==pygame.KEYDOWN:
语句,然后检查从
pygame.key.get\u按下时是否有返回的键


各位,您应该在每次循环运行时调用代码中的某个地方的
pygame.event.pump
。把它放在你的while循环中


(还有一个与您的问题无关的提示:将主循环移动到函数中——像这样挂在程序体中太可怕了)

如果您使用key.get\u pressed,则根本不需要检测key\u down事件。只需删除
if event.type==pygame.KEYDOWN:
语句,然后检查从
pygame.key.get\u按下时是否有返回的键


各位,您应该在每次循环运行时调用代码中的某个地方的
pygame.event.pump
。把它放在你的while循环中


(还有一个与您的问题无关的提示:将主循环移动到函数中——像这样挂在程序体中是非常可怕的)

您的代码实际上可以工作,但存在一些问题。桶实际上是旋转的,但每次按键的旋转量都很小

尝试将
事件\u句柄
函数更改为:

def event_handle(turn):
    if turn == 1:
        c_s = p1
    elif turn == 2:
        c_s = p2
    else:
        return None
    key = pygame.key.get_pressed()
    # next_pos
    if key[pygame.K_q]:
        c_s.next_x -= 1
    if key[pygame.K_e]:
        c_s.next_x += 1
    # angle
    if key[pygame.K_w]:
        c_s.angle += radians(10)
    if key[pygame.K_s]:
        c_s.angle -= radians(10)
    # power (speed)
    if key[pygame.K_d]:
        c_s.speed += 0.1
    if key[pygame.K_a]:
        c_s.speed -= 0.1
因为此时您对事件类型根本不感兴趣,所以我删除了
event
参数和
if event.type==pygame.KEYDOWN:
检查。通过这种方式,您可以按住按键,而不是被迫多次敲击按键以旋转桶

我还将桶旋转的值从
弧度(1)
增加到
弧度(10)
。否则,更改太小而不可见(在合理的时间内)

此外,您还必须将主循环调整为

...
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
        pygame.quit()
        break
if not running:
    break
event_handle(turn)
...

因此,
事件句柄
在主循环的每次迭代中都被调用。

您的代码实际上可以工作,但存在一些问题。桶实际上是旋转的,但每次按键的旋转量都很小

尝试将
事件\u句柄
函数更改为:

def event_handle(turn):
    if turn == 1:
        c_s = p1
    elif turn == 2:
        c_s = p2
    else:
        return None
    key = pygame.key.get_pressed()
    # next_pos
    if key[pygame.K_q]:
        c_s.next_x -= 1
    if key[pygame.K_e]:
        c_s.next_x += 1
    # angle
    if key[pygame.K_w]:
        c_s.angle += radians(10)
    if key[pygame.K_s]:
        c_s.angle -= radians(10)
    # power (speed)
    if key[pygame.K_d]:
        c_s.speed += 0.1
    if key[pygame.K_a]:
        c_s.speed -= 0.1
因为此时您对事件类型根本不感兴趣,所以我删除了
事件