2010-04-20 110 views
0

我剛剛開始學習pygame和livewires,我正在嘗試製作一個單人乒乓遊戲,在那裏你剛剛擊中球,它會反彈,直到它通過你的槳(位於屏幕的左側並由鼠標控制),這會讓你失去。我有基本的代碼,但球不停留在屏幕上,它只是閃爍,並不保持不變。此外,槳不隨鼠標移動。我確信我錯過了一些簡單的東西,但我無法弄清楚。請幫助!這是我有什麼:單人遊戲「乒乓」遊戲

from livewires import games 
import random 

games.init(screen_width=640, screen_height=480, fps=50) 

class Paddle(games.Sprite): 

    image=games.load_image("paddle.bmp") 

    def __init__(self, x=10): 
     super(Paddle, self).__init__(image=Paddle.image, 
            y=games.mouse.y, 
            left=10) 
     self.score=games.Text(value=0, size=25, top=5, right=games.screen.width - 10) 
     games.screen.add(self.score) 

    def update(self): 
     self.y=games.mouse.y 
     if self.top<0: 
      self.top=0 
     if self.bottom>games.screen.height: 
      self.bottom=games.screen.height 
     self.check_collide() 

    def check_collide(self): 
     for ball in self.overlapping_sprites: 
      self.score.value+=1 
      ball.handle_collide() 

class Ball(games.Sprite): 

    image=games.load_image("ball.bmp") 
    speed=5 

    def __init__(self, x=90, y=90): 
     super(Ball, self).__init__(image=Ball.image, 
            x=x, y=y, 
            dx=Ball.speed, dy=Ball.speed) 

    def update(self): 
     if self.right>games.screen.width: 
      self.dx=-self.dx 
     if self.bottom>games.screen.height or self.top<0: 
      self.dy=-self.dy 
     if self.left<0: 
      self.end_game() 
      self.destroy() 

    def handle_collide(self): 
     self.dx=-self.dx 

    def end_game(self): 
     end_message=games.Message(value="Game Over", 
            size=90, 
            x=games.screen.width/2, 
            y=games.screen.height/2, 
            lifetime=250, 
            after_death=games.screen.quit) 
     games.screen.add(end_message) 



def main(): 

    background_image=games.load_image("background.bmp", transparent=False) 
    games.screen.background=background_image 

    paddle_image=games.load_image("paddle.bmp") 
    the_paddle=games.Sprite(image=paddle_image, 
          x=10, 
          y=games.mouse.y) 
    games.screen.add(the_paddle) 

    ball_image=games.load_image("ball.bmp") 
    the_ball=games.Sprite(image=ball_image, 
          x=630, 
          y=200, 
          dx=2, 
          dy=2) 
    games.screen.add(the_ball) 

    games.mouse.is_visible=False 

    games.screen.event_grab=True 

    games.screen.mainloop() 

main() 
+0

我沒有看到screen.flip在任何地方,但也許它在screen.mainloop? – 2010-04-20 20:17:38

+0

如果您使用雙緩衝,某些庫會爲您翻轉緩衝區。沒有太多,我不知道livewires是否是其中之一,但不打電話翻轉不是這裏的問題。果醬提到他的球是閃爍的。 – 2010-04-21 14:02:03

回答

1

我不能幫你,因爲你沒有在這裏發佈完整的代碼。至少,我沒有看到你在哪裏更新精靈的位置(self.x += self.dx某處?)並將繪圖更新爲屏幕。你也沒有在main()函數中使用你的類。

這就是說,我看到

def __init__(self, x=10): 

,你從來沒用過x變量在構造函數中。我也擔心。

考慮使用球拍和球類作爲雪碧,如下所示:

if __name__ == '__main__': 

    background_image = games.load_image("background.bmp", transparent=False) 
    games.screen.background = background_image 

    the_paddle = Puddle() 
    games.screen.add(the_paddle) 

    the_ball = Ball() 
    games.screen.add(the_ball) 

    games.mouse.is_visible = False 
    games.screen.event_grab = True 

    games.screen.mainloop() 

注意我冒昧,使你的代碼讀取更Python。然而,我從來沒有使用過livewires,所以我的代碼可能無法正常工作。但它應該指向你正確的方向。祝你好運!

1

你爲什麼使用livewires?你只能使用pygame進行pong遊戲。

import pygame 

pygame.init() 
screen = pygame.display.set_mode((640, 480)) # window size 
pygame.display.set_caption("Simple pong") # window title 

# this is a rect that contains the ball 
# at the beginning it is set in the center of the screen 
ball_rect = pygame.Rect((312, 232), (16, 16)) 
# speed of the ball (x, y) 
ball_speed = [4, 4] 

# this contains your paddle 
# vertically centered on the left side 
paddle_rect = pygame.Rect((8, 200), (8, 80)) 

# 1 point if you hit the ball 
# -5 point if you miss the ball 
score = 0 

# load the font for displaying the score 
font = pygame.font.Font(None, 30) 

# mainloop 
while True: 
    # event handler 
    for event in pygame.event.get(): 
     # quit event => close the game 
     if event.type == pygame.QUIT: 
      exit(0) 
     # control the paddle with the mouse 
     elif event.type == pygame.MOUSEMOTION: 
      paddle_rect.centery = event.pos[1] 
      # correct paddle position if it's going out of window 
      if paddle_rect.top < 0: 
       paddle_rect.top = 0 
      elif paddle_rect.bottom >= 480: 
       paddle_rect.bottom = 480 

    # this test if up or down keys are pressed 
    # if yes move the paddle 
    if pygame.key.get_pressed()[pygame.K_UP] and paddle_rect.top > 0: 
     paddle_rect.top -= 5 
    elif pygame.key.get_pressed()[pygame.K_DOWN] and paddle_rect.bottom < 480: 
     paddle_rect.top += 5 

    # update ball position 
    # this move the ball 
    ball_rect.left += ball_speed[0] 
    ball_rect.top += ball_speed[1] 

    # these two if block control if the ball is going out on the screen 
    # if it's going it reverse speed to simulate a bounce 
    if ball_rect.top <= 0 or ball_rect.bottom >= 480: 
     ball_speed[1] = -ball_speed[1] 

    if ball_rect.right >= 640: 
     ball_speed[0] = -ball_speed[0] 
    # this control if the ball touched the left side 
    elif ball_rect.left <= 0: 
     score -= 5 
     # reset the ball to the center 
     ball_rect = pygame.Rect((312, 232), (16, 16)) 

    # test if the ball is hit by the paddle 
    # if yes reverse speed and add a point 
    if paddle_rect.colliderect(ball_rect): 
     ball_speed[0] = -ball_speed[0] 
     score += 1 

    # clear screen 
    screen.fill((255, 255, 255)) 

    # draw the ball, the paddle and the score 
    pygame.draw.rect(screen, (0, 0, 0), paddle_rect) # paddle 
    pygame.draw.circle(screen, (0, 0, 0), ball_rect.center, ball_rect.width/2) # ball 
    score_text = font.render(str(score), True, (0, 0, 0)) 
    screen.blit(score_text, (320-font.size(str(score))[0]/2, 5)) # score 

    # update screen and wait 20 milliseconds 
    pygame.display.flip() 
    pygame.time.delay(20)