Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.01.2013, 18:55
Профессор
Отправить личное сообщение для bpystep Посмотреть профиль Найти все сообщения от bpystep
 
Регистрация: 06.08.2010
Сообщений: 161

Гонки c тетриса JS, JQuery
Доброго дня.
Все помнят знаменитый "Тетрис" (Brick Game), с которым не было скучно. И естественно игру "Гонки", в которой надо было ехать и ехать, объезная препятствия. Решил сделать эмулятор этого самого тетриса. С самой игрой тетрис проблем не возникло, а вот с гонками имеет место быть проблема, не могу придумать алгоритм по-которому на экране будет не одно препятствие, а хотя бы 2 или 2 (естественно, чтобы была возможность их объехать). Ниже привожу код, где есть "управляемая машинка", и с "неба" падает препятствие, которое нужно объехать. (ненужный код, для этой задачи удален...). Помогите сделать, можно словами, главное, чтобы понятно.
З.Ы. Также, если найдете какие-то косяки, просьба на них указать.
З.Ы.Ы. Спасибо заранее.

$(window).load(function() {
	race.init();
	$('#game_race').click(race.start);
});

//Гоночки
var race = {
	colors: ['none','URL(img/pixel-active.png)'],
	car: [[0,1,0],
		[1,1,1],
		[0,1,0],
		[1,1,1]
	],
	
	init: function() {
		var i, j, k;
		race.cells = [];
		for (i = -3; i < 22; ++i) {
			race.cells[i] = [];
			for (j = 1; j < 11; ++j) {
				k = String.fromCharCode(i + 97);
				race.cells[i][j] = $(['#', k, j].join(''));
			}
		}
	},
	
	start: function() {
		race.duration = 200;
		race.grid = [
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,0,0,0,0,0,0,0,0,0,1,1],
			[1,1,1,1,1,1,1,1,1,1,1,1]
                ];
		$(race.bound).keypress(race.key);
		for (var i = 0; i < 20; ++i) {
			for (var j = 1; j < 11; ++j) {
				if (race.grid[i][j]) race.cells[i][j].css('backgroundImage', race.colors[1]);
			}
		}
		race.createCar();
		race.createBar();
		race.timer = window.setInterval(race.moveDown, race.duration);
	},
	
	key: function(event) {
		switch(event.charCode || event.keyCode) {
			case 97: case 1092: case 52: case 37: race.moveLeft(); break; //Налево
			case 100: case 1074: case 54: case 39: race.moveRight(); break; //Направо
		}
		return false;
	},
	
	moveLeft: function() {
		if (race.canGo(race.curCar, race.x, race.y - 3)) {
			race.y = race.y-3;
			race.refreshCar();
		}
	},

	moveRight: function() {
		if (race.canGo(race.curCar, race.x, race.y + 3)) {
			race.y = race.y+3;
			race.refreshCar();
		}
	},
	moveDown: function() {
		if (race.canGo(race.curBar, race.barx+1, race.bary)) {
			++race.barx;
			race.refreshBar();
		} 
		else {
			if (race.barx == 19) {
				race.curBar = 0;
				for (var i = 0; i < 20; i++) {
					for (var j = 2; j < 10; j++) {
						if (!race.grid[i][j]) race.cells[i][j].css('backgroundImage', 'none');
					}
				}
				race.createBar();
			}
			else race.gameOver();
		}
	},
	gameOver: function() {
		if (race.timer) {
			$(race.bound).unkeypress(race.key);
			window.clearInterval(race.timer);
			race.timer = null;
		} 
		for (var i = 0; i < 20; ++i) {
			for (var j = 1; j < 11; ++j) {
				race.cells[i][j].css('backgroundImage', 'none');
			}
		}
		for (var i = 0; i < 4; i++) {
			for (var j = 0; j < 3; j++) {
				if (race.curCar[i][j] && race.grid[race.x0+i]) race.grid[race.x0+i][race.y0+j] = 0;
			}
		}
		race.curCar = 0; race.curBar = 0;
	},
		
	createCar: function() {
		race.x0 = race.x = 16;
		race.y0 = race.y = 1;
		race.curCar = race.car;
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				if (race.curCar[i][j]) race.cells[race.x0+i][race.y0+j].css('backgroundImage', race.colors[1]);
			}
		}
		race.marking();
	},
	
	refreshCar: function() {
		race.draw(race.curCar, race.x0, race.y0, race.colors[0]);
		race.draw(race.curCar, race.x, race.y, race.colors[1]);
		race.marking();
		race.x0 = race.x;
		race.y0 = race.y;
	},	
	refreshBar: function() {
		race.draw(race.curBar, race.barx0, race.bary0, race.colors[0]);
		race.draw(race.curBar, race.barx, race.bary, race.colors[1]);
		race.barx0 = race.barx;
		race.bary0 = race.bary;
	},
	
	draw: function(obj, x, y, color) {
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				if (obj[i][j]) race.cells[x+i][y+j].css('backgroundImage', color);
			}
		}
	},
	
	canGo: function(obj, x, y) {
		for (var i = 0; i < 4; i++) {
			for (var j = 0; j < 3; j++) {
				if (obj[i][j] && race.grid[x+i] && race.grid[x+i][y+j]) return false; 
			}
		}
		return true;
	},

	createBar: function() {
		race.meter++;
		var rand = Math.floor(Math.random()*(2 + 1))+1;
		if (rand == 1) race.bary0 = race.bary = 1;
		else if (rand == 2) race.bary0 = race.bary = 4;
			 else race.bary0 = race.bary = 7;
		race.barx0 = race.barx = -3;
		race.curBar = race.car;
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				if (race.curBar[i][j]) race.cells[race.barx0+i][race.bary0+j].css('backgroundImage', race.colors[1]);
			}
		}
	},
	marking: function() {
		for (var i = 0; i < 4; i++) {
			for (var j = 0; j < 3; j++) {
				if (race.curCar[i][j] && race.grid[race.x0+i]) race.grid[race.x0+i][race.y0+j] = 0;
				if (race.curCar[i][j] && race.grid[race.x+i]) race.grid[race.x+i][race.y+j] = 1;
			}
		}
	}
};

Последний раз редактировалось bpystep, 26.01.2013 в 18:01.
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2013, 22:49
Профессор
Отправить личное сообщение для bpystep Посмотреть профиль Найти все сообщения от bpystep
 
Регистрация: 06.08.2010
Сообщений: 161

неужели никто мне не поможет?
Ответить с цитированием
  #3 (permalink)  
Старый 24.01.2013, 23:39
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bpystep,
Хаккер спец по игрулькам - ждите
Ответить с цитированием
  #4 (permalink)  
Старый 25.01.2013, 00:41
Профессор
Отправить личное сообщение для bpystep Посмотреть профиль Найти все сообщения от bpystep
 
Регистрация: 06.08.2010
Сообщений: 161

Deff,
Это ник человека? А можете ему написать в ЛС, чтобы заглянул в эту тему, целый день голову ломаю.
Ответить с цитированием
  #5 (permalink)  
Старый 25.01.2013, 00:52
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bpystep,
По собственному опыту - насильно мил не бушь, тема коли заинтересует - то ответят...

Собственно я б попробовал валить препятствия в массив вместе с трассой, который периодически - считывал и перерисовывал(массив) и дополнял
А из массива уже функция отображалка в экран (код не смотрел
Ответить с цитированием
  #6 (permalink)  
Старый 25.01.2013, 04:18
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

ЭТО НЕМО НЕ ВЕДИТЕСЬ
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2013, 17:05
Профессор
Отправить личное сообщение для bpystep Посмотреть профиль Найти все сообщения от bpystep
 
Регистрация: 06.08.2010
Сообщений: 161

Сделал, но корявым образом. Очень печально что на этом форуме мало кто имеет желание помогать.
//Создание заграждения 1
	createBar: function() {
		//создаем координату игрик
		var rand = Math.floor(Math.random()*(2 + 1))+1;
		if (rand == 1) race.bary0 = race.bary = 1;
		else if (rand == 2) race.bary0 = race.bary = 4;
			 else race.bary0 = race.bary = 7;
		race.line = rand;
		race.barx0 = race.barx = -3; //задаем координату икс
		//рандомим заграждение
		rand = Math.floor(Math.random()*(7 - 1 + 1))+1;
		race.curBar = race.barricades[rand];
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				if (race.curBar[i][j]) race.cells[race.barx0+i][race.bary0+j].css('backgroundImage', race.colors[1]);
			}
		}
	},
	//Создание заграждения 2
	createBar2: function() {
		var rand = Math.floor(Math.random()*(2 + 1))+1;
		if (rand == 1) race.bary0_2 = race.bary_2 = 1;
		else if (rand == 2) race.bary0_2 = race.bary_2 = 4;
			 else race.bary0_2 = race.bary_2 = 7;
		race.line_2 = rand;
		race.barx0_2 = race.barx_2 = -3;
		rand = Math.floor(Math.random()*(7 - 1 + 1))+1;
		race.curBar_2 = race.barricades[rand];
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				if (race.curBar_2[i][j]) race.cells[race.barx0_2+i][race.bary0_2+j].css('backgroundImage', race.colors[1]);
			}
		}
	},
	//Создание заграждения 3
	createBar3: function() {
		//здесь тоже самое, что и в race.createBar3();
	},
	//Обновление поля (для заграждения 1)
	refreshBar: function() {
		race.draw(race.curBar, race.barx0, race.bary0, race.colors[0]);
		race.draw(race.curBar, race.barx, race.bary, race.colors[1]);
		race.barx0 = race.barx;
		race.bary0 = race.bary;
	},
	//Обновление поля (для заграждения 2)
	refreshBar2: function() {
		race.draw(race.curBar_2, race.barx0_2, race.bary0_2, race.colors[0]);
		race.draw(race.curBar_2, race.barx_2, race.bary_2, race.colors[1]);
		race.barx0_2 = race.barx_2;
		race.bary0_2 = race.bary_2;
	},
	//Обновление поля (для заграждения 3)
	refreshBar3: function() {
		//здесь тоже самое что и в race.refreshBar2(); 
	},
