Javascript.RU

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

Почему растягивается изображение в Canvas?
Доброго времени суток, друзья!

Делаю клон змейки на canvas и изображения яблока у меня странное:

Вот.

Но нормальное яблоко у меня 32px на 32px



Код рисования:

const canvas = document.getElementById("game");

const ctx = canvas.getContext("2d");

const foodImg = new Image();

foodImg.src = "img/food.png";

let widthField = canvas.width;

let heightField = canvas.height;

let box = 32;

food = {
    
    x: Math.floor((Math.random() * (widthField - box))),
        
    y: Math.floor((Math.random() * (heightField - box))) ,
    
    width: box,

    height: box
};

};

function drawGame () {
 
    ctx.drawImage(foodImg, food.x, food.y, food.width, food.height);

}

let game = setInterval(drawGame, 100);


Я уж и размер яблоку задал. Уменьшается, если размер делить на двое.

Почему его так колбасит то? Изначально же должно быть нормального размера!

Благодарю за помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 20.09.2023, 11:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

dandiablo,
вы что-то не договариваете ...
<!DOCTYPE HTML>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        #game {
            border: 1px solid #8B4513;
        }
    </style>
</head>
<body>
    <canvas height="300" width="300" id="game"></canvas>
    <script>
        const canvas = document.getElementById("game");
        const ctx = canvas.getContext("2d");
        const foodImg = new Image();
        foodImg.src = "https://i.postimg.cc/QMgFDqpk/food.png";
        let widthField = canvas.width;
        let heightField = canvas.height;
        let box = 32;
        function drawGame() {
            let food = {
                x: Math.floor((Math.random() * (widthField - box))),
                y: Math.floor((Math.random() * (heightField - box))),
                width: box,
                height: box
            };
            ctx.drawImage(foodImg, food.x, food.y, food.width, food.height);
        }
        let game = setInterval(drawGame, 1000);
    </script>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 20.09.2023, 15:16
Аватар для dandiablo
Интересующийся
Отправить личное сообщение для dandiablo Посмотреть профиль Найти все сообщения от dandiablo
 
Регистрация: 27.11.2022
Сообщений: 10

Что же интересно, я могу не договаривать? Ваши предположения?

Единственное отличие:

у Вас:

<canvas height="300" width="300" id="game"></canvas>


У меня:

<canvas id="game"></canvas>


И параметры, соответственно, в CSS:
#game{
    width: 647px;
    height: 517px;
    border: 5px #24722a solid;
    background: rgba(223, 190, 3, 0.8);
    border-radius: 10px;
}
Ответить с цитированием
  #4 (permalink)  
Старый 20.09.2023, 15:33
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

dandiablo,
надо выставлять размер через атрибуты.

если ты в стилях указал width: 647px; и height: 517px;, это не значит, что холст будет состоять из 647х517 пикселей. У него есть какие-то дефолтные размеры холста, вот они и растянутся.
Ответить с цитированием
  #5 (permalink)  
Старый 20.09.2023, 15:33
Аватар для dandiablo
Интересующийся
Отправить личное сообщение для dandiablo Посмотреть профиль Найти все сообщения от dandiablo
 
Регистрация: 27.11.2022
Сообщений: 10

Япона мама!

Действительно, стоило только вынести высоту и ширину из css в canvas, как надо было, так все и заработало!

Спасибо, что повторили, увидел разницу.

Вот бы уж не подумал... Оо!
Ответить с цитированием
  #6 (permalink)  
Старый 20.09.2023, 15:47
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

dandiablo,
<canvas> это как <img> только с возможностью скриптинга, поэтому в плане css и другого ведет себя также, растягивается, имеет свои атрибуты размеров, можно сохранить картинку как... и тд.
Ответить с цитированием
  #7 (permalink)  
Старый 20.09.2023, 18:24
Аватар для dandiablo
Интересующийся
Отправить личное сообщение для dandiablo Посмотреть профиль Найти все сообщения от dandiablo
 
Регистрация: 27.11.2022
Сообщений: 10

Блин, вот об этом не говорили ни где. Буду знать, благодарю!
Ответить с цитированием
  #8 (permalink)  
Старый 20.09.2023, 19:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Сообщение от dandiablo
Блин, вот об этом не говорили ни где.
Об этом написано
https://developer.mozilla.org/ru/doc...%D0%B8% D0%B5

Цитата:
Отображаемый размер холста может быть изменён используя stylesheet. Изображение масштабируется при рендеринге, чтобы соответствовать стилю размер. Если ваш рендеринг кажется искажённым, попытайтесь указать ваши атрибуты ширины и высоты точно в атрибутах <canvas>, и не используя CSS.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
квадрат по середине canvas Всемогущий Общие вопросы Javascript 8 31.05.2019 12:30
canvas hue-rotate fireballpro100 Общие вопросы Javascript 8 11.08.2016 05:34
Петербург: Javascript + Canvas. Разработчик для портирования игры. В офис. waxattack Работа 0 21.07.2016 14:06
Canvas resize mrFlyer AJAX и COMET 5 12.01.2015 15:24
Повтор фото (getUserMedia(),HTML5 Canvas) aspex Элементы интерфейса 1 27.12.2014 16:46