50行代码实现3D模拟真实撒金币动效

2023-05-16

我们将会用50行不到的代码来实现一个3D模拟撒金币动效。你只需要一点Egret基础就能够快速上手,如果你不了解Egret,这里有一篇3分钟创建hello world来带你快速入门。

实现效果

源码和在线demo

  • 完整的工程请见:github.com/wildfirecod…
  • 在线访问地址:wildfirecode.com/fallingCoin…

资源准备

图片序列帧在工程的design/coin下。我们需要用TextureMerge工具来创建一个精灵图(SpriteSheet)。具体方式查看 这里 。最后将精灵图导入assets/文件夹,文件名为coin.jsoncoin.png

注意:序列帧图片的文件名为1.png~8.png

加载资源

我们通过精灵图的方式加载这8张序列帧图片。这里有一个工具函数:

const loadSpriteSheet: (keys: string[]) => Promise<egret.SpriteSheet>
复制代码

我们将精灵图的keys传入就可以获取到一个egret.SpriteSheet类型的对象,使用代码:

const keys = ['assets/coin.json', 'assets/coin.png'];
const spritesheet = await loadSpriteSheet(keys);
复制代码

注意:如果你想用TexturePacker来创建精灵图也是可以的,只是loadSpriteSheet函数需要有少许的变动。

创建序列帧图片动画

这里要引入一个工具类MovieClip(不要太在意类的命名 >.<)。看下API:

constructor MovieClip(
    { spritesheet, frames, position, keys,frameInterval} : 
    {
        spritesheet: egret.SpriteSheet;//精灵图
        frames: string[];//序列帧的图片的文件名序列
        position: number[];//设置动画位置
        frameInterval?: number;//相邻图片播放间隔,单位是帧,这会控制动画的播放速度
    }): MovieClip
复制代码

下面这段代码将金币动画放置在{x:100,y:100}的位置,相邻图片播放间隔是3帧,图片的播放顺序是1.png~8.png

const animation = new MovieClip({
    frameInterval: 3,
    frames: ['1', '2', '3', '4', '5', '6', '7', '8'],
    position: [100, 100],
    spritesheet: spritesheet
});
this.addChild(animation);//显示动画
复制代码

对动画增加真实的掉落效果

这里引入物理对象工具类Body

constructor Body({ x, y, vx, vy, gx, gy, host }: {
    x: number;//起始x
    y: number;//起始y
    vx: number;//起始x方向速度
    vy: number;//起始y方向速度
    gx: number;//x方向重力
    gy: number;//y方向重力
    host: egret.DisplayObject;//宿主显示对象
}): Body
复制代码

下面是使用代码:

const x = 750 / 2;
const y = 750 / 2;
const vx = 10;
const vy = -10;
const animation = this.createCoinMovieClip(spritesheet);
const falling = new Body({
    x: x, y: y, vx: vx, vy: vy, gy: 1, host: animation
});
复制代码

创建3D模拟撒金币

main.ts增加创建单个动画的函数:

createCoinMovieClip(spritesheet) {
    const animation = new MovieClip({
        frameInterval: 3,
        frames: ['1', '2', '3', '4', '5', '6', '7', '8'],
        loop: true,
        position: [100, 100],
        spritesheet: spritesheet
    });
    return animation;
}
复制代码

我们来创建100个金币动画,并设置随机的起始位置和速度,重力设置为1。你可以调整其中的各种参数来获得你想要的效果。

 let coinsFall = setInterval(() => {
    if (count < 100) {
        const x = 750 / 2 + Math.random() * 50 - 25;
        const y = 750 / 2 + Math.random() * 50 - 25;
        const vx = Math.random() * 20 - 10;
        const vy = -10 + Math.random() * 10 - 5;
        const animation = this.createCoinMovieClip(spritesheet);
        const falling = new Body({
            x: x, y: y, vx: vx, vy: vy, gy: 1, host: animation
        });
        this.addChild(animation);
        count++;
    } else {
        //结束
    }
}, 10)
复制代码

完整的代码

可以看出,我们只用了50行不到的代码就实现了一个真实的撒金币效果。

import Body from "./physics/Body";
import loadSpriteSheet from "./utils/loadSpriteSheet";
import MovieClip from "./movieclip/MovieClip";

