# cardjs **Repository Path**: SirWangCode/cardjs ## Basic Information - **Project Name**: cardjs - **Description**: card.js是一款绘制游戏王卡图的工具 - **Primary Language**: JavaScript - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: https://ymssx.gitee.io/ygo - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 41 - **Created**: 2020-06-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # card.js 这是一个游戏王卡片渲染工具,你只需要在你的网站引入card.js,就可以轻松地渲染出标准的游戏王卡图! ## 为什么使用card.js 你的网站需要大量的游戏王卡图,但是网上的卡图资源参差不齐?不妨试试card.js,只需要一次的加载,就可以使用大量、标准、高清的游戏王卡图。 * 🥦 响应式。Card会自动响应数据的变动,同时更新卡图,这在与表单交互场景十分有用。同时,对于大量的更新请求,内部只会进行一次绘制,因此你不用过多的担心性能问题。 * 🍅 十分容易使用。你只需要短短的几行代码,就能将一张canvas画布变成一张游戏王高清卡图!另外,card.js可以自由的更改模板样式,在config文件中你可以随心所欲地进行创作! * 🍉 交互式。你可以轻松实现各种交互动效,比如SR面闪特效、烫金字等。同时允许实时修改卡片信息、自由定制卡片。 * 🍇 动态尺寸。Card渲染的卡图非常清晰,你可以直接保存到本地进行打印。同时Card会自动监听canvas的尺寸变化,同时会自动重绘。从显示器到纸张上,它是一张永远都不会模糊的图片。
## 🎈 作品 [🔗 游戏王在线制卡器 #yami](https://ymssx.gitee.io/ygo) [🔗 游戏王WIKI #yami](http://ocg.wiki/#59438930) 欢迎向我自荐你的基于card.js的作品,邮箱:ymssx@qq.com
## 📦 安装 ```shell $ git clone https://gitee.com/ymssx/cardjs.git ``` 将 `dist`文件夹下的内容放到需要的地方 #### 目录结构 > mold/ 保存了我们需要的标准模板素材。当然你也可以自定义你的模板 > config/ 这里自带了几份常用的配置文件 > card.js 手动引入它就可以使用Card啦
## 🚀 使用方式 将`dist`文件夹的内容放在合适的位置,使用` ``` 传入一个卡片数据和canvas对象,然后使用render方法就可以渲染啦 ```javascript const canvas = document.getElementById('card'); const data = { name: '青眼的白龍', _id: '89631139', type: 'monster', type2: 'tc', type3: '', type4: '', attack: 3000, defend: 2500, level: 8, desc: '以高攻擊力著稱的傳說之龍。任何對手都能被粉碎,其破壞力不可估量。', race: '龍族', attribute: 'light' } const card = new Card({ data, canvas, size: [400, 584] }); card.render(); ``` > **注意,当card.js不在根目录时,你可能需要手动指定moldPath。** ```javascript const card = new Card({ data, canvas, moldPath: './source/mold' }); ```
> ### data -- 卡片信息,包括名字、密码、效果等 ```typescript interface data = { name: string, // card name _id: string, // card id type: 'monster' | 'spell' | 'trap', // first type type2: type, // secend type 见下面注释① type3: type, // third type type4: type, // fourth type desc: string // card describe ?attribute: 'light' | 'dark' | 'fire' | 'water' | 'wind' | 'earth' | 'divine' // monster attribute ?race: string // monster race ?attack: number // monster attack ?defend: number // monster defend ?level: number // monster level ?link: boolean[] // link monster arrows ?lb_desc: string // pendulum describe ?lb_number: number // pendulum number } typeMap = { "tc": '通常', "xg": '效果', "ys": '儀式', "rh": '融合', "tt": '同調', "cl": '超量', "lb": '靈擺', "lj": '連接', "ec": '二重', "tz": '調整', "tm": '同盟', "tk": '卡通', "lh": '靈魂', "fz": '反轉', "ts": '特殊召喚', "zb": '裝備', "sg": '速攻', "cd": '場地', "fj": '反擊', "yx": '永續' } ``` > ① 关于type2 | type3 | type4 * 描述卡片类型时,请一定在type2中反映出它是一张什么颜色的卡片,可选为 tc通常、xg效果、rh融合、ys仪式、cl超量、tt同调等 * type3 - type4可描述为tz调整、ec二重、fz反转、tc通常、xg效果等 * 默认使用拼音首字母描述,超过两个字的按前两个字处理,如“特殊召唤”为“ts” * TCG玩家也可以使用英文,如 normal、effect、fusion、ritual、xyz、synchro等(请使用小写),我们会自动转换为拼音 以下两种描述是等价的,请根据自己喜好选择 ```javascript const data = { name: '幽鬼兔', type: 'monster', type2: 'xg', // 效果 type3: 'tz', // 调整 type4: '', } const data = { name: '幽鬼兔', type: 'monster', type2: 'effect', // 效果 type3: 'tuner', // 调整 type4: '', } ```
## 🎏 游戏王卡图库 不知道去哪里找卡图? 这里收录了绝大多数游戏王卡图,不定期更新。 [🔗 传送门](https://gitee.com/ymssx/pics)
## 🎉 详细配置 ```typescript const Card = function ({ data: object, // 卡片数据 canvas: HTMLElement, // canvas对象 size: number[], // 绘制尺寸,[宽, 高] moldPath: string = './mold', // 模板资源路径 lang:'cn' | 'jp' | 'en' = 'cn', // 语言 cn、jp、en config: object = defaultConfig, // 配置信息。在这里指定你的自定义配置信息 fontLoaded: function = defaultEvent, // 事件 imageLoaded: function = defaultEvent, fontsLoaded: function = defaultEvent, imagesLoaded: function = defaultEvent, loaded: function = defaultEvent, recover: boolean = false, // 是否缓存配置与数据 holo: boolean = true, // 是否显示防伪标志 cardbagSwitch: boolean = false, // 是否显示卡包信息 translate: boolean = false, // 是否自动繁简转换 verbose: boolean = false // 是否开启啰嗦模式 }) ```
> ### size 当传入的值为数组时,canvas会严格按照这个尺寸进行绘制。 ```javascript const card = new Card({ data, canvas, size = [813, 1185] }) ``` 你也可以不传入size,如果autoResize为true(默认值),那么card.js会自动计算尺寸。 当canvas尺寸变化时,card.js会自动重新进行绘制,保证卡图永远高清,这在弹性布局中十分有用。 ```html ``` ```javascript // autoResize默认开启 const card = new Card({ data, canvas, autoResize: true }) ```
## 🌴 生命周期 通过传入事件来自定义卡片渲染的生命周期钩子函数。 ### fontLoaded 单个字体文件加载完成。 ```javascript card.fontLoaded = function(e) { console.log(e); } ``` ### fontsLoaded 所有字体文件加载完成。 ### imageLoaded 单个图片资源加载完成。 ### imagesLoaded 单个图片资源加载完成。 ### loaded 卡片渲染完毕。
## 🧰 config 更改config文件,可以自由地调整卡片的样式,比如字体大小、颜色等。 [具体配置请参考`config/defaultConfig.js`](https://gitee.com/ymssx/cardjs/tree/master/source/config) 你可以通过传递一个配置对象来临时改变配置信息 ```javascript card.changeConfig(config); ```
## 🧮 API ### Card.render ```javascript await card.render(); ``` 初始渲染,返回一个promise对象,当绘制完毕时变为fulfilled状态。 ### Card.feed 你可以自由的使用与更换自定义的中间卡图。 比如当你想把【真红眼黑龙】的卡图换成【青眼白龙】。 ```javascript const pic = document.getElementById('blueEyes'); card.feed(pic); ``` ### Card.changeConfig ```javascript card.changeConfig(config); ``` ### Card.feedData 调整卡片信息。 ```javascript card.feedData(data); ``` 或者直接 ```javascript card.data.name = 'Blue Eyes'; ``` ### Card.save 保存卡图到本地,你可以指定保存时**文件名称**和**图片尺寸**。 ```javascript card.save('青眼白龙', [1626, 2370]); ``` 也可以不指定参数,card.js会自动使用卡名作为文件名,尺寸会使用默认值1626 × 2370。 ### Card.feedFlash 使用面闪效果。传入一张闪面卡图,并且调整`card.data.flash`的值(0 ~ 1),卡图会呈现不同强度的面闪效果。 ```javascript card.feedFlash(document.getElementById('flashImg')); card.data.flash = 0.5; ``` 一张闪面卡图需要自行制作,一下是两组例子:
## 静态方法 以下是Card对象私有的方法,请不要在实例对象上使用。 ### Card.complex 将简体字文本转换为繁体字文本。 ```javascript const complexText = Card.complex('青眼白龙'); // 青眼白龍 ``` ### Card.transData card.js需要你以特定的JSON结构来描述一张卡,觉得麻烦?没关系,使用transData可以**直接兼容YGOPro自带数据库的卡片数据**。 ```javascript const ygoproData = { "name": '元素英雄 羽翼侠', "desc": "拥有操纵风在天空飞舞之翼的元素英雄。以来自天空的一击羽翼击破来审判邪恶。", "id": 21844576, "atk": 1000, "def": 1000, "race": 1, "type": 17, "level": 3, "attribute": 8 } // 来自YGOPro的数据,直接传入card.js会报错 const newData = Card.transData(ygoproData); console.log(newData); ``` 输出 ```javascript { name: '元素英雄 羽翼侠', desc: '拥有操纵风在天空飞舞之翼的元素英雄。以来自天空的一击羽翼击破来审判邪恶。', _id: '21844576', attack: 1000, defend: 1000, race: '战士族', type: 'monster', type2: 'tc', type3: '', type4: '', level: 3, attribute: 'wind' } // 可以被card.js理解的数据对象结构 ```
## 🧶 实现方式 Card.js * 📚 cardData.js 管理卡片数据,监听数据变动,当数据更新之后,cardData会自动分析需要更新哪些文件,然后告知cardFile * 📁 cardFile.js 管理文件的更新与缓存,当收到cardData的更新请求后,会自动从缓存或者网络调用图片,在文件更新之后会自动告知cardDrawer * 🎨 cardDrawer.js 管理绘图功能,在收到cardFile的绘图请求后,会按照cardData的数据以及cardFile提供的文件进行绘图