2016-10-07 3 views
0

Первый раз что-то в pygame ... Я пытаюсь сгенерировать несколько экземпляров изображения, а затем прокручивать их снизу вверх. По какой-то причине оригинальные фотоснимки ставят, а другие воображают, как ожидалось. Я также пытаюсь создать экземпляры изображения в самой левой четверти экрана или в самой правой четверти. Мои изображения отображаются только слева. Моя игра - 1150x500 пикселей. Любые советы о том, как я могу исправить свой код, будем очень благодарны!blitting moving images in pygame

здесь метод я использую:

def gameHighScore(): 
    points=0 
    guesses=0 
    time=0 

    balloons= pygame.image.load("balloons.png") 

    objects=[] 

    for i in range (4): 
     xpos= random.randrange(0, round(display_width/4)) or random.randrange(round((3/4)*display_width), display_width) 
     #object generated at start height 400, random xpos with a speed -i*2 
     o=Balloons(balloons, 400, xpos ,-i*2)   
     objects.append(o) 


    gamehs=True 
    while gamehs: 
     for event in pygame.event.get(): 
      if event.type==pygame.QUIT: 
       pygame.quit() 
       quit() 
      if event.type==pygame.KEYDOWN: 
       if event.key==pygame.K_SPACE: # space for continue 
        paused=False 
        gameTimer.start() 
       elif event.key==pygame.K_q: #q for quit 
        pygame.quit() 
        quit() 



     for o in objects: 
      gameDisplay.fill(BLACK) 
      message_to_screen("HIGH SCORE", WHITE, y_displace=-100, size="large") 
      message_to_screen(" You scored " +str(points) +" points", WHITE, y_displace=0, size="medium") 
      message_to_screen("in " +str(time) +" after " +str(guesses) +" guesses", WHITE, y_displace=50, size="medium") 
      button("Play (space bar)", 300,400,250,50, GRAY, BLUE, action ="continue") 
      button("Quit (Q)", 600,400,250,50, GRAY, BLUE, action ="quit") 
     for o in objects: 
      o.move() 
      gameDisplay.blit(o.image, o.pos) 


     pygame.display.update() 
     clock.tick(30)    #static screen, no need for high fps 

А вот класс, который перемещает объекты:

class Balloons: 

    def __init__(self, image, height, xpos, speed): 
     self.speed=speed 
     self.image=image 
     self.xpos=xpos 
     self.pos=image.get_rect().move(xpos, height)    #momve(x,y) change x to random 

    def move(self): 
     self.pos=self.pos.move(0, self.speed) 
     if self.pos.top< -200: 
      self.pos.bottom=800 

ответ

1

Там в несколько вещей, здесь происходит.

В частности, есть несколько вещей неправильно с этой линией ...

xpos= random.randrange(0, round(display_width/4)) or random.randrange(round((3/4)*display_width), display_width) 

(3/4) оценивает НУЛЬ, потому что они являются целыми числами. Но большая проблема заключается в том, что вы используете or, что не делает то, что вы думаете, что оно делает. or будет принимать первое выражение слева и использовать его, если оно не является False. Поскольку это будет только False в случае выбора randrange 0, правая сторона никогда не будет оценена. Я хотел бы сделать что-то вроде этого ...

# pick a random position in a quarter-size of the screen. 
xpos = int(random.random() * display_width/4) 

# 50% chance of offsetting that position to the right quarter of the screen. 
if random.random() < .5: xpos += display_width * 3/4 

Относительно того, почему один из вашего изображения всегда остается на месте: вы назначаете скорость на основе for i in range(4). Значение i для одного из изображений равно 0, и поэтому скорость будет равна 0.

+1

'3/4' не оценивает значение 0, если это Python 3 (который, как я считаю, с тех пор, как класс не наследует от объект). Кроме того, не яснее ли делать if-else-statement? Тогда вам не нужно назначать значение дважды. Хотя, это может быть только вопрос мнения. Отличный ответ, +1 –