vue3+threejs新手从零开发卡牌游戏(十三):上场手牌添加攻击力文字

在utils/common.ts下新建渲染场上手牌文字方法:

// 渲染场上手牌文字
const renderSiteCardText = (mesh: any, font: any) => {
  return new Promise((resolve, reject) => {
    let pos = mesh.position
    const geometry = new TextGeometry( `ATK ${mesh.userData._ATK}`, {
      font,
      size: 0.2,
      height: 0,
      curveSegments: 12,
      bevelEnabled: false,
      bevelThickness: 0,
      bevelSize: 0,
      bevelSegments: 0
    });
    geometry.center()
    const material = new THREE.MeshBasicMaterial({ 
      // color: new THREE.Color("#00a2ff"),
      color: new THREE.Color("white"),
      // alphaHash: true
    })
    const textMesh = new THREE.Mesh( geometry, material ) ;
    textMesh.position.y = pos.y + 0.02
    textMesh.position.z = pos.z + 0.18
    textMesh.rotateX(-90 * (Math.PI / 180)) // 弧度
    textMesh.name = "攻击力"

    mesh.add(textMesh)

    resolve(true)
  })
}
export { renderSiteCardText }

​

然后在game/index.vue中绘制场上卡牌时调用:

// 绘制场上卡牌
const renderSiteCard = async (data: any, mesh: any) => {
  let p1_handGroup = scene.getObjectByName("p1_handGroup")
  let position = new THREE.Vector3(0, 0, 0)
  mesh.getWorldPosition(position)
  mesh.userData.empty = false
  let oldMesh = p1_handGroup.children.find((v: any) => v.name === data.name)
  let newMesh = oldMesh.clone()
  newMesh.userData.areaType = mesh.name // 用来记录卡牌在哪个区域,怪兽区、墓地、手牌、卡组、场地等
  newMesh.scale.set(0.8, 0.8, 0.8)
  handRef.value.removeHandCard(oldMesh)
  scene.add(newMesh)
  newMesh.position.set(position.x, position.y, position.z)
  await renderSiteCardText(newMesh, commonStore.$state._font)

  console.log(123, newMesh)
}

相当于在手牌上场时给当前上场的卡牌添加一个TextGeometry,这里需要注意的是,展示的攻击力不能直接拿userData里的ATK,而要添加一个新的ATK来实时计算攻击力值,所以在game/deck/p1.vue中还需要修改下代码:

const init = () => {
  setDeckPos()
  addDeckWireframe()
  commonStore.$state.p1Deck.forEach((v: any, i: any) => {
    let obj = CARD_DICT.find((b: any) => b.card_id === v.card_id)
    if (obj) {
      let card = new Card(obj)
      let mesh = card.init()
      mesh.position.set(0, 0.005 * i, 0)
      mesh.rotateX(180 * (Math.PI / 180)) // 弧度
      mesh.name = v.name
      mesh.userData._ATK = mesh.userData.ATK // _ATK用于实时计算当前攻击力
      deckGroup.add( mesh );
    }
  })

  let position = new THREE.Vector3(0, 0.005 * commonStore.$state.p1Deck.length, 0)
  renderDeckText(deckGroup, `${commonStore.$state.p1Deck.length}`, commonStore.$state._font, position)

}

页面效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清岚_lxn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值