代码之家  ›  专栏  ›  技术社区  ›  Redas Shuliakas

Libgdx拖放,如何同步光标和精灵/演员?

  •  1
  • Redas Shuliakas  · 技术社区  · 8 年前

    Gdx版本:1.9.8

    您好,我正在创建JRPG,我有一个带有拖放系统的清单,问题是,当我单击项目时,它的位置在左上角,远离光标(请参见屏幕截图),如何使精灵位于光标的中心(通常应该是怎样的)???

    SCREENSHOT!!!How it looks like

    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Target;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Source;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Payload;
    import com.redsoft.redrune.InventoryItem;
    
    public class InventorySlotTarget extends Target {
    
        InventorySlot _targetSlot;
    
        public InventorySlotTarget(InventorySlot actor) {
            super(actor);
            _targetSlot = actor;
        }
    
        @Override
        public boolean drag(Source source, Payload payload, float x, float y, int pointer) {
            return true;
        }
    
        @Override
        public void reset(Source source, Payload payload) {
        }
    
        @Override
        public void drop(Source source, Payload payload, float x, float y, int pointer) {
    
            InventoryItem sourceActor = (InventoryItem) payload.getDragActor();
            InventoryItem targetActor = _targetSlot.getTopInventoryItem();
            InventorySlot sourceSlot = ((InventorySlotSource) source).getSourceSlot();
    
            if (sourceActor == null) {
                return;
            }
    
            //First, does the slot accept the source item type?
            if (!_targetSlot.doesAcceptItemUseType(sourceActor.getItemUseType())) {
                //Put item back where it came from, slot doesn't accept item
                sourceSlot.add(sourceActor);
                return;
            }
    
            if (!_targetSlot.hasItem()) {
                _targetSlot.add(sourceActor);
            } else {
                //If the same item and stackable, add
                if (sourceActor.isSameItemType(targetActor) && sourceActor.isStackable()) {
                    _targetSlot.add(sourceActor);
                } else {
                    //If they aren't the same items or the items aren't stackable, then swap
                    InventorySlot.swapSlots(sourceSlot, _targetSlot, sourceActor);
                }
            }
    
        }
    }
    

    更新!

    import com.badlogic.gdx.scenes.scene2d.Actor;
    import com.badlogic.gdx.scenes.scene2d.InputEvent;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Source;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Payload;
    import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Target;
    
    public class InventorySlotSource extends Source {
    
        private DragAndDrop _dragAndDrop;
        private InventorySlot _sourceSlot;
    
        public InventorySlotSource(InventorySlot sourceSlot, DragAndDrop dragAndDrop) {
            super(sourceSlot.getTopInventoryItem());
            this._sourceSlot = sourceSlot;
            this._dragAndDrop = dragAndDrop;
        }
    
        @Override
        public Payload dragStart(InputEvent event, float x, float y, int pointer) {
            Payload payload = new Payload();
            Actor actor = getActor();
            if (actor == null) {
                return null;
            }
    
            InventorySlot source = (InventorySlot) actor.getParent();
            if (source == null) {
                return null;
            } else {
                _sourceSlot = source;
            }
    
            _sourceSlot.decrementItemCount(true);
    
            payload.setDragActor(getActor());
            _dragAndDrop.setDragActorPosition(-x, -y + getActor().getHeight());
    
            return payload;
        }
    
        @Override
        public void dragStop(InputEvent event, float x, float y, int pointer, Payload payload, Target target) {
            if (target == null) {
                _sourceSlot.add(payload.getDragActor());
            }
        }
    
        public InventorySlot getSourceSlot() {
            return _sourceSlot;
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Tenfour04    8 年前

    这是在DragAndDrop对象中设置的。默认位置假定您希望演员的右下角与光标对齐。您可以这样居中:

    dragAndDrop.setDragActorPosition(dragActor.getWidth() / 2, -dragActor.getHeight() / 2);
    

    设置drag actor后只需调用一次。我认为方法名称有误导性(应该说偏移量而不是位置)。