Javascript 随机点

Javascript 随机点,javascript,paperjs,Javascript,Paperjs,我有这个密码。我想要代码做的是使球移动,当球越过一个灰色点(洞)时,它回到起点。我已经为灰洞创建了一个随机的位置。我只需要找到一种方法来定义这些孔的位置,即使它们是随机的 var startPoint = new Path.Circle(new Point(40, 40), 40); startPoint.fillColor = "green"; //finishPoint var finishPoint = new Path.Circle(new Point(1300, 600), 40)

我有这个密码。我想要代码做的是使球移动,当球越过一个灰色点(洞)时,它回到起点。我已经为灰洞创建了一个随机的位置。我只需要找到一种方法来定义这些孔的位置,即使它们是随机的

var startPoint = new Path.Circle(new Point(40, 40), 40);
startPoint.fillColor = "green";

//finishPoint 
var finishPoint = new Path.Circle(new Point(1300, 600), 40);
finishPoint.fillColor = "red";

var ball = new Path.Circle(new Point(40, 40), 20);
ball.fillColor = "black";

//holes 
var path = new Path(new Point(20, 20), new Point(20, 23));
path.style = {
    strokeColor: 'grey',
    strokeWidth: 70,
    strokeCap: 'round'
};

var holes = new Symbol(path);

for (var i = 0; i < 10; i++) {
    var placement = view.size * Point.random();
    var placed = holes.place(placement);
}





var vector = new Point(0, 0);

function onFrame(event) {

    ball.position += vector / 100;
}
var moves = new Point(100, 1);

function onKeyDown(event) {
    if (event.key === "s") {
        vector.y += 10;
    }
    if (event.key === "d") {
        vector.x += 10;
    }
    if (event.key === "a") {
        vector.x -= 10;
    }
    if (event.key === "w") {
        vector.y -= 10;
    }

    var ballPlace = ball.position;
    if (ballPlace.isClose(finishPoint.position, 40) == true) {

        var text = new PointText(view.center);
        text.content = 'Congratulations';
        text.style = {
            fontFamily: 'Courier New',
            fontWeight: 'bold',
            fontSize: 100,
            fillColor: 'gold',
            justification: 'center'
        };
        ball.remove();
    }
if(ballPlace.isClose(placement.position, 40) == true) {
    ball = new Point(40, 40);
}
};
var startPoint=新路径圆(新点(40,40,40));
startPoint.fillColor=“绿色”;
//终点
var finishPoint=新路径圆(新点(1300600),40);
finishPoint.fillColor=“红色”;
var ball=新路径圆(新点(40,40,20));
ball.fillColor=“黑色”;
//洞
var路径=新路径(新点(20,20),新点(20,23));
path.style={
strokeColor:'灰色',
冲程宽度:70,
冲程盖:“圆形”
};
变量孔=新符号(路径);
对于(变量i=0;i<10;i++){
var placement=view.size*Point.random();
放置变量=孔。放置(放置);
}
var向量=新点(0,0);
函数onFrame(事件){
球位置+=向量/100;
}
var移动=新点(100,1);
函数onKeyDown(事件){
如果(event.key==“s”){
向量y+=10;
}
如果(event.key==“d”){
向量x+=10;
}
如果(event.key==“a”){
向量x-=10;
}
如果(event.key==“w”){
向量y-=10;
}
var ballPlace=球位置;
if(ballPlace.isClose(finishPoint.position,40)=真){
变量文本=新的点文本(view.center);
text.content='恭喜';
text.style={
fontFamily:“信使新”,
fontWeight:'粗体',
字体大小:100,
fillColor:“金色”,
理由:“中心”
};
球。移除();
}
if(ballPlace.isClose(placement.position,40)=true){
球=新点(40,40);
}
};

当球越过灰洞(var洞)时,我希望球回到点(40,40),但我无法让它工作。你知道怎么解决这个问题吗

@Luke Park关于使用数组的看法是正确的

通过确保每个新点与所有其他现有点保持一定距离,尝试每个新点。下面的示例(未缩放到view.size)

这是可能的无限循环,但如果你是人口稀少的地区,应该没有问题

iStoClose测试阵列p中的每个点,其中距离=sqrt(dxdx+dydy)。如果有多个点,可以通过测试原始dx和dy值是否小于测试半径来避免sqrt(),从而进行优化


您还可以在每个帧上使用类似的功能来测试碰撞。

您希望测试球相对于孔的位置,以查看球是否回到起始位置。我能想到的最简单的方法是创建一组孔,然后测试球在该组孔上的位置。在以下代码中,通过
onMouseMove
功能模拟球的位置,孔闪烁红色以指示球何时返回起始位置

var holes = [];
var hole;

for (var i = 0; i < 10; i++) {
    hole = new Path.Circle(view.size * Point.random(), 10);
    hole.fillColor = 'grey';
    holes.push(hole);
}

holes = new Group(holes);

onMouseMove = function(e) {
    if (holes.hitTest(e.point)) {
        holes.fillColor = 'red';
    } else {
        holes.fillColor = 'grey';
    }

为什么不将这些点存储在一个数组中?是的,我在想。但我知道这是一个非常简单的问题,但我对编码非常陌生。如何将其放入数组中?
var arr=[]
初始化一个新的空数组。然后
arr.push(obj)
将对象添加到数组中。如果你仍然不确定的话,也许值得多读一点。数组是非常基本的概念。谢谢。我知道阵列的结构,我只是一个初学者:PDid OP询问如何划分孔的位置?@bmacnouton我想是的,但我可能弄错了;o) “我只是需要找到一种方法来定义这些孔的位置,即使它们是随机的。”我解释为问题的“第1部分”,询问如何有意义地定位这些孔。第二部分是关于检测球何时越过一个洞。两者都可以减少到测试点之间的距离。我把它当作“洞在随机位置,所以我怎么知道它们在哪里?”以便检测球何时在它们上面。这个数组部分很有用,但我想测试球在洞上的位置,而不是鼠标悬停在上面。我对它做了一些修改,所以我希望当球的位置与洞的位置相同时,会弹出一个文本。当我这样做时,它只对一个孔有效。if(ballPlace.isClose(hole.position,30)=true){var text=new PointText(view.center);text.content='Game Over';…}ball.remove();}@内奥米,我没有意识到我提供的东西不够清楚。我不想复制你所有的代码,所以我只是做了它的本质。谢谢,你的回答很清楚:)我只是不知道如何应用你刚才给我看的第二部分。非常感谢你!我需要读一下hitTest,以前没见过。谢谢。如果这回答了你的问题,我将感谢你接受它。您可能希望使用
hitTest
isClose
,具体取决于您希望游戏如何运行<当球的中心在洞的圆内时,“代码>命中测试”将返回true。如果这不是你想要的,那么你可能需要做些别的事情。
var holes = [];
var hole;

for (var i = 0; i < 10; i++) {
    hole = new Path.Circle(view.size * Point.random(), 10);
    hole.fillColor = 'grey';
    holes.push(hole);
}

holes = new Group(holes);

onMouseMove = function(e) {
    if (holes.hitTest(e.point)) {
        holes.fillColor = 'red';
    } else {
        holes.fillColor = 'grey';
    }
onFrame = function(e) {
    ball.position += vector / 100;
    if (holes.hitTest(ball.position)) {
        // move the ball wherever you want to move it, position text,
        // etc. you might have to loop through the array to find which
        // hole was hit.
    }
}