2015-02-21 2 views
1

Мне было интересно, как изменить размер холста и всех его рисунков при изменении размера экрана. Я знаю, что это возможно на 100% по мере того, как эта игра делает (измените размер вашего браузера, и он будет соответствовать любому соотношению).resize canvas images

http://html5games.com/Game/Smarty-Bubbles/d8f24956-dc91-4902-9096-a46cb1353b6f

ли я рисовать все мои формы с% или умножить их все на% каждый раз, когда они нарисованы? Я могу оценить необходимость перерисовывать по изменению размера экрана, но как повлиять на холст и его компонентов?

+0

http://stackoverflow.com/questions/1664785/resize-html5-canvas-to-fit-window –

+0

Но что объекты внутри? Если нарисовать квадрат 10x10, а затем увеличить размер окна на 100%, будет ли мой квадрат 20x20? Что, если мне понадобится нарисовать еще один квадрат 10x10 - я бы хотел, чтобы он автоматически масштабировался с новым размером браузера. Он должен знать размер окна до того, как он нарисует себя, да? – forty2011111

ответ

1
  1. В начале приложения сохраните начальную ширину окна и размер начала холста.

    var originalWindowWidth=window.innerWidth; 
    var canvas=document.getElementById('canvas'); 
    var originalCanvasWidth=canvas.width; 
    var originalCanvasHeight=canvas.height; 
    
  2. Прислушайтесь окном изменения размера события

  3. Вычислить, сколько шириной окна измененных

    scale=window.innerWidth/originalWindowWidth; 
    

Если содержание холста полный & неизменен, вы можете изменить масштаб ваш холст с помощью CSS. Таким образом, вам не нужно перерисовывать содержимое холста.

4a. (Вариант # 1) Масштабирование с помощью CSS:

// rescale both CSS width & height by the SAME SCALE FACTOR 
$('#canvas').css('width',originalCanvasWidth*scale); 
$('#canvas').css('width',originalCanvasWidth*scale); 

Если содержание холста не полный & неизменного, вы должны изменить масштаб вашего самого холста элемента. Это приводит к потере всего содержимого холста, поэтому вы должны его перерисовать. Вы можете использовать команду context.scale для автоматического перерисовки содержимого по новому масштабному коэффициенту. Использование этого метода также с меньшей вероятностью приведет к пиксельному контенту и изменению размера с помощью CSS, который «растягивается» & «сжимает» существующие пиксели, чтобы соответствовать новому размеру CSS.

4b. (Вариант № 2) Масштаб самого холста элемент

var canvas=document.getElementById("myCanvas"); 
    var ctx=canvas.getContext("2d"); 

    canvas.width=originalCanvasWidth*scale; 
    canvas.height=originalCanvasHeight*scale; 

    context.scale(scale,scale); 

    // now reissue all the drawing commands 
    // (no need to adjust coordinates or sizes -- context.scale does that for you! 
+0

Спасибо большое – forty2011111

+0

Теперь, когда у меня это работает, как я могу нарисовать прямоугольник в середине экрана, который всегда занимает один и тот же размер экрана? Всегда ли нужно умножать на% или базовое значение по умолчанию? – forty2011111

+0

У вас есть несколько вариантов: (1) Не используйте context.scale, что означает, что fillrect (x, y, 10,10) нарисует прямоугольник, визуально 10x10. (2) «context.scale», который заставляет все новые чертежи увеличивать/уменьшать с помощью прилагаемого масштабного коэффициента (коэффициентов) и fillrect (x, y, 10,10), приведет к тому, что прямоугольник будет визуально 20x20. Если вы хотите квадрат 10x10, заполните fillRect (x, y, 10/scale, 10/scale). Те же самые два параметра относятся к координатам x, y. Ваш оригинальный вопрос: «Я бы хотел, чтобы он автоматически масштабировался с новым размером браузера», поэтому я добавил context.scale. Если вам это не нужно, вы можете оставить его и рисовать нормально ;-) – markE