2016-04-05 140 views
0

我是新來編程,我試圖創建一個基於2D瓷磚的遊戲。我已經設法將我的士兵在瓷磚上自由移動,但現在我想讓它在按鍵上按瓷磚移動。使圖像移動每個瓷磚pygame

我知道當我改變self.pos到self.x或self.y我可以在屏幕上

到目前爲止我的代碼自由移動的士兵:

#envoirment variables 
ice = 0 
forest = 1 
desert = 2 
swamp = 3 
water = 4 
island = 5 

#envoirement tiles 
tiles = { 
     ice : icetile, 
     forest : foresttile, 
     desert : deserttile, 
     swamp : swamptile, 
     water : watertile, 
     island : islandtile   
    } 

#tilemap 
tilemap = [ 
     [ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0], 
     [ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0], 
     [ 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4], 
     [ 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4], 
     [ 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4], 
     [ 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4], 
     [ 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1], 
     [ 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1] 
     ] 
class Soldier(object): 

     def __init__(self): 
     self.image = pygame.image.load("soldier.png") 
     self.x = 0 
     self.y = 0 
     self.hp = 1 
     self.ap = 1 
     self.price = 150 
     self.pos = [0, 0] 

    def keys(self): 
     key = pygame.key.get_pressed() 
     if key[pygame.K_DOWN]: 
      self.pos[1] += 1 
     if key[pygame.K_UP]: 
      self.pos[1] -= 1 
     if key[pygame.K_RIGHT]: 
      self.pos[0] += 1 
     if key[pygame.K_LEFT]: 
      self.pos[0] -= 1 

    def draw(self, surface): 
     surface.blit(self.image, (self.x, self.y)) 

def gameloop(): 

gamescreen = pygame.display.set_mode((mapwidth*tilesize, mapheight*tilesize)) 
gameloop = True 
soldier = Soldier() 
kasteel = Base() 


while gameloop: #Main game loop 
    for row in range(mapheight): 
     for column in range(mapwidth): 
      gamescreen.blit(tiles[tilemap[row][column]], (column*tilesize, row*tilesize)) 


    for event in pygame.event.get(): 
     pos = pygame.mouse.get_pos() 
     print(pos) 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      gameloop = False 

    soldier.keys() 
    kasteel.draw(gamescreen) 
    soldier.draw(gamescreen) 
    pygame.display.update() 
    clock.tick(40) 
pygame.quit() 

謝謝您的時間並幫助我

PS:歡迎任何書籍或網站的建議!

回答

0

您將要在此處執行的操作是跟蹤按下按鍵的第一幀,並在發生此情況時調用移動功能。這可以做如下:

def keys(self): 
     key = pygame.key.get_pressed() 
     if key[pygame.K_DOWN] and not self.prev_pressed[pygame.K_DOWN]: 
      self.row += 1 
     if key[pygame.K_UP] and not self.prev_pressed[pygame.K_UP]: 
      self.row -= 1 
     if key[pygame.K_LEFT] and not self.prev_pressed[pygame.K_LEFT]: 
      self.col -= 1 
     if key[pygame.K_RIGHT] and not self.prev_pressed[pygame.K_RIGHT]: 
      self.col += 1 

     self.prev_pressed[pygame.K_DOWN] = key[pygame.K_DOWN] 
     self.prev_pressed[pygame.K_UP] = key[pygame.K_UP] 
     self.prev_pressed[pygame.K_LEFT] = key[pygame.K_LEFT] 
     self.prev_pressed[pygame.K_RIGHT] = key[pygame.K_RIGHT] 

其中prev_pressed在建設初始化爲全是假的。代替存儲pos,xy而不是存儲rowcol作爲瓦片陣列中士兵的當前行和列。當需要打印時,將陣列中的圖塊映射到屏幕上的像素。例如,如果每個圖塊的寬度爲50像素且高度爲50像素,則某個圖塊的屏幕上的相應像素將爲50*row, 50*col

0

surface.blit(self.image,(self.POS [0] * tilesize,self.POS [1] * tilesize))

對不起首都,是在工作和張貼在糟糕的片劑。