首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Konva js中的拖放限制

Konva js中的拖放限制
EN

Stack Overflow用户
提问于 2017-04-05 03:29:55
回答 2查看 1.2K关注 0票数 0

我最近开始学习Konva-JS...请帮帮我:)

代码语言:javascript
复制
<script>
    var width = window.innerWidth;
    var height = window.innerHeight;
    function loadImages(sources, callback) {
        var assetDir = '/assets/';
        var images = {};
        var loadedImages = 0;
        var numImages = 0;
        for(var src in sources) {
            numImages++;
        }
        for(var src in sources) {
            images[src] = new Image();
            images[src].onload = function() {
                if(++loadedImages >= numImages) {
                    callback(images);
                }
            };
            images[src].src = assetDir + sources[src];
        }
    }
    function isNearOutline(animal, outline) {
        var a = animal;
        var o = outline;
        var ax = a.getX();
        var ay = a.getY();
        if(ax > o.x - 20 && ax < o.x + 20 && ay > o.y - 20 && ay < o.y + 20) {
            return true;
        }
        else {
            return false;
        }
    }
    function drawBackground(background, beachImg, text) {
        var context = background.getContext();
        context.drawImage(beachImg, 0, 0);
        context.setAttr('font', '20pt Calibri');
        context.setAttr('textAlign', 'center');
        context.setAttr('fillStyle', 'white');
        context.fillText(text, background.getStage().getWidth() / 2, 40);
    }
    function initStage(images) {
        var stage = new Konva.Stage({
            container: 'container',
            width: 578,
            height: 530
        });
        var background = new Konva.Layer();
        var animalLayer = new Konva.Layer();
        var animalShapes = [];
        var score = 0;
        // image positions
        var animals = {
            snake: {
                x: 10,
                y: 70
            },
            giraffe: {
                x: 90,
                y: 70
            },
            monkey: {
                x: 275,
                y: 70
            },
            lion: {
                x: 400,
                y: 70
            }
        };
        var outlines = {
            snake_black: {
                x: 275,
                y: 350
            },
            giraffe_black: {
                x: 390,
                y: 250
            },
            monkey_black: {
                x: 300,
                y: 420
            },
            lion_black: {
                x: 100,
                y: 390
            }
        };
        // create draggable animals
        for(var key in animals) {
            // anonymous function to induce scope
            (function() {
                var privKey = key;
                var anim = animals[key];
                var animal = new Konva.Image({
                    image: images[key],
                    x: anim.x,
                    y: anim.y,
                    draggable: true
                });
                animal.on('dragstart', function() {
                    this.moveToTop();
                    animalLayer.draw();
                });
                /*
                       * check if animal is in the right spot and
                       * snap into place if it is
                       */
                animal.on('dragend', function() {
                    var outline = outlines[privKey + '_black'];
                    if(!animal.inRightPlace && isNearOutline(animal, outline)) {
                        animal.position({
                            x : outline.x,
                            y : outline.y
                        });
                        animalLayer.draw();
                        animal.inRightPlace = true;
                        if(++score >= 4) {
                            var text = 'You win! Enjoy your booty!';
                            drawBackground(background, images.beach, text);
                        }
                        // disable drag and drop
                        setTimeout(function() {
                            animal.draggable(false);
                        }, 50);
                    }
                });
                // make animal glow on mouseover
                animal.on('mouseover', function() {
                    animal.image(images[privKey + '_glow']);
                    animalLayer.draw();
                    document.body.style.cursor = 'pointer';
                });
                // return animal on mouseout
                animal.on('mouseout', function() {
                    animal.image(images[privKey]);
                    animalLayer.draw();
                    document.body.style.cursor = 'default';
                });
                animal.on('dragmove', function() {
                    document.body.style.cursor = 'pointer';
                });
                animalLayer.add(animal);
                animalShapes.push(animal);
            })();
        }
        // create animal outlines
        for(var key in outlines) {
            // anonymous function to induce scope
            (function() {
                var imageObj = images[key];
                var out = outlines[key];
                var outline = new Konva.Image({
                    image: imageObj,
                    x: out.x,
                    y: out.y
                });
                animalLayer.add(outline);
            })();
        }
        stage.add(background);
        stage.add(animalLayer);
        drawBackground(background, images.beach, 'Ahoy! Put the animals on the beach!');
    }
    var sources = {
        beach: 'beach.png',
        snake: 'snake.png',
        snake_glow: 'snake-glow.png',
        snake_black: 'snake-black.png',
        lion: 'lion.png',
        lion_glow: 'lion-glow.png',
        lion_black: 'lion-black.png',
        monkey: 'monkey.png',
        monkey_glow: 'monkey-glow.png',
        monkey_black: 'monkey-black.png',
        giraffe: 'giraffe.png',
        giraffe_glow: 'giraffe-glow.png',
        giraffe_black: 'giraffe-black.png'
    };
    loadImages(sources, initStage);
  </script>

正如我们在这个例子Animals_on_the_Beach_Game中看到的,动物的图像是可拖动的,可以被拖放到任何地方……但我想要改变它的方式,它可以只落在特定的地方…我能做些什么?谢谢您:)

EN

回答 2

Stack Overflow用户

发布于 2017-09-10 09:50:18

这更多的是一个设计问题,因为松开鼠标按钮不是你可以阻止的。将图像附加到鼠标位置也是不直观的,因为您将需要一个新的鼠标事件来与放置它相关联。我对拖放UI所做的是(1)销毁被拖放的形状,或者(2)将形状动画恢复(即捕捉回)到其原始位置。或者,您可以(3)找到最接近的可能有效的放置目标,并捕捉到该位置。

票数 0
EN

Stack Overflow用户

发布于 2019-06-08 00:20:44

首先,您定义了lionOrigin,您可能已经定义了它。

您必须实现对被拖动对象的dragend事件的调用,因此我们假设是lion。你必须检查狮子相对于最终期望位置的位置,我们称之为lionDestiny。这可以通过一个简单的不对称来完成:计算到点之间的距离。我们使用distanceA2B()函数来完成此操作。

现在,您可以在其中建立一个足够接近对象的offset,因为它已足够接近。如果未达到最小偏移量,则将lion放回lionOrigin上。

最后,在konvajs中,您可以使用.x().y()轻松获取或设置lion的位置。

如下所示:

代码语言:javascript
复制
var lionOrigin = [50,50];
var lionDestiny = [200,200];
var offset = 20;

distanceA2B(a,b) {
  return Math.sqrt( ((a[0]-b[0])*(a[0]-b[0])) + ((a[1]-b[1])*(a[1]-b[1])) );
}

lion.on('dragend', (e) => {
  var d = distanceA2B([lion.x(),lion.y()],lionDestiny);
  if(d<offset){
    lion.x(lionDestiny[0]);
    lion.y(lionDestiny[1]);
  }else{
    lion.x(lionOrigin[0]);
    lion.y(lionOrigin[1]);
  }
});

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43216050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档