Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Игра на JS. Косяк с массивом (https://javascript.ru/forum/misc/17913-igra-na-js-kosyak-s-massivom.html)

treno1 08.06.2011 17:13

Игра на JS. Косяк с массивом
 
В общем у меня задание - написать игру на JS. Смысл игры:

На странице есть рабочая область 800х550 пикс. Внутри области рандомом
расставляются БЛОКИ - картинки различной ширины и высоты, препятствующие
движению объекта. . В нижней части области, при нажатии на кнопку СТАРТ
появляется ОБЪЕКТ - отдельная картинка. Объект можно перемещать с
помощью клавиш (стрелки). Цель «игры» - переместить объект от нижней
границы до верхней, при этом не задев движущиеся блоки. Если блок задет,
то объект начинает мигать и появляется надмись «game over», а также
появляется кнопка restart. При клике на кнопку «старт» появляется
«окошко» с предложением ввести кол-во блоков, скорость перемещения
объекта.

Вот код игры:

var ball = document.getElementById('ball'); //Получаем объект "Колобок"
var playground = document.getElementById('playground'); //Получаем игровое поле
var enemyground = document.getElementById('enemyground'); //Получем поле передвижения врагов
var info_zone = document.getElementById('info_zone'); //Получем поле вывода сообщений

var attemptContainer = document.getElementById('attemptContainer'); //Получаем контейнер счетчика

var startBtn = document.getElementById('start'); //Получаем кнопку "Старт"
var resetBtn = document.getElementById('reset'); //Получаем кнопку обнуления попытки

var positionXstart = 384; //Стартовая позиция колобка по горизонтали
var positionYstart = 486; //Стартовая позиция колобка по вертикали

var speed = 0; //Скорость колобка
var blocks = 0; //Количество блоков
var globalDeath = 0;

var attempt = 1; //Количество попыток

var en = []; //ID блоков
var speedB = []; //Скорость блоков

var getSpeed; //Переменная скорости колобка
var getBlocks; //Переменная количества блоков

var tempW = []; //Временная переменная ширины блока
var tempH = []; //Временная переменная высоты блока
var tempP = []; //Временная переменная вертикальной позиции блока
var tempS = []; //Временная переменная скорости блока

/* Выводим счетчик */
attemptContainer.innerHTML = 'Attempt:&nbsp;<span id="countAttempts" >' + attempt + '</span>';
var countAttempts = document.getElementById('countAttempts'); //Элемент "Счетчик"

/* Задаем стартовые параметры положения */
ball.style.left = positionXstart;
ball.style.top = positionYstart;

/* Функция запроса скорости и количества блоков */
function startDialog(){
	getSpeed = window.prompt("Your speed (Leave input line blank for default value - 2)", "");
	if((getSpeed === "") || (getSpeed==null))
		getSpeed = 2;
	getBlocks = window.prompt("Ammount of enemy blocks (Leave input line blank for default value - 3)", "");
	if((getBlocks === "") || (getBlocks==null))
		getBlocks = 3;
}

function lowOpacity(){
	ball.style.opacity = 0;
}

function hightOpacity(){
	ball.style.opacity = 1;
}



lowOpacity();

startDialog();

hightOpacity();
ball.style.visibility = "visible";

speed = parseInt(getSpeed);
blocks = parseInt(getBlocks);

var posiX = positionXstart;
var posiY = positionYstart;

/* Функция счетчика */
function nextAttempt(){
	attempt++;
	attemptContainer.innerHTML = 'Attempt:&nbsp;<span id="countAttempts" >' + attempt + '</span>';
}

/* Получение случайных величин */
function getRandomH(){ //Высота блока
	return parseInt(Math.random() * 60 + 20);
}

function getRandomW(){ //Ширина блока
	return parseInt(Math.random() * 170 + 20);
}

function getRandomVerPositition(){ //Вертикальная позиция блока
	return parseInt(Math.random() * 20 + 10);
}

function getRandomSpeedB() { //Скорость блока
	return parseInt(Math.random() * 5 + 10);
}

/* Отрисовка блоков на поле */
function drawBlocks(){
	var i;
	var nameOfIteration;
	var dPosition = 40;
	for(i=0;i<getBlocks;i++){
		enemyground.innerHTML += '<div id="en' + i + '">&nbsp;</div>';
		nameOfIteration = 'en' + i;
		en[i] = document.getElementById(nameOfIteration);
		en[i].style.position = 'relative';
		en[i].style.background = '#000';
		tempW[i] = getRandomW();
		en[i].style.width = tempW[i];
		tempH[i] = getRandomH();
		en[i].style.height = tempH[i];
		dPosition += getRandomVerPositition();
		tempP[i] = dPosition;
		en[i].style.top = tempP[i];
		tempS[i] = getRandomSpeedB();
		speedB[i] = tempS[i];
	}
}

/* Очистка поля передвижения врагов */
function removeBlocks() {
	enemyground.innerHTML = '';
}

function moveBlocks() {
	var i = 0;
	var nameOfIteration;
	for(i=0;i<getBlocks;i++){
		enemyground.innerHTML += '<div id="en' + i + '">&nbsp;</div>';
		nameOfIteration = 'en' + i;
		en[i] = document.getElementById(nameOfIteration);
		en[i].style.position = 'relative';
		en[i].style.background = '#000';
		en[i].style.width = tempW[i];
		en[i].style.height = tempH[i];
		en[i].style.top = tempP[i];
		//if((posiY<=(tempP[i]+tempH[i]))&&(posiY>=tempP[i])){
		//	if((posiX>=speedB[i])&&(posiX<=(speedB[i]+tempW[i]))){
		//		alert(i);
		//		alert(tempH[i]);
		//		death();
		//	}
		//}
		if(speedB[i] >= 800){
			tempS[i] = -tempS[i];
		} else if(speedB[i] <= (0 - tempW[i])){
			tempS[i] = -tempS[i];
		}
		en[i].style.left = speedB[i];
		speedB[i] = speedB[i] + tempS[i];
	}
}

function updateBlocks(){
	var j = 0;
	if(globalDeath==0){
		for(j=0;j<getBlocks;j++){
			if((posiY<=(tempP[j]+tempH[j]))&&(posiY>=tempP[j])){
				if((posiX>=speedB[j])&&(posiX<=(speedB[j]+tempW[j]))){
					alert(j);
					alert(tempH[j]);
					death();
				}
			}
		}
		removeBlocks();
		moveBlocks();
		window.setTimeout('updateBlocks()', 50);
	}
}

/* Очистка инфо-зоны */
function clearInfo(){
	info_zone.innerHTML = '';
}

/* Смерть колобка */
function death(){
	globalDeath = 1;
	removeBlocks();
	var mnogo = 999999;
	var i = 0;
	info_zone.innerHTML = '<h1>Death!</h1>';

	for(i=0;i<=mnogo;i++){
		if(i%1000>=500){
			lowOpacity();
		} else {
			hightOpacity();
		}
	}
	clearInfo();
}

/* Функция кнопки Старт */
function startF(){
	removeBlocks();
	nextAttempt();
	ball.style.visibility = "none";
	ball.style.left = positionXstart;
	ball.style.top = positionYstart;
	posiX = positionXstart;
	posiY = positionYstart;
	globalDeath = 0;
	if (window.confirm("Do you want to use last settings?")) {
		ball.style.visibility = "visible";
		removeBlocks();
		drawBlocks();
	}
	else {
		startDialog();
		speed = parseInt(getSpeed);
		blocks = parseInt(getBlocks);
		ball.style.visibility = "visible";
		removeBlocks();
		drawBlocks();
	}
	clearInfo();
}

/* Функция обнуления попытки */
function resetF(){
	ball.style.left = positionXstart;
	ball.style.top = positionYstart;
	posiX = positionXstart;
	posiY = positionYstart;
	ball.src = "img/ball.png";
}

/* Победа */
function winGame(){
	info_zone.innerHTML = '<h1>Win!</h1>';
	ball.style.opacity = 0;
}

/* Функция движения колобка */
function moveBall(evt){
	evt = (evt) ? evt : window.event;
	if(evt){

		if(posiX <= 0) posiX = 0;
		if(posiX >= 736) posiX = 736;
		if(posiY >= 486) posiY = 486;
		if(posiY <= 0) posiY = 0;
		
		if(posiY == 0) winGame();

		if(ball&&globalDeath==0){
			var code = (evt.charCode)? evt.charCode : evt.keyCode;

			//alert(code);

			switch(code){
				case 37:               // left
					ball.style.left = (posiX - speed);
					posiX = (posiX - speed);
					ball.src = "img/ball_l.png";
				break;
				case 38:               // up
					ball.style.top  = (posiY - speed);
					posiY = (posiY - speed);
				break;
				case 39:               // right
					ball.style.left = (posiX + speed);
					posiX = (posiX + speed);
					ball.src = "img/ball.png";
				break;
				case 40:               // down
					ball.style.top  = (posiY + speed);
					posiY = (posiY + speed);
				break;
				case 114:               // R
					resetF();
				break;
				case 115:               // S
					startF();
				break;
			}
		}
	}
}



document.onkeypress = moveBall;

resetBtn.onclick = resetF;
startBtn.onclick = startF;

drawBlocks();
updateBlocks();


Проблема в том, что смерть работает только на 1-ый блок. На остальные он не реагирует. Помогите пожалуйста!

http://ifolder.ru/24034082 Вот папка со всеми картинками и HTML и CSS файликом


Часовой пояс GMT +3, время: 20:05.