2015-12-09 26 views
5

Oyunum için bir envanter sistemi kurdum. Ekran tıklandığında, MousePressedEvent, oyundaki tüm layers içinden, EventListener (My EventListener) öğemi alan tüm nesnelere geçirilir. EventListener sınıfı iyi çalışıyor ve aşağıda gösterildiği gibi kullanarak, envanterimi almayı başardım, böylece öğeleri bir yuvadan kaldırabilir ve geri koyabilirsiniz. Bununla birlikte yapmak istediklerim, bunları içeren herhangi bir slottan çıkartabilmeleri ve bunları slotların herhangi bir yerine yerleştirebilmeleridir (hedef slot boş olduğu sürece). Buna izin verdiğimi düşündüm, çünkü if bildirimde olduğu gibi, eğer yuva seçiliyse, onu hiçbir zaman yuvaya ekleyemem. Ama bu aslında işe yaramıyor. Herhangi bir fikir? Slot.java sınıftaJava: Envanterimde bırakma eylemine izin veriliyor mu?

Kodu: Sözde kodda

public boolean onMousePressed(MousePressedEvent e) { 
    Point p = new Point(Mouse.getX(), Mouse.getY()); 
    if (!this.getBounds().contains(p)) return false; 
    boolean left = (e.getButton() == MouseEvent.BUTTON1); 
    boolean right = (e.getButton() == MouseEvent.BUTTON3); 
    boolean hasItems = (items.size() > 0); 
    if (this.getBounds().contains(p)){ 
     if (right && !selected && hasItems){ 
      select(true); 
      s = new Slot(new Vector2i(Mouse.getX(), Mouse.getY())); 
      addComponent(s); 
      s.add(items.get(0)); 
      remove(items.get(items.size() - 1)); 
     } else if (right && selected){ 
      s.add(items.get(0)); 
      remove(items.get(items.size() - 1)); 
      if (items.size() == 0) { 
       setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png")); 
       selected = false; 
       return true; 
      } 
      return true; 
     } else if ((left || right) && s==null) { 
      return true; 
     } else if (left && s != null){ //If left clicked, add to the slot from s regardless of if we are selected. 
      add(s.getItems().get(0)); 
      s.remove(s.getItems().get(s.getItems().size() - 1)); 
      if (s.getItems().size() == 0){ 
       s.setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png")); 
       removeComponent(s); 
       s = null; 
       selected = false; 
       return true; 
      } 
     } 
    } 
    return false; 
} 

: Her else if açıklamada baskı hatlarında ekleyerek

+1

Bu kodun açıklamayla nasıl ilişkili olduğunu göremiyorum. Kodu asgari bir örnekle kapatabilir ve ne yaptığını ve liste ve döngüler ile ifs ve benzeri gibi programlama terimlerinde ne yapmadığına dair bir açıklama verebilir misiniz? Oyununuzun kavramları kod için gerçekten alakalı değildir. – zapl

+1

@zapl daha iyi? Şeyler açıklığa kavuşturmak için bir sözde kod sürümü ekledim –

+1

Sözde kodunuzun hangi bölümünün beklediğiniz gibi çalışmadığını belirtebilir misiniz? Bir çok kenar durumu var .... –

cevap

2

:)

If (Mouse is clicked) : 
    if (the mouse isn't the bounds of the slot) return false (alert we haven't handled the event) 
    if (we contain the mouse cursor) : 
    if (right is pressed and we aren't selected) : 
     select 
     create a temporary slot at the mouse location 
     remove item from this slot 
     add it to the temporary slot 
     return true 
    else if (right is pressed and we are selected) : 
     add item to temporary slot 
     remove item from selected slot 
     return true 
    else if (we press left or right while temporary slot is null) : 
     return true (tell the dispatcher we have handled the event) 
    //This following else if statement is supposed to add an item to a clicked slot whether that slot is selected or not, but doesn't work 
    else if (left is pressed and temporary slot isn't null) : 
     add the item to the clicked slot 
     remove it from the temporary one 
     return true 
    return false if none of the above applies 

sayesinde ben çalıştığınızda bulundu Geçici yuvadan başka bir yuvaya bir öğe eklemek için geçici aralık boştur. Bunun nedeni, geçici yuva oluşturulduğunda, ilk kez seçtiğiniz yuva örneğiyle yaratıldığından, ekleme yapmaya çalıştığınız öğenin geçici yuvaya erişimi yoktur. Bunu aşmak için temp yuvasını, statik hale getirerek, örnek başına değişken olarak taşıdım. Kod şimdi iyi çalışıyor