slot machine prototype
full project on my github: https://github.com/yevhverb/casino-slots (on russian)
| .title | |
| - const slots = ['β¬', 'S', 'L', 'O', 'T', 'S', 'β¬'] | |
| - for (let sl = 0; sl < slots.length; sl++) | |
| span= slots[sl] | |
| .slots | |
| .combs | |
| - for(let c = 1; c <= 3; c++) | |
| .comb= 'COMB ' + c | |
| .lines | |
| .rings | |
| - for(let r = 1; r <= 3; r++) | |
| .ring | |
| - for(let s = 0; s < 8; s++) | |
| .slot(id=s)= s | |
| .results | |
| - for(let rs = 1; rs <= 3; rs++) | |
| .result | |
| button.spin SPIN |
| const rings = document.querySelectorAll('.ring'), | |
| spin = document.querySelector('.spin'), | |
| degs = [0, 45, 90, 135, 180, 225, 270, 315, 360] | |
| window.onload = () => { | |
| rings.forEach((el, i) => { | |
| let obj = {}, | |
| arr = obj.arr = [] | |
| el.querySelectorAll('.slot').forEach((el) => { | |
| let id = el.getAttribute('id') | |
| obj.arr.push(id) | |
| }) | |
| obj.next = arr[arr.length-2] | |
| obj.curr = arr[arr.length-1] | |
| obj.prev = arr[0] | |
| obj.deg = 0 | |
| window[`ring${i}`] = obj | |
| }) | |
| update() | |
| } | |
| spin.addEventListener('click', rotate) | |
| function rotate() { | |
| rings.forEach((el, i) => { | |
| let obj = window[`ring${i}`], | |
| deg = obj.deg, | |
| curr = obj.curr, | |
| arr = obj.arr, | |
| res = deg - degs[rnd(0, degs.length)] * rnd(1, 30) | |
| el.style.transform = `rotateX(${res}deg)` | |
| obj.deg = res | |
| let cnt = Math.abs(res - deg) / (360/arr.length), | |
| tmp = arr.slice(arr.indexOf(curr)), | |
| next, | |
| prev | |
| for (let i = 0; i <= cnt; i++) { | |
| tmp.push.apply(tmp, arr) | |
| curr = tmp[i] | |
| next = tmp[i - 1] | |
| prev = tmp[i + 1] | |
| } | |
| obj.curr = curr | |
| if (cnt > 0) { | |
| obj.next = next | |
| obj.prev = prev | |
| } | |
| window[`ring${i}`] = obj | |
| }) | |
| setTimeout(() => { | |
| update() | |
| }, 2825) | |
| } | |
| function update() { | |
| const results = document.querySelector('.results') | |
| results.innerHTML = '' | |
| results.insertAdjacentHTML('beforeend', | |
| `<div class="result">${ring0.next} ${ring1.curr} ${ring2.prev}</div> | |
| <div class="result">${ring0.curr} ${ring1.curr} ${ring2.curr}</div> | |
| <div class="result">${ring0.prev} ${ring1.curr} ${ring2.next}</div>`) | |
| } | |
| function rnd(min, max) { | |
| return Math.floor(Math.random() * (max - min)) + min | |
| } |
slot machine prototype
full project on my github: https://github.com/yevhverb/casino-slots (on russian)
| $bg: #1F1F1F | |
| $co: #F1A850 | |
| $vm: 10vmin | |
| * | |
| margin: 0 | |
| padding: 0 | |
| box-sizing: border-box | |
| font-family: 'Rozha One', serif | |
| font-size: $vm/2.5 | |
| color: $co * .9 | |
| user-select: none | |
| body, .slots, .rings, .combs, .results, .ring, .slot, .spin | |
| display: flex | |
| justify-content: center | |
| align-items: center | |
| transform-style: preserve-3d | |
| body, .combs, .results | |
| flex-direction: column | |
| body | |
| justify-content: space-around | |
| width: 100% | |
| height: 100vh | |
| background: $bg | |
| .slots | |
| position: relative | |
| width: $vm * 12 | |
| height: $vm * 5 | |
| > * | |
| height: 100% | |
| .combs, .results | |
| width: 20% | |
| justify-content: space-between | |
| > * | |
| font-size: $vm/2.8 | |
| color: $co * .5 | |
| .rings | |
| width: 50% | |
| perspective: $vm * 25 | |
| .ring | |
| position: relative | |
| width: calc(100% / 3) | |
| height: 100% | |
| transition: 3s ease-in-out | |
| .slot | |
| position: absolute | |
| width: 100% | |
| height: 45% | |
| font-size: $vm*1.5 | |
| background: rgba($bg, .935) | |
| @for $i from 1 through 8 | |
| &:nth-child(#{$i}) | |
| transform: rotateX(45deg * $i) translateZ($vm * 2.7) | |
| .lines | |
| position: absolute | |
| top: 50% | |
| left: 50% | |
| transform: translate(-50%, -50%) translateZ($vm*5) | |
| width: 50% | |
| height: 95% | |
| background-image: linear-gradient(transparent 49.75%, rgba($co, .15) 49.75%, rgba($co, .15) 50.25%, transparent 50.25%), linear-gradient(to bottom left, transparent 49.75%, rgba($co, .15) 49.75%, rgba($co, .15) 50.25%, transparent 50.25%), linear-gradient(to bottom right, transparent 49.75%, rgba($co, .15) 49.75%, rgba($co, .15) 50.25%, transparent 50.25%) | |
| .title | |
| width: $vm*12 | |
| position: relative | |
| margin-bottom: $vm*1.5 | |
| span | |
| display: block | |
| position: absolute | |
| left: 48.5% | |
| transform-origin: 40% 400% | |
| font-size: $vm/1.5 | |
| color: $co * .5 | |
| @for $i from 1 through 7 | |
| &:nth-child(#{$i}) | |
| transform: rotate(-36deg + (9deg * $i)) | |
| .spin | |
| width: $vm*1.4 | |
| height: $vm*1.4 | |
| transform: rotateX(45deg) | |
| border: $vm/30 solid | |
| radius: 50% | |
| font-size: $vm/2.2 | |
| color: $co * .75 | |
| background: transparent | |
| outline: none | |
| cursor: pointer | |
| transition: .3s | |
| &:hover | |
| color: $co * .9 | |
| &:active | |
| color: $co * 1.2 | |
| .result | |
| transform: scale(0) | |
| opacity: 1 | |
| animation: scale-on .375s ease-in-out forwards | |
| @for $i from 1 through 3 | |
| &:nth-child(#{$i}) | |
| animation-delay: .1s * $i | |
| @keyframes scale-on | |
| 50% | |
| transform: scale(1.5) | |
| 100% | |
| transform: scale(1) |
saved