亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有“動態”坐標的Konva .to

帶有“動態”坐標的Konva .to

慕萊塢森 2022-09-02 10:13:57
我正在使用Konva創建一個小游戲。您可以控制一個可以在地圖中移動的單個單元,并將“相機”平移到它上面。我通過將屏幕居中放在單位的x,y坐標上,然后繪制與此相關的其他所有內容來實現此效果:class GameWorld {  public entities = new Map();  public width = window.innerWidth;  public height = window.innerHeight;  public center = {    x: 0,    y: 0  };  tick(world: any) {    world.forEach((entity: any) => {      ...      if (entity.id === user.id) {        // this is the user's unit        this.center.x = entity.x;        this.center.y = entity.y;      }      ...      let dx = this.dx(entity.x);      let dy = this.dy(entity.y);      entity.shape.position({ x: dx, y: dy });      ...    });    this.layer.draw();  }  dx(x: number) {    return x - this.center.x + this.width / 2;  }  dy(y: number) {    return y - this.center.y + this.height / 2;  }}目前,我遇到的問題是一個簡單的血液飛濺效果,它的工作原理是創建5個“大”紅色圓圈和15個小圓圈,以不同的速度在死亡單位(不是玩家單位)周圍的隨機方向和距離上散布。let bloodDot = (x: number, y: number, size: number) => {  let dx = this.dx(x);  let dy = this.dy(y);  let dot = new Konva.Circle({    x: dx,    y: dy,    radius: size,    fill: 'red',  });  this.layer.add(dot);  let dir = Math.random() * Math.PI * 2;  let dis = Math.random() * size * 5;  dot.to({    x: dx + Math.cos(dir) * dis,    y: dy + Math.sin(dir) * dis,    duration: Math.random() * 3,    easing: Konva.Easings.StrongEaseOut,    onFinish: () => dot.destroy()  });}for (let lg = 0; lg < 5; lg++) {  for (let sm = 0; sm < 3; sm++) {    bloodDot(entity.x, entity.y, entity.size / 6);  }  bloodDot(entity.x, entity.y, entity.size / 3);}使用該方法會帶來問題。如果玩家是靜止的,這一切都很好,但是如果玩家正在移動,因此其他一切,包括血液,都應該相對于它們移動,則使用中的x和y仍然是創建血點時的x和y,似乎血液正在跟隨玩家或更確切地說是卡在屏幕上的同一位置, 而其他一切都相對移動。.to().to如何在Konva仍在制作動畫時動態更改補間的屬性(坐標)?
查看完整描述

1 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

好吧,這不是對所提問題的直接回答,但它是問題的解決方案,所以在這里。


我沒有找到一種方法在動畫處理補間的屬性時對其進行修改,但我發現我可以對點進行分組,然后相對于該組進行動畫處理,并且我必須在派生的x,y上繪制組,這很容易。


let bloodDot = (size: number) => {

  let dot = new Konva.Circle({

    x: 0,

    y: 0,

    radius: size,

    fill: 'red',

  });


  let dir = Math.random() * Math.PI * 2;

  let dis = Math.random() * size * 5;


  g.add(dot);


  dot.to({

    x: Math.cos(dir) * dis,

    y: Math.sin(dir) * dis,

    duration: Math.random() * 3,

    easing: Konva.Easings.StrongEaseOut,

    onFinish: () => dot.destroy()

  });

}


let g = new Konva.Group({

  x: this.dx(entity.x),

  y: this.dy(entity.y)

});

this.layer.add(g);


for (let lg = 0; lg < 5; lg++) {

  for (let sm = 0; sm < 3; sm++) {

    bloodDot(entity.size / 6);

  }

  bloodDot(entity.size / 3);

}


setTimeout(() => g.destroy(), 3000);


查看完整回答
反對 回復 2022-09-02
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號