2015-01-28 2 views
1

Я не знаю, как создать новые спрайты щелчком мыши и добавить движение ко всем новым спрайтам.sprite не движется вниз

Я создал простую игру:

  • Алмазная: двигаться влево/вправо с K_LEFT, K_RIGHT
  • Pad: движение влево/вправо с помощью мыши

Если щелкнуть мышью вас добавьте сердца и нарисуйте спрайт heart0, heart1 и т. д. согласно количеству щелчков мыши.

Если щелкнуть мышью рисование спрайтов сердца, которое падает на месте, где алмаз и сердце должно двигаться вниз ...

ПРОБЛЕМЫ: сердца не двигаются вниз. Я не могу привлечь несколько сердец. На данный момент я могу только нарисовать сердце в месте, где диамон и приложить сердца.

Знаете ли вы, что не так с моим кодом, поэтому я не могу получить требуемую функциональность, пожалуйста?

import pygame, sys 
from pygame.locals import * 

pygame.init() 
pygame.mouse.set_visible(1) 
clock = pygame.time.Clock() 

screen_width = 640 
screen_height = 480 
screen = pygame.display.set_mode((screen_width, screen_height)) 

myfont = pygame.font.SysFont("Arial", 15) 

hearts = [] 
clicks = [] 

class HeartSprite(object): 

    def __init__(self, pozx, pozy): 

     self.image = pygame.image.load("heart.png") 
     self.posx = pozx 
     self.posy = pozy 
     self.rect = self.image.get_rect() 
     self.going_down = True 
     self.next_update_time = 0 

    def update(self, current_time, bottom): 
     if self.next_update_time < current_time: 
      ### bounce back 
      #if self.rect.bottom >= bottom - 1: 
      # self.going_down = False 
      ### kill it 
      if self.posy > screen_height: 
       del hearts[0] 
      elif self.posy <= 85: 
       self.going_down = True  
      if self.going_down: 
       self.posy += 2 
      else: 
       self.posy -= 2 
      self.next_update_time = current_time + 10 

    def draw(self, surface): 
     surface.blit(self.image, (self.posx, self.posy)) 

class Diamond(object): 
    def __init__(self): 
     self.image = pygame.image.load("diamond.png").convert() 
     self.rect = self.image.get_rect() 

    def handle_keys(self): 
     key = pygame.key.get_pressed() 
     dist = 3 
     if key[pygame.K_LEFT]: 
      self.rect[0] -= dist 
     elif key[pygame.K_RIGHT]: 
      self.rect[0] += dist 

    def draw(self, surface): 
     surface.blit(self.image, (self.rect[0], self.rect[1]+18)) 

class Pad(object): 
    def __init__(self): 
     self.image = pygame.image.load("pad.png") 
     self.rect = self.image.get_rect() 
     self.top = screen.get_height() - self.rect[1] 
     self.shoot_y = 0 
     self.shoot_x = 0 
    def draw(self, surface, posx, posy): 
     surface.blit(self.image, (posx, posy)) 

class DisplayText(object): 
    def __init__(self): 
     self.myfont = pygame.font.SysFont("Tahoma", 15) 
     self.heartsleft = 10 - len(hearts) 
     self.label = self.myfont.render("hearts left : %d" %  self.heartsleft, 1, (0,0,0)) 

    def draw(self, surface): 
     surface.blit(self.label, (3, 1)) 

def main(): 

    diamond = Diamond() 
    pad = Pad() 

    while True: 

     white = (255, 255, 255) 
     screen.fill(white) 
     time = pygame.time.get_ticks() 

     x, y = pygame.mouse.get_pos() 
     pad.draw(screen, x - pad.rect[2]/2, screen_height - pad.rect[2]/2) 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       sys.exit() 
      elif event.type == MOUSEBUTTONDOWN: 
       diamondy = diamond.rect[1]+18 
       diamondx = diamond.rect[0] 
       count = "clicks" 
       clicks.append(count) 
       myvar = len(clicks) 
       for i in range(myvar): 
        ii = "heart" + str(i) 
       hearts.append(ii) 

     for myfigure in hearts: 
      myfigure = HeartSprite(diamondx , diamondy) 
      myfigure.update(time, 480) 
      myfigure.draw(screen) 

     diamond.draw(screen) 
     diamond.handle_keys() 

     displaytext = DisplayText() 
     displaytext.draw(screen) 

     pygame.display.update()    
     clock.tick(100) 
    pygame.quit() 
main() 

ответ

1

Проблема заключается в этом цикле:

for myfigure in hearts: 
    myfigure = HeartSprite(diamondx , diamondy) 
    myfigure.update(time, 480) 
    myfigure.draw(screen) 

Остановить мгновение и подумать о том, что этот цикл действительно делает. Он создает новый экземпляр HeartSprite с diamondx и diamondy для каждого элемента в сердцах; каждый раз, когда цикл запущен.

То, что вы действительно хотите сделать, это создать HeartSprite экземпляры после нажатия кнопки на экране, и сохранить эти экземпляры в списке (так каждое сердце сохраняет свое состояние):

... 
     elif event.type == MOUSEBUTTONDOWN: 
      diamondy = diamond.rect[1]+18 
      diamondx = diamond.rect[0] 
      hearts.append(diamondx, diamondy) 
... 
    for myfigure in hearts: 
     myfigure.update(time, 480) 
     myfigure.draw(screen) 
... 

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

+0

спасибо. Ваш ответ помог мне двигаться вперед. Я подумаю больше о проблеме, прежде чем поместить код и попросить о помощи. – BlueTomato