【ife】任务二十八:行星与飞船(三)

来源:互联网 发布:java web 许令波 编辑:程序博客网 时间:2024/04/30 14:57
function addEventHandler(element, event, hanlder) {    if (element.addEventListener)        element.addEventListener(event, hanlder, false);    else if (element.attachEvent)        element.attachEvent("on" + event, hanlder);    else        element["on" + event] = hanlder;}var error = 0.1; var spaceships = [];window.onload = function() {var command = document.getElementById("command");var order = document.getElementById("order");var universe = document.getElementById("universe");addEventHandler(command, "click", function() {event.target.disable = "true";Commander.newSpaceship(event.target);});addEventHandler(order, "click", function() {event.target.disable = "true";switch(event.target.innerHTML) {case "开始飞行":Commander.beginToFly(event.target);break;case "停止飞行":Commander.stopToFly(event.target);break;case "销毁":Commander.destroy(event.target);break;}});}var Spaceship = function(id, speed, discharge, charge, powerStyle, energyStyle) {this.id = id,this.speed = speed,this.discharge = discharge,this.charge = charge,this.powerStyle = powerStyle,this.energyStyle = energyStyle,this.state = "stop",this.deg = 45,this.energy = 100,this.interval = null,this.energy_signal = null};Spaceship.prototype.powerSystem = function() {if (this.state == "fly") {var that = this;if (this.interval == null) {this.interval = setInterval(function() {that.energy -= that.discharge; if (that.energy < 0) {that.state = "stop";clearInterval(that.interval);that.interval = null;}document.getElementById("spaceship" + that.id).getElementsByTagName("span")[0].innerHTML = that.energy + "%";that.deg = (that.deg + that.speed) % 360;document.getElementById("spaceship" + that.id).style.transform = "rotate(" + that.deg + "deg)";}, 1000);}}else {clearInterval(this.interval);this.interval = null;}};Spaceship.prototype.energySystem = function() {this.energy += this.charge; if (this.energy > 100) this.energy = 100;document.getElementById("spaceship" + this.id).getElementsByTagName("span")[0].innerHTML = this.energy + "%";};Spaceship.prototype.distroySystem = function() {for (var i = 0; i < universe.getElementsByTagName("div").length; i++) {if (universe.getElementsByTagName("div")[i].innerHTML.toString()[0] == this.id) universe.removeChild(universe.getElementsByTagName("div")[i]); }for (var i = 0; i < spaceships.length; i++) { if (spaceships[i].id == this.id) {clearInterval(spaceships[i].energy_signal); clearInterval(spaceships[i].interval); spaceships.splice(i, 1); var tr = document.getElementById(this.id);tr.parentNode.removeChild(tr); break;}}};Spaceship.prototype.signalSystem = function(command) {var id = parseInt(command.slice(0,4), 2);var cmd = command.slice(4,8);if (this.id == id) {switch(cmd) {case "0001":this.state ="fly";this.powerSystem();this.energySystem();console.log(this.id + "号飞船接收到开始飞行命令");break;case "0010":this.state = "stop";this.powerSystem();this.energySystem();console.log(this.id + "号飞船接收到停止飞行命令");break;case "1100":this.state = "destroy";this.distroySystem();console.log(this.id + "号飞船接收到销毁命令");break;}}};Spaceship.prototype.signalLaynchSystem = function() {var cmd = "";switch(this.id) { case 1: cmd += "0001"; break;case 2: cmd += "0010"; break;case 3: cmd += "0011"; break;case 4: cmd += "0100"; break;}switch(this.state) { case "fly": cmd += "0001"; break;case "stop": cmd += "0010"; break;case "destroy": cmd += "1100"; break;}var num = this.energy.toString(2);var len = num.length; if (len < 8) { // 若不足8位需要补齐for (var i = 0; i < 8 - len; i++) num = "0" + num; } cmd += num;signalReceiver(cmd);};function signalReceiver(command) {var id = parseInt(command.slice(0,4), 2);var state = command.slice(4,8);var energy = parseInt(command.slice(8,16), 2);var obj = {}; obj.id = id;obj.energy = energy;switch(state) {case "0001": obj.state = '飞行中'; break;case "0010": obj.state = '停止'; break;case "1100": obj.state = '即将销毁'; break;}for (var i = 0; i < spaceships.length; i++) {if (spaceships[i].id == obj.id) {switch(spaceships[i].powerStyle) {case "forward": obj.powerStyle = '前进型'; break;case "rise": obj.powerStyle = '奔腾型'; break;case "exceed": obj.powerStyle = '超越型'; break;}switch(spaceships[i].energyStyle) {case "strength": obj.energyStyle = '劲量型'; break;case "light": obj.energyStyle = '光能型'; break;case "forever": obj.energyStyle = '永久型'; break;}break;}}var table = document.getElementsByTagName("table")[0];if (document.getElementById(obj.id) == undefined) {var text = document.createTextNode(obj.id + "号");var tr = document.createElement("tr");tr.setAttribute("id", obj.id);var td = document.createElement("td");td.appendChild(text);tr.appendChild(td);text = document.createTextNode(obj.powerStyle);td = document.createElement("td");td.appendChild(text);tr.appendChild(td);text = document.createTextNode(obj.energyStyle);td = document.createElement("td");td.appendChild(text);tr.appendChild(td);text = document.createTextNode(obj.state);td = document.createElement("td");td.appendChild(text);tr.appendChild(td);text = document.createTextNode(obj.energy + "%");td = document.createElement("td");td.appendChild(text);tr.appendChild(td);table.appendChild(tr);}else {var tr = document.getElementById(obj.id);tr.getElementsByTagName("td")[3].innerHTML = obj.state;tr.getElementsByTagName("td")[4].innerHTML = obj.energy + "%";}}var Commander = {newSpaceship: function() { var divs = universe.getElementsByTagName("div");var orders = order.getElementsByTagName("div");var power, energy;var speed, charge, discharge;var radio1 = document.getElementsByName("power");var radio2 = document.getElementsByName("energy");for (var i = 0; i < radio1.length; i++) {if (radio1[i].checked) {power = radio1[i].value;break;}}for (var i = 0; i < radio2.length; i++) {if (radio2[i].checked) {energy = radio2[i].value;break;}}switch(power) {case "forward": speed = 30; discharge = 5; break;case "rise": speed = 50; discharge = 7; break;case "exceed": speed = 80; discharge = 9; break;}switch(energy) {case "strength": charge = 2; break;case "light": charge = 3; break;case "forever": charge = 4; break;}if (orders.length < 4 ) {var newSpaceship = document.createElement("div");var newCommand = document.createElement("div");for (var i = 1; i <= 4; i++) {if (document.getElementById("spaceship" + i) == undefined)break;}var id = i;newSpaceship.innerHTML = id + "号-<span>100%</span>";newSpaceship.className = "spaceship";universe.appendChild(newSpaceship);newSpaceship.setAttribute("id", "spaceship" + id);newSpaceship.style.top = 90 - (id - 1) * 25 + "px"; newSpaceship.style.transformOrigin = "center" + " " + (135 + (id - 1) * 25) + "px"; newCommand.innerHTML = "<span>对" + id + "号飞船下达命令:</span><button>开始飞行</button><button>停止飞行</button><button>销毁</button>";order.appendChild(newCommand);var spaceship = new Spaceship(id, speed, discharge, charge, power, energy);    spaceships.push(spaceship);spaceship.energy_signal = setInterval(function() {spaceship.energySystem();spaceship.signalLaynchSystem();}, 1000);} else alert("创建失败,飞船数量已达上限4");},beginToFly: function(e) { var id = e.parentNode.firstChild.innerHTML.toString()[1];mediator('{"id":' + id +', "command": "fly"}');},stopToFly: function(e) { var id = e.parentNode.firstChild.innerHTML.toString()[1];mediator('{"id":' + id +', "command": "stop"}');},destroy: function(e) {var id = e.parentNode.firstChild.innerHTML.toString()[1];for (var i = 0; i < order.getElementsByTagName("div").length; i++) {if (order.getElementsByTagName("span")[i].innerHTML.toString()[1] == id) order.removeChild(order.getElementsByTagName("div")[i]);}mediator('{"id":' + id +', "command": "destroy"}');}}function mediator(jsonStr) {var jsonObj = JSON.parse(jsonStr);var cmd = ""; switch(jsonObj.id) {case 1: cmd += "0001"; break;case 2: cmd += "0010"; break;case 3: cmd += "0011"; break;case 4: cmd += "0100"; break;}switch(jsonObj.command) { case "fly": cmd += "0001"; break;case "stop": cmd += "0010"; break;case "destroy": cmd += "1100"; break;}var errorInterval = setInterval(function() {if (Math.random() > error) { clearInterval(errorInterval);var spaceship = [];for (var i = 0; i < spaceships.length; i++)     spaceship.push(spaceships[i]);for (var i = 0; i < spaceship.length; i++) {    if (typeof spaceship[i].signalSystem === "function")          spaceship[i].signalSystem(cmd);}}}, 300); }
1 0
原创粉丝点击