<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>非自走型tank!!!!</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> .map { background: gray; border: 1px solid black; position: relative; margin: 50px auto; width: 416px; height: 416px; } .tank { background-image: url("//images0.cnblogs.com/blog/294743/201306/12123133-eaa9ada8690e4216a2bee3e56442e032.gif"); background-repeat: no-repeat; overflow: hidden; position: absolute; width: 32px; height: 32px; z-index: 3; } </style> </head> <body> <div class="map" id="map"> <div id="me" class="tank"> </div> </div> <script type="text/javascript"> //js取不到样式表的值,暂时先这样 var MyGlobal = { mapWidth: 416, mapHeight: 416 }; var Tank = function (id, dir, x, y) {//div的id,方向,起始坐标 this.el = document.getElementById(id); this.direction = dir ? dir : 'up'; this.speed = 10;//越大越慢 //坦克活动状态 0 未活动 1 正在活动 this.activeState = 0; this.tid = null; this.x = x ? x : 100; this.y = y ? y : 200; }; Tank.prototype.init = function () {//tank生成位置 var dir = this.direction; var tank = this.el; tank.style['left'] = this.x + 'px'; tank.style['top'] = this.y + 'px'; this.setDirection(dir); }; Tank.prototype.setDirection = function (dir) {//tank方向图片 var tank = this.el; if (dir == 'up') { tank.style['backgroundPosition'] = '0 0'; } if (dir == 'right') { tank.style['backgroundPosition'] = '-5px -36px'; } if (dir == 'down') { tank.style['backgroundPosition'] = '0 -73px'; } if (dir == 'left') { tank.style['backgroundPosition'] = '0 -105px'; } }; Tank.prototype.move = function (dir) {//tank移动 if (this.activeState != 0) return false; //正在运动不管他 this.activeState = 1; //将当前状态设置为正在运动 if (this.direction != dir) {//转向 this.direction = dir; this.setDirection(dir); } var tank = this.el; //获得当前位置 var xpos = tank.style['left'] ? tank.style['left'] : 0; var ypos = tank.style['top'] ? tank.style['top'] : 0; xpos = parseInt(xpos); ypos = parseInt(ypos); //最大范围 var mx = MyGlobal.mapWidth - 32; var my = MyGlobal.mapHeight - 32; switch (dir) { case 'up': ypos <= 0 ? 0 : ypos--; break; case 'right': xpos >= mx ? mx : xpos++; break; case 'down': ypos >= my ? my : ypos++; break; case 'left': xpos <= 0 ? 0 : xpos--; break; } //重新设置坦克位置 tank.style['left'] = xpos + 'px'; tank.style['top'] = ypos + 'px'; //处理运动中的定时器 if (this.tid) { clearTimeout(this.tid); this.tid = null; } //为了移动得更平滑 this.x = xpos; this.y = ypos; var scope = this; var speed = this.speed; var repeat = function () { scope.move(dir); }; if (!this.tid) { this.tid = setTimeout(repeat, speed);//10毫秒移动一次 } //移动结束 this.activeState = 0; } Tank.prototype.stop = function () { clearTimeout(this.tid); this.tid = null; }; var tank = new Tank('me', 'right', 100, 100); tank.init(); function getDir(code) { if (code == '87' || code == '119') { return 'up'; } if (code == '100' || code == '68') { return 'right'; } if (code == '115' || code == '83') { return 'down'; } if (code == '97' || code == '65') { return 'left'; } return null; } document.onkeydown = function (evt) {//按下键盘 evt = (evt) ? evt : window.event; var keyCode = evt.keyCode; if (keyCode) { dir = getDir(keyCode.toString());//获得方向 } tank.setDirection(dir); if (dir) tank.move(dir);//移动 evt.preventDefault(); return false; }; document.onkeyup = function (evt) {//松开键盘 tank.stop(); }; document.onkeypress = function (evt) {//从按下到松开键盘 evt = (evt) ? evt : window.event; var keyCode = evt.keyCode; if (keyCode) { dir = getDir(keyCode.toString());//获得方向 } if (dir) tank.move(dir); evt.preventDefault(); return false; }; </script> </body> </html>