moveDown: function() {
		if (race.curBar_2) {
			//обновление заграждения 2
			if (race.canGo(race.curBar_2, race.barx_2+1, race.bary_2)) {
				++race.barx_2;
				race.refreshBar2();
			}
			else race.gameOver();
		}
		if (race.curBar_3) {
			//обновление заграждения 3
			if (race.canGo(race.curBar_3, race.barx_3+1, race.bary_3)) {
				++race.barx_3;
				race.refreshBar3();
			}
			else race.gameOver();
		}
		//обновление заграждения 1
		if (race.canGo(race.curBar, race.barx+1, race.bary)) {
			if (race.barx == 5) race.createBar2(); //создание заграждения 2
			if (race.barx == 10) race.createBar3(); //создание заграждения 3
			++race.barx;
			race.refreshBar();
		}
		else {
			if (race.barx == 19) { //если заграждение достигло низа экрана
				//2 заграждение теперь 1
				race.curBar = race.curBar_2; race.line = race.line_2;
				race.barx0 = race.barx0_2; race.bary0 = race.bary0_2;
				race.barx = race.barx_2; race.bary = race.bary_2;
				//3 заграждение теперь 2
				race.curBar_2 = race.curBar_3; race.line_2 = race.line_3;
				race.barx0_2 = race.barx0_3; race.bary0_2 = race.bary0_3;
				race.barx_2 = race.barx_3; race.bary_2 = race.bary_3;
				race.createBar3(); // создание нового заграждения
			}
			else race.gameOver(); //иначе смерть xD (конец игры)
		}
	},
Ответить с цитированием
  #8 (permalink)  
Старый 26.01.2013, 17:06
Профессор
Отправить личное сообщение для bpystep Посмотреть профиль Найти все сообщения от bpystep
 
Регистрация: 06.08.2010
Сообщений: 161

megaupload,
уважаемый, укажите русским языком, что вы имели в виду.
Ответить с цитированием
  #9 (permalink)  
Старый 26.01.2013, 17:36
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bpystep,
megaupload, птица странная,(по большей части флудер высоких материй

Основа ответов интересно изложенный материал, примеры рабочих кодов, скриншоты идей... У многих сейчас послепраздничное затишье и способность думать в простых вариациях. Основа ответов - читательский интерес к топику, (не смотря на всё лично волнующее)
Ответить с цитированием
  #10 (permalink)  
Старый 26.01.2013, 17:40
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Зы - длиннокод тяжел для восприятия, - интересно выдавать материал минимально необходимым, либо бить на части и скрывать малонужные куски под спойлером

[HTML run hide][/html]
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу jquery, js, html, css спеца. AlexBell Работа 41 23.11.2012 08:20
Тестирование js и jquery в дбраузере leny Firefox/Mozilla 2 21.11.2011 14:58
Найти проблему с jQuery или писать js? Saladdin Элементы интерфейса 0 17.03.2011 17:02
jQuery, load: замена элемента вырубает js на странице. warobushek AJAX и COMET 0 08.10.2010 07:44
Вакансия: Front-end разработчик (HTML, CSS, JS, Ajax, jQuery) ivankov Работа 0 05.10.2010 19:00