vue3——pixi初学,编写一个简单的小游戏,复制粘贴可用学习

news2024/11/18 11:25:14

pixi官网

小游戏效果
在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/a28bad4e64294c88ae10d764378d2091.png

两个文件夹 一个index.html 一个data.js

//data.js
import { reactive } from "vue";
import { Sprite, utils, Rectangle, Application, Text, Graphics } from "pixi.js";

//首先 先创建一个舞台
export const app = new Application({
  resizeTo: window, //自适应页面大小 铺满页面 其他参数可以查看文档
  backgroundColor: 0x061639, // 背景颜色
  transparent: true,//背景是否透明,默认false
});

// 计算分数 舞台上面分数文本
let scroe = 0;
const scroeText = new Text(`分数: ${scroe}`, {
  fontFamily: "Arial",
  fontSize: 24,
  fill: 0xffffff,
});

// 创建一个文本对象来显示当前帧数
 const fpsText = new Text("FPS: 0", {
    fontFamily: "Arial",
    fontSize: 24,
    fill: 0xffffff,
 }); 
// 文本创建
export function createText() {
  scroeText.position.set(100, 10); // 位置  x 100  y 10
  // scroeText.anchor.set(0.5); //以自己中心设置了锚点来计算 x y
  scroeText.zIndex = 999; // 层级
  fpsText.position.set(250, 10);
  fpsText.zIndex = 999;
  app.stage.addChild(fpsText);
  app.stage.addChild(scroeText);
   
   // 创建一个Ticker对象来处理动画循环
  app.ticker.add(update);
  // 定义一个update函数来更新帧数
  function update() {
    // 计算当前帧数
     const fps = Math.round(app.ticker.FPS);
    // 更新文本内容
     fpsText.text = `FPS: ${fps}`;
    // console.log(`FPS: ${fps}`);
   }
}

// 创建精灵  
let sprites = []; // 存储精灵图对象的数组
const maxSprites = 8; // 最大精灵图数量
let s_data = reactive({
  vx: 0,
  vy: 1, //初始速度
  maxX: 0,//边界
  maxY: 0,
  minX: 0,
  minY: 0,
  // 设置精灵图的初始移动方向
  directionX: 1,
  directionY: 1,
});
// 创建精灵图  从雪碧图里面抠出方块
export function createRocket() {
   // 超过8个就不再创建
  if (sprites.length >= maxSprites) return;
  
 // 扣雪碧图 将雪碧图存储在TextureCache缓存中的texture变量中。
  let texture = utils.TextureCache[require("../../assets/tileset.png")];
  
  // 创建了一个新的Rectangle对象,该对象表示了从纹理中提取的一个矩形区域
  let rectangle = new Rectangle(96, 128, 32, 32);
  
  // 将之前创建的矩形区域赋值给纹理的frame属性。
  texture.frame = rectangle;
  
  // 创建了一个新的精灵图对象,名称为rocket,并将之前创建的纹理对象赋值给它的texture属性。
  // 这样,精灵图将根据纹理显示相应的图像。
  let sprite = new Sprite(texture);
  
  // 设置精灵图的初始位置
  sprite.x = Math.random() * app.renderer.width; // 随机 X轴坐标
  sprite.y = 0; // Y轴坐标
  
  // 运动边界
  s_data.maxX = app.screen.width - sprite.width;
  s_data.maxY = app.screen.height - sprite.height;
  
  // 初始位置边界
  if (sprite.x < 0) sprite.x = 0;
  if (sprite.x > s_data.maxX) sprite.x = app.screen.width - sprite.width;
  
  app.stage.addChild(sprite); // 添加到舞台
  sprites.push(sprite);
  

}
// 精灵图——方块 运动判断
function gameLoop() {
  for (let i = sprites.length - 1; i >= 0; i--) {
    const sprite = sprites[i];
    const nextX = sprite.x + s_data.vx;
    const nextY = sprite.y + s_data.vy;
    // 检查碰撞并采取相应行动
    // if (nextX < s_data.minX || nextX > s_data.maxX) {
    // 在X轴方向上与边界碰撞
    // s_data.directionX *= -1; // 反转运动方向
   //  }
    if (nextY < s_data.minY || nextY > s_data.maxY) {
      // 在Y轴方向上与边界碰撞
      // s_data.directionY *= -1; // 反转运动方向
      // app.stage.removeChild(rocket); // 移除
      // return;
      // scroe += 10;
      scroeText.text = `FPS: ${scroe}`;
      app.stage.removeChild(sprite);
      sprites.splice(i, 1);
    }
    // 检测碰撞
    if (detectCollision(box, sprite)) {
      // 发生碰撞
      console.log("碰撞发生!");
      scroe += 10;
      scroeText.text = `FPS: ${scroe}`;
      app.stage.removeChild(sprite); // 从舞台移除精灵图
      sprites.splice(i, 1);
    }
    // 更新精灵图的位置
    sprite.x += s_data.vx * s_data.directionX;
    sprite.y += s_data.vy * s_data.directionY;
  }
}
// 创建动画循环 会一直频繁触发gameLoop
app.ticker.add(() => gameLoop());

// 暂停创建
export function stopTimer(timer) {
  if (scroe > 200) {
    clearInterval(timer);
  }
}

// 创建 底部方块 限制:左右运动
let boxData = reactive({
  minX: 0,// 运动边界
  maxX: 0,
});
const boxWidth = 100;
const boxHeight = 50;
const box = new Graphics();
export function createBox() {
  box.beginFill(0x0000ff); // 方块的填充颜色为蓝色,可以根据需要修改颜色值
  box.drawRect(0, 0, boxWidth, boxHeight); // 绘制方块
  box.endFill();
  box.x = (app.screen.width - boxWidth) / 2; // 将方块定位在水平居中位置
  box.y = app.screen.height - boxHeight; // 将方块定位在底部
  boxData.maxX = app.screen.width - boxWidth;
  // 启用交互
  box.interactive = true;

  // 监听触摸或鼠标按下事件,开始拖动
  box.on("pointerdown", onDragStart);

  // 监听触摸或鼠标释放事件,停止拖动
  box.on("pointerup", onDragEnd);
  box.on("pointerupoutside", onDragEnd);

  // 监听触摸或鼠标移动事件,移动方块
  box.on("pointermove", onDragMove);

  let isDragging = false; // 记录是否正在拖动
  let startPosition; // 拖动开始时的位置

  // 拖动开始
  function onDragStart(event) {
    isDragging = true;
    startPosition = event.data.global.x;
  }

  // 拖动停止
  function onDragEnd() {
    isDragging = false;
  }

  // 拖动移动
  function onDragMove(event) {
    if (isDragging) {
      const currentPosition = event.data.global.x;
      const deltaX = currentPosition - startPosition;
      console.log(deltaX, box.x, s_data.maxX);
      // 移动方块
      box.x += deltaX;
      // 检查碰撞并采取相应行动 // 在X轴方向上与边界碰撞
      if (box.x > boxData.maxX) box.x = boxData.maxX;
      if (box.x < boxData.minX) box.x = boxData.minX;
      startPosition = currentPosition;
    }
  }
  app.stage.addChild(box); // 将方块添加到舞台上
}

// 检测碰撞
function detectCollision(box, sprite) {
  // getBounds 方法获取方块和精灵图的边界矩形,然后判断两个矩形是否相交,如果相交,则说明发生了碰撞。
  const boxBounds = box.getBounds();
  const spriteBounds = sprite.getBounds();

  return (
    boxBounds.x + boxBounds.width > spriteBounds.x &&
    boxBounds.x < spriteBounds.x + spriteBounds.width &&
    boxBounds.y + boxBounds.height > spriteBounds.y &&
    boxBounds.y < spriteBounds.y + spriteBounds.height
  );
}
// index.html

<template>
  <div id="pixi"></div>
</template>
<script>
import { Loader } from "pixi.js";
import { onMounted } from "vue";
import { createRocket, app, createText, stopTimer, createBox } from "./index";

export default {
  name: "Game",
  setup() {
  	//初始化
    function init() {
      createText();
      // 定时创建精灵图
      let timer = setInterval(() => {
        createRocket();
      }, 1000); // 每秒创建一个精灵图
      stopTimer(timer);
      createBox();
    }

    onMounted(() => {
      let box = document.getElementById("pixi");
      box.appendChild(app.view);
      Loader.shared.add([require("../../assets/tileset.png")]).load(init);
    });
    return {};
  },
  components: {},
};
</script>
<style scoped lang="scss">
#pixi {
  position: absolute;
  width: 100%;
  height: 100%;
  background-image: url("../../assets/bg.png"); /* 替换为你的背景图路径 */
  background-size: cover;
}
</style>

package.josn

 "dependencies": {
    "core-js": "^3.6.5",
    "pixi.js": "^6.2.1",
    "vue": "^3.0.0-0",
    "vue-router": "^4.0.0-0",
    "vuex": "^4.0.0-0"
  },

该页面素材
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于开源模型的实时人脸识别系统(九):软件说明

续 人脸识别_CodingInCV的博客-CSDN博客 文章目录 前言简介模型选择的要求总体流程图人脸检测人脸跟踪人脸质量人脸关键点人脸识别代码结构人脸识别的逻辑高阶设置 前言 前面的文章我们介绍了整个系统里的关键步骤&#xff0c;基于这些步骤我们就可以搭建出属于自己的人脸识别…

Java 并发编程面试题——Lock 与 AbstractQueuedSynchronizer (AQS)

目录 1.Lock1.1.Lock 是什么&#xff1f;1.2.Lock 接口提供了哪些 synchronized 关键字不具备的主要特性&#xff1f;1.3.✨Lock 与 synchronized 有什么区别&#xff1f;1.4.Lock 接口中有哪些方法&#xff1f;1.5.哪些类实现了 Lock 接口&#xff1f; 2.AbstractQueuedSynchr…

使用YOLOv5-C3模块识别图像天气 - P8

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 环境步骤环境设置引用包全局设备对象 数据准备数据集信息收集图像预处理读取数据…

【Vue】模块基本语法

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue快速入门》。&#x1f…

什么是WhatsApp群发,WhatsApp协议,WhatsApp云控

那么WhatsApp群控云控可以做什么呢&#xff1f; 1、获客 自动化引流&#xff0c;强大的可控性&#xff0c;产品快速拓客 2、导流 一键式傻瓜化自动加好友&#xff0c;群发&#xff0c;朋友圈营销 3、群控 一键式拉群好友&#xff0c;建群&#xff0c;进群 …

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中比较有用的命令&#xff0c;cherry是樱桃&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到一个新分支…

大模型应用发展的方向|代理 Agent 的兴起及其未来(上)

“ 介绍了人工智能代理的历史渊源与演进&#xff0c;接着探讨了大型语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;以及它们在知识获取、指令理解、泛化、规划和推理等方面所展现出的强大潜力。在此基础上&#xff0c;提出了一个以大型语言模型为核心的智能代理概念框…

[论文笔记]P-tuning v2

引言 今天带来第五篇大模型微调论文笔记P-tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Across Scales and Tasks。 作者首先指出了prompt tuning的一些不足,比如在中等规模的模型上NLU任务表现不好,还不能处理困难的序列标记任务,缺乏统一应用的能力。 然…

【学习草稿】背包问题

一、01背包问题 图解详细解析 &#xff08;转载&#xff09; https://blog.csdn.net/qq_37767455/article/details/99086678 &#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个物…

Vue中的自定义指令详解

文章目录 自定义指令自定义指令-指令的值&#xff08;给自定义指令传参数&#xff09; 自定义指令 自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom 操作&#xff0c;扩展额外功能&#xff08;自动聚焦&#xff0c;自动加载&#xff0c;懒加载等复杂的指令封…

2006-2022年上市公司彭博ESG数据

2006-2022年彭博ESG数据 1、时间&#xff1a;2006-2022年 2、指标&#xff1a; Stkcd、Year、BloombergS、BloombergESG、BloombergE、BloombergG 3、指标解释&#xff1a; 彭博企业社会责任披露指数(Bloomberg ESG Disclo-sure Scores)&#xff0c;包括ESG综合得分以及环境、社…

Mac使用CMakeList编译ImGUi项目

文章目录 创建项目1.下载ImGui2.下载GLAD3.下载GLFW4.编译项目5.运行截图 创建项目 我这里创建一个demo&#xff0c;opengl这个是可以跨平台的&#xff0c;所以在mac上使用ImGui的opengl3示例 1.下载ImGui 我使用的是docking版本的&#xff0c;这个版本支持停靠功能&#xff…

Python学习 day01(注意事项)

注释 变量 数据类型的转换 运算符 / 的结果为浮点数。若// 的两边有一个为浮点数&#xff0c;则结果为浮点数&#xff0c;否则为整数。 字符串

JavaScript - canvas - 将图片保存到本地

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>将图片保存到本地</title></head><body><canvas id"canvas"></canvas><b…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

《计算机视觉中的多视图几何》笔记(9)

现在进入本书的part 2了&#xff0c;标题是Two-View Geometry。第9-14章都隶属于part 2&#xff0c;这一部分涵盖了两个透视图的几何形状知识&#xff0c;这些视图可以像在立体设备中同时获取&#xff0c;或者例如通过相对于场景移动的相机顺序获取。这两种情况在几何上是等价的…

Java基于SpringBoot的校园博客系统

第一章&#xff1a;简介 本系统主要根据博主的需求做出分析&#xff0c;让博主更好的在线查看校园博客系统信息等&#xff0c;管理员后台管理系统数据等功能。从这个系统的操作来说&#xff0c;能够有效的进行信息的添加、修改、查询、删除一些校园博客系统信息&#xff0c;在…

【深度学习实验】前馈神经网络(七):批量加载数据(直接加载数据→定义类封装数据)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 直接加载鸢尾花数据集 a. 加载数据集 b. 数据归一化 c. 洗牌操作 d. 打印数据 2. 定义类封装数据 a. __init__(构造函数&#xff1a;用于初始化数据集对象) b.…

基础课-排列组合

1.排列 2.组合 定义 从n个不同元素中&#xff0c;任意取出m(m<n)元素并为一组&#xff0c;叫做从n个不同元素中取出m个元素的一个组合 注意:1.不同元素 2.只取不排 3.相同组合:元素相同 3.把位置当成特殊元素 这个元素不一定入选的时候&#xff0c;把位置当特殊元素 4.插空…

【AI视野·今日Sound 声学论文速览 第九期】Thu, 21 Sep 2023

AI视野今日CS.Sound 声学论文速览 Thu, 21 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;Auto-ACD,大规模文本-音频数据集自动生成方法。 基于现有的大模型和api构建了一套大规模高质量的音频文本数据收集方法&#xff0c…