初试pixijs,实现猫和老鼠小游戏(中)

148 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

一、前言

接上期我们引入了pixijs,并初步实验了其中的部分函数,今天我们就接着上次的项目,继续完善我们的项目demo。

如果有不懂的小伙伴可以去翻一下我的上一篇文章,或者去pixijs官网看下示例。

注意: 1、本文使用ts,部分代码存在不兼容情况; 2、本文所使用的pixi版本为6.5.5。

二、过程

1、键盘读取

如果我们想控制我们的主角tom去抓到jerry,那就需要监听键盘按键,从而触发对应的事件,才能达到我们控制tom移动的效果。事不宜迟,来试试吧。

首先我们将下面这个自定义函数加到项目中去,是官网给的js版本,要根据ts做些许改动

下面这个函数定义了key这个变量,它含以下几个变量,value是具体按键的值,用来区别当前按键,isDown和ipUp用来判定按键是否按下,同时预留定义了press和release方法,可以决定按键按下时触发什么方法,未按下时触发什么方法。

function keyboard(value: string) {
  let key: { value: string; isDown: boolean; isUp: boolean; press: (() => void) | undefined; release: (() => void) | undefined; downHandler: { (event: any): void; bind?: any; }; upHandler: { (event: any): void; bind?: any; }; unsubscribe: () => void; };
  key = {}
  console.log(value, key)
  key.value = value;
  key.isDown = false;
  key.isUp = true;
  key.press = undefined;
  key.release = undefined;
  //The `downHandler`
  key.downHandler = event => {
    if (event.key === key.value) {
      if (key.isUp && key.press) key.press();
      key.isDown = true;
      key.isUp = false;
      event.preventDefault();
    }
  };

  //The `upHandler`
  key.upHandler = event => {
    if (event.key === key.value) {
      if (key.isDown && key.release) key.release();
      key.isDown = false;
      key.isUp = true;
      event.preventDefault();
    }
  };

  //Attach event listeners
  const downListener = key.downHandler.bind(key);
  const upListener = key.upHandler.bind(key);
  
  window.addEventListener(
    "keydown", downListener, false
  );
  window.addEventListener(
    "keyup", upListener, false
  );
  
  // Detach event listeners
  key.unsubscribe = () => {
    window.removeEventListener("keydown", downListener);
    window.removeEventListener("keyup", upListener);
  };
  
  return key;
}

引入完keyboard函数后,我们来创建左右方向的键盘监听,并完善一下left和right的press和release函数, 同时新建一个catVX, 用来表示tom的速度属性,如果是6.版本以下的,那还有cat.vx这个速度属性,6.版本之后,就取消这个了,不知道放置了在哪儿,所以只能手动新建了。

let left = keyboard("ArrowLeft")
let right = keyboard("ArrowRight")
let catVX:number // 设置tom的速度属性
// 完善一下left和right的press和release函数
left.press = () => {
  // console.log(cat)
  catVX = -3
}
left.release = () => {
  if (!right.isDown) {
    catVX = 0
  }
}
right.press = () => {
  // console.log(cat)
  catVX = 3
}
right.release = () => {
  if (!right.isDown) {
    catVX = 0
  }
}

然后我们修改一下上期代码的play函数,这个是刷新网页帧的函数,我们把之前碰撞函数改写一下

function play(delta: number) {
  cat.x += catVX
  // 碰撞函数监测
  if (hitTestRectangle(cat, mouse)) {
    //There's a collision
    cat.x = 130
    cat.tint = 0xff0054
    count++
  } else if (!hitTestRectangle(cat, mouse)) {
    //There's no collision
    // cat.x -= 1
    // cat.tint = 0xccff99
  }
}

就可以用小键盘的← →控制tom移动啦

键盘.gif

2、添加背景图片

突然想起背景图还没添加,其实背景图片也是一个sprite,不过pixijs是canvas,所以sprite的添加顺序,就决定了是在上层还是下层,背景应该在最底层,那就应该最先添加。

同样用loader加载器先加载好图片,然后在setup函数里添加背景

app.loader
  .add([
    "tom.jpeg",
    "jerry.jpeg",
    "bg.jpeg"
  ])
  .load(setup)

声明好变量bg

let bg: PIXI.Sprite

setup函数里

// 设置背景
  bg = new PIXI.Sprite(app.loader.resources["bg.jpeg"].texture)
  bg.x = 0
  bg.y = 0
  bg.width = 400
  bg.height = 400
  app.stage.addChild(bg)

image.png

三、 小结

今天浅浅试了一下键盘监听的事件,也对sprite也有了更多的认知,容我好好构思的可以利用这些函数实现什么样的效果,先睡觉了,苟命要紧!明天继续更新。

ps: 我是地霊殿__三無,希望我别摸鱼了!

微信图片_20221001074313.jpg