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

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 yscroeText.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.rhkb.cn/news/139003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Go疑难杂症]为什么nil不等于nil

现象 在日常开发中&#xff0c;可能一不小心就会掉进 Go 语言的某些陷阱里&#xff0c;而本文要介绍的 nil ≠ nil 问题&#xff0c;便是其中一个&#xff0c;初看起来会让人觉得很诡异&#xff0c;摸不着头脑。 先来看个例子&#xff1a; type CustomizedError struct {Err…

【面试必刷TOP101】 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II

目录 题目&#xff1a;删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder…

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟&#xff0c;现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能&#xff1a;快速读取所有位数据、寄存器数据的当前数值。 操作&#xff1a;双击“数值”列表头。 一键…

11:STM32---spl通信

目录 一:SPL通信 1:简历 2:硬件电路 3:移动数据图 4:SPI时序基本单元 A : 开/ 终条件 B:SPI时序基本单元 A:模式0 B:模式1 C:模式2 D:模式3 C:SPl时序 A:发送指令 B: 指定地址写 C:指定地址读 二: W25Q64 1:简历 2: 硬件电路 3:W25Q64框图 4: Flash操作注意…

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…

小小购物车案例(V3)

效果如下&#xff1a; 可以添加和减少商品个数&#xff08;最少个为1&#xff09;&#xff0c;在添加的时候总价格会随着改变&#xff0c;也可以点击按钮移除商品 代码分为三个模块&#xff08;html、js、css&#xff09; html部分&#xff1a; <!DOCTYPE html> <h…

计算机毕业设计 基于SSM+Vue的物资存储系统(以消防物资为例)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2023华为杯研究生数学建模竞赛选题统计+分析

2023年研赛的选题统计&#xff0c;我们主要基于根据两个平台投票统计。最终得出2023年研赛选题人数&#xff0c;这个结果仅供参考&#xff0c;但是应该具备一定的可信度。&#xff08;时间截止为22号中午1点&#xff09; 大家可以看到&#xff0c;AB题仅占10%&#xff0c;E题独…

操作系统:系统调用

1.系统调用的定义 凡是与共享资源有关的操作、会直接影响到其他进程的操作, 就一定需要操作系统介入,就需要通过系统调用来实现。 1.回顾系统调用 操作系统作为用户和计算机硬件之间的接口&#xff0c;需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中&a…

Lua学习笔记:探究package

前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级…

kafka的 ack 应答机制

目录 一 ack 应答机制 二 ISR 集合 一 ack 应答机制 kafka 为用户提供了三种应答级别&#xff1a; all&#xff0c;leader&#xff0c;0 acks &#xff1a;0 这一操作提供了一个最低的延迟&#xff0c;partition的leader接收到消息还没有写入磁盘就已经返回ack&#x…

Unity新收费模式:开启游戏开发者的持续盈利时代

Unity引擎近日宣布自2024年1月1日起&#xff0c;将根据游戏安装量对开发者进行收费。这一消息在游戏开发圈引起了广泛关注和讨论。根据Unity技术博客发布的《Unity收费模式和配套服务更新》一文&#xff0c;他们之所以选择这种计费方式&#xff0c;是因为每次游戏被下载时&…

基于SSM+Vue的亿互游在线平台的设计与开发

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Linux下的Docker安装,以Ubuntu为例

Docker是一种流行的容器化平台&#xff0c;它能够简化应用程序的部署和管理。 Docker安装 1、检查卸载老版本Docker&#xff08;为保证安装正确&#xff0c;尽量在安装前先进行一次卸载&#xff09; apt-get remove docker docker-engine docker.io containerd runc 2、Dock…

Qt创建线程(线程池)

1.线程池可以创建线程统一的管理线程&#xff08;统一创建、释放线程&#xff09; 2.使用线程池方法实现点击开始按钮生成10000个随机数&#xff0c;然后分别使用冒泡排序和快速排序排序这10000个随机数&#xff0c;最后在窗口显示排序后的数字&#xff1a; mainwindow.h文件…

基础课-排列组合

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

please choose a certificate and try again.(-5)报错怎么解决

the server you want to connect to requests identification,please choose a certificate and try again.(-5)

刷题笔记24——完全二叉树的节点个数

有些事情是不能告诉别人的,有些事情是不必告诉别人的,有些事情是根本没有办法告诉别人的,而且有些事情是,即使告诉了别人,你也会马上后悔的。——罗曼罗兰 222. 完全二叉树的节点个数 java的幂运算要 (int) Math.pow(2,l1)-1计算满二叉树的节点数量公式&#xff1a;2 ^ height…

Linux中swap几乎耗尽,但物理内存还有空余的现象

故障现象&#xff1a; 产生此现象的原因&#xff1a; swappiness 配额设置了偏高的值。 还有一个潜在的因素是某个程序因其自身对内存管理的缺陷&#xff0c;形成了zombie进程、且为及时关闭的处理任务还在持续消耗Mem及swap。 解决办法&#xff1a; 调低swappiness 配额值&…

C语言 coding style

头文件 The #define Guard #define的保护文件的唯一性&#xff0c;防止被多重包含 格式 : <PROJECT>_< FILE>_H_ PROJECT : XS FILE : MV_CTR 头文件的包含顺序 C System FilesOther LibrariesUser LibraryConditional include 作用域 局部变量 -变量定义时需要…