日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

js實現飛機大戰游戲

瀏覽:217日期:2024-04-23 16:11:16

本文實例為大家分享了js實現飛機大戰游戲的具體代碼,供大家參考,具體內容如下

CSS部分的代碼:

<style> * { margin: 0px; padding: 0px; } canvas{ border: 1px solid #000; display: block; margin: auto; }</style>

JavaScript代碼:

<!-- 先創建一個畫布 --><canvas height='640'></canvas><script> var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); // 0游戲初始化 // 0.1定義游戲開始的五個階段 var START = 0; var STARTING = 1; var RUNNING = 2; var PAUSE = 3; var GAMEOVER = 4; // 0.2 定義一個自己的狀態,時刻去和上面的五個狀態作比較 // 0.3 頁面加載時 var state = START; // 0.4 背景圖片的寬和高 var WIDTH = 480; var HEIGHT = 640; // 0.5 定義分數 var score = 0; // 0.6 定義生命條數 var life = 3; // 1 游戲開始前 // 1.1 加載背景圖片 // 1.1.1 背景圖片的對象 var bg = new Image();// 創建一個背景圖片 bg.src = 'http://m.b3g6.com/bcjs/images/background.png'; // 1.1.2 背景圖片的數據 var BG = { imgs: bg, width: 480, height: 852 } // 1.1.3 背景圖片的構造函數 function Bg(config) { this.imgs = config.imgs; this.width = config.width; this.height = config.height; // 繪制圖片的坐標(兩張背景圖片進行輪流滑動) this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = -this.height; // 背景圖片繪制 this.paint = function () { context.drawImage(this.imgs, this.x1, this.y1); context.drawImage(this.imgs, this.x2, this.y2); } // 圖片的運動 this.step = function () { this.y1++; this.y2++; // 判斷圖片的臨界點 if (this.y1 == this.height) {this.y1 = -this.height; } if (this.y2 == this.height) {this.y2 = -this.height; } } } // 1.1.4創建對象 var sky = new Bg(BG); // console.log(sky); // 1.2 創建頁面加載時的飛機大戰圖片 var logo = new Image(); logo.src = 'http://m.b3g6.com/bcjs/images/start.png'; // 2.游戲開始前 // 2.1 開始前動畫的對象 var loadings = []; loadings[0] = new Image(); loadings[0].src = 'http://m.b3g6.com/bcjs/images/game_loading1.png'; loadings[1] = new Image(); loadings[1].src = 'http://m.b3g6.com/bcjs/images/game_loading2.png'; loadings[2] = new Image(); loadings[2].src = 'http://m.b3g6.com/bcjs/images/game_loading3.png'; loadings[3] = new Image(); loadings[3].src = 'http://m.b3g6.com/bcjs/images/game_loading4.png'; // 2.2 開始前加載的動畫圖片的數據 var LOADINGS = { imgs: loadings, length: loadings.length, width: 186, height: 38 } // 2.3 開始前動畫的構造函數 function Loading(config) { this.imgs = config.imgs; this.length = config.length; this.width = config.width; this.height = config.height; // 定義一個索引 this.startIndex = 0; // 繪制 this.paint = function () { context.drawImage(this.imgs[this.startIndex], 0, HEIGHT - this.height); } // 定義一個速度 this.time = 0; this.step = function () { this.time++; if (this.time % 3 == 0) { // 頁面加載時下面小飛機運行的速度this.startIndex++; } // 當動畫運行完成進入下一個階段 if (this.startIndex == this.length) {state = RUNNING; } } } // 2.4創建對象 var loading = new Loading(LOADINGS); // 2.5綁定時間 canvas.onclick = function () { if (state == START) { state = STARTING; } } // 3.1.1游戲開始時的圖片 var heros = []; heros[0] = new Image(); heros[0].src = 'http://m.b3g6.com/bcjs/images/hero1.png'; heros[1] = new Image(); heros[1].src = 'http://m.b3g6.com/bcjs/images/hero2.png'; heros[2] = new Image(); heros[2].src = 'http://m.b3g6.com/bcjs/images/hero_blowup_n1.png'; heros[3] = new Image(); heros[3].src = 'http://m.b3g6.com/bcjs/images/hero_blowup_n2.png'; heros[4] = new Image(); heros[4].src = 'http://m.b3g6.com/bcjs/images/hero_blowup_n3.png'; heros[5] = new Image(); heros[5].src = 'http://m.b3g6.com/bcjs/images/hero_blowup_n4.png'; // 3.1.2游戲開始時加載數據 var HEROS = { imgs: heros, length: heros.length, width: 99, height: 124, // 我方飛機有兩種狀態,增加標識 frame: 2 } // 3.1.3我方飛機的構造器 function Hero(config) { this.imgs = config.imgs; this.length = config.length; this.width = config.width; this.height = config.height; this.frame = config.frame; // 定義索引 this.startIndex = 0; // 繪制坐標 this.x = WIDTH / 2 - this.width / 2; this.y = HEIGHT - 150; // 增加標識符 this.down = false; //表示一直沒有撞擊 // 增加標識符 this.candel = false; //表示撞擊以后的動畫是否運行完成,完成以后的恢復運行的狀態 // 定義繪制方法 this.paint = function () { context.drawImage(this.imgs[this.startIndex], this.x, this.y) } // 定義運動的方法 this.step = function () { // 兩個狀態 // 1.正常運動狀態 // 2.碰撞以后的狀態 if (!this.down) {//正常運動狀態// 沒有發生撞擊的時候 一直在0和1之間切換this.startIndex++;this.startIndex = this.startIndex % 2; } else {//撞擊以后的狀態// 腳標就要不停的加1,模擬出從碰撞到爆炸完成的動畫this.startIndex++;// 判斷是否完成撞擊if (this.startIndex == this.length) { life--//爆炸一次生命值減1; if (life == 0) { state = GAMEOVER; // 如果死了,動畫保存最后一張爆破的照片 this.startIndex = this.length - 1; } else { hero = new Hero(HEROS); }} } } // 我方飛機增加射擊方法 this.time = 0; this.shoot = function () { this.time++; if (this.time % 2 == 0) {bullets.push(new Bullet(BULLET)); } } // 撞擊以后觸發 this.bang = function () { this.down = true; } } // 3.1.4我方飛機的對象 var hero = new Hero(HEROS); // 3.1.5綁定鼠標移動事件 canvas.onmousemove = function (e) { if (state == RUNNING) { var x = e.offsetX; var y = e.offsetY; hero.x = x - hero.width / 2; hero.y = y - hero.height / 2; } } // 3.2 繪制子彈 // 3.2.1 圖片 var bullet = new Image(); bullet.src = 'http://m.b3g6.com/bcjs/images/bullet1.png'; // 3.2.2數據 var BULLET = { imgs: bullet, width: 9, height: 21 } // 3.2.3 子彈的構造函數 function Bullet(config) { this.imgs = config.imgs; this.width = config.width; this.height = config.height; // 子彈坐標 this.x = hero.x + hero.width / 2 - this.width / 2; this.y = hero.y - this.height; // 繪制 this.paint = function () { context.drawImage(this.imgs, this.x, this.y); } // 運動 往上運動 this.step = function () { this.y -= 10; } this.candel = false;//表示撞擊以后的動畫是否運行完成,完成以后的恢復運行的狀態 this.bang = function () { this.candel = true; } } // 3.2.4 存放所有子彈 var bullets = []; // 3.2.5 繪制所有子彈 function bulletsPaint() { for (var i = 0; i < bullets.length; i++) { bullets[i].paint(); } } // 3.2.6 繪制所有子彈的運動 function bulletsStep() { for (var i = 0; i < bullets.length; i++) { bullets[i].step(); } } // 3.2.7 刪除子彈 function bulletsDel(){ for(var i = 0; i < bullets.length;i++){ if(bullets[i].y < -bullets[i].height || bullets[i].candel){ bullets.splice(i,1) } } // console.log(bullets) } // 3.3 敵方飛機 // 3.3.1 敵方飛機的圖片(3種) // 小號 var enemy1 = []; enemy1[0] = new Image(); enemy1[0].src = 'http://m.b3g6.com/bcjs/images/enemy1.png'; enemy1[1] = new Image(); enemy1[1].src = 'http://m.b3g6.com/bcjs/images/enemy1_down1.png'; enemy1[2] = new Image(); enemy1[2].src = 'http://m.b3g6.com/bcjs/images/enemy1_down2.png'; enemy1[3] = new Image(); enemy1[3].src = 'http://m.b3g6.com/bcjs/images/enemy1_down3.png'; enemy1[4] = new Image(); enemy1[4].src = 'http://m.b3g6.com/bcjs/images/enemy1_down4.png'; // 中號 var enemy2 = []; enemy2[0] = new Image(); enemy2[0].src = 'http://m.b3g6.com/bcjs/images/enemy2.png'; enemy2[1] = new Image(); enemy2[1].src = 'http://m.b3g6.com/bcjs/images/enemy2_down1.png'; enemy2[2] = new Image(); enemy2[2].src = 'http://m.b3g6.com/bcjs/images/enemy2_down2.png'; enemy2[3] = new Image(); enemy2[3].src = 'http://m.b3g6.com/bcjs/images/enemy2_down3.png'; enemy2[4] = new Image(); enemy2[4].src = 'http://m.b3g6.com/bcjs/images/enemy2_down4.png'; // 大號 var enemy3 = []; enemy3[0] = new Image(); enemy3[0].src = 'http://m.b3g6.com/bcjs/images/enemy3_n1.png'; enemy3[1] = new Image(); enemy3[1].src = 'http://m.b3g6.com/bcjs/images/enemy3_n2.png'; enemy3[2] = new Image(); enemy3[2].src = 'http://m.b3g6.com/bcjs/images/enemy3_down1.png'; enemy3[3] = new Image(); enemy3[3].src = 'http://m.b3g6.com/bcjs/images/enemy3_down2.png'; enemy3[4] = new Image(); enemy3[4].src = 'http://m.b3g6.com/bcjs/images/enemy3_down3.png'; enemy3[5] = new Image(); enemy3[5].src = 'http://m.b3g6.com/bcjs/images/enemy3_down4.png'; enemy3[6] = new Image(); enemy3[6].src = 'http://m.b3g6.com/bcjs/images/enemy3_down5.png'; enemy3[7] = new Image(); enemy3[7].src = 'http://m.b3g6.com/bcjs/images/enemy3_down6.png'; // 3.2.2 數據 var ENEMY1 = { imgs: enemy1, length: enemy1.length, width: 57, height: 51, type: 1, //增加標識符,區分飛機的種類。小號的設置成1 frame: 1, //增加標識符,1種狀態就為1,2種狀態就為2 life: 1, //增加標識符,被子彈打擊的次數 score: 1 //打倒一只的得分 } var ENEMY2 = { imgs: enemy2, length: enemy2.length, width: 69, height: 95, type: 2, //增加標識符,區分飛機的種類。中號的設置成2 frame: 1, //增加標識符,1種狀態就為1,2種狀態就為2 life: 3, //增加標識符,被子彈打擊的次數 score: 5 //打倒一只的得分 } var ENEMY3 = { imgs: enemy3, length: enemy3.length, width: 169, height: 258, type: 3, //增加標識符,區分飛機的種類。大號的設置成3 frame: 2, //增加標識符,,1種狀態就為1,2種狀態就為2 life: 10, //增加標識符,被子彈打擊的次數 score: 15 //打倒一只的得分 } // 3.3.3 構造函數 function Enemy(config) { this.imgs = config.imgs; this.length = config.length; this.width = config.width; this.height = config.height; this.type = config.type; this.frame = config.frame; this.life = config.life; this.score = config.score; // 圖片的索引 this.startIndex = 0 this.down = false; //表示一直沒有撞擊 this.candel = false; //表示撞擊以后的動畫是否運行完成,完成以后的恢復運行的狀態 // 繪制坐標 this.x = Math.random() * (WIDTH - this.width); this.y = -this.height; // 繪制的方法 this.paint = function () { context.drawImage(this.imgs[this.startIndex], this.x, this.y); } // 運動方法 this.step = function(){ if(!this.down){ //正常 // 小號的,中號 角標始終是0 // 大號的是在0和1之間切換 this.startIndex ++; this.startIndex = this.startIndex % this.frame; this.y += 2; }else { //爆炸 this.startIndex ++; if(this.startIndex == this.length){ this.candel = true; this.startIndex = this.length - 1; } } } // 爆炸的方法 this.bang = function(){ this.life -- ; if(this.life == 0){ this.down = true; score += this.score; } } // 檢測是否撞擊 this.checkHit = function(wo){ // 1.撞擊到子彈 // 2.撞擊到我方飛機 return wo.y + wo.height > this.y && wo.x + wo.width > this.x && wo.y < this.y + this.height && wo.x < this.x + this.width; } } // 3.3.4 創建數組 存儲敵方飛機 var enemies = []; // 3.3.5 創建飛機 function enterEnemies() { var num = Math.random(); if (num < 0.1) { enemies.push(new Enemy(ENEMY1)) } else if (num < 0.15) { enemies.push(new Enemy(ENEMY2)) } else if (num < 0.16) { enemies.push(new Enemy(ENEMY3)) } } // 3.3.6 繪制 function paintEnemies() { for (var i = 0; i < enemies.length; i++) { enemies[i].paint(); } } // 3.3.7 運動 function stepEnemies() { for (var i = 0; i < enemies.length; i++) { enemies[i].step(); } } // 3.3.8 刪除 function delEnemies(){ for(var i = 0;i < enemies.length;i++){ if(enemies[i].y > HEIGHT || enemies[i].candel){ enemies.splice(i,1) } } } // 3.4 檢測撞擊 function hitEnemies() { for (var i = 0; i < enemies.length; i++) { if (enemies[i].checkHit(hero)) {enemies[i].bang();hero.bang(); } for (var j = 0; j < bullets.length; j++) {if (enemies[i].checkHit(bullets[j])) { enemies[i].bang(); bullets[j].bang();} } } } // 3.5 我方飛機的生命和得分 function paintText(){ context.font = 'bold 30px 微軟雅黑'; context.fillText('SCORE:' + score,10,30); context.fillText('LIFE:' + life,380,30) } // 4.暫停階段 canvas.onmouseover=function(){ if(state==PAUSE){ state=RUNNING; } } canvas.onmouseout=function(){ if(state==RUNNING){ state=PAUSE; } } var pause=new Image(); pause.src='http://m.b3g6.com/bcjs/images/game_pause_nor.png' function paintdown(){ context.drawImage(pause,220,300) } // 5.gameover階段 function paintOver(){ context.font='bold 50px 微軟雅黑'; context.fillText('GAME OVER',110,300); } // 定時器加載,使圖片緩慢往下面移動 setInterval(function () { sky.paint(); sky.step(); if (state == START) { context.drawImage(logo, 40, 0);//繪制在正中間 } else if (state == STARTING) { loading.paint(); loading.step(); } else if (state == RUNNING) { hero.paint(); hero.step(); hero.shoot(); bulletsPaint(); bulletsStep(); bulletsDel(); enterEnemies(); paintEnemies(); stepEnemies(); delEnemies(); hitEnemies(); paintText(); }else if(state==PAUSE){ hero.paint(); bulletsPaint(); paintEnemies(); paintText(); paintdown(); }else if(state==GAMEOVER){ hero.paint(); bulletsPaint(); paintEnemies(); paintText(); paintdown(); paintOver(); } }, 100)</script>

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

