This article describes the cosmic fighter source code of JS mini-games and is shared with you for your reference. The specific introduction is as follows:
1. Game introduction:
This is a flying shooting game, vertical, with a total of six levels.
2. Game requirements:
1. The fighter can fire bullets, and the bullets can be upgraded by obtaining props.
2. The fighter can be placed in bombs, and the number of props can be obtained can be increased.
3. Fighter jets can accumulate power to attack.
4. There are three types of channels, namely, upgrade bullets, increase the number of bombs, and increase the number of fighter jets.
5. Each level has different music.
6. The fighter jet is shot down and then enters the battlefield, and is in a protected state.
7. Enemy aircraft AI design.
The game runs as shown in the figure below:
Click here to download the complete example code .
3. Javascript source code part:
/** Cosmic Fighter* Author: fdipzone* Date: 2013-02-12* Ver: 1.0*/window.onload = function(){ var gameimg = [ 'images/fighter.png', 'images/fighter_p.png', 'images/fighter_s.png', 'images/fighter_s.png', 'images/fighter_s.png', 'images/fighter_s.png', 'images/shot.png', 'images/destroy.png', 'images/destroy.png', 'images/enemy.png', 'images/bullet.png', 'images/gift.png', 'images/bomb.png', 'images/ 'images/boss1.png']; var callback = function(){ var gameplane = $('gameplane'); fighter.init(); fighter.bgmove(gameplane); } img_preload(gameimg, callback);};/** fighter class */var fighter = (function(){ var hiscore = 10000; // The highest score var score = 0; // The current score var fighter = 3; // The number of fighter var bombnum = 3; // The number of bombs var ft = null; // The fighter object var is_start = 0; // Whether the game has started var is_bombing = 0; // Is var is_lock = 1 in explosion; // Is var is_over = 0; // Is ended var is_clear = 0; // Is the screen clearing var is_pile = 0; // Is the power accumulation var is_protect = 0; // Is the status var pilenum = 0; // Is the power accumulation var ackey = {}; // Is the record key pressed var keypriority = {}; // The conflict key priority var gamekey = [37,38,39,40,83,65]; // The game's key var scoretag = [0,20,30,40,50,60,500]; // The score of different enemy aircraft var level = 1; // The level var power = 1; // The power of the fighter bullet var cheatcode = []; // Record cheat input var failures = 0; // The number of challenges failed// The boss data var bossdata = [ {'armor':500, 'left':136, 'top':-169, 'step':30}, {'armor':1000, 'left':136, 'step':30}, {'armor':2000, 'left':136, 'top':-169, 'step':30}, {'armor':2500, 'left':136, 'top':-169, 'step':30}, {'armor':3000, 'left':136, 'top':-169, 'step':30}, ]; // The enemy aircraft that appears var enemy enemy data = []; // The boss var curboss currently appears var curboss = null; // Level data var map = [ // level 1 { 'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 'ms2500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 12, -23, 190, 10]], 'ms9500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 100, -50, 10]], 'ms11500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms25000':[[3, 800, 3, -50, 340, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10]], 'ms25000':[[1, 10, 4, 150, -50, 280, 10]], 'ms25000':[[1, 10, 4, 150, -50, 280, 10]], 'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]], 'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms38000':[[1, 10, 11, -23, 10, 10]], 'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms45500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] }, // level 2 { 'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms3500':[[1, 10, 12, -23, 190, 10]], 'ms5500':[[3, 800, 2, 100, -50, 10]], 'ms7500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 100, -50, 10]], 'ms11500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms35000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10]], 'ms30000':[[3, 800, 5, 692, 90, -10]], 'ms35000':[[3, 800, 5, 692, 90, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms45500':[[1, 10, 11, -23, 10, 10]], 'ms45500':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms42500':[[3, 680, 1, -50, 70, 10], 'ms45500':[[3, 680, 1, -50, 70, 10]], 'ms45500':[[3, 800, 2, 50, -50, 10]], 'ms47500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] }, // level 3 { 'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 10]], 'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms3500':[[1, 10, 12, -23, 190, 10]], 'ms5500':[[3, 800, 2, 100, -50, 10]], 'ms7500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 100, -50, 10]], 'ms11500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10]], 'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]], 'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms38000':[[1, 10, 11, -23, 10, 10]], 'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms42500':[[3, 800, 2, 50, -50, 10]], 'ms42500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] }, // level 4 { 'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms3500':[[1, 10, 12, -23, 190, 10]], 'ms5500':[[3, 800, 2, 100, -50, 10]], 'ms7500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms11500':[[3, 800, 3, -50, 340, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms35000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10], 'ms30000':[[3, 800, 5, 692, 90, -10]], 'ms35000':[[3, 800, 5, 692, 90, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms45500':[[1, 10, 11, -23, 10, 10]], 'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms42500':[[3, 680, 1, -50, 70, 10], 'ms45500':[[3, 680, 1, -50, 220, 10]], 'ms45500':[[3, 800, 2, 50, -50, 10]], 'ms47500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] }, // level 5 { 'ms50':[[3, 680, 1, -50, 10],[3, 680, 1, -50, 290, 10]], 'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms3500':[[1, 10, 12, -23, 190, 10]], 'ms5500':[[3, 800, 2, 100, -50, 10]], 'ms7500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 100, -50, 10]], 'ms11500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10], 'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]], 'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms38000':[[1, 10, 11, -23, 10, 10]], 'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms45500':[[3, 800, 2, 50, -50, 10]], 'ms47500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] }, // level 6 { 'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 'ms7500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms3500':[[1, 10, 12, -23, 190, 10]], 'ms5500':[[3, 800, 2, 100, -50, 10]], 'ms7500':[[3, 800, 2, 200, 450, -10]], 'ms8000':[[1, 10, 11, -23, 100, 10]], 'ms9500':[[3, 800, 2, 100, -50, 10]], 'ms11500':[[3, 800, 2, 200, 450, -10]], 'ms13500':[[3, 800, 2, 100, -50, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10]], 'ms15500':[[3, 800, 3, -50, 30, 10]], 'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms35000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]], 'ms30000':[[3, 800, 5, 692, 90, -10]], 'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]], 'ms42500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 150, 450, -10]], 'ms49500':[[3, 800, 2, 50, -50, 10]], 'ms51500':[[3, 800, 2, 150, 450, -10]], 'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]], 'ms60000':[[3, 800, 3, -50, 30, 10]], 'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]], 'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]], 'ms71000':[[1, 10, 13, -23, 220, 10]], 'ms76000':[] } ]; // Initialize init = function(){ ft = $('fighter'); reset(); key_event(); } // Start the game start = function(){ is_clear = 0; is_protect = 0; disp(ft.id, 'show'); reset_fighter(); reset_pile(); process(); bgsound(level, true); bgchange(level); fighter_init(); } // Set event key_event = function(){ document.onkeydown = function(e){ var e = e || window.event; var curkey = e.keyCode || e. which || e.charCode; if(is_start==0){ if(cheatcode.length>12){ cheatcode.shift(); } cheatcode.push(curkey); // Record the cheatcode input by the user } if(is_start==1 && in_array(curkey,gamekey)){ if(ackey[curkey.toString()]==0 || typeof(ackey[curkey.toString()])=='undefined' || !in_array(curkey,[83,65])){ // Shooting and bombing block ackey[curkey.toString()] = 1; // save key down switch(curkey){ case 37: case 39: keypriority.left = curkey; // left right break; case 38: case 40: keypriority.top = curkey; // up down break; } }else{ return false; } } if(curkey==13 || is_start==1 && is_lock==0){ // game is start or key=13 switch(curkey){ case 13: // enter if(is_start==0){ is_start=1; disp('op', 'hide'); msg_show(); setTimeout(function(){ msg_hide(); cheat(); start(); }, 1500); } break; case 83: // shooting shot(); break; case 65: // bomb bomb(); break; } } } document.onkeyup = function(e){ var e = e || window.event; var curkey = e.keyCode || e. which || e.charCode; if(is_start==1 && in_array(curkey,gamekey)){ ackey[curkey.toString()] = 0; // release key down if(curkey==83){// Release the power attack if(is_pile==1){ pile_shot(); } reset_pile(); } } } } // Action executed by loop = function(){ var movestep = 5; // Move step size var et = setInterval(function(){ if(is_start==0 || is_lock==1){ clearInterval(et); } // Move if(ackey['37']==1 && (ackey['39']==0 || keypriority.left==37)){ // Priority judgment in conflict if(getPosition(ft,'left')<movestep){ setPosition(ft, 'left', 0); // left }else{ setPosition(ft, 'left', getPosition(ft,'left') - movestep); } } if(ackey['38']==1 && (ackey['40']==0 || keypriority.top==38)){ if(getPosition(ft, 'top')<movestep){ setPosition(ft, 'top', 0); // top }else{ setPosition(ft, 'top', getPosition(ft,'top') - movestep); } } if(ackey['39']==1 && (ackey['37']==0 || keypriority.left==39)){ if(400-(getPosition(ft,'left')+50)<movestep){ setPosition(ft, 'left', 350); //width-fighter.width }else{ setPosition(ft, 'left', getPosition(ft,'left') + movestep); } } if(ackey['40']==1 && (ackey['38']==0 || keypriority.top==40)){ if(640-(getPosition(ft,'top')+50)<movestep){ setPosition(ft, 'top', 590); // height-fighter.height }else{ setPosition(ft, 'top', getPosition(ft,'top') + movestep); } } // charge attack if(ackey['83']==1){ if(pilenum<1000){ pipeline = pipelineum + 20; }else if(is_pile==0){ is_pile = 1; if(is_protect==1){ setClass(ft, 'fighter_s'); }else{ setClass(ft, 'fighter_s'); } } } } } } } } } } }, 20); } // Fighter shooting shot = function(){ // Create bullet var bullet = document.createElement('div'); var offsetx; switch(power){ case 1: offsetx = 20; break; case 2: offsetx = 15; break; case 3: offsetx = 10; break; case 4: offsetx = 4; break; } setClass(bullet, 'shot' + power); // Set the initial position of the bullet setPosition(bullet, 'top', getPosition(ft, 'top')-30); setPosition(bullet, 'left', getPosition(ft, 'left') + offsetx); ft.parentNode.appendChild(bullet); // Set the bullet motion var et = setInterval(function(){ if(getPosition(bullet,'top')<=-30 || is_lock==1){ clearInterval(et); ft.parentNode.removeChild(bullet); // Release bullet} for(var i=0; i<enemydata.length; i++){ if(enemydata[i]!=null){ if(impact(bullet, enemydata[i])){ // Strike the enemy plane destroy(enemydata[i]); scoreup(enemydata[i].type); enemydata[i] = null; clearInterval(et); ft.parentNode.removeChild(bullet); } } } if(curboss!=null){ // boss battle if(impact(bullet, curboss['obj'])){ // Hit the boss curboss['armor']=parseInt(curboss['armor'])-power*10; clearInterval(et); ft.parentNode.removeChild(bullet); } } setPosition(bullet, 'top', getPosition(bullet, 'top')-15); }, 30) } // Causing shooting pile_shot = function(){ var pilebullet = document.createElement('div'); setClass(pilebullet, 'pileshot'); // Set the initial position of the bullet setPosition(pilebullet, 'top', getPosition(ft, 'top')-30); setPosition(pilebullet, 'left', getPosition(ft, 'left')); ft.parentNode.appendChild(pilebullet); var et = setInterval(function(){ if(getPosition(pilebullet,'top')<=-85 || is_lock==1){ clearInterval(et); ft.parentNode.removeChild(pilebullet); // Release the bullet} for(var i=0; i<enemydata.length; i++){ if(enemydata[i]!=null){ if(impact(pilebullet, enemydata[i])){ // Hit the enemy plane destroy(enemydata[i]); scoreup(enemydata[i].type); enemydata[i] = null; } } } if(curboss!=null){ // Boss war if(impact(pilebullet, curboss['obj'])){ // Hit the boss curboss['armor']=parseInt(curboss['armor'])-100; clearInterval(et); ft.parentNode.removeChild(pilebullet); // Release bullet} } setPosition(pilebullet, 'top', getPosition(pilebullet, 'top')-20); }, 30) } // Release bomb bomb = function(){ if(is_bombing==0 && bombnum>0){ // Not in the explosion and there are bomb count is_bombing = 1; bombnum --; setHtml('bombnum', bombnum); // Decrement by 1 var opacity = 100; setOpacity($('bomb'), opacity); disp('bomb', 'show'); // Clear all enemy planes and enemy bullets is_clear = 1; // Strike boss if(curboss!=null){ curboss['armor'] = parseInt(curboss['armor'])-300; } var step = 0; var et = setInterval(function(){ // Bomb effect if(step<11){ setBgPosition($('bomb'), 0, step*(-280)); }else{ clearInterval(et); disp('bomb', 'hide'); is_bombing = 0; is_clear = 0; } step ++; }, 70); } } // game process process = function(){ var leveldata = map[level-1], processed = 0, step = 10; var levelstep = 0; // Clear 0 for each level var et = setInterval(function(){ if(is_lock==0){ processed += step; if(attrcount(leveldata)>levelstep){ // This level has not been completed if(leveldata['ms'+processed]){ for(var i=0; i<leveldata['ms'+processed].length; i++){ var msdata = leveldata['ms'+processed][i]; create(msdata); } levelstep ++; // Progress} }else{ // This level has been completed, enter the boss battle bosswar(); clearInterval(et); } } if(is_over==1){ clearInterval(et); } }, step); } /* Create level elements/* msdata:{ num: the number of occurrences interval: interval: interval: type: type top: original top coordinate left: original left coordinate step: movement distance} */ create = function(msdata){ var num = msdata[0], interval = msdata[1], type = msdata[2], top = msdata[3], left = msdata[4], step = msdata[5]; var et = setInterval(function(){ if(num>0){ var enft = document.createElement('div'); setClass(enft, 'element' + type); enft.type = type; setPosition(enft, 'top', top); setPosition(enft, 'left', left); ft.parentNode.appendChild(enft); if(type<=10){ enemydata.push(enft); } route(enft, type, step); num--; }else{ clearInterval(et); } }, interval); } // Element motion track route = function(enft, type, step){ var et = null; switch(type){ case 1: // Curve var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step)); setPosition(enft, 'left', getPosition(enft,'left')+step); count<5? count++ : (count=0, step*=-1); if(getPosition(enft, 'top')>640 || is_over==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(enft); } impact_handle(enft, et); }else{ clearInterval(et); } }, 80); break; case 2: // horizontal var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'left', getPosition(enft,'left')+step); count<9? count++ : (count=0, attack(enft,1,17,47)); if(getPosition(enft,'left')>400 && step>0 || getPosition(enft,'left')<-50 && step<0 || is_over==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(enft); } impact_handle(enft, et); }else{ clearInterval(et); } }, 80); break; case 3: // Vertical var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+step); count<9? count++ : (count=0, attack(enft,1,17,47)); if(getPosition(enft,'top')>640 || is_over==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(enft); } impact_handle(enft, et); }else{ clearInterval(et); } }, 75); break; case 4: // left and right loop movement attack var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'left', getPosition(enft,'left')+step); count<10? count++ : (count=0, attack(enft,4,17,31)); if(getPosition(enft,'left')>=350 && step>0 || getPosition(enft,'left')<=0 && step<0){ step*=-1; } if(is_over==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(enft); } impact_handle(enft, et); }else{ clearInterval(et); } }, 80); break; case 5: // Attack from behind var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+step); count<9? count++ : (count=0, attack(enft,1,17,-17)); if(getPosition(enft,'top')<-32 || is_over==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(enft); } impact_handle(enft, et); }else{ clearInterval(et); } }, 75); break; case 11: // power gift var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step)); setPosition(enft, 'left', getPosition(enft,'left')+step); count<5? count++ : (count=0, step*=-1); if(getPosition(enft, 'top')>640 || is_over==1){ clearInterval(et); ft.parentNode.removeChild(enft); } if(impact(enft, ft) && is_lock==0){ // Reward collision with fighter powerup(); ft.parentNode.removeChild(enft); clearInterval(et); } }else{ clearInterval(et); } }, 80); break; case 12: // bomb gift var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step)); setPosition(enft, 'left', getPosition(enft,'left')+step); count<5? count++ : (count=0, step*=-1); if(getPosition(enft, 'top')>640 || is_over==1){ clearInterval(et); ft.parentNode.removeChild(enft); } if(impact(enft, ft) && is_lock==0){ // Reward collided with fighter bombup(); ft.parentNode.removeChild(enft); clearInterval(et); } }else{ clearInterval(et); } }, 80); break; case 13: // fighter gift var count = 0; et = setInterval(function(){ if(node_exist(enft)){ setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step)); setPosition(enft, 'left', getPosition(enft,'left')+step); count<5? count++ : (count=0, step*=-1); if(getPosition(enft, 'top')>640 || is_over==1){ clearInterval(et); ft.parentNode.removeChild(enft); } if(impact(enft, ft) && is_lock==0){ // Reward collision with fighterup(); ft.parentNode.removeChild(enft); clearInterval(et); } }else{ clearInterval(et); } }, 80); break; } } // Destroy destroy = function(dobj){ // dobj: the destroyed object var dest = document.createElement('div'); setClass(dest, 'destroy'); setPosition(dest, 'top', getPosition(dobj, 'top')); setPosition(dest, 'left', getPosition(dobj, 'left')); ft.parentNode.appendChild(dest); if(dobj.id=='fighter'){ // The fighter was hit disp(dobj.id, 'hide'); power = 1; bombnum = 3; fightnum--; setHtml('fightternum', fightnum); setHtml('bombnum', bombnum); is_lock = 1; }else{ dobj.parentNode.removeChild(dobj); } var step = 0; var et = setInterval(function(){ if(step<11){ setBgPosition(dest, step*(-48), 0); step++; }else{ if(dobj.id=='fighter'){ setTimeout(function(){ if(fightternum>0){ levelcontinue(); }else{ if(curboss!=null){ obj = curboss['obj']; obj.parentNode.removeChild(obj); } gameover(); //All fighters are hit, the game ends} },1000); } dest.parentNode.removeChild(dest); clearInterval(et); } }, 50); } // boss war bosswar = function(){ var boss = bossdata[level-1]; var bossft = document.createElement('div'); setClass(bossft, 'boss' + level); setPosition(bossft, 'left', boss['left']); setPosition(bossft, 'top', boss['top']); ft.parentNode.appendChild(bossft); curboss = {"armor":boss['armor'],"obj":bossft}; switch(level){ case 1: // boss 1 case 2: // boss 2 case 3: // boss 3 case 4: // boss 4 case 5: // boss 5 case 6: // boss 6 var step = -3; var count = 0; var et = setInterval(function(){ if(getPosition(bossft,'top')<50){ // boss enter setPosition(bossft, 'top', getPosition(bossft, 'top')+5); }else{ if(curboss['armor']<=0){ // boss over clearInterval(et); bossover(); }else{ if(step<0){ // left if(getPosition(bossft,'left')>10){ setPosition(bossft, 'left', getPosition(bossft, 'left')+step); }else{ step*=-1; } } if(step>0){ // Move right if(getPosition(bossft,'left')<260){ setPosition(bossft, 'left', getPosition(bossft, 'left')+step); }else{ step*=-1; } } if(count>=35 && count%35==0){ attack(bossft, 1, 30, 30); attack(bossft, 1, 80, 30); } if(count>=60 && count%60==0){ attack(bossft, 2, 15, 75); attack(bossft, 2, 105, 75); } if(count>=100 && count%100==0){ attack(bossft, 3, 60, 92); } count<8400? count++ : count=0; } } }, boss['step']); break; } } /* attack * obj enemy aircraft* type Attack type* left Bullet initial left * top Bullet initial top */ attack = function(obj, type, left, top){ if(is_lock==1){ return false; // If locked, don't shoot} var oleft = getPosition(obj, 'left')+left; var top = getPosition(obj, 'top')+top; switch(type){ case 1: //Attack at the fighter// The initial position of the bullet and the fighter's position var oppoint = {x:oleft+7, y:otop+7}; var dpoint = {x:getPosition(ft,'left')+25, y:getPosition(ft,'top')+25}; var p = vector(opoint, dpoint, 8); enftbullet('bullet', oleft, top, p[0], p[1], 35); break; case 2: //Straight attack var num = 3; var st = setInterval(function(){ if(num>0){ enftbullet('bullet', oleft, top, 0, 8, 35); num --; }else{ clearInterval(st); } }, 150); break; case 3: //Scatter attack var num = 3; var st = setInterval(function(){ if(num>0){ switch(num){ case 1: enftbullet('sbullet', oleft, top, 0, 8, 35); break; case 2: enftbullet('sbullet', oleft, topop, 3, 8, 35); break; case 3: enftbullet('sbullet', oleft, topop, -3, 8, 35); break; } num --; }else{ clearInterval(st); } }, 0); break; case 4: // Small scatter attack var num = 3; var st = setInterval(function(){ if(num>0){ switch(num){ case 1: enftbullet('bullet', oleft, topop, 0, 8, 35); break; case 2: enftbullet('bullet', oleft, top, 3, 8, 35); break; case 3: enftbullet('bullet', oleft, top, -3, 8, 35); break; } num --; }else{ clearInterval(st); } }, 0); break; } } /* enft bullet * type Bullet type* oleft,top Bullet initial position* left,top Bullet * speed */ enftbullet = function(type, oleft, top, left, top, speed){ var bullet = document.createElement('div'); setClass(bullet, type); setPosition(bullet, 'left', oleft); setPosition(bullet, 'top', top); ft.parentNode.appendChild(bullet); var et = setInterval(function(){ setPosition(bullet, 'top', getPosition(bullet,'top')+top); setPosition(bullet, 'left', getPosition(bullet,'left')+left); if(getPosition(bullet,'left')>400 || getPosition(bullet,'left')<-30 || getPosition(bullet,'top')<-30 || getPosition(bullet,'top')>640 || is_lock==1 || is_clear==1){ clearInterval(et); ft.parentNode.removeChild(bullet); } impact_handle(bullet, et); }, speed); } // boss over boss = function(){ obj = curboss['obj']; obj.parentNode.removeChild(obj); scoreup(6); // boss score var dest = document.createElement('div'); setClass(dest, 'destroyboss'); setPosition(dest, 'top', getPosition(obj, 'top')); setPosition(dest, 'left', getPosition(obj, 'left')); ft.parentNode.appendChild(dest); var step = 0; var et = setInterval(function(){ if(step<21){ setBgPosition(dest, step*(-150), 0); }else if(step==21){ dest.parentNode.removeChild(dest); }else if(step==50){ clearInterval(et); levelup(); } step++; }, 50); } // continue levelcontinue = function(){ reset_fighter(); disp(ft.id, 'show'); setProtect(); fighter_init(); } // pass level level = function(){ keypriority = {}; enemydata = []; curboss = null; level ++; bgsound('pass', false); var processed = 0; var et = setInterval(function(){ is_lock = 1; processed = processed + 15; if(getPosition(ft, 'top')>-50){ setPosition(ft, 'top', getPosition(ft, 'top')-15); } if(processed>=2500){ clearInterval(et); disp(ft.id, 'hide'); if(level<=map.length){ bgchange(0); msg_show(); setTimeout(function(){ msg_hide(); start(); }, 1500); }else{ gameclear(); // clearance} } } }, 25); } // update scoreup = function(type){ if(typeof(scoretag[type])!='undefined'){ score = score + scoretag[type] * level; setHtml('score', score); if(score > hiscore){ hiscore = score; setHtml('hiscore', hiscore); } } } // Bullet Upgrade Powerup = function(){ power = power+1>4? 4 : power+1; } // Bomb Increase Bombop = function(){ bombnum ++; setHtml('bombnum', bombnum); } // Fighter Increase Fighter Up = function(){ fighternum ++; setHtml('fightternum', fighternum); } // Protection status setProtect = function(){ is_protect = 1; if(is_pile==1){ setClass(ft, 'fighter_sp'); }else{ setClass(ft, 'fighter_p'); } setTimeout(function(){ is_protect = 0; if(is_pile==1){ setClass(ft, 'fighter_s'); }else{ setClass(ft, 'fighter'); } }, 3000) } // Collision processing impact_handle = function(obj, et){ // et timer if(impact(obj, ft) && is_lock==0){ // Collision generated if(is_protect==0){ destroy(ft); clearInterval(et); ft.parentNode.removeChild(obj); } } } // All clearance gameclear = function(){ is_over = 1; disp('gameclear', 'show'); setHtml('clearcon', 'Game Clear' + '<br>' + 'SCORE : ' + score); bgsound('clear', false); bgchange('clear'); setTimeout(function(){ bgsound(); init(); }, 16000); } // End of the game gameover = function(){ is_over = 1; disp('gameover', 'show'); setHtml('overcon', 'LEVEL : ' + level + '<br>' + 'SCORE : ' + score); bgsound('over', false); bgchange('over'); failtimes++; setTimeout(function(){ if(failtimes==3){ alert('Enter ↑ ↑ ↓ ← → ← → asas, start the game again, and there will be surprises^_^'); } bgsound(); init(); }, 8000); } // Show message msg_show = function(){ setHtml('level', 'LEVEL - ' + level); disp('level', 'show'); is_lock = 1; } // Hide message msg_hide = function(){ disp('level', 'hide'); } // Reset reset = function(){ is_start = 0; is_bombing = 0; is_lock = 1; is_over = 0; is_clear = 0; is_protect = 0; level = 1; power = 1; ackey = {}; keypriority = {}; enemydata = []; score = 0; fightenum = 3; bombnum = 3; setHtml('hiscore', hiscore); setHtml('score', score); setHtml('fightternum', fightenum); setHtml('bombnum', bombnum); reset_fighter(); reset_pile(); disp('op', 'show'); disp('gameover', 'hide'); disp('gameclear', 'hide'); bgchange(0); } // Reset fighter position reset_fighter = function(){ setPosition(ft, 'top', 640); setPosition(ft, 'left', 175); setClass(ft, 'fighter'); } // Reset charge reset_pile = function(){ is_pile = 0; pilenum = 0; if(is_protect==1){ setClass(ft, 'fighter_p'); } else{ setClass(ft, 'fighter'); } } // Fighter initialization fighter_init = function(){ var et = setInterval(function(){ if(getPosition(ft, 'top')>400){ setPosition(ft, 'top', getPosition(ft, 'top')-12); }else{ clearInterval(et); is_lock = 0; action(); } }, 30); } // Secret skill 30 life cheat = function(){ if(cheatcode.join(',')=='38,38,40,40,37,39,37,39,65,83,65,83,13'){ fightenum = 30; setHtml('fighternum', fightnum); } cheatcode = []; } // Background control bgmove = function(obj){ var step = 1; var et = setInterval(function(){ var bgpos = getBgPosition(obj); if(bgpos['top']==640){ setBgPosition(obj, 0, 0); // reset }else{ setBgPosition(obj, bgpos['left'], bgpos['top']+step); } }, 50); } // Background switching bgchange = function(file){ var obj = $('gameplane'); setClass(obj, 'gameplane bg'+file); } // Music control bgsound = function(file, loop){ var id = 'audioplayer'; if(typeof(file)!='undefined'){ if(typeof(loop)=='undefined'){ loop = false; } var audiofile = []; audiofile['mp3'] = 'music/' + file + '.mp3'; audiofile['ogg'] = 'music/' + file + '.ogg'; audioplayer(id, audiofile, loop); }else{ audioplayer(id); } } return this;})();I believe that the description in this article has certain reference value for everyone's JavaScript game design.