2012-06-29 93 views
1

我會盡量重構我的問題作爲一個更簡潔和具體的問題。下面是一對夫婦更多打印指令到終端,我試圖用理清什麼錯誤的英雄職業:Pygame雪碧運動,未能更新

代碼:

class Hero(pygame.sprite.Sprite): 
    """Moves the hero around the screen, following the mouse""" 
    #male = load_image("malehero-64.png", -1) 
    #female = load_image("girlhero-64.png", -1) 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("girlhero-64.png", -1) 
     self.rect = self.image.get_rect() 
     self.rect.topleft = (384,0) 
     self.target = self.movetarget() 

    #def setgender(self, gender): 
     #if gender == "male": 
      #self.image, self.rect = self.male 
     #if gender == "female": 
      #self.image, self.rect = self.female 
     #self.startingpos = (480, 640) 
     #self.rect.topleft = (480,640) 
     #self.target = self.rect.topleft 

    def movetarget(self): 
     self.pos = pygame.mouse.get_pos() 
     self.rect = self.image.get_rect() 
     self.target = self.rect.topleft 
     self.targetx,self.targety = self.target 
     self.oldx, self.oldy = self.rect.topleft 
     if self.oldx + tilesize < self.pos[0]: 
      self.targetx = self.oldx + tilesize 
     if self.oldx > self.pos[0]: 
      self.targetx = self.oldx - tilesize 
     if self.oldx + tilesize >= self.pos[0] and self.oldx < self.pos[0]: 
      self.targetx = self.oldx 
     if self.oldy + tilesize < self.pos[1]: 
      self.targety = self.oldy + tilesize 
     if self.oldy > self.pos[1]: 
      self.targety = self.oldy - tilesize 
     if self.oldy + tilesize >= self.pos[1] and self.oldy < self.pos[1]: 
      self.targety = self.oldy 
     self.target = (self.targetx,self.targety) 
     print("NOW THE TARGET IS SET!!!!!!!!") 
     print(self.targetx,self.targety) 
     return self.target 

    def update(self): 
     "Move the hero closer to the last mouse position clicked self.target" 
     self.rect = self.image.get_rect() 
     print("topleft before") 
     print(self.rect.topleft) 
     self.xmove = 0 
     self.ymove = 0 
     print("update target is") 
     print(self.target) 
     if self.rect.topleft[0] > 960: 
      self.rect.topleft = (960, self.rect.topleft[1]) 
     if self.rect.topleft[0] < 0: 
      self.rect.topleft = (0, self.rect.topleft[1]) 
     if self.rect.topleft[0] >= 0 and self.rect.topleft[0] <= 960: 
      if self.rect.topleft[0] < self.target[0]: 
       self.xmove = 4 
      if self.rect.topleft[1] < self.target[1]: 
       self.ymove = 4 
      if self.rect.topleft[0] > self.target[0]: 
       self.xmove = -4 
      if self.rect.topleft[1] > self.target[1]: 
       self.ymove = -4 
     self.newx=self.rect.topleft[0]+self.xmove 
     self.newy=self.rect.topleft[1]+self.ymove 
     print("newx and newy") 
     print (self.newx,self.newy) 
     self.rect.topleft = (self.newx,self.newy) 
     print("topleft after") 
     print(self.rect.topleft) 

運行時,將終端的片斷是如下:

代碼:

NOW THE TARGET IS SET!!!!!!!! 
64 64 
NOW THE TARGET IS SET!!!!!!!! 
64 64 
NOW THE TARGET IS SET!!!!!!!! 
64 64 
NOW THE TARGET IS SET!!!!!!!! 
64 64 
topleft before 
(0, 0) 
update target is 
(0, 0) 
newx and newy 
0 0 
topleft after 
(0, 0) 
topleft before 
(0, 0) 
update target is 
(0, 0) 
newx and newy 
0 0 
topleft after 
(0, 0) 
topleft before 
(0, 0) 
update target is 
(0, 0) 
newx and newy 
0 0 
topleft after 
(0, 0) 

什麼,我試圖做到: 當單擊遊戲地圖上的鼠標,Hero.movetarget是CAL引導,並設置一個遠離當前矩形的移動目標。然後,當字符串組在組中的所有精靈上調用更新方法(這裏是正確的術語?)時,他們應該向該目標方塊移動幾個像素。

當更新方法只是簡單地將所有精靈移動到一個平鋪中時,我就有了這樣的精靈。我試圖改變它,讓精靈們滑過幾幀到他們新的目標磚塊,而不是簡單地在那裏跳躍。

當我讀到上面的終端打印輸出時,Hero.movetarget中設置的self.target變量與Hero.update開始處打印到終端的self.target不同。

我不明白爲什麼在Hero.movetarget中改變self.target不會改變Hero.update中的self.target。

請原諒我對問題措辭的任何無知,並預先感謝您提供的任何見解。

的load_image類是從Pygame的黑猩猩教程採取: 代碼: 代碼:

def load_image(name, colorkey=None): 
    fullname = os.path.join('data', name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error as message: 
     print ('Cannot load image:', name) 
     raise SystemExit(message) 
    image = image.convert() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 

調用英雄類別的節目,編輯什麼,我認爲是相關部分的主體

hero = Hero() 

charactersprites = pygame.sprite.Group((hero)) 

mathsterGroup = pygame.sprite.Group() 
mathster = Mathster((0, 0)) 
mathsterGroup.add((mathster)) 
charactersprites.add((mathster)) 
mathster = Mathster((128, 256)) 
mathsterGroup.add((mathster)) 
charactersprites.add((mathster)) 
mathster = Mathster((512, 320)) 
mathsterGroup.add((mathster)) 
charactersprites.add((mathster)) 

inventory = TextObject("Hit a mathster!", Font, (0,0,0), (1024,50)) 
charactersprites.add((inventory)) 
nextproblem = Input(x=825, color=(255,25,25), 

heroGroup = pygame.sprite.Group() 
heroGroup.add(hero) 

clock = pygame.time.Clock() 

while 1: 
    events1 = pygame.event.get() 

    for event in events1: 
     if event.type == pygame.QUIT: sys.exit() 

    if not menu: 
     for events in events1: 
      if event.type == MOUSEBUTTONDOWN: 
       mouseclick = 1 

     if not collisiontest and mouseclick: 
      for heros in charactersprites: 
       hero.movetarget() 
      for mathsters in mathsterGroup: 
       mathster.movetarget() 
      mouseclick = 0 
     screen.fill((50,100,200)) 
     gamebackground = GameMap() 
     if not mapdrawn: 
      levelmap = gamebackground.drawmap() 
      mapdrawn = 1 
     screen.blit(levelmap, (0,0)) 
     wallGroup.draw(screen) 
     nextproblem.update() 
     nextproblem.draw(screen) 
     charactersprites.update() 
     charactersprites.draw(screen) 
     screen.fill((50,100,200)) 
     screen.blit(menubackground, (0,0)) 
     menusprites.update() 
     menusprites.draw(screen) 


    pygame.display.flip() 
    clock.tick(120) 

在此先感謝任何看看並願意伸出援助之手的人。我一直在閱讀大量的教程來嘗試教育自己,但我一直無法找到我出錯的地方。

提高我的代碼的任何提示都是值得歡迎的,儘管修復我的不動的英雄是我的首要任務。

編輯來制定一個更具體的問題。

+0

我解決了這個問題,但我仍然不確定它爲什麼不起作用。 charactersprites.update和charactersprites.draw沒有更新和繪製所有組成員,因此我將精靈分成更小的組,並且它們更新並正確繪製。 –

回答

1

區塊ID的

我建議你使用一個元組(x,y)每個怪物/玩家的位置。保存爲瓦片偏移量而不是像素。

當您繪製時,將tile-id轉換爲像素。如果它在屏幕外,它會好的。

def id_to_screen(tile_id width=32, height=32): 
    """convert tile-coordinate to screen-coordinate (Pixels)""" 
    x,y = tile_id 
    x *= width 
    y *= height 
    return (x, y)   # unless you need: return pygame.Rect(x, y, width, height)  

您也需要相反的方法,它將鼠標位置轉換爲tile-id。

def screen_to_id(pos, width=32, height=32): 
    # converts screen pixel coordinate to world map tile offsets. 
    x = pos[0]/width 
    y = pos[1]/height 
    return (x, y) 

RECT

rect.topleft是其中精靈是blit的到左上。設置這個來移動精靈。 (眼下你設置targetx,並從self.rect閱讀。

self.rect.topleft = (384,0) 

    # or 
    self.rect.move_ip(384,0) 

刪除self.targetx,除非你正在使用它在地圖上瓦ID的位置,而不是像素。(如果你畫一個精靈,當它的矩形的屏幕之外,這很好)

一些提示:。

self.targetx = self.rect.topleft[0] 
    self.targety = self.rect.topleft[1] 

    # becomes 
    self.target = self.rect.topleft 
    # or 
    x,y = self.rect.topleft 
    # or 
    self.tilex, self.tiley = self.rect.topleft 

矩形虛擬屬性是有用的,請參閱:http://www.pygame.org/docs/ref/rect.html#pygame.Rect他們簡化邏輯/刪除一些數學

r.bottomleft = (20,30) 
    r.left = 500 

numpy的+實例項目

numpy的爲多維陣列(roguelike 2D地圖瓦片)是有用的。 示例爲地圖使用了一個numpy數組。 http://code.google.com/p/ninmonkey/source/browse/#hg%2Fexamples%2Fmaptiles_numpy%253Fstate%253Dclosed

運行main.py,按s切換滾動切片。

+0

我非常感謝這些提示。他們會很有幫助,但我仍然不明白我的問題的根源。我已經更具體地重述了我的問題;如果您可以添加任何其他見解,我將非常感激。 –