如何跟踪和存储当前最接近的类实例相对于另一个类实例的位置(再次...)

时间:2019-04-04 16:40:39

标签: javascript processing p5.js

在我的UFO射击游戏中,我希望玩家能够刺入最接近的UFO,以确保混乱和令人敬畏。大声笑。无论如何,我似乎无法弄清楚如何存储最接近的当前UFO(或在代码中称为 drone )...

这是游戏的所有功能和类。 (有点混乱,我知道,但我可能会在以后修改)

var score = 0;
var bullets = [];
var drones = [];

var keys = [];
keyPressed = function () {
    keys[keyCode]=true;
};
keyReleased = function () {
    keys[keyCode]=false;
};

var player = function (x,y) {
    this.x = 25;
    this.y = 440;
    this.w = 15;
    this.h = 20;

    this.xvel = 0;
    this.yvel = 0;

    this.accel = 0.2;
    this.frict = 0.08;

    this.isShooting = false;

    this.update = function () {
        this.leftGun = this.x-11-this.xvel;
        this.rightGun = this.x+20-this.xvel;
        if (this.isShooting) {
            this.gunsY = random(this.y,this.y+7);
        } else {
            this.gunsY = this.y+3;
        }

        if (keys[LEFT]) {
            this.xvel -= this.accel;
        }
        if (keys[RIGHT]) {
            this.xvel += this.accel;
        }
        if (keys[UP]) {
            this.yvel -= this.accel;
        }
        if (keys[DOWN]) {
            this.yvel += this.accel;
        }

        if (this.xvel > 0 || this.xvel < 0) {
            this.xvel -= this.xvel * this.frict;
        }
        if (this.yvel > 0 || this.yvel < 0) {
            this.yvel -= this.yvel * this.frict;
        }

        fill(255, 255, 255);
        //rect(this.x-this.w/2,this.y + 5,this.w,this.h);
        triangle(this.x,this.y+this.h-this.xvel+this.yvel,this.x+this.xvel+7,this.y,this.x+15,this.y+this.h+this.xvel+this.yvel);

        fill(0,0,255);
        //ellipse(this.x+7,this.y+14,7,7);
        rect(this.leftGun,this.gunsY,4,15);
        rect(this.rightGun,this.gunsY,4,15);

        this.x += this.xvel;
        this.y += this.yvel;
    };
};
var p1 = new player();



// verify status
var active = function(obj){
    return obj.x>0 && obj.y<height+100;
};
var bulletActive = function(blt){
    return blt.x>0 && blt.x < width && blt.y>0 && blt.y<height+20;
};

var droneArt = function(){
    var zz = this.z/2;
    var dam = map(this.h, 0, 100, 0, this.z);
    if (this.h<0){
         this.x = -100; 
         score+=(80-this.z);
         return;
    }
    fill(255, 0, 0);
    rect(this.x-zz, this.y-zz-10, this.z, 4);
    fill(0, 255, 0);
    rect(this.x-zz, this.y-zz-10, dam, 4);

    pushMatrix();
    translate(this.x,this.y);
    //rotate(r);

    fill(255, 255, 255);
    ellipse(0,0,this.z,this.z);

    fill(0, 0, 0);
    ellipse(0,0,this.z-this.z/1.8,this.z-this.z/1.8);

    for(var i = 0; i < 360; i += 45){
        rotate(i);
        fill(0, 0, 0);
        noStroke();
        ellipse(this.z-this.z/1.6,0,this.z-this.z/1.15,this.z-this.z/1.15);
    }
    //r++;
    popMatrix();
    this.y += 0.4;


    /*
    for(var i = 0; i < 360; i += 45){
        rotate(i);
        fill(255,0,0);
        ellipse(this.z-this.z/1.6,0,this.z-this.z/2,5);
    }
    */
};

// drone object
var drone = function(x, y){
    return {
    x:x,
    y:y,
    z:20 + floor(random(2)) * 20,
    h:100,
    draw:droneArt };
};

// bullet object
var bullet = function(x, y, s, id){
    return {
        x:x, y:y, s:s, z:3,
        draw: function(){
            if (id==="canon"){
                this.y -= 7;
                fill(255, 97, 97);
                ellipse(this.x+2,this.y+9,this.z*3,this.z*4);
                fill(255, 0, 0);
                ellipse(this.x,this.y+9,this.z*3.2,this.z*4.2);
            } else {
                this.y -= 14;
                fill(102, 102, 255);
                rect(this.x-this.z/2, this.y, this.z, this.z+10);
            }
        }
    };
};

// collision test
var kill = function(obj){
    var test = function(blt){
        if (dist(obj.x, obj.y, blt.x, blt.y)<(obj.z+blt.z)/2){
            obj.h -= blt.s;
            blt.x = -100;
        }
    };
    return test;
};

var r = 0;
var drawDrone = function(drn){
    //r += 0.2;
    pushMatrix();
    translate(drone.x,0);
    rotate(r);
    drn.draw();
    popMatrix();

    bullets.forEach(kill(drn));
};

var drawBullet = function(blt){
    blt.draw();
};

var ufo;
var distance;
var minUFO = 10000;

var drones = [drone(100, 100), drone(200, -100), drone(300, 0)];

/*minUFO = minUFO === null || t > minUFO ? t : minUFO;*/

var minUFO = 9999999999;
var findNearestDrone = function () {
    for(var i=0; i < drones.length; i++) {
        var ufo = drones[i];

        var po = dist(ufo.x,ufo.y,p1.x,p1.y);

        if (po < minUFO) {
            minUFO = po;
        }

        fill(255, 0, 0);
        stroke(255,0,0);
        strokeWeight(2);
        line(ufo.x,ufo.y,p1.x+8,p1.y);
        noStroke();

        //println(ufo + " drone " + i);

        text(minUFO,30,100);
    }
};

事实证明,与我的预期不同;但从逻辑上讲,minUFO只会变得越来越小。似乎没有存储最近的UFO的位置,而是存储了UFO和会话中记录的播放器之间的最小距离。事实证明,这也不是我想要的。有人知道如何存储当前最接近的无人机的位置吗?不仅是我现在的距离,还有它的实际位置。谢谢您,我要为千百年来直达主题的非凡能力深表歉意。

1 个答案:

答案 0 :(得分:0)

您应将var minUFO = 9999999999;放在findNearestDrone函数中。这样,每次调用该函数时都会重置该变量,并且不再受以前的最小距离的影响。

接下来,类似于存储minUFO的方式,可以使用一个变量来跟踪ufo本身或与最近的ufo(到目前为止)相关联的索引。

我已经用两个选项修改了您的代码:

//initiate vars outside function
var nearestUFO;
var nearestIndex;

var findNearestDrone = function () {

    //initiate var that tracks min distance inside function
    var minUFO = 9999999999;

    for(var i=0; i < drones.length; i++) {
        var ufo = drones[i];

        var po = dist(ufo.x,ufo.y,p1.x,p1.y);

        if (po < minUFO) {
            minUFO = po;

            //store the current nearest ufo / index 
            nearestUFO= ufo;
            nearestIndex= i;
        }

        fill(255, 0, 0);
        stroke(255,0,0);
        strokeWeight(2);
        line(ufo.x,ufo.y,p1.x+8,p1.y);
        noStroke();

        //println(ufo + " drone " + i);

        text(minUFO,30,100);
    }
};