java經典小游戲匯總

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩视频| 在线亚洲观看| 激情综合网站| 欧美天堂一区| 在线日韩中文| 国产精品xxxav免费视频| 欧美1区免费| 国产高清亚洲| 亚洲另类黄色| 欧美丝袜一区| 久久久久观看| 中文字幕亚洲在线观看| 日韩欧美精品一区| 日本欧美一区| 亚洲午夜91| 精品亚洲成人| 日本午夜精品一区二区三区电影| 欧美日韩精品一区二区视频| 久久国产免费看| 免费久久99精品国产自在现线| 9999国产精品| 国产精品啊啊啊| 亚洲97av| 国产一区白浆| 99视频精品视频高清免费| 久久不见久久见免费视频7 | 欧美偷窥清纯综合图区| 午夜欧美精品久久久久久久| 久久精品色播| 久久狠狠久久| 亚洲精品女人| 欧美专区18| 亚洲无线一线二线三线区别av| 国产一区二区三区天码| 欧美日韩黄网站| 亚洲三级毛片| 亚洲欧美日本日韩| 国户精品久久久久久久久久久不卡| 国产一区二区三区四区二区| 国产伦精品一区二区三区千人斩| 综合亚洲色图| 久久亚洲电影| 日韩视频在线一区二区三区| 国产盗摄——sm在线视频| 国产欧美一区二区三区国产幕精品 | 国产欧美在线观看免费| 久久亚洲国产精品一区二区| 精品一区欧美| 99精品视频在线观看免费播放| 岛国精品一区| 久久不卡日韩美女| 欧美日韩夜夜| 欧美亚洲福利| 欧美日韩中出| 久久精品av麻豆的观看方式| 色8久久久久| 亚洲理论在线| 婷婷久久免费视频| 亚洲三级精品| 亚洲日本久久| 亚洲aa在线| 日本成人在线网站| 日本成人在线不卡视频| 日韩福利视频网| 欧美综合社区国产| 日本视频中文字幕一区二区三区| 一区二区三区四区日韩| 丝袜亚洲精品中文字幕一区| 亚洲欧美日韩国产| 美女尤物久久精品| 香蕉久久久久久| 日韩av中文字幕一区二区 | 日本 国产 欧美色综合| 蜜桃91丨九色丨蝌蚪91桃色| 中文字幕视频精品一区二区三区| 亚洲专区视频| 欧美亚洲综合视频| 免费看一区二区三区| 久久精品国产999大香线蕉| 老鸭窝一区二区久久精品| 欧美a级一区二区| 高清一区二区三区av| 亚洲伊人av| 亚洲香蕉网站| 免费成人av在线播放| 日韩精品国产欧美| 欧美xxxx性| 蜜桃av.网站在线观看| 国产一区二区中文| 最新亚洲国产| 国产毛片精品| 日韩精品第一区| 在线看片不卡| 日韩精品一区二区三区中文在线| 国产精品中文字幕亚洲欧美| 国产一区二区三区黄网站| 日韩精品午夜| 亚洲五月综合| 你懂的国产精品| 日韩免费av| 亚洲视频www| 欧美日韩亚洲一区二区三区在线| 精品三级国产| 91久久国产| 亚洲另类黄色| 精品视频97| 免费黄色成人| 日韩一区二区三区免费视频| 麻豆精品视频在线观看免费| 日本高清不卡一区二区三区视频 | 久久久天天操| 亚洲狼人精品一区二区三区| 麻豆一区二区三| 黑丝美女一区二区| 人人爱人人干婷婷丁香亚洲| а√在线中文在线新版| 国产视频久久| 国产精品伦一区二区| 久久激情一区| 综合激情婷婷| 福利一区二区三区视频在线观看| 婷婷六月综合| 国产精品一区二区免费福利视频| 首页国产精品| 亚洲免费福利一区| 日本а中文在线天堂| 男女男精品视频网| 狠狠久久伊人| 综合在线一区| 欧美黄色网页| 91福利精品在线观看| 亚洲一级黄色| 麻豆久久久久久| 亚洲欧美日韩国产一区二区| 久久久久伊人| 男女男精品网站| 在线看片福利| 欧美日韩1区2区3区| 色88888久久久久久影院| 午夜精品影视国产一区在线麻豆| 91日韩免费| 亚洲乱码一区| 久久精品国内一区二区三区水蜜桃| 日本中文字幕一区二区| 91精品国产成人观看| 国产精品va| 亚洲一区二区日韩| av高清不卡| 国产精品毛片aⅴ一区二区三区| 欧美福利专区| 久久69成人| 午夜精品影视国产一区在线麻豆| 精精国产xxxx视频在线野外| 日韩高清在线观看一区二区| 欧美日一区二区| 欧美aⅴ一区二区三区视频| 亚洲一区国产| 在线精品亚洲欧美日韩国产| 欧美专区一区| 国产视频一区三区| se01亚洲视频| 国产精品1区在线| 一级成人国产| 女主播福利一区| 国产成人精品亚洲日本在线观看| 91精品在线免费视频| 国产精品视区| 欧美特黄一级大片| 电影91久久久| 国产精品一区二区三区av麻| 午夜在线视频观看日韩17c| 日韩国产综合| 久久一区视频| 国产麻豆一区二区三区精品视频| 亚洲我射av| 日韩视频免费| 久久婷婷激情| 激情黄产视频在线免费观看| 国产精品色在线网站| 午夜精品影视国产一区在线麻豆| 91久久中文| 蜜桃视频欧美| 欧美影院三区| 黄色aa久久| 精品国产亚洲一区二区三区大结局| 日本强好片久久久久久aaa| 欧美专区18| 亚洲视频播放| 亚洲一区二区三区高清| 国产精品7m凸凹视频分类| 久久精品国内一区二区三区水蜜桃| 91欧美国产| 国产在线观看www| 国产粉嫩在线观看| 国产精品777777在线播放| 久久国产精品免费一区二区三区| 日韩综合小视频| 色狠狠一区二区三区| 手机精品视频在线观看| 国产女优一区|