<!DOCTYPE HTML>
<html>
<head>
<title>letter-FishGame</title>
<style type="text/css">
html{
margin: 0;
padding: 0;
width: auto;
height: 100%; /*宽度自动*/
}
img{
padding: 0;
margin: 0;
}
div{
padding: 0;
margin: 0;
}
body{
background: url(img6/bk.jpg) no-repeat;
background-size: cover;
}
.main{
position: relative;
}
.logo{
position: fixed;
left: 35%;
top: 5%;
}
.one{
position: fixed;
left: 37%;
top: 60%;
}
.about{
padding-right: 80px;
}
.ab_content{
display: none;
position: absolute;
width: 200px;
}
.start{
}
.score{
margin: 0;
padding-top: 20px;
width: 170px;
height: 108px;
background: url("img6/35.png") no-repeat;
display: none;
position: fixed;
left: 1%;
top: 2%;
text-align: center;
font-weight: bold;
font-size: 45px;
}
.back{
display: none;
position: fixed;
left: : 2%;
bottom: 2%;
width: 7%;
min-width: 50px;
}
.two{
display: none;
position: fixed;
width: 10%;
right: 0;
bottom: 1%;
}
.stop{
width: 70%;
min-width: 50px;
}
.set{
width: 70%;
min-width: 50px;
}
.speed{
display: none;
width: 60%;
position: fixed;
left: 80%;
top: 48%;
}
.classic{
width: 15%;
}
.challenge{
width: 15%;
position: absolute;
top: 120%;
left: 0;
}
/*版本A:手动编写popo元素对应的css*/
.popo1,.popo2,.popo3,.popo4,.popo5,.popo6,.popo11,.popo12,.popo13,.popo14,.popo15,.popo16{
position: fixed;
width: 3%;
margin-left: 10%;
}
.popo1,.popo2,.popo3,.popo4,.popo5,.popo6{
bottom: 0;
}
.popo11,.popo12,.popo13,.popo14,.popo15,.popo16{
bottom: -50px;
}
.popo1,.popo11{
left: 2%;
}
.popo2,.popo12{
animation-timing-function: ease-in;
animation-delay: 1s;
left: 17%;
}
.popo3,.popo13{
animation-timing-function: ease;
left: 32%;
}
.popo4,.popo14{
animation-timing-function: ease-out;
animation-delay: 1s;
left: 47%;
}
.popo5,.popo15{
animation-timing-function: ease-in-out;
left: 62%;
}
.popo6,.popo16{
animation-delay: 1s;
left: 77%;
}
.po_move{
animation-name: popomove;
animation-duration: 10s;
animation-iteration-count: infinite;
}
.popo11,.popo13,.popo15{
animation-delay: 5s;
}
.popo12,.popo13,.popo16{
animation-delay: 6s;
}
@keyframes popomove{
from{
bottom: 0;
}
to{
bottom: 100%;
}
}
.fish{
width: 163px;
height: 117px;
background: url('img/yu7.gif') no-repeat;
color: black;
font-weight: bold;
font-size: 40px;
text-align: right;
padding: 0px;
position: fixed;
right: -163px;
}
.moveFish{
animation-name: moveFish;
animation-duration: 5s;
/*animation-iteration-count: infinite;*/
animation-timing-function: linear;
}
@keyframes moveFish{
from{
right: 0;
}
to{
right: 100%;
}
}
</style>
</head>
<body>
<div class="main">
<div class="one">
<img src="img6/36.png" class="logo">
<img src="img6/32.png" class="about" id="a">
<img src="img6/33.png" class="start" >
<img src="img6/30.png" class="ab_content">
</div>
<div class="two">
<img src="img6/11.png" class="set">
<img src="img6/10.png" class="stop">
</div>
<div class="speed">
<img src="img6/23.png" class="classic">
<img src="img6/24.png" class="challenge">
</div>
<div class="score"></div>
<img src="img6/9.png" class="back">
</div>
<div class="allFish">
</div>
<!--版本A:手动插入popo,并用animation元素制作动画效果-->
<div class="popo1 po_move" >
<img src="img6/qp5.png">
<img src="img6/qp6.png">
</div>
<div class="popo2 po_move" >
<img src="img6/qp6.png">
<img src="img6/qp7.png">
</div>
<div class="popo3 po_move" >
<img src="img6/qp7.png">
</div>
<div class="popo4 po_move" >
<img src="img6/qp7.png">
</div>
<div class="popo5 po_move" >
<img src="img6/qp5.png">
<img src="img6/qp6.png">
</div>
<div class="popo6 po_move" >
<img src="img6/qp6.png">
<img src="img6/qp7.png">
</div>
<div class="popo11 po_move" >
<img src="img6/qp5.png">
<img src="img6/qp6.png">
</div>
<div class="popo12 po_move" >
<img src="img6/qp6.png">
<img src="img6/qp7.png">
</div>
<div class="popo13 po_move" >
<img src="img6/qp7.png">
</div>
<div class="popo14 po_move" >
<img src="img6/qp7.png">
</div>
<div class="popo15 po_move" >
<img src="img6/qp5.png">
<img src="img6/qp6.png">
</div>
<div class="popo16 po_move" >
<img src="img6/qp6.png">
<img src="img6/qp7.png">
</div>
<script type="text/javascript">
var d1 = 0;
var d2 = 0;
var stop_switch = true;
var speed_switch = 'classic';
var ele_fish = new Array();
var ab_content = document.getElementsByClassName('ab_content');
var about = document.getElementsByClassName('about');
var start = document.getElementsByClassName('start');
var one = document.getElementsByClassName('one');
var two = document.getElementsByClassName('two');
var score = document.getElementsByClassName('score');
var back = document.getElementsByClassName('back');
var set = document.getElementsByClassName('set');
var classic = document.getElementsByClassName('classic');
var challenge = document.getElementsByClassName('challenge');
var stop = document.getElementsByClassName('stop');
var speed = document.getElementsByClassName('speed');
var popo = document.getElementsByClassName('popo');
var allFish = document.getElementsByClassName('allFish');
var fish = document.getElementsByClassName('fish');
var score_value = 0;
//鼠标移入时about的内容出现,移出时消失
about[0].addEventListener('mouseover',function(){
ab_content[0].style.cssText = 'display:block; right:95%; bottom:40%;';
},false);
about[0].addEventListener('mouseout',function () {
ab_content[0].style.cssText = 'display:none';
},false);
start[0].onclick = function(){
my_show([two[0],score[0],back[0]]);
my_hide([one[0]]);
game_classic();
score_value = 0;
score[0].innerHTML = score_value;
}
back[0].onclick = function(){
clearInterval(d1);
clearInterval(d2);
my_show([one[0]]);
my_hide([two[0],score[0],back[0],ab_content[0],speed[0]]);
allFish[0].innerHTML = '';
}
set[0].onclick = function(){
if (stop_switch){
clearInterval(d1);
clearInterval(d2);
for(var i=0;i<allFish[0].children.length;i++){
fish[i].style.animationPlayState = "paused";
}
my_show([speed[0]]);
stop_switch = false;
}
else{
for(var i=0;i<allFish[0].children.length;i++){
fish[i].style.animationPlayState = "running";
}
if(speed_switch == 'classic'){
game_classic();
}
else{
game_challenge();
}
my_hide([speed[0]]);
stop_switch = true;
}
}
classic[0].onclick = function(){
my_hide([speed[0]]);
allFish[0].innerHTML = '';
score_value = 0;
score[0].innerHTML = score_value;
game_classic();
speed_switch = 'classic';
stop_switch = true;
}
challenge[0].onclick = function(){
my_hide([speed[0]]);
allFish[0].innerHTML = '';
score_value = 0;
score[0].innerHTML = score_value;
game_challenge();
speed_switch = 'challenge';
stop_switch = true;
}
stop[0].onclick = function(){
if (stop_switch){
clearInterval(d1)
clearInterval(d2)
for(var i=0;i<allFish[0].children.length;i++){
fish[i].style.animationPlayState = "paused";
}
stop_switch = false;
}
else{
for(var i=0;i<allFish[0].children.length;i++){
fish[i].style.animationPlayState = "running";
}
if(speed_switch = 'classic'){
game_classic();
}
else{
game_challenge();
}
//game_classic();
stop_switch = true;
}
}
window.onkeydown = function(event){
var keyCode = event.keyCode; //返回点击的按键的字符代码
var key = String.fromCharCode(keyCode); //将按键的字符代码转换为字符串
var fish_value;
for (var i = 0; i < fish.length; i++) {
if(fish[i].innerHTML == key){
allFish[0].removeChild(fish[i]);
score_value += 10;
score[0].innerHTML = score_value;
}
}
}
function my_show(arr){
for(var i=0; i<arr.length ;i++){
arr[i].style.display = 'block';
}
}
function my_hide(arr){
for(var i=0;i<arr.length;i++){
arr[i].style.display = 'none';
}
}
function game_classic(){
d1 = setInterval(creatFish,1500);
}
function game_challenge(){
d2 = setInterval(creatFish,900);
}
function creatFish(){
var chars = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
var num = Math.random()*chars.length;
var randomNum = parseInt(num);
var randomChar = chars.charAt(randomNum);
var ele = document.createElement('div');
allFish[0].appendChild(ele);
ele.innerHTML = randomChar;
ele.classList.add('moveFish','fish');
var random_top = Math.random()*900;
ele.style.top = random_top + 'px';
if(allFish[0].children.length > 30) {
for (var i = 0; i < 10; i++) {
allFish[0].removeChild(fish[i]);
}
}
}
</script>
</body>
</html>
<!--
总结:本游戏是一个针对桌面的打字游戏,功能非常简单,
纯js,css,没有使用地第三方框架
大概思路如下:
1、设置每个按钮的事件,主要是点击后需要消失和显示元素,完成界面
2、设置鱼和气泡的动画,气泡的用了固定的div块去设计,也可以用动态js像做鱼一样去做
鱼在这里用了animation动画,还有一种动起来的方法就是不断去用js改变鱼的坐标,达到一个视觉移动的目的,但是那样做的话比较耗费资源,
而且连贯性不是很好,会有跳动的感觉
3、暂停设置的时候需要注意怎么让画面固定然后再恢复
4、设置按钮在点击时也需要画面静止,类似于停止按钮,所以两个函数大概相同,调用的一些元素属性有相同之处,这样造成点击了暂停后
再点击设置按钮时,会出现混乱现象,所以采用了公用开关设置
5、等级设置,这个比较简单,就是改变创建节点的时间
注意:创建节点时一点要有一个清除机制,这里采用了让最大节点数不超过31来控制,否则节点不断产生,如果玩家开始后没有键盘输入,浏览器就尴尬了
会造成节点过多卡死
还有一点就是无论什么代码都要提前想好代码结构,否则经常会出现代码之间前后矛盾现象,造成开发时间周期过长
使用到的函数:
document.getElementsByClassName();获取含有某个class样式的元素数组,看清楚,是数组,所以用的时候要加数组下标
setInterval(),固定时间调用参数函数,两个参数,第一个是被调用函数,第二个为设置固定时间
clearInval(),取消setInterval()设置的固定
animation是css中的动画,很好用。
-->
https://download.csdn.net/download/xiaopihaisal/10490070
资源下载页面 附图