📄 game.js
字号:
/*** transform the game_area ***/ /** ZOOM MODE **/
var sx, sy, tx, ty;
/*** Add your code here ***/
// calculate scaling factors
// calculate translating factors
tx = SCREEN_WIDTH/zoom - player.x * zoom;
if(tx > 0) tx = 0;
else if (tx < SCREEN_WIDTH - SCREEN_WIDTH * zoom)
tx = SCREEN_WIDTH - SCREEN_WIDTH * zoom;
ty = SCREEN_HEIGHT/zoom - player.y * zoom;
if (ty > 0) ty = 0;
else if (ty < SCREEN_HEIGHT - SCREEN_HEIGHT * zoom)
ty = SCREEN_HEIGHT - SCREEN_HEIGHT * zoom;
// transform the game_area
game_area.setAttribute("transform", "translate(" + tx + "," + ty + ") scale(" + zoom + "," + zoom + ")");
}
function set_zoom_level() {
zoom = 2.0;
set_level();
}
//creat monster
function create_monster(x, y, minx, maxx, step) {
var new_monster;
new_monster = SVGDoc.createElement("use");
new_monster.setAttribute("x", x);
new_monster.setAttribute("y", y);
new_monster.setAttribute("minx", minx);
new_monster.setAttribute("maxx", maxx);
new_monster.setAttribute("step", step);
new_monster.setAttributeNS(namespace, "xlink:href", "#monster");
monsters_group.appendChild(new_monster);
}
//to reduce the time
function time_remaining() {
time_text = SVGDoc.getElementById("timer").childNodes.item(0);
total_time--;
time_text.setData(total_time + " sec.");
if (total_time <= 0) {
clearInterval(interval);
clearInterval(timer);
play_sound("die_sound");
over_timer = setInterval("game_over_move()", 50);
}
}
function next_level() {
var cx, cy, x1, x2, y1, y2;
cx = player.x;
cy = player.y;
x1 = exit_x - 15;
y1 = exit_y - 15;
x2 = exit_x + 15;
y2 = exit_y + 15;
if (x1 <= cx && x2 >= cx && y1 <= cy && y2 >= cy) {
clearInterval(interval);
clearInterval(timer);
play_sound("end_sound");
if (!zoom_mode)
score += s_score*total_time;
else score += s_score*total_time*2;
score_text.setData(score);
level++;
set_level();
}
}
function set_level() {
start_up = SVGDoc.getElementById("start_up_page");
start_up.setAttribute("visibility","hidden");
// set all variables
player.SetPosition(PLAYER_INIT_X, PLAYER_INIT_Y);
total_time = 45;
total_time = total_time - (level-1)*10;
if (total_time <= 0)
total_time = 0;
laser_left = 20;
// show the status
time_text = SVGDoc.getElementById("timer").childNodes.item(0);
time_text.setData(total_time + " sec.");
level_text = SVGDoc.getElementById("level").childNodes.item(0);
level_text.setData("Level " + level);
leaer_left_text = SVGDoc.getElementById("laser_left").childNodes.item(0);
leaer_left_text.setData(laser_left);
score_text = SVGDoc.getElementById("score").childNodes.item(0);
score_text.setData(score);
cheat_text = SVGDoc.getElementById("cheat").childNodes.item(0);
cheat_text.setData("~NO~");
switch (cheat) {
case true:
cheat_text.setData("~YES~");
break;
case false:
cheat_text.setData("~NO~");
break;
}
//clear all monster
while (monsters_group.childNodes.length != 0) {
//alert("kill monster");
var monster = monsters_group.childNodes.item(0);
monsters_group.removeChild(monster);
}
while (lasers_group.childNodes.length != 0) {
//alert("kill monster");
var laser = lasers_group.childNodes.item(0);
lasers_group.removeChild(laser);
}
// create monster create_monster(x, y, minx, maxx, step)
create_monster(90, 7, 100, 90, 0); //at start point
create_monster(410, 65, 400, 520, 2); //near end point
create_monster(200, 147, 200, 200, 0); //under disappear 1
create_monster(380, 217,380, 380, 0); //near disappear 2
create_monster(30, 217, 30, 120, 2); //under monster 3
create_monster(300, 342, 300, 570, 10); //monster 6
var platforms = SVGDoc.getElementById("platforms_group");
for (var i = 0; i < platforms.childNodes.length; i++) {
floor = platforms.childNodes.item(i);
if (floor.getAttribute("type") == "disappearing") {
floor.setAttribute("visibility","visible");
floor.setAttribute("opacity",1);
}
else continue;
}
// Start up the game
game_start();
}
// move the monster
function move_monster() {
var x, x1, x2, minx, maxx, step, monster;
for (i=0; i<monsters_group.childNodes.length; i++) {
monster = monsters_group.childNodes.item(i);
step= parseFloat(monster.getAttribute("step"));
if (step==0) continue; //not a number
//get position of monster
x1 = parseFloat(monster.getAttribute("x"));
x2 = x1 + MONSTER_WIDTH;
minx = parseFloat(monster.getAttribute("minx"));
maxx = parseFloat(monster.getAttribute("maxx"));
x1 += step;
x2 += step;
// moving range of monster
if (x1 < minx) {
x1 = minx;
x2 = minx + MONSTER_WIDTH;
step *= -1;
}
if (x2 > maxx) {
x1 = maxx - MONSTER_WIDTH;
x2 = maxx;
step *= -1;
}
/* if (step<0)
monster.setAttribute("transform", "translate("+MONSTER_WIDTH+", 0) scale(1, 1)");
else
monster.setAttribute("transform", "translate("+MONSTER_WIDTH+", 0) scale(-1, 1)"); */
monster.setAttribute("x",x1);
monster.setAttribute("step",step);
}
}
// move the platform
function move_platform() {
var y1, y2, miny, maxy, step, floor;
var platforms = SVGDoc.getElementById("platforms_group");
for (var i = 0; i < platforms.childNodes.length; i++) {
floor = platforms.childNodes.item(i);
if (floor.nodeName == "line") {
step = parseFloat(floor.getAttribute("step"));
if (isNaN(step)) continue; //not a number
y2 = y1 = parseFloat(floor.getAttribute("y1"));
miny = parseFloat(floor.getAttribute("miny"));
maxy = parseFloat(floor.getAttribute("maxy"));
y2 = y1 += step;
if (y1 < miny) {
y2 = y1 = miny;
step *= -1;
}
if (y1 > maxy) {
y2 = y1 = maxy;
step *= -1;
}
floor.setAttribute("y1",y1);
floor.setAttribute("y2",y2);
floor.setAttribute("step",step);
var floor_width = parseFloat(floor.getStyle().getPropertyValue("stroke-width"))/2.0;
var distance = y1 - floor_width - player.bottom;
if (step < 0 && distance >= step
&& distance <=0
&& floor.getAttribute("x1") <= player.right
&& floor.getAttribute("x2") >= player.left) {
player.SetPosition(player.x, y1 - floor_width - player.height/2.0);
platform_found = true;
}
}
}
//for disappearing platform
for (i=0; i<platforms.childNodes.length; i++) {
var disappearing_platform = platforms.childNodes.item(i);
if (disappearing_platform.getAttribute("type") != "disappearing") {
continue;
}
else {
var opacity_value = parseFloat(disappearing_platform.getAttribute("opacity"));
var top = parseInt(disappearing_platform.getAttribute("y1")) - parseFloat(floor.getStyle().getPropertyValue("stroke-width")) / 2.0 ;
var left = parseInt(disappearing_platform.getAttribute("x1"));
var right = parseInt(disappearing_platform.getAttribute("x2"));
if ((top-player.bottom == 0) && (player.right > left) && (player.left < right)) {
opacity_value -= 0.1;
disappearing_platform.setAttribute("opacity",opacity_value);
if (opacity_value <= 0)
{
disappearing_platform.setAttribute("visibility", "hidden");
break;
}
}
}
}
//for sliding platform
for (i=0; i<platforms.childNodes.length; i++) {
var sliding_platform = platforms.childNodes.item(i);
var step_value = parseInt(sliding_platform.getAttribute("step_p"));
if (isNaN(step_value)
&& sliding_platform.getAttribute("type") != "sliding") {
continue;
}
else {
var top = parseInt(sliding_platform.getAttribute("y1")) - parseFloat(floor.getStyle().getPropertyValue("stroke-width")) / 2.0 ;
var left = parseInt(sliding_platform.getAttribute("x1"));
var right = parseInt(sliding_platform.getAttribute("x2"));
if ((top-player.bottom == 0) && (player.right > left) && (player.left < right)) {
player.SetPosition(player.x - step_value, player.y);
}
}
}
}
function play_sound(id){
//alert("here!!!");
SVGDoc.getElementById(id).endElement();
SVGDoc.getElementById(id).beginElement();
}
//--------------------------------Game over and Cookie part!!!!!
// SVG score board and cookies
var max_player = 10;
var separator = "|";
// ----- Class player_record -----
// a player record object and properties in a Javascript object
function player_record(name, score) {
this.name = name; // player's name
this.score = score; // player's score
}
// --------- functions -----------
// write a line of text in a 'text' element
// by adding 'tspan' element under the 'text' element
function svg_writeln(object_name, str1, str2) {
var x = parseFloat(object_name.getAttribute("x"));
var y = parseFloat(object_name.getAttribute("y"));
//alert(x + " " + y);
// create a text node, for holding the text "str"
var myData1 = SVGDoc.createTextNode(str1);
var myData2 = SVGDoc.createTextNode(str2);
// create a 'tspan' element
var mySpan1 = SVGDoc.createElement("tspan");
var mySpan2 = SVGDoc.createElement("tspan");
// set the properties of the 'tspan' element
mySpan1.setAttribute("x", x);
mySpan1.setAttribute("dx", "3em");
mySpan1.setAttribute("dy", "1em");
// set the properties of the 'tspan' element
mySpan2.setAttribute("x", x);
mySpan2.setAttribute("dx", "13em");
// add the text node to the 'tspan' element
mySpan1.appendChild(myData1);
mySpan2.appendChild(myData2);
// add the 'tspan' element to the text element
object_name.appendChild(mySpan1);
object_name.appendChild(mySpan2);
}
// show the players' score on the score board
function show_score_board(player_list) {
// get the SVG 'text' element inside the score board group
var score_board_text = SVGDoc.getElementById("score_board_text");
// print all the records to the score board
for (i=0; i< player_list.length ; i++) {
var str1 = player_list[i].name;
var str2 = player_list[i].score;
svg_writeln (score_board_text, str1, str2);
}
// set the score board to be visible
var score_board = SVGDoc.getElementById("score_board");
score_board.setAttribute("visibility", "visible");
}
// add a player record to the cookie file
function add_player_cookies(player_record, total) {
// expiration date, cookie expires in one year (actually, 365 days)
var now = new Date(); //now = expiry date
now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); //now = 1 year later
// ******* write your code here *******
// set the cookies
index = total - 1;
set_cookie("total", total, now);
set_cookie("player" + index, player_record.name + separator + player_record.score, now);
// for (i=0; i<total; i++)
// {
// set_cookie("player" + i, player_record[i].name + separator + player_record[i].score, now);
// }
}
// get all the players' record from cookie file
function get_players_cookies(player_list) {
// get the total number of player
var count = get_cookie("total");
if (count==null) // check if any cookies stored
count = 0;
else
count = parseInt(count);
// ******* write your code here *******
// get all the players' record from the cookies
for (i=0; i<count;i++) {
var mycookie = get_cookie("player" + i);
var mycookie_array = mycookie.split(separator);
player_name = mycookie_array[0];
player_score = parseInt(mycookie_array[1]);
var player = new player_record(player_name, player_score);
player_list.push(player);
}
}
// this function handles the cookies and score board when the game is over
function game_over() {
// An array to store all players' record
var player_list = new Array();
var p;
var player_name = null;
var player_score = score;
get_players_cookies(player_list); // load previous records
player_list.sort(compare_score);
if (player_list.length < max_player) {
player_name = prompt("What is your name?");
//player_score = Math.round(Math.random() * 100);
p = new player_record(player_name, player_score);
player_list.push(p);
add_player_cookies(p, player_list.length);
}
//if the score is in the top ten
if ((player_list.length >= max_player) && (player_list[max_player-1].score < player_score))
{
out = player_list.pop();
player_name = prompt("What is your name?");
p = new player_record(player_name, player_score);
player_list.push(p);
//add_player_cookies(p, player_list.length);
for (i=0; i<player_list.length; i++) {
set_player_cookies(player_list[i], i);
}
}
player_list.sort(compare_score);
show_score_board(player_list);
setTimeout("again()", 1000);
}
function again() {
if (confirm("Do you want to play again?"))
window.location.reload();
}
function compare_score (a,b) {
if (a.score > b.score) return -1;
if (a.score < b.score) return 1;
return 0;
}
function set_player_cookies(player_record, index) {
// expiration date, cookie expires in one year (actually, 365 days)
var now = new Date(); //now = expiry date
now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); //now = 1 year later
// set the cookies
set_cookie("player" + index, player_record.name + separator + player_record.score, now);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -