原生js实现火车变轨通行引导游戏代码
代码语言:html
所属分类:游戏
代码描述:原生js实现火车变轨通行引导游戏代码,在图中点击鼠标变动错乱的轨道让火车可以通行。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Coustard&display=block'>
<style>
body {
margin: 0;
background-color: #252021;
height: 100vh;
display: flex;
align-items: center;
text-transform: uppercase;
overflow: hidden;
}
.canvas-container {
position: relative;
width: 100vmin;
height: 100vmin;
display: block;
text-align: center;
margin: 0 auto;
}
.canvas-container a {
display: none;
position: absolute;
right: 5%;
top: 5%;
}
.canvas-container canvas {
height: 100%;
}
.modal {
position: absolute;
width: 130px;
height: 183px;
font-size: 14px;
background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/21151/ticket.svg);
background-repeat: no-repeat;
background-size: contain;
color: #019897;
text-align: center;
left: 50%;
top: 50%;
font-family: "Coustard", serif;
transform: translateX(-50%) translateY(-50%);
padding: 20px;
transition: 0.2s all;
}
.modal__gameover,
.modal__win {
display: none;
}
.modal__gameover .modal__title,
.modal__win .modal__title {
padding: 40px 0 25px;
}
.modal__loading {
display: none;
}
.game--active .canvas-container a {
display: block;
}
.game--active .modal {
pointer-events: none;
opacity: 0;
transform: translateX(-50%) translateY(0);
}
.game--over .modal__gameover {
display: block;
}
.game--over .modal__main,
.game--over .modal__win {
display: none;
}
.game--win .modal__win {
display: block;
}
.game--win .modal__gameover,
.game--win .modal__main {
display: none;
}
.game--loading .modal__main {
display: none;
}
.game--loading .modal__loading {
display: block;
}
.modal__title {
padding: 10px 0 17px;
margin: 0;
color: #f38073;
line-height: 1.1;
font-weight: normal;
}
.modal__text {
margin: 2.5em 0;
}
.modal__controls {
display: flex;
justify-content: center;
margin: 17px 0 10px;
}
.btn {
font-family: "Coustard", serif;
display: inline-block;
line-height: 40px;
background-color: #d8d1c6;
padding: 0 20px;
color: #252021;
cursor: pointer;
text-transform: none;
}
.btn:hover {
background-color: #c3b9a8;
}
input[type=range] {
-webkit-appearance: none;
background-color: transparent;
}
input[type=range]::-webkit-slider-runnable-track {
width: 129px;
height: 6px;
background-color: #01aead;
border: none;
border-radius: 3px;
}
input[type=range]::-moz-range-track {
width: 129px;
height: 6px;
background-color: #01aead;
border: none;
border-radius: 3px;
}
input[type=range]::-ms-track {
width: 129px;
height: 6px;
background-color: #01aead;
border: none;
border-radius: 3px;
margin: 5px 0;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background-color: #f38073;
margin-top: -5px;
}
input[type=range]::-moz-range-thumb {
-webkit-appearance: none;
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background-color: #f38073;
margin-top: -5px;
}
input[type=range]::-ms-thumb {
margin-top: 0;
}
/*input[type=range]::-ms-fill-lower {
background: #2a6495;
border: 0.2px solid #010101;
border-radius: 2.6px;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
input[type=range]::-ms-fill-upper {
background: #3071a9;
border: 0.2px solid #010101;
border-radius: 2.6px;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}*/
input[type=range]:focus {
outline: none;
}
input[type=range]:focus::-webkit-slider-runnable-track {
background-color: #016565;
}
input[type=range]:focus::-moz-range-track {
background-color: #016565;
}
</style>
</head>
<body class="game game--loading">
<div class="canvas-container"><a class="btn" onclick="finish()">Finished</a>
<canvas width="1380" height="1380"></canvas>
</div>
<div class="modal">
<div class="modal__content modal__main">
<h2 class="modal__title">Train Puzzle</h2>
<label>Difficulty
<input type="range" min="1" max="100" value="25" oninput="setSpeed(this)"/>
</label>
<div class="modal__controls"><a class="btn" onclick="playLevel(false, false)">Play</a></div>
</div>
<div class="modal__content modal__loading">
<h2 class="modal__title">Train Puzzle</h2>
<div class="modal__text">Loading...</div>
</div>
<div class="modal__content modal__gameover">
<h2 class="modal__title">Game Over</h2>
<div class="modal__controls"><a class="btn" onclick="gotoMenu()">Try again</a></div>
</div>
<div class="modal__content modal__win">
<h2 class="modal__title">Well done!</h2>
<div class="modal__controls"><a class="btn" onclick="gotoMenu()">Thanks</a></div>
</div>
</div>
<script>
const lerp = (norm, min, max) => {
return (max - min) * norm + min;
}
const norm = (value, min, max) => {
return (value - min) / (max - min);
}
const map = (value, sourceMin, sourceMax, destMin, destMax) => {
return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
}
const TileTypes = Object.freeze({
"upleft": 1,
"upright": 2,
"downleft": 3,
"downright": 4,
"horizontal": 5,
"vertical": 6,
"shadow": 7,
"blocker": 9
});
const Directions = Object.freeze({
"up": 1,
"right": 2,
"down": 3,
"left": 4
});
class Line {
constructor(startPos, endPos) {
this.startPos = startPos;
this.endPos = endPos;
}
isIntersecting(line) {
let det = (this.endPos.x - this.startPos.x) * (line.endPos.y - line.startPos.y) - (line.endPos.x - line.startPos.x) * (this.endPos.y - this.startPos.y),
gamma, lambda;
if (det === 0) {
return false;
} else {
lambda = ((line.endPos.y - line.startPos.y) * (line.endPos.x - this.startPos.x) + (line.startPos.x - line.endPos.x) * (line.endPos.y - this.startPos.y)) / det;
gamma = ((this.startPos.y - this.endPos.y) * (line.endPos.x - this.startPos.x) + (this.endPos.x - this.startPos.x) * (line.endPos.y - this.startPos.y)) / det;
return (0 < lambda &&a.........完整代码请登录后点击上方下载按钮下载查看
















网友评论0