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

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

用JS實現飛機大戰小游戲

瀏覽:157日期:2024-03-23 10:08:03

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

小的時候玩的飛機大戰感覺還蠻神奇,今天自己就學著做了一個

先制作好要做好的幾步以及背景樣式

var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var start = 0; // 開始階段 var starting = 1; // 開始的加載階段 var running = 2; // 游戲階段 var pause = 3; // 暫停階段 var gameover = 4; // 結束階段 var state = start; // 目前狀態 var width = canvas.width; // 獲取畫布的寬度 var height = canvas.height; // 獲取畫布的高度 var score = 0; // 分數 var life = 3; // 我放飛機生命值 var bg = new Image(); // 創建背景圖片 bg.src = 'http://m.b3g6.com/bcjs/img/background.png'; var BG = {imgs: bg,width: 480,height: 852, }; // 創建生成背景圖片的構造函數 function Bg(config) { // 參數為BG對象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() { //分別繪制了兩張背景圖 ctx.drawImage(this.imgs, this.x1, this.y1); ctx.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; }} }; // 創建背景圖片對象 var sky = new Bg(BG); // 生成游戲名文字 var logo = new Image(); logo.src = 'http://m.b3g6.com/bcjs/img/start.png'; // 游戲加載過程的4張圖片存入一個數組中 var loadings = []; loadings[0] = new Image(); loadings[0].src = 'http://m.b3g6.com/bcjs/img/game_loading1.png'; loadings[1] = new Image(); loadings[1].src = 'http://m.b3g6.com/bcjs/img/game_loading2.png'; loadings[2] = new Image(); loadings[2].src = 'http://m.b3g6.com/bcjs/img/game_loading3.png'; loadings[3] = new Image(); loadings[3].src = 'http://m.b3g6.com/bcjs/img/game_loading4.png'; var LOADING = {imges: loadings,length: loadings.length,width: 186,height: 38, }; // 構造函數 function Loading(config) {this.imges = config.imges;this.length = config.length;this.width = config.width;this.height = config.height;this.startIndex = 0; // 用于判斷需要顯示的圖片是哪個// 繪制方法this.paint = function() { ctx.drawImage(this.imges[this.startIndex], 0, height - this.height)};this.time = 0; // 加載時圖片切換速度// 圖片切換方法this.step = function() { this.time++; if (this.time % 4 === 0) {this.startIndex++; } if (this.startIndex === this.length) {// 加載階段結束,進入游戲階段state = running; }} }; // 創建加載階段的對象var loading = new Loading(LOADING);

在制作我方飛機

// 我方飛機 var heros = []; heros[0] = new Image(); heros[0].src = 'http://m.b3g6.com/bcjs/img/hero1.png'; heros[1] = new Image(); heros[1].src = 'http://m.b3g6.com/bcjs/img/hero2.png'; heros[2] = new Image(); heros[2].src = 'http://m.b3g6.com/bcjs/img/hero_blowup_n1.png'; heros[3] = new Image(); heros[3].src = 'http://m.b3g6.com/bcjs/img/hero_blowup_n2.png'; heros[4] = new Image(); heros[4].src = 'http://m.b3g6.com/bcjs/img/hero_blowup_n3.png'; heros[5] = new Image(); heros[5].src = 'http://m.b3g6.com/bcjs/img/hero_blowup_n4.png'; var HEROS = {imgs: heros,length: heros.length,width: 99,height: 124,frame: 2 }; // 我方飛機的構造函數 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 - this.height;// 定義飛機撞擊的標志,表示飛機沒有被撞擊this.down = false;// 定義飛機是否爆破完成,表示飛機還沒有完全爆炸this.candel = false;// 繪制方法this.paint = function() { ctx.drawImage(this.imgs[this.startIndex], this.x, this.y)};// 我方飛機運動方法this.step = function() { if (!this.down) { // 飛機正常狀態if (this.startIndex === 0) { this.startIndex = 1;} else { this.startIndex = 0} } else { // 爆炸狀態this.startIndex++;if (this.startIndex === this.length) { // 判斷是否炸完了 // 炸完了,命-1 life--; if (life === 0) { // 判斷是否掛了state = gameover;this.startIndex = this.length - 1; } else { // 重新開始新生命hero = new Hero(HEROS) }} }};// 我方飛機碰撞this.bang = function() { this.down = true;};

