以不同的速度产生随机图像

时间:2015-02-23 09:03:38

标签: javascript arrays

我有一个太空射击游戏,飞机从屏幕顶部下来,这架飞机叫做enemy.png,但现在我想添加更多的敌人。但我不知道从哪里开始。 我想添加另一个名为enemy1.png的敌人。这个敌人也需要有一个不同的速度然后enemy.png

希望你们能帮忙。

这是敌人的代码

//enemies
var enemy;
var enemyTotal = 5;
var enemies = [enemy1,enemy2];
var enemy_x = 50;
var enemy_y = -45;
var enemy_w = 50;
var enemy_h = 50;
var speed = 3;








//Build enemy array of x/y coordinate, width, height, and speed
for (var i = 0; i < enemyTotal; i++) {
enemies.push([enemy_x, enemy_y, enemy_w, enemy_h, speed]);

  enemy_x += enemy_w + 60;
}

//Iterate through array of enemies and draw them on the canvas
function drawEnemies() {
  for (var i = 0; i < enemies.length; i++) {
    ctx.drawImage(enemy, enemies[i][0], enemies[i][1]);

  }
}

//Iterate through array of enemies and update their position
function moveEnemies() {
  for (var i = 0; i < enemies.length; i++) {
    if (enemies[i][1] < height) {
      enemies[i][1] += enemies[i][4];
    } else if (enemies[i][1] > height - 1) {
      //after the enemies scroll off screen, this value is where they get re-spawned
      enemies[i][1] = -45;
    }
  }
}

//Check for laser collision
function hitTest() {
  var remove = false;
  for (var i = 0; i < lasers.length; i++) {
    for (var j = 0; j < enemies.length; j++) {
      //laser's y position is less than or equal to the enemy's y position plus its height -AND-
      //laser's x position is greater than or equal to the enemy's x position -AND-
      //laser's x position is less than or equal to the enemy's x position plus it's width
      if (lasers[i][1] <= (enemies[j][1] + enemies[j][3]) && lasers[i][0] >= enemies[j][0] && lasers[i][0] <= (enemies[j][0] + enemies[j][2])) {
        remove = true;
        //draw();//hier explosion afspelen
        enemies.splice(j, 1); //enemy at this array position no longer gets drawn
        enemies.push([(Math.random() * 500) + 50, -45, enemy_w, enemy_h, speed]); //refill a new enemy in a random x position between 50 and 500
      }
    }
    if (remove == true) {
      lasers.splice(i, 1);  //laser at this array position no longer gets drawn
      remove = false;
      score += 10;
    }
  }
}

这是我定义图片的代码

//wereld
var canvas;
var ctx;
var width = 600;
var height = 600;
var starfield;
var starX = 0;
var starY = 0;
var starY2 = -600;

//scoring
var score = 0;
var alive = true;
var lives = 3;
var gameStarted = false;

image = new Image()
image.src = 'explosion.png';

//Clear the canvas, this is required before each canvas frame update
function clearCanvas() {
  ctx.clearRect(0, 0, width, height);
}

//Initialize image objects, canvas, and event listeners
function init() {
  canvas = document.getElementById('canvas');
  ctx = canvas.getContext('2d');
  enemy = new Image();
  enemy.src = 'enemy.png';
  ship = new Image();
  ship.src = 'ship.png';
  starfield = new Image();
  starfield.src = 'starfield.jpg';
  document.addEventListener('keydown', keyDown, false);
  document.addEventListener('keyup', keyUp, false);
  canvas.addEventListener('click', gameStart, false);
  gameLoop();
}

//Used by an event listener.  Removes the overall canvas listener once game has started.
function gameStart() {
  gameStarted = true;
  canvas.removeEventListener('click', gameStart, false);
}

//Game loop that calls all the functions needed to be updated
function gameLoop() {
  clearCanvas();
  drawStarfield();
  if (alive && gameStarted && lives > 0) {
    hitTest();
    moveEnemies();
    moveLaser();
    drawEnemies();
    drawShip();
    drawLaser();
    shipCollision();
  }
  scoreTotal();
  //game = setTimeout(gameLoop, 1000 / 30); //not sure why 'game =' is included...
  setTimeout(gameLoop, 1000 / 30); //this works too...
}

//Used to draw several text and shape objects for score, lives, and pre-game information.
function scoreTotal() {
  ctx.font = 'bold 18px VT323';
  ctx.fillStyle = '#fff';
  ctx.fillText('Score: ', 10, 55);
  ctx.fillText(score, 70, 55);
  ctx.fillText('Lives: ', 10, 30);
  ctx.fillText(lives, 68, 30);

  if (!alive) {
    ctx.fillText('Game Over!', 245, (height / 2));

    //Continue button
    ctx.fillRect((width / 2) - 65, (height / 2) + 10, 100, 40);
    ctx.fillStyle = '#000';
    ctx.fillText('Opnieuw?', 252, (height / 2) + 35);
    canvas.addEventListener('click', continueButton, false);
  }

  //Pre-Game Text
  if (!gameStarted) {
    ctx.font = 'bold 50px VT323';
    ctx.fillText('Sander Gouman top down', (width / 2) - 210, (height / 2));
    ctx.font = 'bold 20px VT323';
    ctx.fillText('Klik om te spelen', (width / 2) - 56, (height / 2) + 30);
    ctx.fillText('Beweeg met de pijltjes', (width / 2) - 100, (height / 2) + 60);
    ctx.fillText('Gebruik de spatiebalk om te schieten', (width / 2) - 100, (height / 2) + 90);
  }
}

