mirror of https://github.com/mainnika/a-quest.git
parent
799ee3d6c8
commit
8fb2789461
@ -0,0 +1,549 @@ |
|||||||
|
|
||||||
|
#game {width: auto;} |
||||||
|
.hidden {display: none;} |
||||||
|
|
||||||
|
/*////////////////////////////////////////////////////////////////// |
||||||
|
[ RESTYLE TAG ]*/ |
||||||
|
|
||||||
|
* { |
||||||
|
margin: 0px; |
||||||
|
padding: 0px; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
body, html { |
||||||
|
height: 100%; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
} |
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
a { |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 14px; |
||||||
|
line-height: 1.7; |
||||||
|
color: #666666; |
||||||
|
margin: 0px; |
||||||
|
transition: all 0.4s; |
||||||
|
-webkit-transition: all 0.4s; |
||||||
|
-o-transition: all 0.4s; |
||||||
|
-moz-transition: all 0.4s; |
||||||
|
} |
||||||
|
|
||||||
|
a:focus { |
||||||
|
outline: none !important; |
||||||
|
} |
||||||
|
|
||||||
|
a:hover { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
h1,h2,h3,h4,h5,h6 { |
||||||
|
margin: 0px; |
||||||
|
} |
||||||
|
|
||||||
|
p { |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 14px; |
||||||
|
line-height: 1.7; |
||||||
|
color: #666666; |
||||||
|
margin: 0px; |
||||||
|
} |
||||||
|
|
||||||
|
ul, li { |
||||||
|
margin: 0px; |
||||||
|
list-style-type: none; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
input { |
||||||
|
outline: none; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
outline: none; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
textarea:focus, input:focus { |
||||||
|
border-color: transparent !important; |
||||||
|
} |
||||||
|
|
||||||
|
input:focus::-webkit-input-placeholder { color:transparent; } |
||||||
|
input:focus:-moz-placeholder { color:transparent; } |
||||||
|
input:focus::-moz-placeholder { color:transparent; } |
||||||
|
input:focus:-ms-input-placeholder { color:transparent; } |
||||||
|
|
||||||
|
textarea:focus::-webkit-input-placeholder { color:transparent; } |
||||||
|
textarea:focus:-moz-placeholder { color:transparent; } |
||||||
|
textarea:focus::-moz-placeholder { color:transparent; } |
||||||
|
textarea:focus:-ms-input-placeholder { color:transparent; } |
||||||
|
|
||||||
|
input::-webkit-input-placeholder { color: #adadad;} |
||||||
|
input:-moz-placeholder { color: #adadad;} |
||||||
|
input::-moz-placeholder { color: #adadad;} |
||||||
|
input:-ms-input-placeholder { color: #adadad;} |
||||||
|
|
||||||
|
textarea::-webkit-input-placeholder { color: #adadad;} |
||||||
|
textarea:-moz-placeholder { color: #adadad;} |
||||||
|
textarea::-moz-placeholder { color: #adadad;} |
||||||
|
textarea:-ms-input-placeholder { color: #adadad;} |
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
button { |
||||||
|
outline: none !important; |
||||||
|
border: none; |
||||||
|
background: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
button:hover { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
iframe { |
||||||
|
border: none !important; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
.container { |
||||||
|
max-width: 1200px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*////////////////////////////////////////////////////////////////// |
||||||
|
[ Contact ]*/ |
||||||
|
|
||||||
|
.container-contact100 { |
||||||
|
width: 100%; |
||||||
|
min-height: 100vh; |
||||||
|
display: -webkit-box; |
||||||
|
display: -webkit-flex; |
||||||
|
display: -moz-box; |
||||||
|
display: -ms-flexbox; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
padding: 15px; |
||||||
|
background: #a64bf4; |
||||||
|
background: -webkit-linear-gradient(45deg, #00dbde, #fc00ff); |
||||||
|
background: -o-linear-gradient(45deg, #00dbde, #fc00ff); |
||||||
|
background: -moz-linear-gradient(45deg, #00dbde, #fc00ff); |
||||||
|
background: linear-gradient(45deg, #00dbde, #fc00ff); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.wrap-contact100 { |
||||||
|
width: 500px; |
||||||
|
background: #fff; |
||||||
|
border-radius: 10px; |
||||||
|
overflow: hidden; |
||||||
|
padding: 42px 55px 45px 55px; |
||||||
|
} |
||||||
|
|
||||||
|
.wrap-contact150 { |
||||||
|
width: 750px; |
||||||
|
background: #fff; |
||||||
|
border-radius: 10px; |
||||||
|
overflow: hidden; |
||||||
|
padding: 42px 55px 45px 55px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Form ]*/ |
||||||
|
|
||||||
|
.contact100-form { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.contact100-form-title { |
||||||
|
display: block; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 39px; |
||||||
|
color: #333333; |
||||||
|
line-height: 1.2; |
||||||
|
text-align: center; |
||||||
|
padding-bottom: 44px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Input ]*/ |
||||||
|
|
||||||
|
.wrap-input100 { |
||||||
|
width: 100%; |
||||||
|
position: relative; |
||||||
|
border-bottom: 2px solid #d9d9d9; |
||||||
|
padding-bottom: 13px; |
||||||
|
margin-bottom: 27px; |
||||||
|
} |
||||||
|
|
||||||
|
.label-input100 { |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 13px; |
||||||
|
color: #666666; |
||||||
|
line-height: 1.5; |
||||||
|
padding-left: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.input100 { |
||||||
|
display: block; |
||||||
|
width: 100%; |
||||||
|
background: transparent; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 18px; |
||||||
|
color: #333333; |
||||||
|
line-height: 1.2; |
||||||
|
padding: 0 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.focus-input100 { |
||||||
|
position: absolute; |
||||||
|
display: block; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
pointer-events: none; |
||||||
|
} |
||||||
|
|
||||||
|
.focus-input100::before { |
||||||
|
content: ""; |
||||||
|
display: block; |
||||||
|
position: absolute; |
||||||
|
bottom: -2px; |
||||||
|
left: 0; |
||||||
|
width: 0; |
||||||
|
height: 2px; |
||||||
|
|
||||||
|
-webkit-transition: all 0.4s; |
||||||
|
-o-transition: all 0.4s; |
||||||
|
-moz-transition: all 0.4s; |
||||||
|
transition: all 0.4s; |
||||||
|
|
||||||
|
background: #7f7f7f; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------*/ |
||||||
|
input.input100 { |
||||||
|
height: 40px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
textarea.input100 { |
||||||
|
min-height: 110px; |
||||||
|
padding-top: 9px; |
||||||
|
padding-bottom: 13px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.input100:focus + .focus-input100::before { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.has-val.input100 + .focus-input100::before { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Button ]*/ |
||||||
|
.container-contact100-form-btn { |
||||||
|
display: -webkit-box; |
||||||
|
display: -webkit-flex; |
||||||
|
display: -moz-box; |
||||||
|
display: -ms-flexbox; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
justify-content: center; |
||||||
|
padding-top: 13px; |
||||||
|
} |
||||||
|
|
||||||
|
.wrap-contact100-form-btn { |
||||||
|
width: 100%; |
||||||
|
display: block; |
||||||
|
position: relative; |
||||||
|
z-index: 1; |
||||||
|
border-radius: 25px; |
||||||
|
overflow: hidden; |
||||||
|
margin: 0 auto; |
||||||
|
} |
||||||
|
|
||||||
|
.contact100-form-bgbtn { |
||||||
|
position: absolute; |
||||||
|
z-index: -1; |
||||||
|
width: 300%; |
||||||
|
height: 100%; |
||||||
|
background: #a64bf4; |
||||||
|
background: -webkit-linear-gradient(left, #00dbde, #fc00ff, #00dbde, #fc00ff); |
||||||
|
background: -o-linear-gradient(left, #00dbde, #fc00ff, #00dbde, #fc00ff); |
||||||
|
background: -moz-linear-gradient(left, #00dbde, #fc00ff, #00dbde, #fc00ff); |
||||||
|
background: linear-gradient(left, #00dbde, #fc00ff, #00dbde, #fc00ff); |
||||||
|
top: 0; |
||||||
|
left: -100%; |
||||||
|
|
||||||
|
-webkit-transition: all 0.4s; |
||||||
|
-o-transition: all 0.4s; |
||||||
|
-moz-transition: all 0.4s; |
||||||
|
transition: all 0.4s; |
||||||
|
} |
||||||
|
|
||||||
|
.contact100-form-btn { |
||||||
|
display: -webkit-box; |
||||||
|
display: -webkit-flex; |
||||||
|
display: -moz-box; |
||||||
|
display: -ms-flexbox; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
padding: 0 20px; |
||||||
|
width: 100%; |
||||||
|
height: 50px; |
||||||
|
|
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 16px; |
||||||
|
color: #fff; |
||||||
|
line-height: 1.2; |
||||||
|
} |
||||||
|
|
||||||
|
.wrap-contact100-form-btn:hover .contact100-form-bgbtn { |
||||||
|
left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.contact100-form-btn i { |
||||||
|
-webkit-transition: all 0.4s; |
||||||
|
-o-transition: all 0.4s; |
||||||
|
-moz-transition: all 0.4s; |
||||||
|
transition: all 0.4s; |
||||||
|
} |
||||||
|
.contact100-form-btn:hover i { |
||||||
|
-webkit-transform: translateX(10px); |
||||||
|
-moz-transform: translateX(10px); |
||||||
|
-ms-transform: translateX(10px); |
||||||
|
-o-transform: translateX(10px); |
||||||
|
transform: translateX(10px); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Responsive ]*/ |
||||||
|
|
||||||
|
@media (max-width: 576px) { |
||||||
|
.wrap-contact100 { |
||||||
|
padding: 72px 15px 65px 15px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Alert validate ]*/ |
||||||
|
|
||||||
|
.validate-input { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.alert-validate::before { |
||||||
|
content: attr(data-validate); |
||||||
|
position: absolute; |
||||||
|
max-width: 70%; |
||||||
|
background-color: #fff; |
||||||
|
border: 1px solid #c80000; |
||||||
|
border-radius: 2px; |
||||||
|
padding: 4px 25px 4px 10px; |
||||||
|
top: 58%; |
||||||
|
-webkit-transform: translateY(-50%); |
||||||
|
-moz-transform: translateY(-50%); |
||||||
|
-ms-transform: translateY(-50%); |
||||||
|
-o-transform: translateY(-50%); |
||||||
|
transform: translateY(-50%); |
||||||
|
right: 2px; |
||||||
|
pointer-events: none; |
||||||
|
|
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
color: #c80000; |
||||||
|
font-size: 13px; |
||||||
|
line-height: 1.4; |
||||||
|
text-align: left; |
||||||
|
|
||||||
|
visibility: hidden; |
||||||
|
opacity: 0; |
||||||
|
|
||||||
|
-webkit-transition: opacity 0.4s; |
||||||
|
-o-transition: opacity 0.4s; |
||||||
|
-moz-transition: opacity 0.4s; |
||||||
|
transition: opacity 0.4s; |
||||||
|
} |
||||||
|
|
||||||
|
.alert-validate::after { |
||||||
|
content: "\f06a"; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
display: block; |
||||||
|
position: absolute; |
||||||
|
color: #c80000; |
||||||
|
font-size: 16px; |
||||||
|
top: 58%; |
||||||
|
-webkit-transform: translateY(-50%); |
||||||
|
-moz-transform: translateY(-50%); |
||||||
|
-ms-transform: translateY(-50%); |
||||||
|
-o-transform: translateY(-50%); |
||||||
|
transform: translateY(-50%); |
||||||
|
right: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.alert-validate:hover:before { |
||||||
|
visibility: visible; |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 992px) { |
||||||
|
.alert-validate::before { |
||||||
|
visibility: visible; |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*////////////////////////////////////////////////////////////////// |
||||||
|
[ Restyle Select2 ]*/ |
||||||
|
|
||||||
|
.select2-container { |
||||||
|
display: block; |
||||||
|
max-width: 100% !important; |
||||||
|
width: auto !important; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container .select2-selection--single { |
||||||
|
display: -webkit-box; |
||||||
|
display: -webkit-flex; |
||||||
|
display: -moz-box; |
||||||
|
display: -ms-flexbox; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
background-color: transparent; |
||||||
|
border: none; |
||||||
|
height: 40px; |
||||||
|
outline: none; |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ in select ]*/ |
||||||
|
.select2-container .select2-selection--single .select2-selection__rendered { |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 18px; |
||||||
|
color: #333333; |
||||||
|
line-height: 1.2; |
||||||
|
padding-left: 5px ; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--default .select2-selection--single .select2-selection__arrow { |
||||||
|
height: 100%; |
||||||
|
top: 50%; |
||||||
|
transform: translateY(-50%); |
||||||
|
right: 10px; |
||||||
|
display: -webkit-box; |
||||||
|
display: -webkit-flex; |
||||||
|
display: -moz-box; |
||||||
|
display: -ms-flexbox; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-selection__arrow b { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-selection__arrow::before { |
||||||
|
content: ''; |
||||||
|
display: block; |
||||||
|
|
||||||
|
border-right: 5px solid transparent; |
||||||
|
border-left: 5px solid transparent; |
||||||
|
border-bottom: 5px solid #999999; |
||||||
|
margin-bottom: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-selection__arrow::after { |
||||||
|
content: ''; |
||||||
|
display: block; |
||||||
|
|
||||||
|
border-right: 5px solid transparent; |
||||||
|
border-left: 5px solid transparent; |
||||||
|
border-top: 5px solid #999999; |
||||||
|
} |
||||||
|
|
||||||
|
/*------------------------------------------------------------------ |
||||||
|
[ Dropdown option ]*/ |
||||||
|
.select2-container--open .select2-dropdown { |
||||||
|
z-index: 1251; |
||||||
|
border: 0px solid #e5e5e5; |
||||||
|
border-radius: 0px; |
||||||
|
background-color: white; |
||||||
|
|
||||||
|
box-shadow: 0 3px 10px 0px rgba(0, 0, 0, 0.2); |
||||||
|
-moz-box-shadow: 0 3px 10px 0px rgba(0, 0, 0, 0.2); |
||||||
|
-webkit-box-shadow: 0 3px 10px 0px rgba(0, 0, 0, 0.2); |
||||||
|
-o-box-shadow: 0 3px 10px 0px rgba(0, 0, 0, 0.2); |
||||||
|
-ms-box-shadow: 0 3px 10px 0px rgba(0, 0, 0, 0.2); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-dropdown--above {top: -30px;} |
||||||
|
.select2-dropdown--below {top: 8px;} |
||||||
|
|
||||||
|
.select2-container .select2-results__option[aria-selected] { |
||||||
|
padding-top: 10px; |
||||||
|
padding-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container .select2-results__option[aria-selected="true"] { |
||||||
|
background: #a64bf4; |
||||||
|
background: -webkit-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: -o-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: -moz-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container .select2-results__option--highlighted[aria-selected] { |
||||||
|
background: #a64bf4; |
||||||
|
background: -webkit-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: -o-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: -moz-linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
background: linear-gradient(right, #00dbde, #fc00ff); |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-results__options { |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 15px; |
||||||
|
color: #333333; |
||||||
|
line-height: 1.2; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-search--dropdown .select2-search__field { |
||||||
|
border: 1px solid #aaa; |
||||||
|
outline: none; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
font-size: 15px; |
||||||
|
color: #333333; |
||||||
|
line-height: 1.2; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 31 KiB |
@ -0,0 +1,64 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
|
||||||
|
<head> |
||||||
|
<title>по следам анонимного деда мороза</title> |
||||||
|
<meta charset="UTF-8"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||||
|
<link rel="icon" type="image/png" href="images/icons/favicon.ico" /> |
||||||
|
<link href="//fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet"> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<div id="q"> |
||||||
|
<div class="container-contact100"> |
||||||
|
<div class="wrap-contact100"> |
||||||
|
<form id="q-form" class="contact100-form" validate-form> |
||||||
|
<span class="contact100-form-title"> |
||||||
|
предлагаю поиграть, простая игра пинг-понг, вводи ключ и понеслась! первому месту в рейтинге открывается |
||||||
|
скрытое знание. |
||||||
|
</span> |
||||||
|
|
||||||
|
<div class="wrap-input100 validate-input" data-validate="Нужен ключ"> |
||||||
|
<input class="input100" type="text" name="key" required> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="container-contact100-form-btn"> |
||||||
|
<div class="wrap-contact100-form-btn"> |
||||||
|
<div class="contact100-form-bgbtn"></div> |
||||||
|
<button class="contact100-form-btn" onclick="return playGame(this)"> |
||||||
|
<span> |
||||||
|
поехали |
||||||
|
</span> |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="a" class="hidden"> |
||||||
|
<div class="container-contact100"> |
||||||
|
<div id="game" class="wrap-contact100"> |
||||||
|
<canvas width="640" height="480" id="canvas"></canvas> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<script src="./js/main.js"></script> |
||||||
|
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics --> |
||||||
|
<script async src="//www.googletagmanager.com/gtag/js?id=UA-23581568-13"></script> |
||||||
|
<script> |
||||||
|
window.dataLayer = window.dataLayer || []; |
||||||
|
function gtag() { dataLayer.push(arguments); } |
||||||
|
gtag('js', new Date()); |
||||||
|
|
||||||
|
gtag('config', 'UA-23581568-13'); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,464 @@ |
|||||||
|
|
||||||
|
import jQuery from 'jquery'; |
||||||
|
|
||||||
|
import 'bootstrap'; |
||||||
|
import 'bootstrap/dist/css/bootstrap.css'; |
||||||
|
|
||||||
|
import '../css/main.css'; |
||||||
|
import '../css/util.css'; |
||||||
|
|
||||||
|
// RequestAnimFrame: a browser API for getting smooth animations
|
||||||
|
window.requestAnimFrame = (function () { |
||||||
|
return window.requestAnimationFrame || |
||||||
|
window.webkitRequestAnimationFrame || |
||||||
|
window.mozRequestAnimationFrame || |
||||||
|
window.oRequestAnimationFrame || |
||||||
|
window.msRequestAnimationFrame || |
||||||
|
function (callback) { |
||||||
|
return window.setTimeout(callback, 1000 / 60); |
||||||
|
}; |
||||||
|
})(); |
||||||
|
|
||||||
|
window.cancelRequestAnimFrame = (function () { |
||||||
|
return window.cancelAnimationFrame || |
||||||
|
window.webkitCancelRequestAnimationFrame || |
||||||
|
window.mozCancelRequestAnimationFrame || |
||||||
|
window.oCancelRequestAnimationFrame || |
||||||
|
window.msCancelRequestAnimationFrame || |
||||||
|
clearTimeout |
||||||
|
})(); |
||||||
|
|
||||||
|
(function ($) { |
||||||
|
"use strict"; |
||||||
|
|
||||||
|
var P = (function () { |
||||||
|
var PP = []; |
||||||
|
var A = function () { PP.push(null); }; |
||||||
|
var B = function () { return PP.length; }; |
||||||
|
var C = function () { PP = []; }; |
||||||
|
return { A: A, B: B, C: C }; |
||||||
|
})() |
||||||
|
|
||||||
|
var A = P.A, B = P.B, C = P.C; |
||||||
|
|
||||||
|
// Initialize canvas and required variables
|
||||||
|
var canvas = document.getElementById("canvas"), |
||||||
|
ctx = canvas.getContext("2d"), // Create canvas context
|
||||||
|
W = 640, // Window's width
|
||||||
|
H = 480, // Window's height
|
||||||
|
particles = [], // Array containing particles
|
||||||
|
ball = {}, // Ball object
|
||||||
|
paddles = [2], // Array containing two paddles
|
||||||
|
mouse = {}, // Mouse object to store it's current position
|
||||||
|
points = 0, // Varialbe to store points
|
||||||
|
fps = 60, // Max FPS (frames per second)
|
||||||
|
particlesCount = 20, // Number of sparks when ball strikes the paddle
|
||||||
|
flag = 0, // Flag variable which is changed on collision
|
||||||
|
particlePos = {}, // Object to contain the position of collision
|
||||||
|
multipler = 1, // Varialbe to control the direction of sparks
|
||||||
|
startBtn = {}, // Start button object
|
||||||
|
restartBtn = {}, // Restart button object
|
||||||
|
over = 0, // flag varialbe, cahnged when the game is over
|
||||||
|
init, // variable to initialize animation
|
||||||
|
paddleHit; |
||||||
|
|
||||||
|
// Add mousemove and mousedown events to the canvas
|
||||||
|
canvas.addEventListener("mousemove", trackPosition, true); |
||||||
|
canvas.addEventListener("mousedown", btnClick, true); |
||||||
|
|
||||||
|
// Initialise the collision sound
|
||||||
|
var collision = document.getElementById("collide"); |
||||||
|
|
||||||
|
// Set the canvas's height and width to full screen
|
||||||
|
canvas.width = W; |
||||||
|
canvas.height = H; |
||||||
|
|
||||||
|
// Function to paint canvas
|
||||||
|
function paintCanvas() { |
||||||
|
ctx.fillStyle = "black"; |
||||||
|
ctx.fillRect(0, 0, W, H); |
||||||
|
} |
||||||
|
|
||||||
|
// Function for creating paddles
|
||||||
|
function Paddle(pos) { |
||||||
|
// Height and width
|
||||||
|
this.h = 5; |
||||||
|
this.w = 150; |
||||||
|
|
||||||
|
// Paddle's position
|
||||||
|
this.x = W / 2 - this.w / 2; |
||||||
|
this.y = (pos == "top") ? 0 : H - this.h; |
||||||
|
} |
||||||
|
|
||||||
|
// Push two new paddles into the paddles[] array
|
||||||
|
paddles.push(new Paddle("bottom")); |
||||||
|
paddles.push(new Paddle("top")); |
||||||
|
|
||||||
|
// Ball object
|
||||||
|
ball = { |
||||||
|
x: 50, |
||||||
|
y: 50, |
||||||
|
r: 5, |
||||||
|
c: "green", |
||||||
|
vx: 4, |
||||||
|
vy: 8, |
||||||
|
|
||||||
|
// Function for drawing ball on canvas
|
||||||
|
draw: function () { |
||||||
|
ctx.beginPath(); |
||||||
|
ctx.fillStyle = this.c; |
||||||
|
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false); |
||||||
|
ctx.fill(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
// Start Button object
|
||||||
|
startBtn = { |
||||||
|
w: 100, |
||||||
|
h: 50, |
||||||
|
x: W / 2 - 50, |
||||||
|
y: H / 2 - 25, |
||||||
|
|
||||||
|
draw: function () { |
||||||
|
ctx.strokeStyle = "blue"; |
||||||
|
ctx.lineWidth = "2"; |
||||||
|
ctx.strokeRect(this.x, this.y, this.w, this.h); |
||||||
|
|
||||||
|
ctx.font = "18px Arial, sans-serif"; |
||||||
|
ctx.textAlign = "center"; |
||||||
|
ctx.textBaseline = "middle"; |
||||||
|
ctx.fillStlye = "Green"; |
||||||
|
ctx.fillText("Start", W / 2, H / 2); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// Restart Button object
|
||||||
|
restartBtn = { |
||||||
|
w: 100, |
||||||
|
h: 50, |
||||||
|
x: W / 2 - 50, |
||||||
|
y: H / 2 - 50, |
||||||
|
|
||||||
|
draw: function () { |
||||||
|
ctx.strokeStyle = "green"; |
||||||
|
ctx.lineWidth = "2"; |
||||||
|
ctx.strokeRect(this.x, this.y, this.w, this.h); |
||||||
|
|
||||||
|
ctx.font = "18px Arial, sans-serif"; |
||||||
|
ctx.textAlign = "center"; |
||||||
|
ctx.textBaseline = "middle"; |
||||||
|
ctx.fillStlye = "white"; |
||||||
|
ctx.fillText("Restart", W / 2, H / 2 - 25); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// Function for creating particles object
|
||||||
|
function createParticles(x, y, m) { |
||||||
|
this.x = x || 0; |
||||||
|
this.y = y || 0; |
||||||
|
|
||||||
|
this.radius = 1.2; |
||||||
|
|
||||||
|
this.vx = -1.5 + Math.random() * 3; |
||||||
|
this.vy = m * Math.random() * 1.5; |
||||||
|
} |
||||||
|
|
||||||
|
// Draw everything on canvas
|
||||||
|
function draw() { |
||||||
|
paintCanvas(); |
||||||
|
for (var i = 0; i < paddles.length; i++) { |
||||||
|
var p = paddles[i]; |
||||||
|
|
||||||
|
ctx.fillStyle = "green"; |
||||||
|
ctx.fillRect(p.x, p.y, p.w, p.h); |
||||||
|
} |
||||||
|
|
||||||
|
ball.draw(); |
||||||
|
update(); |
||||||
|
} |
||||||
|
|
||||||
|
// Function to increase speed after every 5 points
|
||||||
|
function increaseSpd() { |
||||||
|
if (B() % 4 == 0) { |
||||||
|
if (Math.abs(ball.vx) < 15) { |
||||||
|
ball.vx += (ball.vx < 0) ? -1 : 1; |
||||||
|
ball.vy += (ball.vy < 0) ? -2 : 2; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Track the position of mouse cursor
|
||||||
|
function trackPosition(e) { |
||||||
|
mouse.x = e.offsetX; |
||||||
|
mouse.y = e.offsetY; |
||||||
|
} |
||||||
|
|
||||||
|
// Function to update positions, score and everything.
|
||||||
|
// Basically, the main game logic is defined here
|
||||||
|
function update() { |
||||||
|
|
||||||
|
// Update scores
|
||||||
|
updateScore(); |
||||||
|
|
||||||
|
// Move the paddles on mouse move
|
||||||
|
if (mouse.x && mouse.y) { |
||||||
|
for (var i = 1; i < paddles.length; i++) { |
||||||
|
var p = paddles[i]; |
||||||
|
p.x = mouse.x - p.w / 2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Move the ball
|
||||||
|
ball.x += ball.vx; |
||||||
|
ball.y += ball.vy; |
||||||
|
|
||||||
|
// Collision with paddles
|
||||||
|
var p1 = paddles[1]; |
||||||
|
var p2 = paddles[2]; |
||||||
|
|
||||||
|
// If the ball strikes with paddles,
|
||||||
|
// invert the y-velocity vector of ball,
|
||||||
|
// increment the points, play the collision sound,
|
||||||
|
// save collision's position so that sparks can be
|
||||||
|
// emitted from that position, set the flag variable,
|
||||||
|
// and change the multiplier
|
||||||
|
if (collides(ball, p1)) { |
||||||
|
collideAction(ball, p1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
else if (collides(ball, p2)) { |
||||||
|
collideAction(ball, p2); |
||||||
|
} |
||||||
|
|
||||||
|
else { |
||||||
|
// Collide with walls, If the ball hits the top/bottom,
|
||||||
|
// walls, run gameOver() function
|
||||||
|
if (ball.y + ball.r > H) { |
||||||
|
ball.y = H - ball.r; |
||||||
|
gameOver(); |
||||||
|
} |
||||||
|
|
||||||
|
else if (ball.y < 0) { |
||||||
|
ball.y = ball.r; |
||||||
|
gameOver(); |
||||||
|
} |
||||||
|
|
||||||
|
// If ball strikes the vertical walls, invert the
|
||||||
|
// x-velocity vector of ball
|
||||||
|
if (ball.x + ball.r > W) { |
||||||
|
ball.vx = -ball.vx; |
||||||
|
ball.x = W - ball.r; |
||||||
|
} |
||||||
|
|
||||||
|
else if (ball.x - ball.r < 0) { |
||||||
|
ball.vx = -ball.vx; |
||||||
|
ball.x = ball.r; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// If flag is set, push the particles
|
||||||
|
if (flag == 1) { |
||||||
|
for (var k = 0; k < particlesCount; k++) { |
||||||
|
particles.push(new createParticles(particlePos.x, particlePos.y, multipler)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Emit particles/sparks
|
||||||
|
emitParticles(); |
||||||
|
|
||||||
|
// reset flag
|
||||||
|
flag = 0; |
||||||
|
} |
||||||
|
|
||||||
|
//Function to check collision between ball and one of
|
||||||
|
//the paddles
|
||||||
|
function collides(b, p) { |
||||||
|
if (b.x + ball.r >= p.x && b.x - ball.r <= p.x + p.w) { |
||||||
|
if (b.y >= (p.y - p.h) && p.y > 0) { |
||||||
|
paddleHit = 1; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
else if (b.y <= p.h && p.y == 0) { |
||||||
|
paddleHit = 2; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
else return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//Do this when collides == true
|
||||||
|
function collideAction(ball, p) { |
||||||
|
ball.vy = -ball.vy; |
||||||
|
|
||||||
|
if (paddleHit == 1) { |
||||||
|
ball.y = p.y - p.h; |
||||||
|
particlePos.y = ball.y + ball.r; |
||||||
|
multipler = -1; |
||||||
|
} |
||||||
|
|
||||||
|
else if (paddleHit == 2) { |
||||||
|
ball.y = p.h + ball.r; |
||||||
|
particlePos.y = ball.y - ball.r; |
||||||
|
multipler = 1; |
||||||
|
} |
||||||
|
|
||||||
|
A(); |
||||||
|
increaseSpd(); |
||||||
|
|
||||||
|
if (collision) { |
||||||
|
if (B() > 0) |
||||||
|
collision.pause(); |
||||||
|
|
||||||
|
collision.currentTime = 0; |
||||||
|
collision.play(); |
||||||
|
} |
||||||
|
|
||||||
|
particlePos.x = ball.x; |
||||||
|
flag = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Function for emitting particles
|
||||||
|
function emitParticles() { |
||||||
|
for (var j = 0; j < particles.length; j++) { |
||||||
|
var par = particles[j]; |
||||||
|
|
||||||
|
ctx.beginPath(); |
||||||
|
ctx.fillStyle = "white"; |
||||||
|
if (par.radius > 0) { |
||||||
|
ctx.arc(par.x, par.y, par.radius, 0, Math.PI * 2, false); |
||||||
|
} |
||||||
|
ctx.fill(); |
||||||
|
|
||||||
|
par.x += par.vx; |
||||||
|
par.y += par.vy; |
||||||
|
|
||||||
|
// Reduce radius so that the particles die after a few seconds
|
||||||
|
par.radius = Math.max(par.radius - 0.05, 0.0); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Function for updating score
|
||||||
|
function updateScore() { |
||||||
|
ctx.fillStlye = "white"; |
||||||
|
ctx.font = "16px Arial, sans-serif"; |
||||||
|
ctx.textAlign = "left"; |
||||||
|
ctx.textBaseline = "top"; |
||||||
|
ctx.fillText("Score: " + B(), 20, 20); |
||||||
|
} |
||||||
|
|
||||||
|
// Function for running the whole animation
|
||||||
|
function animloop() { |
||||||
|
init = requestAnimFrame(animloop); |
||||||
|
draw(); |
||||||
|
} |
||||||
|
|
||||||
|
// Function to execute at startup
|
||||||
|
function startScreen() { |
||||||
|
draw(); |
||||||
|
startBtn.draw(); |
||||||
|
} |
||||||
|
|
||||||
|
// On button click (Restart and start)
|
||||||
|
function btnClick(e) { |
||||||
|
|
||||||
|
// Variables for storing mouse position on click
|
||||||
|
var mx = e.offsetX, |
||||||
|
my = e.offsetY; |
||||||
|
|
||||||
|
// Click start button
|
||||||
|
if (mx >= startBtn.x && mx <= startBtn.x + startBtn.w) { |
||||||
|
animloop(); |
||||||
|
|
||||||
|
// Devare the start button after clicking it
|
||||||
|
startBtn = {}; |
||||||
|
} |
||||||
|
|
||||||
|
// If the game is over, and the restart button is clicked
|
||||||
|
if (over == 1) { |
||||||
|
if (mx >= restartBtn.x && mx <= restartBtn.x + restartBtn.w) { |
||||||
|
ball.x = 20; |
||||||
|
ball.y = 20; |
||||||
|
ball.vx = 4; |
||||||
|
ball.vy = 8; |
||||||
|
animloop(); |
||||||
|
C(); |
||||||
|
|
||||||
|
over = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
window.gameOver = function () { |
||||||
|
ctx.fillStlye = "white"; |
||||||
|
ctx.font = "20px Roboto, sans-serif"; |
||||||
|
ctx.textAlign = "center"; |
||||||
|
ctx.textBaseline = "middle"; |
||||||
|
ctx.fillText("Сохраняю результат...", W / 2, H / 2 + 25); |
||||||
|
|
||||||
|
var key = sessionStorage.getItem("key"); |
||||||
|
|
||||||
|
fetch('//127.0.0.1:8081/answer/check', { |
||||||
|
method: 'POST', |
||||||
|
body: JSON.stringify({ key: key, score: B() }), |
||||||
|
}) |
||||||
|
.then(function (data) { return data.json() }) |
||||||
|
.catch(function () { }) |
||||||
|
.then(function (approval) { |
||||||
|
if (!approval) { |
||||||
|
ctx.fillText("Не удалось сохранить с этим ключем", W / 2, H / 2 + 65); |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
var top = approval.top; |
||||||
|
for (var i = 0; i < top.length; i++) { |
||||||
|
var score = top[i].Score; |
||||||
|
var name = top[i].Member.substr(20); |
||||||
|
ctx.fillText(name + " → " + score, W / 2, H / 2 - 150 + 20 * i); |
||||||
|
} |
||||||
|
|
||||||
|
var msg = approval.msg; |
||||||
|
for (var i = 0; i < msg.length; i++) { |
||||||
|
ctx.fillText(msg[i], W / 2, H / 2 + 65 + 20 * i); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
// Stop the Animation
|
||||||
|
cancelRequestAnimFrame(init); |
||||||
|
|
||||||
|
// Set the over flag
|
||||||
|
over = 1; |
||||||
|
|
||||||
|
// Show the restart button
|
||||||
|
restartBtn.draw(); |
||||||
|
} |
||||||
|
|
||||||
|
window.playGame = function (_this) { |
||||||
|
|
||||||
|
var key = $("#q-form").find("input[name='key']") |
||||||
|
|
||||||
|
if (!key.val().trim().length) { |
||||||
|
key.parent().addClass("alert-validate"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
sessionStorage.setItem("key", key.val().trim()); |
||||||
|
|
||||||
|
var q = $("#q"); |
||||||
|
var a = $("#a"); |
||||||
|
|
||||||
|
q.addClass("hidden"); |
||||||
|
a.removeClass("hidden"); |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
startScreen(); |
||||||
|
|
||||||
|
})(jQuery); |
Loading…
Reference in new issue