| @@ -120,6 +120,78 @@ Math.randomInteger = function(max, min = 0) { | |||||
| return this.floor(this.random() * (max - min + 1) + min); | return this.floor(this.random() * (max - min + 1) + min); | ||||
| } | } | ||||
| // Create a class for the element | |||||
| class CardAvatar extends HTMLElement { | |||||
| // Specify observed attributes so that | |||||
| // attributeChangedCallback will work | |||||
| static get observedAttributes() { | |||||
| return ['id']; | |||||
| } | |||||
| #id = 0; | |||||
| get id() { | |||||
| return this.#id; | |||||
| } | |||||
| set id(x) { | |||||
| this.setAttribute('id', x); | |||||
| //this.#id = x; //在属性改变的内容里已经写入了 | |||||
| } | |||||
| constructor() { | |||||
| // Always call super first in constructor | |||||
| super(); | |||||
| // Create a shadow root | |||||
| const shadow = this.attachShadow({mode: 'open'}); | |||||
| // Create some CSS to apply to the shadow dom | |||||
| const linkElem = shadow.appendChild(document.createElement('link')); | |||||
| linkElem.setAttribute('rel', 'stylesheet'); | |||||
| linkElem.setAttribute('href', 'style-card.css'); | |||||
| // Create spans | |||||
| const wrapper = shadow.appendChild(document.createElement('a')); | |||||
| wrapper.className = 'wrapper'; | |||||
| wrapper.target = '_blank'; | |||||
| const dAttr1 = wrapper.appendChild(document.createElement('div')); | |||||
| dAttr1.className = 'attribute attribute-main'; | |||||
| const dAttr2 = wrapper.appendChild(document.createElement('div')); | |||||
| dAttr2.className = 'attribute attribute-sub'; | |||||
| const dId = wrapper.appendChild(document.createElement('div')); | |||||
| dId.className = 'card-id'; | |||||
| } | |||||
| connectedCallback() { | |||||
| console.log('自定义标签添加到页面'); | |||||
| this.update(); | |||||
| } | |||||
| attributeChangedCallback(name, oldValue, newValue) { | |||||
| console.log('自定义标签属性改变', name, oldValue, newValue); | |||||
| if (name == 'id') this.#id = parseInt(this.getAttribute('id')); | |||||
| this.update(); | |||||
| } | |||||
| update() { | |||||
| //得到怪物ID | |||||
| const id = this.#id || 0; | |||||
| const card = Cards[id] || Cards[0]; | |||||
| const dataSource = this.getAttribute('source') || currentDataSource.code; | |||||
| const shadow = this.shadowRoot; | |||||
| const wrapper = shadow.querySelector('.wrapper'); | |||||
| wrapper.href = currentLanguage.guideURL(id, card.name); | |||||
| wrapper.style.backgroundImage = `url(images/cards_${dataSource.toLowerCase()}/CARDS_${Math.ceil(id / 100).toString().padStart(3,"0")}.PNG)`; | |||||
| const idxInPage = (id - 1) % 100; //获取当前页面内的序号 | |||||
| wrapper.setAttribute("data-cards-pic-x", idxInPage % 10); //添加X方向序号 | |||||
| wrapper.setAttribute("data-cards-pic-y", Math.floor(idxInPage / 10)); //添加Y方向序号 | |||||
| const dAttr1 = wrapper.querySelector('.attribute-main'); | |||||
| dAttr1.setAttribute('data-attr', card.attrs[0]); | |||||
| const dAttr2 = wrapper.querySelector('.attribute-sub'); | |||||
| dAttr2.setAttribute('data-attr', card.attrs[1]); | |||||
| const dId = wrapper.querySelector('.card-id'); | |||||
| dId.setAttribute('data-id', id); | |||||
| } | |||||
| } | |||||
| // Define the new element | |||||
| customElements.define('card-avatar', CardAvatar); | |||||
| //将二进制flag转为数组 | //将二进制flag转为数组 | ||||
| function flags(num) { | function flags(num) { | ||||
| @@ -0,0 +1,85 @@ | |||||
| @charset "utf-8"; | |||||
| .wrapper{ | |||||
| display: inline-block; | |||||
| position: relative; | |||||
| width: 100px; | |||||
| height: 100px; | |||||
| } | |||||
| /*怪物边框*/ | |||||
| .attribute { /*主属性*/ | |||||
| position:absolute; | |||||
| left:0;top:0; | |||||
| width: 100px;height: 100px; | |||||
| background-repeat: no-repeat; | |||||
| background-image: url(images/CARDFRAME2.PNG); | |||||
| } | |||||
| .attribute-sub { /*副属性*/ | |||||
| background-position-y: -104px; | |||||
| } | |||||
| .attribute[data-attr='-1'] { | |||||
| background: none; /*无*/ | |||||
| } | |||||
| .attribute[data-attr='0'] { | |||||
| background-position-x: calc(-102px * 0); /*火*/ | |||||
| } | |||||
| .attribute[data-attr='1'] { | |||||
| background-position-x: calc(-102px * 1); /*水*/ | |||||
| } | |||||
| .attribute[data-attr='2'] { | |||||
| background-position-x: calc(-102px * 2); /*木*/ | |||||
| } | |||||
| .attribute[data-attr='3'] { | |||||
| background-position-x: calc(-102px * 3); /*光*/ | |||||
| } | |||||
| .attribute[data-attr='4'] { | |||||
| background-position-x: calc(-102px * 4); /*暗*/ | |||||
| } | |||||
| .attribute-main[data-attr='6'] | |||||
| { | |||||
| background-image: url(images/CARDFRAMEW.PNG); | |||||
| background-position: 0 0; | |||||
| } | |||||
| /*宠物在图中编号对应的坐标*/ | |||||
| .wrapper[data-cards-pic-x='0']{background-position-x:calc(-102px * 0);} | |||||
| .wrapper[data-cards-pic-x='1']{background-position-x:calc(-102px * 1);} | |||||
| .wrapper[data-cards-pic-x='2']{background-position-x:calc(-102px * 2);} | |||||
| .wrapper[data-cards-pic-x='3']{background-position-x:calc(-102px * 3);} | |||||
| .wrapper[data-cards-pic-x='4']{background-position-x:calc(-102px * 4);} | |||||
| .wrapper[data-cards-pic-x='5']{background-position-x:calc(-102px * 5);} | |||||
| .wrapper[data-cards-pic-x='6']{background-position-x:calc(-102px * 6);} | |||||
| .wrapper[data-cards-pic-x='7']{background-position-x:calc(-102px * 7);} | |||||
| .wrapper[data-cards-pic-x='8']{background-position-x:calc(-102px * 8);} | |||||
| .wrapper[data-cards-pic-x='9']{background-position-x:calc(-102px * 9);} | |||||
| .wrapper[data-cards-pic-y='0']{background-position-y:calc(-102px * 0);} | |||||
| .wrapper[data-cards-pic-y='1']{background-position-y:calc(-102px * 1);} | |||||
| .wrapper[data-cards-pic-y='2']{background-position-y:calc(-102px * 2);} | |||||
| .wrapper[data-cards-pic-y='3']{background-position-y:calc(-102px * 3);} | |||||
| .wrapper[data-cards-pic-y='4']{background-position-y:calc(-102px * 4);} | |||||
| .wrapper[data-cards-pic-y='5']{background-position-y:calc(-102px * 5);} | |||||
| .wrapper[data-cards-pic-y='6']{background-position-y:calc(-102px * 6);} | |||||
| .wrapper[data-cards-pic-y='7']{background-position-y:calc(-102px * 7);} | |||||
| .wrapper[data-cards-pic-y='8']{background-position-y:calc(-102px * 8);} | |||||
| .wrapper[data-cards-pic-y='9']{background-position-y:calc(-102px * 9);} | |||||
| .card-id { | |||||
| color: white; | |||||
| /*font-family: var(--game-font-family);*/ | |||||
| font-size: 15px; | |||||
| /*text-shadow: black 0px 0px 2px,black -1px -1px 1px,black 1px 1px 1px,black 1px -1px 1px,black -1px 1px 1px;*/ | |||||
| text-shadow: black 0px 0px 2px,black 1px 1px 1px; | |||||
| position: absolute; | |||||
| left: 5px; | |||||
| bottom: 15px; | |||||
| } | |||||
| .card-id::before { | |||||
| content: "No."; | |||||
| font-size: 0.7em; /*火狐*/ | |||||
| zoom: 0.7; /*Chrome*/ | |||||
| } | |||||
| .card-id::after { | |||||
| content: attr(data-id); | |||||
| } | |||||