繁体   English   中英

乒乓球仅在按键/鼠标移动时移动

[英]Ball in pong only moving on keypress/mouse move

除非我移动鼠标或单击我应该做的事情的按钮之一,否则球不会移动。 (即应该移动桨的向上和向下按钮。)单击按钮和移动鼠标不会控制球移动的方向 - 它只是让它按照它应该的方式移动。 如果我停止移动鼠标或单击按钮,它将完全停止移动。

这是一些代码:

while not x:
  for event in pygame.event.get():
    if event.type == pygame.QUIT: 
      x = True #quits the game when you press X
    if event.type == pygame.KEYUP: #makes start screen go away
      if event.key == pygame.K_RETURN:
        gameScreen()
        ball.startMoving() #makes the ball start moving
        start = True

    if start == True:
      gameScreen()

      ball.move() #controls the movement of the ball
      
      ball.show() #makes the ball show up

      p1Paddle.border()
      p1Paddle.show() #make the paddles and ball show up vv

      p2Paddle.border()
      p2Paddle.show()
      

      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w: #makes blue paddle go up
          p1Paddle.state = 'up'
          p1Paddle.move()
        
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_s: #makes blue paddle go down
          p1Paddle.state = 'down'
          p1Paddle.move()
  
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP: #makes red paddle go up
          p2Paddle.state = 'up'
          p2Paddle.move()
          
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_DOWN: #makes red paddle go down
          p2Paddle.state = 'down'
          p2Paddle.move()
    
    pygame.display.update() #updates the screen/window
    clock.tick(30) 

这是球类的代码。

class Ball:
  def __init__(self, screen, colour, posX, posY, radius):
    self.screen = screen
    self.colour = colour
    self.posX = posX
    self.posY = posY
    self.radius = radius
    self.dx = 0
    self.dy = 0
    self.show()

  def show(self):
    pygame.draw.circle(self.screen, self.colour, (self.posX, self.posY), self.radius)

  def startMoving(self):
    self.dx = 15
    self.dy = 5

  def move(self):
    self.posX += self.dx
    self.posY += self.dy

以下是我将如何更改此代码 - 你必须看看它是否有效,但我认为这是你的意图。 我添加的评论解释了我的变化。 我这样做是为了让球的所有运动和绘制代码,以及用于绘制球拍的代码,始终运行,无论用户是否按下键或生成其他类型的事件。

# -start of application loop-
while not x:
  # -start of event loop- 
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      x = True
    if event.type == pygame.KEYUP:
      if event.key == pygame.K_RETURN:
        gameScreen()
        ball.startMoving()
        start = True

    # only move the paddle if the game is running and the user pressed a key:
    if start == True:
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
          p1Paddle.state = 'up'
          p1Paddle.move()

      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_s:
          p1Paddle.state = 'down'
          p1Paddle.move()

      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
          p2Paddle.state = 'up'
          p2Paddle.move()

      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_DOWN:
          p2Paddle.state = 'down'
          p2Paddle.move()
      # -end of event loop-
    
    # Move and draw everything once per application loop,
    # regardless of if the event loop ran:
    if start == True:
      gameScreen()
      ball.move()
      ball.show()
      p1Paddle.border()
      p1Paddle.show()
      p2Paddle.border()
      p2Paddle.show()

    pygame.display.update()
    clock.tick(30)
    # -end of application loop-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM