2013-11-15 3 views
0

프로그램을 실행할 때 웬일인지 내 baddie 이미지 (소행성)가 움직이지 않고 대상이 움직이지 않을 때마다 뒤틀리는 다. 각 움직임 코드 아래에 pygame.display.update()을 넣으려고 시도했지만 그냥 깜박입니다. 또한 목표물과 배드민턴에 대한 이동 코드의 위치를 ​​전환하여 목표 지연과 말더듬을 초래했습니다.움직일 때 이미지가 느려지고 뒤집습니다.

import pygame, sys, random 
pygame.init() 

def game(): 
    width = 800 
    height = 600 
    screen = pygame.display.set_mode((width,height)) 
    pygame.display.set_caption("Asteroid Dodger") 
    background = pygame.image.load("field_of_stars_full.jpg") 


    player = pygame.image.load("Silver_Surfer.png") 
    px = 350 
    py = 450 
    baddie = pygame.image.load("Asteroid.png") 
    baddiepos = baddie.get_rect() 
    target = pygame.image.load("Cosmic_Clump.png") 
    targetpos = [0,0] 

    gamespeed = 100 
    speed = [gamespeed*random.randint(1,3),gamespeed*random.randint(1,3)] 
    speed2 = [gamespeed*10,gamespeed*10] 
    clock = pygame.time.Clock() 
    movex = movey = 0 

    targetvisible = True 
    playervisible = True 

    font = pygame.font.Font(None,36) 

    score = 0 
    scoretext = font.render("Score: " + str(score), 2, (255,255,255)) 
    lives = 3 
    livestext = font.render("Lives: " + str(lives),2, (255,255,255)) 


    while True: 


     screen.blit(background, (0,0)) 
     screen.blit(player, (px,py)) 

     scoretext = font.render("Score: " + str(score), 2, (255,255,255)) 
     livestext = font.render("Lives: " + str(lives), 2, (255,255,255)) 
     screen.blit(scoretext, (20,20)) 
     screen.blit(livestext, (670,20)) 

     if targetvisible == True: 
      seconds = clock.tick()/1000.0 
      targetpos[0] += seconds*speed[0] 
      targetpos[1] += seconds*speed[1] 
      screen.blit(target, targetpos) 
     else: 
      screen.blit(target, targetpos) 



     if playervisible == True: 
      seconds = clock.tick()/1000.0 
      baddiepos[0] += seconds*speed2[0] 
      baddiepos[1] += seconds*speed2[1] 
      screen.blit(baddie, baddiepos) 
     else: 
      screen.blit(baddie, baddiepos) 

     pygame.display.update() 


     for event in pygame.event.get(): 
      if event.type == pygame.QUIT or event.type == pygame.K_ESCAPE: 
       pygame.quit() 

      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_RIGHT: 
         movex = 2 
       elif event.key == pygame.K_LEFT: 
         movex = -2 
         player = pygame.transform.flip(player, 1, 0) 
       elif event.key == pygame.K_DOWN: 
         movey = 2 
       elif event.key == pygame.K_UP: 
         movey = -2 

      elif event.type == pygame.KEYUP: 
       if event.key == pygame.K_RIGHT: 
         movex = 0 
       elif event.key == pygame.K_LEFT: 
         movex = 0 
         player = pygame.transform.flip(player, 1, 0) 
       elif event.key == pygame.K_DOWN: 
         movey = 0 
       elif event.key == pygame.K_UP: 
         movey = 0 
       elif event.key == pygame.K_ESCAPE: 
         pygame.quit() 

     px += movex 
     py += movey 

     if targetpos[0]+60 > width or targetpos[0]+15 < 0: 
      speed[0] = -speed[0]    
      targetpos[0] += seconds*speed[0] 

     if targetpos[1]+70 > height or targetpos[1]+30 < 0: 
      speed[1] = -speed[1] 
      targetpos[1] += seconds*speed[1] 

     if abs(targetpos[0]-px)<20 and abs(targetpos[1]-py)<20: 
      targetvisible = False 
      score += 10 
      targetpos[0] = random.randint(0,720) 
      targetpos[1] = random.randint(0,520) 
      screen.blit(target, (targetpos))   
      targetvisible = True 


     if baddiepos[0] > width or baddiepos[0] < 0: 
      speed2[0] = -speed2[0] 
      baddiepos[0] += seconds*speed2[0] 

     if baddiepos[1] > height or baddiepos[1] < 0: 
      speed2[1] = -speed2[1] 
      baddiepos[1] += seconds*speed2[1] 

     if abs(baddiepos[0]-px)<20 and (baddiepos[1]-py)<20: 
      playervisble = False 
      lives -= 1 
      baddiepos[0] = random.randint(0,720) 
      baddiepos[1] = random.randint(0,520) 
      screen.blit(baddie, (baddiepos)) 
      playervisible = True 

     if px > 800: 
      px = 0 
     elif px < 0: 
      px = 800 

     if py > 600: 
      py = 0 
     elif py < 0: 
      py = 600 
+0

왜 당신이 대답에서 찾을 수이 예제를 실행하려면 당신은'pygame.time.delay()'를 사용하지 않습니까? – adil

답변

0

baddieclock.tick() 위치에 따라 가변 second에 의존한다. pygame.clock.tick() 문서에서

:

그것은 밀리 초 이전 호출 경과 얼마나 많은 계산합니다 (clock.tick()).

따라서 0 - 0.001이지만 대부분 0입니다. 따라서 baddie은 대부분 이동하지 않습니다.

문서 :

이 방법은 프레임 당 한 번 호출해야합니다.

어쩌면 pygame.time.get_ticks()을 사용하려고했는데 왜 필요한지 알 수 없습니다.


코드는 다음과 같을 수 있습니다 :

import pygame 
import sys 
import random 

#---------------------------------------------------------------------- 

#~ PLAYER_IMAGE  = "ball2.png" 
#~ TARGET_IMAGE  = "ball3.png" 
#~ BADDIE_IMAGE  = "ball1.png" 
#~ BACKGROUND_IMAGE = "background.jpg" 

PLAYER_IMAGE  = "Silver_Surfer.png" 
TARGET_IMAGE  = "Cosmic_Clump.png" 
BADDIE_IMAGE  = "Asteroid.png" 
BACKGROUND_IMAGE = "field_of_stars_full.jpg" 

#---------------------------------------------------------------------- 

class Player(): 

    def __init__(self, screen_rect): 

     self.screen_rect = screen_rect 

     self.image = pygame.image.load(PLAYER_IMAGE) 
     self.rect = self.image.get_rect() 

     self.rect.centerx = 350 
     self.rect.centery = 450 

     self.move_x = self.move_y = 0 

     self.visible = True 

    def draw(self, screen): 
     screen.blit(self.image, self.rect.topleft) 

    def flip(self): 
     self.image = pygame.transform.flip(self.image, 1, 0) 

    def update(self): 
     self.rect.x += self.move_x 
     self.rect.y += self.move_y 

     if self.rect.centerx > self.screen_rect.right: 
      self.rect.centerx = self.screen_rect.left 
     elif self.rect.centerx < self.screen_rect.left: 
      self.rect.centerx = self.screen_rect.right 

     if self.rect.centery > self.screen_rect.bottom: 
      self.rect.centery = self.screen_rect.top 
     elif self.rect.centery < self.screen_rect.top: 
      self.rect.centery = self.screen_rect.bottom 

    def event_handler(self, event): 

     if event.type == pygame.KEYDOWN: 

      if event.key == pygame.K_RIGHT: 
       self.move_x = 5 
      elif event.key == pygame.K_LEFT: 
       self.move_x = -5 
       self.flip() 
      elif event.key == pygame.K_DOWN: 
       self.move_y = 5 
      elif event.key == pygame.K_UP: 
       self.move_y = -5 

     elif event.type == pygame.KEYUP: 

      if event.key in (pygame.K_RIGHT, pygame.K_LEFT): 
       self.move_x = 0 

      elif event.key in (pygame.K_DOWN, pygame.K_UP): 
       self.move_y = 0 

      if event.key == pygame.K_LEFT: 
       self.flip()  

    def random_position(self): 

     self.rect.centerx = random.randint(0,720) 
     self.rect.centery = random.randint(0,520)    
#---------------------------------------------------------------------- 

class Baddie(): 

    def __init__(self, screen_rect, speed): 

     self.screen_rect = screen_rect 

     self.image = pygame.image.load(BADDIE_IMAGE) 
     self.rect = self.image.get_rect() 

     self.speed_x = speed * random.randint(1,3) 
     self.speed_y = speed * random.randint(1,3) 

     self.visible = True 

    def draw(self, screen): 
     screen.blit(self.image, self.rect.topleft) 

    def update(self, player_visible): 

     if player_visible: 

      self.rect.x += self.speed_x * random.randint(1, 5) 
      self.rect.y += self.speed_y * random.randint(1, 5) 

      if self.rect.centerx > self.screen_rect.right: 
       self.rect.centerx = self.screen_rect.left 
      elif self.rect.centerx < self.screen_rect.left: 
       self.rect.centerx = self.screen_rect.right 

      if self.rect.centery > self.screen_rect.bottom: 
       self.rect.centery = self.screen_rect.top 
      elif self.rect.centery < self.screen_rect.top: 
       self.rect.centery = self.screen_rect.bottom 

    def random_position(self): 

     self.rect.centerx = random.randint(0,720) 
     self.rect.centery = random.randint(0,520) 

#---------------------------------------------------------------------- 

class Target(): 

    def __init__(self, screen_rect, speed): 

     self.screen_rect = screen_rect 

     self.image = pygame.image.load(TARGET_IMAGE) 
     self.rect = self.image.get_rect() 

     self.rect.centerx = 100 
     self.rect.centery = 100 

     self.speed_x = speed * 10 
     self.speed_y = speed * 10 

     self.visible = True 

    def draw(self, screen): 
     screen.blit(self.image, self.rect.topleft) 

    def update(self, screen): 

     if self.visible: 
      self.rect.x += self.speed_x 
      self.rect.y += self.speed_y 

      if self.rect.right > self.screen_rect.right or self.rect.left < 0: 
       self.speed_x = -self.speed_x    

      if self.rect.bottom > self.screen_rect.bottom or self.rect.top < 0: 
       self.speed_y = -self.speed_y 

    def random_position(self): 

     self.rect.centerx = random.randint(0,720) 
     self.rect.centery = random.randint(0,520) 

#---------------------------------------------------------------------- 

class Game(): 

    def __init__(self): 

     pygame.init() 

     width = 800 
     height = 600 

     self.screen = pygame.display.set_mode((width,height)) 
     pygame.display.set_caption("Asteroid Dodger") 

     # --- variables --- 

     self.score = 0 
     self.lives = 3 

     self.gamespeed = 1 

     self.font = pygame.font.Font(None,36) 

     self.scoretext = self.font.render("Score: " + str(self.score), 2, (255,255,255)) 
     self.livestext = self.font.render("Lives: " + str(self.lives), 2, (255,255,255)) 

     self.pausetext = self.font.render("PAUSE", 2, (255,255,255)) 
     # center pausetext on screen 
     self.pausetext_rect = self.pausetext.get_rect(center=self.screen.get_rect().center) 

     # --- sprites --- 

     self.background = pygame.image.load(BACKGROUND_IMAGE) 

     screen_rect = self.screen.get_rect() 

     self.player = Player(screen_rect) 

     self.baddie = Baddie(screen_rect, self.gamespeed) 

     self.target = Target(screen_rect, self.gamespeed) 

    #---------------------------------------- 

    def run(self): 

     clock = pygame.time.Clock() 

     RUNNING = True 
     PAUSED = False 

     while RUNNING: 

      # --- events --- 

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

       elif event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_ESCAPE: 
         RUNNING = False 
        elif event.key == pygame.K_SPACE: 
         PAUSED = not PAUSED 

       self.player.event_handler(event) 

      # --- updates --- 

      if not PAUSED: 
       self.player.update() 
       self.baddie.update(self.player.visible) 
       self.target.update(self.player.visible) 

       # detect cilision 
       if pygame.sprite.collide_rect(self.player, self.baddie): 
        self.lives -= 1 
        self.player.random_position() 

       if pygame.sprite.collide_rect(self.player, self.target): 
        self.score += 10 
        self.target.random_position() 

       self.scoretext = self.font.render("Score: " + str(self.score), 2, (255,255,255)) 
       self.livestext = self.font.render("Lives: " + str(self.lives), 2, (255,255,255)) 

      # --- draws --- 

      self.screen.blit(self.background, (0,0)) 

      self.player.draw(self.screen) 
      self.baddie.draw(self.screen) 
      self.target.draw(self.screen) 

      self.screen.blit(self.scoretext, (20,20)) 
      self.screen.blit(self.livestext, (670,20)) 


      if PAUSED: 
       self.screen.blit(self.pausetext, self.pausetext_rect) 

      pygame.display.update() 

      # --- FPS --- 

      clock.tick(25) # 25 Frames Per Second 

     # --- the end --- 

     pygame.quit() 

#---------------------------------------------------------------------- 

Game().run() 

추신. 누군가가 이미지 'ball1.png', 'ball2.png'을 필요로하는 경우, 'ball3.png는'

관련 문제