繪制子彈狀態

var bullet = new Image(); bullet.src = 'http://m.b3g6.com/bcjs/img/bullet1.png'; // 初始化 var BULLETS = {imgs: bullet,width: 9,height: 21, }; // 創建子彈的構造函數 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() { ctx.drawImage(this.imgs, this.x, this.y)};// 運動方法this.step = function() { this.y -= 10;};this.candel = false; // 用于判斷子彈是否碰撞// 子彈碰撞方法this.bang = function() { this.candel = true;} }; // 所有new的子彈對象放到一個數組 var bullets = []; // 遍歷繪制子彈 function bulletdPaint() {for (var i = 0; i < bullets.length; i++) { bullets[i].paint();} }; // 遍歷調用子彈的運動; function bulletdStep() {for (var i = 0; i < bullets.length; i++) { bullets[i].step();} }; // 子彈的刪除函數 function bulletDel() {// 碰撞的時候刪除子彈// 超出畫布的高度,即負的子彈的高度for (var i = 0; i < bullets.length; i++) { if (bullets[i].candel || bullets[i].y < -bullets[i].height) {bullets.splice(i, 1) }} };

子彈跟隨飛機的移動而移動

// 子彈發射this.time = 0; // 設計速度初始為0this.shoot = function() { this.time++; if (this.time % 2 === 0) { // 每2步移動射擊一次bullets.push(new Bullet(BULLETS)) }}; }; // 創建我方飛機的對象實例 var hero = new Hero(HEROS); // 鼠標移動事件 canvas.onmousemove = function(event) {// console.log('onmousemove');var event = event || window.event;if (state == running) { //判斷當前游戲狀態 //把獲取到的頁面中的鼠標橫坐標的值賦給飛機的橫坐標(位置) hero.x = event.offsetX - hero.width / 2; //把獲取到的頁面中的鼠標縱坐標的值賦給飛機的縱坐標(位置) hero.y = event.offsetY - hero.height / 2;} };

繪制敵方飛機

// 敵方飛機的繪制 var enemy1 = []; //小飛機 enemy1[0] = new Image(); enemy1[0].src = 'http://m.b3g6.com/bcjs/img/enemy1.png'; enemy1[1] = new Image(); enemy1[1].src = ’img/enemy1_down1.png’; enemy1[2] = new Image(); enemy1[2].src = ’img/enemy1_down2.png’; enemy1[3] = new Image(); enemy1[3].src = ’img/enemy1_down3.png’; enemy1[4] = new Image(); enemy1[4].src = ’img/enemy1_down4.png’; var enemy2 = []; //中飛機 enemy2[0] = new Image(); enemy2[0].src = 'http://m.b3g6.com/bcjs/img/enemy2.png'; enemy2[1] = new Image(); enemy2[1].src = 'http://m.b3g6.com/bcjs/img/enemy2_down1.png'; enemy2[2] = new Image(); enemy2[2].src = 'http://m.b3g6.com/bcjs/img/enemy2_down2.png'; enemy2[3] = new Image(); enemy2[3].src = 'http://m.b3g6.com/bcjs/img/enemy2_down3.png'; enemy2[4] = new Image(); enemy2[4].src = 'http://m.b3g6.com/bcjs/img/enemy2_down4.png'; var enemy3 = []; //大飛機 enemy3[0] = new Image(); enemy3[0].src = 'http://m.b3g6.com/bcjs/img/enemy3_n1.png'; enemy3[1] = new Image(); enemy3[1].src = 'http://m.b3g6.com/bcjs/img/enemy3_n2.png'; enemy3[2] = new Image(); enemy3[2].src = 'http://m.b3g6.com/bcjs/img/enemy3_down1.png'; enemy3[3] = new Image(); enemy3[3].src = 'http://m.b3g6.com/bcjs/img/enemy3_down2.png'; enemy3[4] = new Image(); enemy3[4].src = 'http://m.b3g6.com/bcjs/img/enemy3_down3.png'; enemy3[5] = new Image(); enemy3[5].src = 'http://m.b3g6.com/bcjs/img/enemy3_down4.png'; enemy3[6] = new Image(); enemy3[6].src = 'http://m.b3g6.com/bcjs/img/enemy3_down5.png'; enemy3[7] = new Image(); enemy3[7].src = 'http://m.b3g6.com/bcjs/img/enemy3_down6.png'; // 初始化數據 var ENEMY1 = {imgs: enemy1,length: enemy1.length,width: 57,height: 51,type: 1,frame: 2,life: 1,score: 1, }; var ENEMY2 = {imgs: enemy2,length: enemy2.length,width: 69,height: 95,type: 2,frame: 2,life: 5,score: 5, }; var ENEMY3 = {imgs: enemy3,length: enemy3.length,width: 165,height: 261,type: 3,frame: 2,life: 15,score: 20, }; // 敵方飛機的構造函數 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.x = Math.random() * (width - this.width);this.y = -this.height;this.startIndex = 0; // 用于判斷的下標this.down = false; // 用于判斷是否碰撞this.candel = false; // 用于判斷是否爆炸完成//繪制方法this.paint = function() { ctx.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.checkHit = function(wo) { //判斷四個邊 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;};//敵方飛機碰撞后this.bang = function() { this.life--; if (this.life === 0) {this.down = true;score += this.score; }} }; // 數組存放敵方飛機 var enemise = []; // 往敵方飛機數組中添加數據 function enterEnemise() {var rand = Math.floor(Math.random() * 100)if (rand < 10) { // 添加小飛機 enemise.push(new Enemy(ENEMY1));} else if (rand < 55 && rand > 50) { // 添加中飛機 enemise.push(new Enemy(ENEMY2));} else if (rand === 88) { // 添加大飛機 if (enemise[0].type !== 3 && enemise.length > 0) {enemise.splice(0, 0, new Enemy(ENEMY3)); }} }; // 繪制敵方飛機函數 function enemyPaint() {for (var i = 0; i < enemise.length; i++) { enemise[i].paint();} }; // 敵方飛機的運動函數 function enemyStep() {for (var i = 0; i < enemise.length; i++) { enemise[i].step();} }; // 刪除敵方飛機函數 function delenemy() {for (var i = 0; i < enemise.length; i++) { // console.log(enemise[i].candel) if (enemise[i].y > height || enemise[i].candel) {enemise.splice(i, 1) }} }; // 碰撞以后的函數 function hitEnemise() {for (var i = 0; i < enemise.length; i++) { // 如果我放飛機撞到了敵方飛機以后 if (enemise[i].checkHit(hero)) {// 敵方飛機碰撞后,碰撞狀態改變enemise[i].bang();// 我方飛機碰撞后,碰撞狀態改變hero.bang(); }; // 子彈碰到敵方飛機 for (var j = 0; j < bullets.length; j++) {if (enemise[i].checkHit(bullets[j])) { enemise[i].bang(); // 子彈的碰撞后,碰撞狀態改變 bullets[j].bang();} }} };

最后的收尾階段

// 繪制分數和生命值 function scoreText() {ctx.font = '30px bold'ctx.fillText('score:' + score, 10, 30);ctx.fillText('life:' + life, 300, 30); }; // 游戲暫停的階段 canvas.onmouseout = function() {if (state === running) { state = pause;} }; // 調用畫布的鼠標移入事件 canvas.onmouseover = function() {if (state === pause) { state = running;} }; // 暫停圖片 var pause = new Image() pause.src = 'http://m.b3g6.com/bcjs/img/game_pause_nor.png'; // 游戲結束 function gameoverfn() {ctx.font = '50px bold'ctx.fillText('GAME OVER !!!', 80, 300);ctx.fillText('ONCE MORE !!!', 80, 400); }; // 畫布點擊事件 canvas.addEventListener('click', function(e) {p = getEventPosition(e);// 點擊畫布時,判斷游戲是否開始if (state === start) { state = starting;}console.log(123);// 重新開始游戲有問題???if (state === gameover) { if (p.y >= 350 && p.y < 450) {console.log(’你點擊了ONCE MORE !!!’);state = running; }} }); function getEventPosition(e) {var x, y;if (e.layerX || ev.layerX === 0) { x = e.layerX; y = e.layerY;} else if (e.offsetX || ev.offsetX === 0) { x = e.offsetX; y = e.offsetY;}return { x: x, y: y}; };

