[英]pygame - KEYDOWN event - line not updating position
我正在制作一個2人游戲,看起來像:
在游戲中,射擊者(綠色和藍色,由玩家控制)可以互相射擊子彈。
如果子彈
1.與牆壁碰撞(灰色),它被破壞了。
2.擊中射手,會失去生命值(射手)。
該游戲(假設是)是回合制,並且在玩家的生命值達到0
時結束。
我的問題
1.我的射手的槍管沒有更新/旋轉。
2.有沒有更好的方法來檢測是否按下了(ny)鍵。
*射手,子彈頭,牆是類
我的密碼
(如果未提及對回答有用的任何功能,請注意)
import math,random,pygame
def event_handle(event,turn):
if turn == 1:
c_s = p1
elif turn == 2:
c_s = p2
else:
return None
if event.type == pygame.KEYDOWN:
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(1)
if key[pygame.K_s]:
c_s.angle -= radians(1)
# power (speed)
if key[pygame.K_d]:
c_s.speed += 0.1
if key[pygame.K_a]:
c_s.speed -= 0.1
def draw_all(bullist,shooters,wall,surface):
# draw shooters
for shooter in shooters:
shooter.move()
shooter.draw(surface)
# draw bullets
for bullet in bullist:
bullet.gravity()
bullet.move()
bullet.collides(shooters,wall,bullist)
bullet.out(surface,bullist)
bullet.draw(surface)
# wall
wall.update()
wall.draw(surface)
pygame.draw.aaline(surface,(255,255,255),(0,400),(640,400))
def angle(A,B,BC,theta):
C = [0,0]
alpha = math.atan2(A[1]-B[1] , A[0] -B[0] ) - theta
C[0] = int(round(B[0] + BC * math.cos(alpha),0))
C[1] = int(round(B[1] + BC * math.sin(alpha),0))
return C
class Shooter:
def __init__(self,pos,size,color,xmax,xmin):
self.pos = pos
self.size = size
self.rect = pygame.Rect(pos,size)
self.health = 100
self.color = color
self.angle = 0
self.speed = 0
self.max = xmax
self.min = xmin
self.next_x = pos[0]
self.color2 = []
for i in color:
i = i - 100
if i < 0:
i = 0
self.color2.append(i)
def draw(self,surface):
global C
pygame.draw.rect(surface,self.color,self.rect)
c = angle(self.rect.midleft,self.rect.center,
20,radians(self.angle))
if c != C and c != [95,392]:
print c
C = c
pygame.draw.line(surface,self.color2,self.rect.center,c,3)
## the other funcs or classes not needed
# globals
turn = 1
C = []
# pygame
(width, height) = (640, 480)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Shooter')
clock = pygame.time.Clock()
# game actors
shooters = []
bullets = []
p1 = Shooter((400,400),(30,-15),(255,0,0),0,0)
p2 = Shooter((100,400),(30,-15),(0,255,0),0,0)
shooters.extend([p1, p2])
wall = Wall(100)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
break
else: event_handle(event,turn)
if not running:
break
screen.fill((0,0,0))
# Game draw logic + Game logic
draw_all(bullets,shooters,wall,screen)
pygame.display.flip()
clock.tick(40)
您的代碼實際上有效,但是存在一些問題。 槍管實際上在旋轉,但是每次按鍵時只有很小的量。
嘗試將event_handle
函數更改為此:
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
由於此時您根本沒有對事件類型if event.type == pygame.KEYDOWN:
,因此我刪除了event
參數,並刪除了if event.type == pygame.KEYDOWN:
檢查。 這樣,您可以保持按下鍵的狀態,而不必多次按下鍵來旋轉發條盒。
我還增加了桶從radians(1)
旋轉到radians(10)
。 否則,更改將太小而看不到(在合理的時間內)。
另外,您必須將主循環調整為
...
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
break
if not running:
break
event_handle(turn)
...
因此event_handle
在主循環的每次迭代中都被調用。
如果您使用的是key.get_pressed,則根本不需要檢測到key_down事件。 只需刪除if event.type == pygame.KEYDOWN:
語句,然后檢查pygame.key.get_pressed
返回的內容pygame.key.get_pressed
包含您的密鑰。
Alos,您應該在每次循環運行時在代碼中的某個地方調用pygame.event.pump
。 將其放入while循環中。
(還有一個與您的問題無關的提示:將主循環移入函數內部-像這樣將其掛在程序主體中實在太可笑了)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.