【问题标题】:Collision detection of array objects阵列对象的碰撞检测
【发布时间】:2020-11-07 03:33:17
【问题描述】:

我正在 p5.js 中制作一个小游戏,当头像击中特定对象时,该对象需要触发特定场景。有问题的对象是包含在一个数组中的 4 个沙漏,我如何“访问”该数组以对每个对象实现不同的碰撞检测?我希望我已经足够清楚了。

class HourGlass {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.w = 60
    this.h = 65
  }
  body() {
    imageMode(CENTER);
    for (let i = 0; i < timekNum; i++) {
    image(hourglass, this.x+(i*150) , this.y+(sin(frameCount/(i+10))*(i+20)), this.w, this.h)
  }
  }
  
  checkCollision1(){
    if (me2.x + me2.w > this[0].x && me2.x < this[0].x + me2.w && me2.y + me2.h/2 > this[0].y && me2.y < this[0].y + this[0].h){
      scene = 5
    } 
  }

这里是“完整”游戏的链接https://editor.p5js.org/larie438/sketches/uufycStNE(它应该在 Chrome 中运行,由于某种原因,它在 Safari 中像垃圾一样运行)

提前感谢您的帮助!

【问题讨论】:

    标签: javascript arrays class collision-detection p5.js


    【解决方案1】:

    问题出在函数 checkCollision1() 中,仅将 this[0] 替换为 this。

     checkCollision1(){
        if (me2.x + me2.w > this.x && me2.x < this.x + me2.w && me2.y + me2.h/2 > this.y && me2.y < this.y + this.h){
          scene = 5
        } 
      }
    

    如果你想选择碰撞的场景,我建议使用这样的参数:

      checkCollision(sceneWanted){
        if (me2.x + me2.w > this.x && me2.x < this.x + me2.w && me2.y + me2.h/2 > this.y && me2.y < this.y + this.h){
          scene = sceneWanted;
        } 
      }
    

    当你检查碰撞时使用这个新功能:

    function hourGlassroom() {
      push()
      background(25, 25, 50)
      for (var i = 0; i < stars.length; i++) {
        stars[i].body();
      }
        for (let i = 0; i < timekNum; i++) {
      timekeeper[i].body()
        }
      me2.body()
      me2.move2()
      timekeeper[0].checkCollision(5)
      timekeeper[1].checkCollision(6)
      timekeeper[2].checkCollision(7)
      timekeeper[3].checkCollision(8)
      pop()
    }
    

    在这一点之后,您可能会遇到问题,即唯一工作的计时器是第一个,这是因为您创建了具有相同 X 和 Y 参数的所有计时器。

    function setup() {
      createCanvas(640, 360);
      noStroke();
      frameRate(fps);
      y = 359;
      vid.loop();
      vid.hide();
    
      for (let i = 0; i < cloudNum; i++) {
        clouds[i] = new Cloud(random(width), random(height - 180));
      }
    
      me = new Emi(10, 220);
      
      me2 = new Emi(20, 300);
      for (let i = 0; i < timekNum; i++) {
        timekeeper[i] = new HourGlass(100, height / 2);
      }
      //All timekeeper with the same X and Y params HERE !!.
    
      for (var i = 0; i < 1000; i++) {
        stars[i] = new Star();
      }
    }
    
    

    实际上你移动了画布中的所有计时器,但你需要像这样更新他的 X 和 Y 参数。

     body(i) {
        imageMode(CENTER);
        this.x = 100+(i*150);
        this.rad += 0.05;
        if(this.rad > 2*PI) this.rad = 0;
        this.y = (height/2 + sin(this.rad)*20);
        image(hourglass, this.x , this.y, this.w, this.h);
      }
    

    【讨论】:

    • 谢谢!但是当我在我的草图中替换你的代码时,沙漏没有出现我做对了吗function hourGlassroom() { push() background(25, 25, 50) for (var i = 0; i &lt; stars.length; i++) { stars[i].body(); } for (let i = 0; i &lt; timekNum; i++) { timekeeper[i].body(i) } me2.body() me2.move2() timekeeper[0].checkCollision(5) timekeeper[1].checkCollision(6) timekeeper[2].checkCollision(7) timekeeper[3].checkCollision(8) pop() }对不起,我不知道如何让它漂亮
    • @M0bi0usOne 这是我所做的更改:editor.p5js.org/piponsio96/sketches/mAJVlSLQ3
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多