2016-04-05 75 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))

对不起首都,是在工作和张贴在糟糕的片剂。