@durnevdanya

Как сделать объект «твердым» на canvas'e?

Добрый вечер. Я делаю либу на js, и тут столкнулся с проблемой. У меня есть функция, названная collisionDetectedBetween(object1, object2), которая возвращает true or false в зависимости от того, наложены ли объекты на канвасе друг на друга или нет.
Она работает, а теперь мне необходима функция, которая сделает один из объектов твердым, чтоб я не мог другим объектом через него пройти. Я использую такой вариант, но он не работает, работает, только если подхожу справа, а с других сторон этот объект тупо телепортирует в разные стороны, как будто код не может понять, с какой стороны я подхожу
makeSolid(object1, object2)
	{
	    if(this.collisionDetectedBetween(object1, object2) && object1.x > object2.x - object2.width && object1.x < object2.x)
	        object1.x = object2.x - object2.width;
	    else if(this.collisionDetectedBetween(object1, object2) && object1.x < object2.x + object2.width && object1.x > object2.x)
	        object1.x = object2.x + object2.width;
	    else if(this.collisionDetectedBetween(object1, object2) && object1.y < object2.y + object2.height && object1.y > object2.y)
	        object1.y = object2.y + object2.height;
	    else if(this.collisionDetectedBetween(object1, object2) && object1.y > object2.y - object2.height && object1.y < object2.y)
	        object1.y = object2.y - object2.height;
	}


В чем проблема? Перепробовал многое, но ничего не выходит.
Вот весь проект с моим кодом и примером
Благодарю
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 1
@maxfox
У вас в коде написано не то, что вы привели в вопросе. У вас так:
makeSolid(object1, object2)
	{
		if(this.collisionDetectedBetween(object1, object2) && object1.x > object2.x - object2.width && object1.x < object2.x)
		{
			if(!this.collisionDetectedBetween(object1, object2))
				object1.x = object2.x - object2.width;
		}
		if(this.collisionDetectedBetween(object1, object2) && object1.x < object2.x + object2.width && object1.x > object2.x)
		{
			if(!this.collisionDetectedBetween(object1, object2))
				object1.x = object2.x + object2.width;
		}
		if(this.collisionDetectedBetween(object1, object2) && object1.y < object2.y + object2.height && object1.y > object2.y)
		{
			if(!this.collisionDetectedBetween(object1, object2))
				object1.y = object2.y + object2.height;
		}
		if(this.collisionDetectedBetween(object1, object2) && object1.y > object2.y - object2.height && object1.y < object2.y)
		{
			if(!this.collisionDetectedBetween(object1, object2))
				object1.y = object2.y - object2.height;
		}
	}

(Взято с гитхаба)
Это, конечно же, работать не будет.
Вот так все работает:
makeSolid(object1, object2) {
        if (!this.collisionDetectedBetween(object1, object2)) return;
		if(object1.x > object2.x - object2.width && object1.x < object2.x) {
            object1.x = object2.x - object2.width;
		}
		if(object1.x < object2.x + object2.width && object1.x > object2.x) {
            object1.x = object2.x + object2.width;
		}
		if(object1.y < object2.y + object2.height && object1.y > object2.y) {
            object1.y = object2.y + object2.height;
		}
		if(object1.y > object2.y - object2.height && object1.y < object2.y) {
            object1.y = object2.y - object2.height;
		}
	}

Замечаний по коду делать не буду, он просто плох. И то, что вы не можете найти простые ошибки в своем же коде - тому доказательство. Советую поработать над этим.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы