IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 实战pixi+gsap,仿刹车动画 -> 正文阅读

[游戏开发]实战pixi+gsap,仿刹车动画

开始之前大家可以先体验效果

进入

这种动态效果只能说yyds

我们这之前需要先考虑这个页面都有哪些元素以及交互

1.那些是静态资源

2.那些是动态元素

3.动态元素实现思路

4.按钮如何绑定动态

一,创建画布导入静态资源

我们创建之后并把它挂载到dom元素上面

this.app = new PIXI.Application({
			width:window.innerWidth,
			height:window.innerHeight,
			backgroundColor:0xffffff,
			resizeTo:window
		})
		this.stage = this.app.stage;
		// 渲染
		document.querySelector(selector).appendChild(this.app.view);

导入静态资源(按钮,车把,车,跑道)

this.loader = new PIXI.Loader();
		this.loader.add("btn.png",'images/btn.png');
		this.loader.add("btn_circle.png","images/btn_circle.png");
		this.loader.add("brake_bike.png","images/brake_bike.png");
		this.loader.add("brake_handlerbar.png","images/brake_handlerbar.png");
		this.loader.add("brake_lever.png","images/brake_lever.png");
		this.loader.add("malu.png","images/malu.png");
		this.loader.add("malu_line.png","images/malu_line.png");
		this.loader.load();

由于我们的动画是基于图片的,我们应该想到在图片加载完成之后再去加载动画效果。我们需要用到onComplete中去调用loader这是容器

this.loader.onComplete.add(()=>{
			this.show();
		});

我们图片尺寸非常大所以我们要对初始图片尺寸及位置进行配置

createAction(){
		//创建一个容器,存放按钮
		let actionbtn = new PIXI.Container();
		this.stage.addChild(actionbtn);
		//创建按钮
		let btni = new PIXI.Sprite(this.loader.resources['btn.png'].texture);
		//按钮边上的圆
		let btnc = new PIXI.Sprite(this.loader.resources['btn_circle.png'].texture);
		let btnc2 = new PIXI.Sprite(this.loader.resources['btn_circle.png'].texture);
		//添加到画布渲染
		actionbtn.addChild(btni);
		actionbtn.addChild(btnc);
		actionbtn.addChild(btnc2);
		//调整位置
		btni.pivot.x = btni.pivot.y = btni.width/2;
		btnc.pivot.x = btnc.pivot.y = btnc.width/2;
		btnc2.pivot.x = btnc2.pivot.y = btnc2.width/2;
		//调整大小缩放
		btnc.scale.x = btnc.scale.y = 0.8;
		//动画效果
		gsap.to(btnc.scale,{duration:1,x:1.3,y:1.3,repeat:-1});
		gsap.to(btnc,{duration:1,alpha:0,repeat:-1});
		return actionbtn;
	}

?创建开始结束时间并绑定按钮

let actionbtn = this.createAction();
		// 调整坐上边距
		actionbtn.x=window.innerWidth/2+400;
		actionbtn.y = 400;
		actionbtn.scale.y=actionbtn.scale.x=.5
		actionbtn.interactive = true;
		actionbtn.buttonMode = true;
		// 按下效果
		actionbtn.on("mousedown",()=>{
			//按下执行刹车把的动画
			gsap.to(bikeLever,{duration:.6,rotation:Math.PI/180*-30});
			pause();
		})
		// 松开效果
		actionbtn.on("mouseup",()=>{
			//松开执行刹车把松开动画
			gsap.to(bikeLever,{duration:.6,rotation:0});
			start();
		})

事件完成后即可通过按钮来进行车子的刹车和启动

速度效果

这里呢我们先是在y轴创建随机的点,在y轴竖向流动,再将画布进行旋转。

ps:这方法比较简单,正常斜线运动是要通过算法。

let particle = new PIXI.Container(); 
		this.stage.addChild(particle);
		//调整中心点
		particle.pivot.x = window.innerWidth/2;
		particle.pivot.y = window.innerHeight/2;
		//调整位置
		particle.x = window.innerWidth/2;
		particle.y = window.innerHeight/2;
		//调整角度(旋转)
		particle.rotation = 35*Math.PI/180;
		//新建一个数组存储点位
		let particlelist = [];
		// 循环创建点
		for (let i = 0; i < 10; i++) {
			let gr = new PIXI.Graphics();
			// 取色
			gr.beginFill(this.setColor4());
			gr.drawCircle(0,0,6);
			gr.endFill();
			// 位置随机取
			let pitem = {
				sx:Math.random()*window.innerWidth,
				sy:Math.random()*window.innerHeight,
				gr:gr
			}
			gr.x = pitem.sx;
			gr.y = pitem.sy;
			particle.addChild(gr);
			particlelist.push(pitem);
		}

创建完点之后我们旋转y轴

let speed = 0;
		//判断是开始还是暂停
		let status = true;
		// 运动
		function loop(){
			
			if(status){
				speed+=.2;
			}else{
				
				speed-=.4;
			}
			//设置加速最大值
			speed = Math.min(speed,30);
			//设置减速最小值
			speed = Math.max(speed,0);
			//循环改变点的位置
			for (let i = 0; i < particlelist.length; i++) {
				const pitem = particlelist[i];
				pitem.gr.y+=speed;
				pitem.sy = pitem.gr.y;
				
				if(speed>=20){
					pitem.gr.scale.y=40;
					pitem.gr.scale.x=0.03;
				}
				//超出屏幕重置位置
				if(pitem.gr.y>window.innerHeight)pitem.gr.y=0;
			}
			//计算改变Y
			maluliney.y+=(Math.cos(35*Math.PI/180))*speed;
			//计算改变X
			maluliney.x-=(Math.sin(35*Math.PI/180))*speed;
			//超出重置
			if(maluliney.y>400)maluliney.y=-100,maluliney.x=720;
		}

最后一步让公路动起来

1.引入马路并旋转合适角度

//马路
		let maluliney = new PIXI.Container(); 
		maluliney.pivot.x = window.innerWidth/2;
		maluliney.pivot.y = window.innerHeight/2;
		//位置
		maluliney.x = window.innerWidth/2;
		maluliney.y = window.innerHeight/2;
		this.stage.addChild(maluliney);
		//旋转
		maluliney.rotation = 35*Math.PI/180;
		//引入马路
		let malu = new PIXI.Sprite(this.loader.resources['malu.png'].texture);

2.在窗口大小发生改变时重置马路位置

// 监听窗口变化
		let resize =  () => {
			bikeContainer.x = window.innerWidth - bikeContainer.width-1000;
			bikeContainer.y = window.innerHeight - bikeContainer.height-1000;
                //刹车时车的顿感
			malu.x = window.innerWidth - bikeContainer.width-600;
			malu.y = window.innerHeight - bikeContainer.height-750;
		}

3.让马路一直循环动起来

//计算改变Y
			maluliney.y+=(Math.cos(35*Math.PI/180))*speed;
			//计算改变X
			maluliney.x-=(Math.sin(35*Math.PI/180))*speed;

到这里就大功告成了,可以欣赏我们的成果了。

ps:灵感以及技术学习来自?大帅老猿?,一个编程三十多年的老程序猿猴!

微信公众号里搜?大帅老猿,在他这里可以学到很多东西!快来和我一起学习!卷!

源码地址 :?https://github.com/QZ-WangXianRen/YCY-TrainingCamp-S1

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:55:11  更:2022-07-17 16:55:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:50:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码