eva-engine / eva.js

Eva.js is a front-end game engine specifically for creating interactive game projects.
https://eva.js.org
MIT License
1.75k stars 108 forks source link

关于网络库的想法 #176

Closed fanmingfei closed 1 year ago

fanmingfei commented 2 years ago
class Player extends NetworkComponent {

  // 创建用户的血量 这是一个和服务端同步的属性
  @networkVarible networkHP: NetworkVariable<number> = new NetworkVariable(100)
  // 创建用户的位置 这是一个和服务端同步的属性
  @networkVarible networkPosition: NetworkVariable<Vector2> = new NetworkVariable({ x: 0, y: 0 });

  // 只有客户端按键盘的时候会调用move方法
  public move() {
    // 这里告诉服务端下一步的位置
    sendNewPos({ x: this.networkPosition.value.x + 10, y: this.networkPosition.value.y + 10 })
  }

  // 告诉服务端我要移动位置了
  @serverRPC
  sendNewPos(pos) {
    // 服务端来修改当前的位置
    this.networkPosition.value = pos
  }

  // 在用户攻击别人的时候调用,告诉服务端我要揍人了
  @serverRPC
  public attackSomeone(gameObject, hp) {
    // 这里直接调用被攻击的游戏对象的attack方法
    gameObject.getComponent(Player).attack(hp)
  }
  attack(hp) {
    this.networkHP.value -= hp
    this.networkHP.value = Math.max(0, this.networkHP.value)
    if (this.networkHP.value === 0) {
      this.die()
    }
  }

  // 客户端接收死亡事件
  @clientRPC
  die() {
    alert('游戏结束')
  }

  // 每帧同步网络位置
  update() {
    this.gameObject.position = this.networkPosition.value
  }
}