Показать сообщение отдельно
  #1 (permalink)  
Старый 26.06.2014, 13:20
Новичок на форуме
Отправить личное сообщение для bogomazov.vadim Посмотреть профиль Найти все сообщения от bogomazov.vadim
 
Регистрация: 30.09.2012
Сообщений: 2

Вопросы касательно архитектуры приложения на примере змейки
Доброго времени суток!
Делаю змейку, есть несколько вопросов. Сразу замечу, что я нуб в программировании, поэтому заранее извиняюсь, если что-то не понятно. Попытаюсь объяснить как смогу.
1) Есть конструкторы объектов GameManager, Fruit и Snake:
function GameManager() {
  // ...
}
function Fruit() {
  // ...
}
function Snake() {
  // ...
}

В GameManager я объявляю свойства snake и fruit и вызываю соответствующие конструкторы:
this.snake = new Snake();
	this.fruit = new Fruit();

Так я получаю доступ ко всем свойствам и методам Fruit И Snake внутри GameManager. Но дело в том, что в Snake мне необходимо каким-то образом получить значения свойств GameManager, например при выходе за границы поля змейки вызывать сделать Game Over:
Snake.prototype.move = function () {
	var self = this,
		moveTimer;

	moveTimer = setInterval(function () {
		switch (self.direction) {
			case 'left':
				self.x -= self.cellWidth;
			break;
			case 'up':
				self.y -= self.cellHeight;
			break;
			case 'right':
				self.x += self.cellWidth;
			break;
			case 'down':
				self.y += self.cellHeight;
			break;
		}
		
		addCell.call(self, self.x, self.y);

		if ((self.x < 0 || self.x > GameManager.prototype.width - self.cellWidth) || (self.y < 0 || self.y > GameManager.prototype.height - self.cellWidth)) {
			clearInterval(moveTimer);
			return game.over();
		}

		removeCell.call(self, self.coords[0][0], self.coords[0][1]);
		
	}, this.speed);

	function addCell(x, y) {
		this.coords.push([x, y]);

		GameManager.getCtx().fillStyle = this.cellColor;
		GameManager.getCtx().fillRect(x, y, this.cellWidth, this.cellHeight);
		
		GameManager.getCtx().strokeStyle = this.cellStroke;
		GameManager.getCtx().lineWidth = 2;
		GameManager.getCtx().strokeRect(x, y, this.cellWidth, this.cellHeight);
	}

	function removeCell(x, y) {
		GameManager.getCtx().clearRect(x, y, this.cellWidth, this.cellHeight);
		this.coords.shift();
	}
}

Как это реализовать?
2) Есть конструктор объекта Fruit:
this.x = null;
	this.y = null;

	this.width = 30;
	this.height = 30;

	var self = this;

	var image = new Image();
	image.onload = function () {
		self.image = image;
	}

	image.src = 'images/grapefruit.png';
	this.image = image;

Внутри него задается изображение, но при заходе на страничку в первый раз оно не загружается, хотя событие onload прописано. Почему?
3) В целом хотелось бы знать - гуанокод или нет?
Спасибо!

P.S. Весь код можно посмотреть здесь: snake.js
Это на jsfiddle/
Ответить с цитированием