Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2015, 18:08
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

как бы танки
ребята, помогите пожалуйста обзором кода

начал писать игру про танки, но уже сейчас чувствую, что нахреновертил. скрипт довольно большой, поэтому залил его на codepen

тут слабых мест очень много, поэтому меня прежде всего интересует насколько правильно я реализовал объект Tank. привожу его здесь полностью:
Tank = function(id){ 
	var	self = this,
			DIRECTION = ['up', 'right', 'bottom', 'left'];

	this.Create = function(){
		self.direction = DIRECTION[helper.randomIntFromZero(4)];

		var	tank = $('<div class="tank" id="' + self.id + '"></div>').css({
			left: self.x_coord + 'px',
			top: self.y_coord + 'px'
		});

		$('#board').append(tank);
	}

	this.checkArrowDirection = function(){
		switch (self.direction) {
	   case 'up':
	      self.arrow = '▲';
	      break
	   case 'right':
	      self.arrow = '►';
	      break
	   case 'bottom':
	      self.arrow = '▼';
	      break
	   case 'left':
	      self.arrow = '◄';
	      break		      
	   default:
	   		console.log('error arrow direction');
	      break
		}
	}

	this.checkBorderCollision = function(){
		switch (self.direction) {
	   case 'up':
	      self.y_coord -= 10;
	      if(self.y_coord <= 0) self.y_coord = 0; 
	      break
	   case 'right':
	      self.x_coord += 10;
	      if(self.x_coord >= 480) self.x_coord = 480;
	      break
	   case 'bottom':
	      self.y_coord += 10;
	      if(self.y_coord >= 480) self.y_coord = 480;
	      break
	   case 'left':
	      self.x_coord -= 10;
	      if(self.x_coord <= 0) self.x_coord = 0;
	      break		      
	   default:
	   		console.log('error direction definition');
	      break
		}
	}

	this.checkChangeDirection = function(){
		if(helper.randomIntFromZero(100) > 75){
			self.direction = DIRECTION[helper.randomIntFromZero(4)];
		}
	}

	this.Offset = function(){
		$('#' + self.id).css({
			left: self.x_coord + 'px',
			top: self.y_coord + 'px'
		}).html(self.arrow);
	}

	this.Move = function(){
		self.checkChangeDirection();
		self.checkBorderCollision();
		self.checkArrowDirection();
		self.Offset();
	};

	this.x_coord = helper.randomIntFromZero(481);
	this.y_coord = helper.randomIntFromZero(481);
	this.id = id;	
	this.arrow;	
	this.direction;
	
	this.Create();
}


но буду рад и критике по остальному коду
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2015, 18:44
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Где прототипы?
Свои классы на прототипах
Ответить с цитированием
  #3 (permalink)  
Старый 24.12.2015, 18:01
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

а вот так получше стало? что ещё из явных косяков можно доработать?

Tank = function(id){ 
  this.x_coord = helper.randomIntFromZero(481);
  this.y_coord = helper.randomIntFromZero(481);
  this.id = id; 
  this.arrow; 
  this.direction;
  this.DIRECTION = ['up', 'right', 'bottom', 'left'];

  this.Create();
}

Tank.prototype.Create = function(){
  this.direction = this.DIRECTION[helper.randomIntFromZero(4)];

  var tank = $('<div class="tank" id="' + this.id + '"></div>').css({
    left: this.x_coord + 'px',
    top: this.y_coord + 'px'
  });

  $('#board').append(tank);
}

Tank.prototype.checkArrowDirection = function(){
  switch (this.direction) {
   case 'up':
      this.arrow = '▲';
      break
   case 'right':
      this.arrow = '►';
      break
   case 'bottom':
      this.arrow = '▼';
      break
   case 'left':
      this.arrow = '◄';
      break         
   default:
      console.log('error arrow direction');
      break
  }
}

Tank.prototype.checkBorderCollision = function(){
  switch (this.direction) {
   case 'up':
      this.y_coord -= 10;
      if(this.y_coord <= 0) this.y_coord = 0; 
      break
   case 'right':
      this.x_coord += 10;
      if(this.x_coord >= 480) this.x_coord = 480;
      break
   case 'bottom':
      this.y_coord += 10;
      if(this.y_coord >= 480) this.y_coord = 480;
      break
   case 'left':
      this.x_coord -= 10;
      if(this.x_coord <= 0) this.x_coord = 0;
      break         
   default:
      console.log('error direction definition');
      break
  }
}

Tank.prototype.checkChangeDirection = function(){
  if(helper.randomIntFromZero(100) > 75){
    this.direction = this.DIRECTION[helper.randomIntFromZero(4)];
  }
}

Tank.prototype.Offset = function(){
  $('#' + this.id).css({
    left: this.x_coord + 'px',
    top: this.y_coord + 'px'
  }).html(this.arrow);
}

