2017-01-31 15 views
-1

У меня есть следующий дублирующий код в mainloop для клавиш направления, WASD в приложении pygame, которое я пытаюсь повторить. Мне сложно найти лучший способ. У меня есть экземпляры, созданные из класса PLAYER p класса GAME g и класса WORLD w.Python pygame рефакторинг ... обертывание кода в метод

В идеале я хочу сделать способ в классе GAME, который называется updatePositions. Основная проблема, с которой я столкнулся, состоит в том, что я должен - = или + =, и мне трудно это сделать, не записывая целую инструкцию if для отдельного ключа WASD. Там должен быть лучший путь.

 if event.key == pygame.K_w: 
      p.fov.y -= g.pixelUpdate 
      for ent in w.entityList: 
      ent.rect.y += g.pixelUpdate 
      ent.collisionRect.y += g.pixelUpdate 
      for ent in w.ents_in_fov: 
      if p.collision(ent): 
       p.collided = True 
       for ent in w.entityList: 
       ent.rect.y -= g.pixelUpdate 
       ent.collisionRect.y -= g.pixelUpdate 
       p.fov.y += g.pixelUpdate 

     elif event.key == pygame.K_d: 
      p.fov.x += g.pixelUpdate 
      for ent in w.entityList: 
      ent.rect.x -= g.pixelUpdate 
      ent.collisionRect.x -= g.pixelUpdate 
      for ent in w.ents_in_fov: 
      if p.collision(ent): 
       p.collided = True 
       for ent in w.entityList: 
       ent.rect.x += g.pixelUpdate 
       ent.collisionRect.x += g.pixelUpdate 
       p.fov.x -= g.pixelUpdate 

     elif event.key == pygame.K_s: 
      p.fov.y += g.pixelUpdate 
      for ent in w.entityList: 
      ent.rect.y -= g.pixelUpdate 
      ent.collisionRect.y -= g.pixelUpdate 
      for ent in w.ents_in_fov: 
      if p.collision(ent): 
       p.collided = True 
       for ent in w.entityList: 
       ent.rect.y += g.pixelUpdate 
       ent.collisionRect.y += g.pixelUpdate 
       p.fov.y -= g.pixelUpdate 

     elif event.key == pygame.K_a: 
      p.fov.x -= g.pixelUpdate 
      for ent in w.entityList: 
      ent.rect.x += g.pixelUpdate 
      ent.collisionRect.x += g.pixelUpdate 
      for ent in w.ents_in_fov: 
      if p.collision(ent): 
       p.collided = True 
       for ent in w.entityList: 
       ent.rect.x -= g.pixelUpdate 
       ent.collisionRect.x -= g.pixelUpdate 
       p.fov.x += g.pixelUpdate 
+0

C'mon помочь нуб, смотрите на все этот ужасный повторяющийся код – zzoop

+0

hint: вместо 'a - = b' вы можете использовать' a + = -b', чтобы вы могли создать одну функцию с помощью 'a + = x' и выполнить ее с помощью' x = b' или с ' x = -b' – furas

ответ

0

подсказка 1: вместо a -= b вы можете использовать a += -b

подсказка 2: вы можете использовать значение по 0

p.fov.x += 0 
p.fov.y += g.pixelUpdate 

p.fov.x += g.pixelUpdate 
p.fov.y += 0 

Таким образом, вы можете создать updatePositions(x, y) и выполнить, как

if event.key == pygame.K_w: 
    updatePositions(0, -g.pixelUpdate) 

elif event.key == pygame.K_s 
    updatePositions(0, g.pixelUpdate) 

elif event.key == pygame.K_d: 
    updatePositions(g.pixelUpdate, 0) 

elif event.key == pygame.K_a: 
    updatePositions(-g.pixelUpdate, 0) 

EDIT: что-то вроде этого:

def updatePositions(x, y):  
     p.fov.x += x 
     p.fov.y += y 

     for ent in w.entityList: 
     ent.rect.x -= x 
     ent.rect.y -= y 
     ent.collisionRect.x -= x 
     ent.collisionRect.x -= y 

     for ent in w.ents_in_fov: 
     if p.collision(ent): 
      p.collided = True 
      for ent in w.entityList: 
      ent.rect.x += x 
      ent.rect.y += y 
      ent.collisionRect.x += x 
      ent.collisionRect.y += y 
      p.fov.x -= x 
      p.fov.y -= y 

КСТАТИ: может потребоваться updatePositions(x, y, p, w), чтобы получить доступ к p и w

+0

Это прекрасно, это именно то, что мне нужно. Я не знал, что могу сделать «x + = -1» таким же, как «x - = 1». Это красиво. И он превратился в массивный свет в моей голове. Спасибо! – zzoop