2015-12-09 7 views
5

私のゲームでは在庫システムを実装しました。画面がクリックされると、MousePressedEventはゲーム内のすべてlayersを継承し、EventListener(My EventListener)のすべてのオブジェクトに渡されます。 EventListenerクラスは正常に動作し、以下に示すように使用して、在庫を取得してスロットからアイテムを取り出して戻すことができます。しかし、私がしたいのは、アイテムを含むスロットから取り出して、他のスロットに配置することです(ターゲットスロットが空である限り)。 ifステートメントのように、スロットが選択されているかどうかに関係なく、スロットにそれを追加するかどうかを確認していないので、私がこれを許可していたと思った。しかし、これは実際には機能しません。何か案は? Slot.javaクラスのJava:インベントリにドロップアクションを許可していますか?

コード:擬似コードで

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; 
} 

:各else if文で印刷ラインに追加することにより

+1

このコードが説明とどのように関係しているのかわかりません。コードを最小限の例に分けて、それが何をしているのか、それがリストやループ、ifなどのプログラミング用語で何をしていないのかを説明できますか?あなたのゲームのコンセプトは、コードと実際には関係ありません。 – zapl

+1

@zapl better?私は事を明確にするために擬似コードバージョンを追加しました –

+1

擬似コードのどの部分が期待通りに機能しないのかを指定できますか?エッジケースがたくさんあります.... –

答えて

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 

おかげで、私は私がしようとすることがわかりました一時的なスロットから別のスロットにアイテムを追加するには、一時的なスロットはヌルです。これは、一時スロットが作成されると、最初に選択したスロットのインスタンスによって作成されるため、追加しようとしているスロットが一時スロットにアクセスできないためです。これを回避するために、私はtempスロットを静的にすることでインスタンス単位の変数として移動しました。コードが正常に動作するようになりました

関連する問題