后面就是基本的每個階段的調用問題叻

setInterval(function() {//背景圖片無論在哪個狀態都有背景圖片以及它的動態效果sky.paint(); // 繪制背景sky.step(); // 背景動畫if (state === start) { // 第一階段 ctx.drawImage(logo, 35, 0)} else if (state === starting) { // 第二階段 loading.paint(); // 繪制背景 loading.step(); // 背景動畫} else if (state === running) { // 第三狀態 // 繪制我放飛機 hero.paint(); // 我方飛機的運動 hero.step(); // 我方飛機的射擊方法 hero.shoot(); // 子彈的繪制 bulletdPaint(); // 子彈的運動 bulletdStep(); // 子彈的刪除 bulletDel(); // 創建敵方飛機 enterEnemise(); // 繪制敵方飛機 enemyPaint(); // 繪制敵方飛機的運動 enemyStep(); // 刪除敵方飛機 delenemy(); // 判斷是否撞擊 hitEnemise(); // 繪制分數和生命值 scoreText()} else if (state === pause) { // 第四狀態 sky.paint(); // 繪制背景 sky.step(); // 背景動畫 // 繪制我放飛機 hero.paint(); // 子彈的繪制 bulletdPaint(); // 繪制敵方飛機 enemyPaint(); // 繪制分數和生命值 scoreText(); ctx.drawImage(pause, 220, 300)} else if (state === gameover) { // 第五狀態 sky.paint(); // 繪制背景 sky.step(); // 背景動畫 hero.paint(); // 子彈的繪制 bulletdPaint(); // 繪制敵方飛機 enemyPaint(); // 繪制分數和生命值 scoreText(); // 游戲結束 gameoverfn();} }, 10)})()

這個也就是飛機大戰的全部源碼了,僅供參考。

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

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品伊人| 精品高清久久| 国内精品福利| 欧美精品一二| 婷婷亚洲综合| 国产精品日本| 亚洲精品乱码日韩| 日本不卡一二三区黄网| 日本va欧美va精品发布| 国产乱子精品一区二区在线观看 | 视频一区中文字幕| 蜜桃久久精品一区二区| 亚洲一级大片| 国产日韩欧美| 97精品国产| 欧美日韩在线网站| 久久亚洲精品伦理| 日韩极品在线观看| 国产亚洲一区二区三区不卡| 欧美国产视频| av一区在线| 男女激情视频一区| 国产欧美日韩亚洲一区二区三区| 久久久久久色 | 丝袜av一区| 一本色道久久精品| 日本在线视频一区二区| 欧美xxxx性| 亚洲国内欧美| 日本色综合中文字幕| 国产极品一区| 久久婷婷久久| 男女激情视频一区| 久久影视三级福利片| 99久久精品网站| 亚洲三级视频| 精品久久久中文字幕| 免费观看不卡av| 日韩激情精品| 中文字幕高清在线播放| 夜夜嗨av一区二区三区网站四季av| 在线精品视频一区| 国产中文字幕一区二区三区| 99国产精品视频免费观看一公开| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美永久精品| 青青久久av| 日本亚洲三级在线| 国产传媒在线| 一区二区日韩免费看| 丰满少妇一区| 久久午夜影视| 国产精品毛片一区二区在线看| 99国产精品99久久久久久粉嫩| 欧美日一区二区三区在线观看国产免 | 国产精品网站在线看| 999国产精品视频| 日韩高清一级| 亚洲高清久久| 免费看久久久| 老司机精品久久| 成人国产精品| 日韩免费精品| 欧美在线亚洲| 精品视频一二| 最新亚洲国产| 久久精品国产68国产精品亚洲| 久久精品凹凸全集| 中文日韩在线| 日韩伦理一区| 国产精品高清一区二区| 黄色亚洲免费| 黑人精品一区| 国产精品亚洲二区| 丝袜国产日韩另类美女| 中文字幕色婷婷在线视频| 日韩欧美2区| 红桃视频国产精品| 亚洲成人不卡| 国产精品hd| 最近国产精品视频| 欧美久久精品一级c片| 日本精品黄色| 国产精品一区二区精品视频观看| 日韩中文字幕区一区有砖一区| www成人在线视频| 老司机精品视频网| 日韩欧乱色一区二区三区在线| 亚洲激情久久| 激情黄产视频在线免费观看| 国产精品久久久久av蜜臀| 午夜电影一区| 日韩在线播放一区二区| 九九综合在线| 日韩久久一区二区三区| 久久99影视| 国产欧美日韩在线观看视频| 亚洲精品伊人| 亚洲理论在线| 日韩有码av| 日韩精品91亚洲二区在线观看| 蜜桃av一区二区三区电影| re久久精品视频| 香蕉久久精品| 麻豆精品视频在线| 国产精品蜜月aⅴ在线| 91精品国产自产精品男人的天堂 | 亚洲精品三级| 中文字幕日韩高清在线| 亚洲综合国产| 日韩亚洲国产欧美| 中文日韩欧美| 丝袜亚洲另类欧美| 国产视频一区欧美| 欧美日韩精品一本二本三本 | 国产一区二区三区四区五区 | 久久婷婷激情| 日韩精品网站| 91精品啪在线观看国产18| 亚洲国产福利| 国产精品亚洲产品| 国产精品对白久久久久粗| 欧美日韩va| 久久69成人| 首页国产精品| 久久激情网站| 影音先锋国产精品| 视频一区视频二区在线观看| 亚洲欧洲日本mm| 亚洲一区二区三区高清不卡| 国产亚洲精品v| 久久国产精品久久w女人spa| 石原莉奈在线亚洲三区| 日本综合视频| 久久不见久久见中文字幕免费| 国产精品中文字幕制服诱惑| 免费亚洲一区| 伊人久久在线| 欧洲毛片在线视频免费观看| 玖玖玖国产精品| 欧美有码在线| 成人台湾亚洲精品一区二区| 亚洲一级少妇| 成人av二区| 亚洲日本在线观看视频| 欧美亚洲tv| 成人午夜毛片| 不卡一区2区| 青草久久视频| 久久精品99国产国产精| 精品国产午夜肉伦伦影院 | 国产精品久久久久久久久免费高清| 国产精品99久久免费| 精品视频在线观看网站| 神马久久午夜| 亚洲永久字幕| 免费久久精品视频| 国产精品18| 国精品一区二区三区| 亚洲美女91| 狠狠久久伊人| 欧美日韩国产精品一区二区亚洲| 亚洲18在线| 国产成人免费| 亚洲男女自偷自拍| 欧美a级一区二区| 伊人久久成人| 欧美激情91| 亚洲免费影视| 国产一区二区精品久| 亚洲欧美日韩综合国产aⅴ| 国产视频网站一区二区三区| 精品99在线| 国产亚洲电影| 国精品产品一区| 美女亚洲一区| 日韩精品中文字幕吗一区二区| 精品福利久久久| 亚洲欧美日韩国产一区二区| 久久成人高清| 久久香蕉精品| 亚洲日产国产精品| 久久成人av| 国产午夜精品一区二区三区欧美| 欧美影院精品| 婷婷亚洲综合| 久久超级碰碰| 激情婷婷久久| 国产精品22p| 日韩中文字幕不卡| 伊人久久在线| 久久激五月天综合精品| 欧美69视频| 国产精品99精品一区二区三区∴| 亚洲一级高清| 国产精久久一区二区| 在线视频免费在线观看一区二区| 老色鬼精品视频在线观看播放| 香蕉精品999视频一区二区| 另类欧美日韩国产在线|