Tank.prototype.Move = function(){
  this.checkChangeDirection();
  this.checkBorderCollision();
  this.checkArrowDirection();
  this.Offset();
}
Ответить с цитированием
  #4 (permalink)  
Старый 24.12.2015, 18:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

zlodiak,
а где проверка что танк не по танку едет?
Ответить с цитированием
  #5 (permalink)  
Старый 24.12.2015, 20:25
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

Сообщение от рони Посмотреть сообщение
zlodiak,
а где проверка что танк не по танку едет?
ну нееееет, это функциональность. её я нарастить всегда успею. мне сейчас важнее чтобы с точки зрения архитектуры и чистоты кода всё было хорошо

например меня беспокоит сам цикл игры(который в setInterval). берут меня сомнения, может быть лучше вынести всё это в отдельный 'класс' и рассылать события подписчикам? не лишнее здесь это будет, как думаете, зубры яваскрипта?)

Последний раз редактировалось zlodiak, 24.12.2015 в 20:30.
Ответить с цитированием
  #6 (permalink)  
Старый 26.12.2015, 13:16
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

Сообщение от рони Посмотреть сообщение
zlodiak,
а где проверка что танк не по танку едет?
всё таки вот сделал проверку чтобы танки не ездили друг по другу: http://codepen.io/anon/pen/PZGeGb

моё решение совсем неудачное с точки зрения производительности? если я потом ещё сделаю стены, деревья и т.п., то не будет ли игра тормозить от такого количества проверок?

Tank.prototype.checkTankCollision = function(){
	self = this;

	Tank.tanks.forEach(function(tank){
		var	x1 = self.x_coord,
				x2 = self.x_coord + Tank.tankSize,
				y1 = self.y_coord,
				y2 = self.y_coord + Tank.tankSize,
				x3 = tank.x_coord,
				x4 = tank.x_coord + Tank.tankSize,
				y3 = tank.y_coord,
				y4 = tank.y_coord + Tank.tankSize;

		if(self.id != tank.id){
			if((y2 >= y3 && y2 <= y4) && ((x2 >= x3 && x2 <= x4) || (x1 <= x4 && x1 >= x3))){
				console.log('collision: ' + self.id + ' and ' + tank.id);
				self.y_coord -= 10;
				tank.x_coord += 10;
			};

			if((y4 >= y1 && y4 <= y2) && ((x4 >= x1 && x4 <= x2) || (x3 <= x2 && x3 >= x1))){
				console.log('collision: ' + self.id + ' and ' + tank.id);
				tank.x_coord -= 10;
				self.y_coord += 10;
			};

			if((x2 >= x3 && x2 <= x4) && ((y2 >= y3 && y2 <= y4) || (y1 <= y4 && y1 >= y3))){
				console.log('collision: ' + self.id + ' and ' + tank.id);
				self.x_coord -= 10;
				tank.x_coord += 10;
			};		

			if((x4 >= x1 && x4 <= x2) && ((y4 >= y1 && y4 <= y2) || (y3 <= y2 && y3 >= y1))){
				console.log('collision: ' + self.id + ' and ' + tank.id);
				tank.x_coord -= 10;
				self.x_coord += 10;
			};		
		}
	});	
}
Ответить с цитированием
  #7 (permalink)  
Старый 26.12.2015, 13:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

zlodiak,
может разбить поле на квадраты и передвигаться только ним?
Ответить с цитированием
  #8 (permalink)  
Старый 26.12.2015, 13:43
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

это слишком просто, да движение слишком рваное получится. а я в будущем собираюсь каждому танку присвоить свою максимальную скорость, размер и другие интересные характеристики
Ответить с цитированием
  #9 (permalink)  
Старый 27.12.2015, 13:43
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

zlodiak, может лучше без jQuery?
Ответить с цитированием
  #10 (permalink)  
Старый 27.12.2015, 17:39
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

zlodiak, если ты развлекаешься, то писал бы уже на es6.
Как сказал рони, разделил бы карту на квадраты.

Цитата:
да движение слишком рваное получится
Не получится, если карта разбита на квадраты, то это не значит, что они будут прыгать из квадрата в квадрат, можно же сделать плавное перемещение. Плюс, так будет проще отследить объекты в данной местности.

Я б делал нечто подобное https://jsfiddle.net/eq3dy2wz/ (тут только карта).
Написал минут за 15, так что сильно не кричите)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
initComponent: Как получить данные родителя и как получить store для вызова load()? Пролетарий ExtJS 76 04.07.2015 09:22
Как сделать что бы картинки с другого url отображались как свои zlodey Серверные языки и технологии 1 04.05.2015 21:30
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40
Как при быстром многократном клике по кнопке обрабатывать только первый клик battrack jQuery 3 22.03.2012 10:47