Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2016, 11:46
Новичок на форуме
Отправить личное сообщение для Martyna Посмотреть профиль Найти все сообщения от Martyna
 
Регистрация: 26.09.2016
Сообщений: 4

Canvas объект выходит за пределы поля
Здравствуйте! Подскажите, пожалуйста, что сделать, чтобы объект не выходил за пределы canvas?

window.onload = function() {
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
 
 
ctx.fillStyle = "#FF0000";
ctx.fillRect(0,0,150,75);
 
var rec = new Object();
rec.x = 0;
rec.y = 0;
rec.moveright = function(){ rec.x++;}
rec.moveleft = function(){ rec.x--;}
rec.moveup = function(){ rec.y--;}
rec.movedown = function(){ rec.y++;}
rec.draw = function() {
    
    ctx.beginPath();
    ctx.clearRect(0,0,500,500);
    ctx.fillStyle = "#FF0000";
    ctx.fillRect(rec.x,rec.y,150,75);
    ctx.closePath();
}

 
document.onkeydown = function(e) {
//alert(e.keyCode);
if (e.keyCode == "37")
{
    
    rec.moveleft();
    rec.draw();
}

 
if (e.keyCode == "38")
{
	
	rec.moveup();
	rec.draw();
   
}
 
if (e.keyCode == "39")
{
	
    rec.moveright();
    rec.draw();
   
}
 
if (e.keyCode == "40")
{
	
    rec.movedown();
    rec.draw();
  
}
}


};
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2016, 11:52
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

То и сделать, не выпускать за пределы.
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2016, 12:03
Новичок на форуме
Отправить личное сообщение для Martyna Посмотреть профиль Найти все сообщения от Martyna
 
Регистрация: 26.09.2016
Сообщений: 4

не выпускала бы, если б знала как может подскажете?
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2016, 12:04
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

в методах move*** проверять, что объект не выскочит за пределы. Если выскочит, не менять икс или игрек.
Ответить с цитированием
  #5 (permalink)  
Старый 26.09.2016, 12:32
Новичок на форуме
Отправить личное сообщение для Martyna Посмотреть профиль Найти все сообщения от Martyna
 
Регистрация: 26.09.2016
Сообщений: 4

Спасибо большое за помощь!
Ответить с цитированием
  #6 (permalink)  
Старый 26.09.2016, 12:50
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Допустим ширина канваса 500

var w=500;

Откуда-то валится 600 в координату Y. Тогда на выводе:

y = Math.min(y,w);

Таким образом y никогда не будет больше w. Если "объект" больше пиксела, то из w еще надо вычесть его ширину.

obj.y = Math.min(obj.y,w-obj.w);

Наверно так, я с арифметикой не дружу.

Последний раз редактировалось warren buffet, 26.09.2016 в 12:52.
Ответить с цитированием
  #7 (permalink)  
Старый 26.09.2016, 23:04
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Martyna, как уже сказали Math.min() и Math.max() в методах move***, плюс ширина, высота, шаг, цвет есть свойства объекта, плюс e.keyCode не рекомендуется
<canvas width="200" height="100" id="myCanvas" style="border: 1px solid red"></canvas>
<script>
var canvas  = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var rec = {};
	rec.x = 10;
	rec.y = 10;
	rec.width = 50;
	rec.height = 25;
	rec.step = 5;
	rec.color = 'red';
	rec.moveup = function () {
		this.y = Math.max(this.y - this.step, 0);
	};
	rec.movedown = function () {
		this.y = Math.min(this.y + this.step, canvas.height - this.height);
	};
	rec.moveleft = function () {
		this.x = Math.max(this.x - this.step, 0);
	};
	rec.moveright = function () {
		this.x = Math.min(this.x + this.step, canvas.width - this.width);
	};
	rec.draw = function () {
		ctx.clearRect(0, 0, canvas.width, canvas.height);
		ctx.fillStyle = this.color;
		ctx.fillRect(this.x, this.y, this.width, this.height);
	};
	rec.draw();
	document.onkeydown = function (e) {
			 if (e.code == 'ArrowUp')    rec.moveup();
		else if (e.code == 'ArrowDown')  rec.movedown();
		else if (e.code == 'ArrowLeft')  rec.moveleft();
		else if (e.code == 'ArrowRight') rec.moveright();
		else return;
		rec.draw();
	};
</script>
Ответить с цитированием
  #8 (permalink)  
Старый 26.09.2016, 23:57
Новичок на форуме
Отправить личное сообщение для Martyna Посмотреть профиль Найти все сообщения от Martyna
 
Регистрация: 26.09.2016
Сообщений: 4

Огромное спасибо за помощь!
Ответить с цитированием
  #9 (permalink)  
Старый 28.09.2016, 00:17
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

e.code в IE не поддерживается
Ответить с цитированием
  #10 (permalink)  
Старый 28.09.2016, 04:48
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Яростный Меч, держи полифилл
try {
	'code' in KeyboardEvent.prototype || Object.defineProperty(KeyboardEvent.prototype, 'code', {
		get: function () { return { 37: 'ArrowLeft', 38: 'ArrowUp', 39: 'ArrowRight', 40: 'ArrowDown' }[this.keyCode] }
	})
} catch (e) {}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не выходит получить объект из функции barsix Общие вопросы Javascript 3 07.08.2014 14:32
Ищу функцию для canvas, которая будет перемещать мой объект на позицию х,у eko24 Events/DOM/Window 0 12.10.2013 00:33
Функция при наведении на Canvas объект max0n Общие вопросы Javascript 0 07.05.2013 17:56
Событие JS, объект выходит из области видимости браузера Z@R@ Events/DOM/Window 1 28.01.2013 07:02
Получение значения поля объекта зная путь к полю и сам объект mgvmax Общие вопросы Javascript 11 07.03.2012 19:09