P5.js: рисование элемента за пределами рисования

У меня простой вопрос. В p5.js есть функция рисования. Я думаю, вы можете рисовать только элементы (например, прямоугольник изнутри этой функции). Я хочу нарисовать один прямоугольник во время функции, которая находится за пределами рисования. (запускается только при определенных событиях). Кто-нибудь знает, как я могу это сделать?

Обновлено: пробовал просто рисовать снаружи с помощью rect (x, y, w, h) не работает
также пробовали создать this.drawRect = function () {} внутри draw (), тоже не повезло

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 083
1

Ответы 1

TL; DR: https://jsbin.com/widinuruna/edit?html,css,js,output

function setup() { 
  createCanvas(400, 400);
  noLoop() // make draw to only be called once
} 

function draw() { // usually called 60 times / s
  background(220); // clears the canvas (including your rect, if drawn before)
}

setTimeout(()=> {
  rect(20,20,50,50)
}, 300)

Вероятно, ваш прямоугольник был нарисован до того, как вы его увидели :)

ссылка: https://p5js.org/reference/#/p5/draw


Допустим, вам нужно нарисовать прямоугольник под курсором при нажатии мыши. В зависимости от вашего варианта использования вы можете:

  • перерисовывать все непрерывно

    // try changing 60 to eg. 1, and click fast while moving the cursor
    // - you'll see it will still only update once a second
    function setup() {
      createCanvas(400, 400)
      frameRate(60) // make draw be called 60 times/s (default?)
    }
    // keeping "state" as an object is a common practice... 
    const state = {x: 0, y: 0} // initialize state
    // ...then it can be updated whenever, eg. on interaction,
    //  without caring about the drawing
    function mousePressed() {
      // update state on interaction
      state.x = mouseX; state.y = mouseY
    }
    // ...the screen will then update independently
    function draw() {
      // (avoid changing the state here)
      background(220) // clear the canvas
      rect(state.x, state.y, 50, 50) // draw according to state
    }
    // by separating "logic" (eg. changing the state) and drawing:
    //  - a "game" will "behave" the same even at different fps,
    //    important for multiplayer etc.
    //  - code will be simpler to reason about and work with, etc
    
  • перерисовывать только при необходимости

    // using noLoop() in setup, draw() will only be called once initially
    // then, either use rect in eg. mousePressed, or:
    // keep using state, but manually call redraw() after changing the state
    pros = "more efficient if less redraws then eg. 60fps is needed"
    cons = "need to know when to invoke redraw,"
         + "possibly makes code a bit more complicated"
    
  • перерисуй только то, что нужно

    // using either point 1 or 2, but in addition keeps track of the
    // previous state, then, only redraws the part of the screen necessary
    // eg. instead of calling background(200), which is the same as:
    fill(200); rect(0,0,width,hight); fill(255) // to clear the screen (and restore fill color)
    fill(200); rect(oldState.x,oldState.y,50,50); fill(255) // clearing only what was previously drawn
    /* followed by */ rect(state.x,state.y,50,50); // as normal
    // (assumes noStroke() is called in setup)
    pros = "possibly much more efficient if large canvas"
    cons = "possibly more complicated"
    

Другие вопросы по теме