//Used by an event listener.  Detects if mouse click is within a specific area.
function continueButton(e) {
  var cursorPos = getCursorPos(e);
  if (cursorPos.x > (width / 2) - 53 && cursorPos.x < (width / 2) + 47 && cursorPos.y > (height / 2) + 10 && cursorPos.y < (height / 2) + 50) {
    alive = true;
    lives = 3;
    reset();
    canvas.removeEventListener('click', continueButton, false);
  }
}

//Used for detection of mouse click on canvas
function getCursorPos(e) {
  var x;
  var y;

  if (e.pageX || e.pageY) {
    x = e.pageX;
    y = e.pageY;
  } else {
    x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  }

  x -= canvas.offsetLeft;
  y -= canvas.offsetTop;
  var cursorPos = new cursorPosition(x, y);

  return cursorPos;
}

//Store x and y cursor position
function cursorPosition(x, y) {
  this.x = x;
  this.y = y;
}

//Check lives
function checkLives() {
  lives -= 1;
  if (lives > 0) {
    reset();
  } else if (lives == 0) {
    alive = false;

  }
}

//Reset enemies and player back to default position
function reset() {
  var enemy_reset_x = 50;
  ship_x = (width / 2) - 25;
  ship_y = height - 75;
  ship_w = 50;
  ship_h = 57;

  for (var i = 0; i < enemies.length; i++) {
    enemies[i][0] = enemy_reset_x;
    enemies[i][1] = -45;
    enemy_reset_x = enemy_reset_x + enemy_w + 60;
  }
}

//Draw a continuous, scrolling starfield (using two instances)
function drawStarfield() {
  ctx.drawImage(starfield, starX, starY);
  ctx.drawImage(starfield, starX, starY2);

  if (starY > 600) {
    starY = -599;
  }

  if (starY2 > 600) {
    starY2 = -599;
  }

  starY += 1;
  starY2 += 1;
}

//Initialize canvas when page is loaded
window.onload = init;

希望你们能帮忙,这样我就能得到更多的敌人

2 个答案:

答案 0 :(得分:0)

一个想法可能是,不考虑将敌人属性存储在全局范围内,而是考虑将属性存储在敌方对象中。

最简单的方法是创建一个像

这样的函数
 //enemies could be in global scope or 
 //inside a closure that contains everything related to the enemies
var enemies = [];

function spawnenemy(x,y,s,i) {
   var enemy = {
    xcord: x,
    ycord: y,
    speed: s,
    spriteimg: new Image()
   };
   enemy['spriteimg'].src = i;
   enemies.push(enemy);
}

然后将每个敌人对象传递给操纵敌人的游戏功能。

例如,如果你想要在敌人死亡时改变你的形象,就会有这样的功能。

function showDead(enemy) {
     //Notice how I am accessing the image property of the enemy...
     enemy['spriteImgUrl'].src = "dead.jpg";
     //do your thing to refresh your canvas to show the new image 
     //or register showDead function with a listener that will do it for you
 }

并简单地将应该死的敌人传给这个函数,以表明它已被杀死。

希望它能给你一些想法。

答案 1 :(得分:0)

我建议将每个“敌人”视为自己的对象,并且为了能够定义对象,你需要制作自己的敌人类:

function Enemy() {
  // stick this at the top of your code somewhere.
  // this defines an Enemy "class", which allows
  // you to make "new" Enemy instances
}

一旦你拥有了它,你可以制造“新”敌人,并为他们分配你喜欢的任何属性......甚至功能:

var enemy1 = new Enemy();
var enemy2 = new Enemy();
enemy1.x = 50;
enemy2.x = 50;
// ... fill in the rest of the stuff here
enemy1.speed = 3;
enemy2.speed = 5;

enemy1.image = new Image();
enemy1.image.src = 'enemyShip1.png';
enemy2.image = new Image();
enemy2.image.src = 'enemyShip2.png';

enemy1.getKilledByPlayer = function() {
  // give the player some score, for example
  // and/or remove this enemy from the game
};

enemies.push(enemy1);
enemies.push(enemy2);

这里的关键是,当你去绘制每个敌人时,你会使用你制作的对象(enemy1enemy2enemies[i]查找所有内容。他们在一个数组中):

function drawEnemies() {
  for (var i = 0; i < enemies.length; i++) {
    ctx.drawImage(enemies[i].image, enemies[i].x, enemies[i].y);
    // here, saying enemies[i].image is grabbing the exact image you want
    // from when you made enemy1/enemy2 up above
  }
}

并且因为你推入阵列的每个敌人都可以拥有不同的x,y,图像,速度等值......它们看起来就像你想要的一样,取决于你给出的值他们开始。