2015-02-18 2 views
0

Я работаю над маленькой игрой python для школы, и у меня возникают проблемы с пониманием того, какой синтаксис использовать.Функция массива массива/проблемы с синтаксисом

def draw_detail_from_array(): 
    for y in new_map_array: 
     for x, _ in enumerate(y): 
      if y[x] == "v": 
       mapx = y[x].index 
       mapy=new_map_array[y].index 
       DISPLAYSURF.blit(pygame.image.load("grass1.png"), (32, 32)) 
       DISPLAYSURF.blit(pygame.image.load("grass1.png"), (mapx + 1) * 32, (mapy + 1) * 32) 

Так что у меня 2d массив и в то время как я цикл через него, если есть «v» Я хочу, чтобы поместить спрайт в том месте, которое соответствует расположению в массиве.

Проблема, с которой я сталкиваюсь, не может понять, как получить индекс от текущих x и y и использовать это, чтобы «разбить» спрайт на местоположение экрана (массив соответствует 20 на 15 сетка квадратов размером 32 x 32 пикселя.) Массив уже заполнен случайным образом «v», заменяя «_», который представляет пустое пространство.

Я попытался несколько различных методов на вершине этого, и я чувствую stuck.Everything Стараюсь из памяти дает мне ошибки как:

unsupported operand type(s) for +: 'builtin_function_or_method' and 'int' 

, так что я знаю, что я либо не используя правильные функции или синтаксис, или существует большая проблема, связанная со структурой моей функции. Я до сих пор относительно новичок в python, и это изматывает меня. Любая помощь будет принята с благодарностью.

+2

Что такое '.index'? свойство или функция –

+0

Это функция, я неправильно читаю сообщение в форуме, которое, как я думал, сказал, что получит индекс для элемента, и либо это не так, либо я использую его неправильно, я действительно не знаю. – Tom

ответ

0

Как насчет чего-то вроде этого:

def draw_detail_from_array(): 
    x, y = 0, 0 
    for row in new_map_array: 
     for col in row: 
      if col == "v": 
       DISPLAYSURF.blit(pygame.image.load("grass1.png"), (x, y)) 
      x += 32 
     y += 32 
     x = 0 

Обратите внимание, что вы не должны загружать изображение снова и снова; это серьезная проблема с производительностью. Просто загрузите его один раз и повторно используйте его.

+0

Большое вам спасибо! Это решило мою проблему, и я понимаю, как (что является отличным бонусом). Я планирую добавить метод «грязного прямоугольника», подробно описанный на сайте pygame, это то, о чем вы говорили? Или вы имеете в виду использование pygame.image.load не нужно? Если да, то какой будет альтернатива? – Tom

+0

Проблема в том, что каждый раз, когда вы вызываете 'pygame.image.load (" grass1.png ")', pygame загружает изображение с диска. Если в new_map_array всего 50 элементов 'v', это означает, что этот цикл загружает изображение 50 раз с диска. Лучше загрузите его один раз (например, 'grassimage = pygame.image.load (" grass1.png ")' и повторно использовать его (поэтому в этой функции используйте 'DISPLAYSURF.blit (трассировка, (x, y))'). – sloth

+0

Это действительно помогло мне заметно повысить производительность, спасибо еще раз! – Tom

0
mapx = y[x].index 
mapy=new_map_array[y].index 

Поскольку index здесь есть функция, которую вы должны назвать его как этот

mapx = y[x].index() 
mapy=new_map_array[y].index() 

Если оставить вне скобок, вместо результата функции вы зададите сама функцию к mapx и mapy, вызывая unsupported operand type(s) for +: 'builtin_function_or_method' and 'int'

+0

Спасибо, так что теперь я понимаю, как работает эта функция, но проблема все еще сохраняется, я думаю, что она лежит во всей моей структуре моей функции. – Tom

+0

@ То, что я не мог сказать, но это выходит за рамки этого вопроса в любом случае –

+0

Как так? Я спрашиваю, вообще ли мой метод неработоспособный, существуют ли разные способы решения этой проблемы? – Tom