class Main extends egret.DisplayObjectContainer {
    constructor() {
        super();
        this.once(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    async onAddToStage() {
        const keys = ['assets/coin.json', 'assets/coin.png'];
        const spritesheet = await loadSpriteSheet(keys);
        let count = 0;
        let coinsFall = setInterval(() => {
            if (count < 100) {
                const x = 750 / 2 + Math.random() * 50 - 25;
                const y = 750 / 2 + Math.random() * 50 - 25;
                const vx = Math.random() * 20 - 10;
                const vy = -10 + Math.random() * 10 - 5;
                const animation = this.createCoinMovieClip(spritesheet);
                const falling = new Body({
                    x: x, y: y, vx: vx, vy: vy, gy: 1, host: animation
                });
                this.addChild(animation);
                count++;
            } else {
                //结束
            }
        }, 10)

    }

    createCoinMovieClip(spritesheet) {
        const animation = new MovieClip({
            frameInterval: 3,
            frames: ['1', '2', '3', '4', '5', '6', '7', '8'],
            loop: true,
            position: [100, 100],
            spritesheet: spritesheet
        });
        return animation;
    }
}

window['Main'] = Main;

egret.runEgret();
复制代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

50行代码实现3D模拟真实撒金币动效 的相关文章

  • can总线配置读入是什么意思_CAN通讯系列--阶段性总结10

    欢迎来到本系列的第10篇文章 xff0c 本文将总结下前面文章的内容 xff0c 同时也思考下后面文章写什么 不知你是否发现了前面文章只是介绍了最常见的CAN通讯发送与接收功能 xff0c 而且只考虑最理想的情况 当然是特意这么安排的 xf
  • 标准正态分布怎么算_如何使用标准正态分布表?

    正态分布这个概念在统计学中很常见 xff0c 在做与正态分布有关计算的时候经常会用到标准正态分布表 如果知道一个数值的标准分数即z score xff0c 就可以非常便捷地在标准正态分布表中查到该标准分数对应的概率值 任何数值 xff0c
  • c语言怎么做界面菜单_C语言实现的一个交互小程序(三)

    关于C语言如何有效正确的学习 xff0c 我写了一个专栏 xff1a 你可以这样学习C语言 xff0c 有兴趣的小伙伴可以来看看哦 xff0c 希望能对你有收获 xff01 需要本文源代码的可以关注我后私信我 xff01 阅读本文之前 xf
  • pycharm怎么安装gym_windows 10、Python 3.6 环境下安装OpenAI Gym

    OpenAI Gym发布两年以来 xff0c 官方一直没有给出windows版支持 而我只有一台普通的win10台式机 xff0c 之前一直通过虚拟机上安装Ububtu来学习该框架 xff0c 但是无奈电脑太差 xff0c 而且虚拟机下不支
  • linux好用的下载工具,四款linux下的好工具

    原标题 xff1a 四款linux下的好工具 linux下的好工具很多 xff0c 使用得当会极大的提高工作者的效率 下面小编为大家推荐四个比较好用并且实用的工具 xff0c 对这四款工具在centos和ubuntu两个系统下进行相应的安装
  • 用计算机怎么按e,在计算器上e的多少次方怎样按

    e的x次方计算器 自然常数e就是lim 1 43 1 x xlim 1 43 1 x x xff0c x 43 或lim 1 43 z 1 zlim 1 43 z 1 z xff0c z 0 xff0c 其值约为2 71828 xff0c
  • Docker容器

    官网 www docker com github https github com docker docker github io 开源的容器引擎 xff0c 可以让开发者打包应用以及依赖的库 xff0c 然后发布到任何流行的linux发行
  • 宝塔跨服务器传文件的命令,宝塔面板文件移动复制粘贴你所不知道的小技巧!...

    下面是编程之家 jb51 cc 通过网络收集整理的代码片段 编程之家小编现在分享给大家 xff0c 也给大家做个参考 使用宝塔面板的时候 xff0c 同名文件夹覆盖无法正确覆盖 xff0c 会提示指定目录已经存在的 例如不同的目录下都有一个
  • 云服务器如何显示不出来,云服务器安装显示不出来

    云服务器安装显示不出来 内容精选 换一换 GPU加速型云服务器 xff0c 需要安装Tesla驱动和CUDA工具包以实现计算加速功能 使用公共镜像创建的计算加速型 P系列 实例默认已安装特定版本的Tesla驱动 使用私有镜像创建的GPU加速
  • linux tcp 例程,tcpdump 常用例子

    tcpdump 是一个很常用的网络包分析工具 xff0c 可以用来显示通过网络传输到本系统的 TCP IP 以及其他网络的数据包 tcpdump 使用 libpcap 库来抓取网络报 xff0c 这个库在几乎在所有的 Linux Unix
  • 给你两个字符串str1,str2,找出str2在str1中的位置

    如题 题目参考链接 xff1a http blog csdn net hxz qlh article details 14110221 代码来自非原创 1 include lt iostream gt 2 include lt cstdio
  • Win10间歇性卡顿

    Win10间歇性卡顿 1 关闭不必要的服务 xff1a Windows Update Windows Search SuperFetch Background Intelligent Transfer Service 2 卸载电脑管家 xf
  • HTTP协议 (二) 基本认证

    http协议是无状态的 xff0c 浏览器和web服务器之间可以通过cookie来身份识别 桌面应用程序 比如新浪桌面客户端 xff0c skydrive客户端 跟Web服务器之间是如何身份识别呢 xff1f 阅读目录 什么是HTTP基本认
  • 字符串截取函数--C语言(转)

    1 include lt stdio h gt 2 include lt stdlib h gt 3 4 char substring char ch int pos int length 5 6 char pch 61 ch 7 定义一个
  • HTTP, WWW-Authenticate, Authorization 验证授权 | Apache验证 | Python处理

    2019独角兽企业重金招聘Python工程师标准 gt gt gt HTTP验证 有时你访问网页时会碰到这种情况 xff1a 这种方式是基于HTTP协议的一种验证方式 xff0c 这里可以参考HTTP协议的具体解释 xff1a http w
  • 虚拟化(KVM)

    虚拟化介绍 VMware Workstation就是虚拟化 虚拟化简单讲 xff0c 就是把一台物理计算机虚拟成多台逻辑计算机 xff0c 每个逻辑计算机里面可以运行不同的操作系统 xff0c 相互不受影响 xff0c 这样就可以充分利用硬
  • 头文件中的(全局)变量只能放声明,不能定义

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 头文件中的变量只能声明 xff0c 不能定义 xff0c 否则其他多个 c文件包含该头文件 xff0c 出现重复定义 xff0c 导致链接出错 ifndef define
  • 程序启动时的堆栈

    程序启动时 xff0c Linux把4种类型的信息存放到程序堆栈中 xff1a xff08 1 xff09 命令行参数 xff08 包括程序名称 xff09 的数目 xff08 2 xff09 从shell提示符执行的程序的名称 xff08

随机推荐

  • suse linux双网卡双网关配置

    公司有台SUSE LINUX服务器需要用到2个网络 xff0c 一个网段是192的 xff0c 用来上OP管理平台系统 一个是B网络 xff0c 网段是202的 xff0c 用来上外网 我们都知道一台电脑拥有两个网关是不可能的 xff0c
  • 统计学中抽样比例一般占百分之多少

    要具体问题具体分析 一般和要求的误差限 置信区间及总体方差有关系 比如最基本的简单随机抽样 其样本量确定公式就是1 n 61 1 N 43 d 2 u 2 S 2 样本量和误差限成反比 和置信区间及总体方差成正比 请问一堆url怎么算方差
  • emqtt 试用(二)验证 emq 和 mosquito 的共享订阅

    本地订阅 Local Subscription 本地订阅 Local Subscription 只在本节点创建订阅与路由表 xff0c 不会在集群节点间广播全局路由 xff0c 非常适合物联网数据采集应用 使用方式 订阅者在主题 Topic
  • spring security实现动态配置url权限的两种方法

    缘起 标准的RABC 权限需要支持动态配置 xff0c spring security默认是在代码里约定好权限 xff0c 真实的业务场景通常需要可以支持动态配置角色访问权限 xff0c 即在运行时去配置url对应的访问角色 基于sprin
  • 干货!2018年你值得一看的网页设计作品集赏析

    网页设计作品集 61 门面 43 能力 网页设计作品集对网页设计师而言 xff0c 既是网页门面 xff0c 也是个人专业素养的体现 那么在作品集设计上万不能掉以轻心 无论是制作一份简约大方还是极具表现力的精良作品集 xff0c 设计师们都
  • ElasticSearch在原索引基础上添加字段和修改字段

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 业务场景 xff1a 现在的系统设计不满足业务需求时就需要升级服务 xff0c 为了满足业务需求有时需要对ES中 字段进行添加或修改操作 xff0c 接下来我们查看为 ma
  • echarts中关于字体设置的配置

    1 legend字体大小的配置 2 x轴和y轴上的刻度值的字体大小的配置 3 visualMap的字体大小的配置 4 饼状图上的文字大小的配置 其对应的是 转载于 https blog 51cto com 11871779 2401302
  • 堡垒机 jumpserver

    堡垒机介绍 在一个特定网络环境下 xff0c 为了保障网络和数据不受外界入侵和破坏 xff0c 而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态 安全事件 网络活动 xff0c 以便集中报警 及时处理及审计定责 我们又把堡
  • vim替换命令

    在VIM中进行文本替换 xff1a 1 替换当前行中的内容 xff1a s from to xff08 s即substitude xff09 s from to xff1a 将当前行中的第一个from xff0c 替换成to 如果当前行含有
  • xxxxxxxxxxxxxxxxxxxxxxxxxxxx

    Get Authorization code Request https accounts google com o oauth2 v2 auth redirect uri 61 https 3A 2F 2Fdevelopers googl
  • linux 系统密码忘记后的 5 种方法【转】

    如果你既没做系统启动软盘 xff0c 同时多系统的引导LILO 和GRUB 又被删除 xff0c 那么只能使用Linux 系统安装盘来恢复root的密码 xff0c 步骤如下 一 lilo引导在出现 lilo 提示时键入 linux sin
  • 理解程序内存

    内存对很多人来说感觉是个很熟悉的东西 xff0c 因为我们在用VC调试程序时 xff0c 很多时候都会察看内存中变量的值 但是 xff0c 很多时候我们的思维也就因此局限在有源码的模块 xff0c 当遇到一些跨模块或是没有源代码的Bug x
  • 内核调试

    转载一篇文章 xff1a http my oschina net fgq611 blog 113249 linux内核调试方法总结 1 二分法与printk AB之间有个bug xff0c 在AB之间找个中间点C xff0c 使用print
  • 提供一个免费的CSDN下载账号

    账号 xff1a windforce05 password xff1a w12345678 请下载了资源后评价一下资源 xff0c 以便赚回分数
  • 答读者问(7):相关实习、在软件开发和测试等论文和关系问题

    最近收到一个研究生朋友的电子邮件 xff0c 让我想起自己毕业前 xff0c 我们已经有很多的疑惑 xff0c 人谁想要的答案 互联网不仅是我们最好的老师 同一时候也是最好的桥梁 我们都要感谢并善于利用它 闲话不说 xff0c 言归正传 邮
  • 安装完office2016 64位后,在安装visio时,报错,无法安装,

    安装环境要求 xff1a 系统要求 xff1a win8 win10等 xff1b office要求 xff1a sw 批量版 不能和cn xff08 零售版 xff09 365版混装 重点注意事项一定要注意批量版和零售版的区别 xff0c
  • tex中把参考文献标题删除

    如果是book类 lt br gt renewcommand bibname lt br gt 如果是article类 lt br gt renewcommand refname
  • 德州扑克AI--Programming Poker AI(译)

    前言 最近在研究德州扑克的AI 也想由浅入深的看下 在网上找了一圈 发现很多文章都提到了一篇文章 Programming Poker AI 仔细拜读了一下 觉得非常不错 这里作下简单的翻译工作 可能加些自己的一些理解 权当做一回大自然的搬运
  • centos7优化内核参数详解

    一 Sysctl命令用来配置与显示在 proc sys目录中的内核参数 xff0e 如果想使参数长期保存 xff0c 可以通过编辑 etc sysctl conf文件来实现 命令格式 xff1a sysctl n e w variable
  • 50行代码实现3D模拟真实撒金币动效

    我们将会用50行不到的代码来实现一个3D模拟撒金币动效 你只需要一点Egret基础就能够快速上手 xff0c 如果你不了解Egret xff0c 这里有一篇3分钟创建hello world来带你快速入门 实现效果 源码和在线demo 完整的