2015-08-22 3 views
0

Я не уверен, что это проблема с циклом for или позицией прямоугольника, но я установил точку останова и использовал отладочную ничью для рисования прямоугольников, и они выглядят как верный.Java for loop не работает полный цикл

public void onAction(String name, boolean value, float tpf) { 
    if(name.equals("ShowInventory")){ 
     if(!value){ 
      if(Statics.s_ShowInventory == true){ 
       Statics.s_ShowInventory = false; 
      }else{ 
       Statics.s_ShowInventory = true; 
      } 
     } 
    } 

    if(name.equals("RightClick") && Statics.s_ShowInventory == true){ 
     Vector2f mousePos = screen.getMouseXY(); 
     for(int i = 0; i < 40; i++) 
     { 
      if(Main.inventory.inventorySlots[i].rect.Contains(mousePos)){ 
       System.out.println(Main.inventory.inventorySlots[i].slotNumber); 
      } 
     } 
    } 
} 

Что происходит, единственный прямоугольник, который записывает на консоль, является самым первым. То, что я хочу сделать, - это каждый раз, когда правый щелчок является истинным, а логическое значение - true, просматривает список прямоугольников и выясняет, какой из них содержит mousePos. При щелчке по прямоугольнику на консоли появляется только «0», поэтому я знаю, что я не получаю никакого другого номера слота инвентаря.

Еще одна вещь, которая может случиться, состоит в том, что цикл может не работать полностью, что было бы проблемой в моем методе кликов.

public float x; 
public float y; 
public float width; 
public float height; 

public Rect(float x, float y, float width, float height){ 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 
} 

public boolean Contains(Vector2f pos){ 
    if(pos.x > x && pos.x < width && pos.y < height && pos.y > y){ 
     return true; 
    } 
    else 
     return false; 
} 


      Element e = createInventorySlot(i, x, y); 
      inventoryElements[i] = e; 
      inventorySlots[i] = new InventorySlot(i, 0, "empty", new Rect(inventoryElements[i].getPosition().x, inventoryElements[i].getPosition().y, iconSize, iconSize)); 
      e.setToolTipText(inventorySlots[i].itemName + " : " + inventorySlots[i].slotNumber + " : " + inventorySlots[i].quantity); 
    inventory.addChild(e); 
+0

Не совсем понятно, что вы просите - мне кажется, что если эти слоты инвентаря не перекрываются, вы должны только ожидать увидеть один напечатанный. – argentage

+0

Я спрашиваю, есть ли что-то, что выделяется, что даст мне проблему только чтения элемента [0] при нажатии? Если я нажму на любой другой инвентарь, в Консоли ничего не отображается. – huehuehuehuehue

+0

Что я должен использовать вместо этого? У меня есть позиция мыши Vector2 и массив прямоугольников, чтобы проверить, какой прямоугольник содержит мышь. – huehuehuehuehue

ответ

1

Петля для петли полностью завершена. Попробуйте распечатать статус оператора if в каждом цикле.

for(int i = 0; i < 40; i++) 
    { 
    // if(Main.inventory.inventorySlots[i].rect.Contains(mousePos)){ 
    //  System.out.println(Main.inventory.inventorySlots[i].slotNumber); 
    // } 

      System.out.println(Main.inventory.inventorySlots[i].rect.Contains(mousePos)); 
    } 

Возможно, что-то не так с «.Contains», а не с циклом for. Ваши «.Contains» могут тестироваться только в первом слоте. Это объясняет, почему он работает только один раз, если мышь находится в первом слоте. Также попробуйте распечатать список слотов самостоятельно, чтобы убедиться, что у вас нет 40 копий первого слота.

+0

Слоты - это копии другого класса, называемого элементом, и класс элемента не содержит класс Rectangle, поэтому я создал его для использования метода Contains для позиции мыши. Тем не менее, я сделаю это. – huehuehuehuehue

+0

Отредактировано для включения класса Rect. Используя ваш метод, доказал, что Contains возвращал false во всех экземплярах. – huehuehuehuehue

+0

попробуйте распечатать pos.x и pos.y и для переключателя try теста значения y и < and > знаков – Zanilen