LINUX.ORG.RU

вопрос про язык processing

 


0

1

Приветствую,
Первый день разбираюсь с processing'ом, заметил, что если в цикле draw() создать свой for() loop, то расположенные внутри него инструкции вывода графики не работают, работают только если расположены непосредственно в цикле draw(). Почему так?

★★★★★

Скорее всего потому, что после draw() вызывается обновление окна, а в твоём цикле оно не вызывается. Поищи что-нибудь навроде update() или repaint() или ещё чего. Я на processing не писал ни разу, если что. Возможно всё немного сложнее.

anonymous
()
Ответ на: комментарий от anonymous

ок, спасибо за наводку

af5 ★★★★★
() автор топика

Если что-то не рисуется, то оно либо не запускается вообще, либо вызывается draw, который перерисовывает окно тебе.

Norgat ★★★★★
()

Какое-то странное суеверие. Покаж код.

ii8_ ★★★★
()
Ответ на: комментарий от vladimir-vg

да какой там код

//Так работает:
int x=22;
void setup()
{
  size(400,200);
}

void draw()
{
  background(111);
  rect(x,22,88,88);
  if(++x>250) x=22;
}



//Так не работает:
void setup()
{
  size(400,200);
}

void draw()
{
  for(int x=22; x<250; x++)
  {
    background(111);
    rect(x,22,88,88);
    if(x>250) x=22;
  }
}

af5 ★★★★★
() автор топика

Я кажется сообразил. Наверное draw() работает с какой-то задержкой, а внутренний луп получается работает со скоростью света. Наверное нельзя так делать.

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от af5

Какую то конкретно сложно подсказать, тебе нужна любая книжка по компьютерной графике

umren ★★★★★
()
Ответ на: комментарий от anonymous

след остается черный за квадратом, но кадр 1 только. Грешил на отсутствие задержки, но попытки её вставить ни к чему хорошему не приводят. umren прав про один кадр. Создать множество квадратов в лупе можно, а анимировать - нет.

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)

а зачем вообще засовывать цикл (for) внутрь цикла (draw)? ведь draw, судя по описанию, и так бесконечный цикл

the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called

CryAngel
()
Ответ на: комментарий от CryAngel

Ну зачем вообще внутрь одного кода другой код пишут. А с draw() уже разобрались.

af5 ★★★★★
() автор топика
Ответ на: комментарий от af5

внутрь одного кода другой код

ну, какой-то код - понятно, но конкретно цикл, который будет выполняться в течении каждого кадра и при этом этот вложенный цикл - единственное, что есть в теле draw - не очень.

А с draw() уже разобрались

ну ок. просто ты писал:

Создать множество квадратов в лупе можно, а анимировать - нет.

тогда как и создать, и анимировать можно хоть с циклом, хоть без.

CryAngel
()
Ответ на: комментарий от CryAngel

Можно, но с for() даже для одного кадра можно подготовить много всего к визуализации. Это к вопросу «зачем for() в draw()»

af5 ★★★★★
() автор топика
Ответ на: комментарий от af5

Вынеси background(111); за пределы for, расположи отрисовку background над циклом.

Hertz ★★★★★
()
Ответ на: комментарий от CryAngel
void setup() {
  size(480, 120);
}

void draw() {
  background(0);
  noStroke();
  for (int y = 0; y <= height; y += 40) {
    for (int x = 0; x <= width; x += 40) {
      fill(255, 140);
      ellipse(x, y, 40, 40);
    }
  }
}
af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от Hertz

не о том речь была. Я думал анимацию в for() можно сделать, а она только циклом draw() делается.

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от af5

и это работает? работает, как и задумано? анимации тут точно не должно быть, просто несколько эллипсов.

Я думал анимацию в for() можно сделать, а она только циклом draw() делается.

если я правильно понимаю логику, то тело draw - это один кадр, а значит, анимация циклом внутри тела draw невозможна, т.к. анимация делается несколькими кадрами. на каждый кадр будет заново выполнено тело draw, поэтому изменения, необходимые для анимации нужно подготовить к следующему вызову тела draw. ты же пытался делать изменения и тут же отрисовывать их, все в одном проходе, в одном кадре.

CryAngel
()
Ответ на: комментарий от CryAngel

и это работает? работает, как и задумано? анимации тут точно не должно быть

ну да, без анимации. Показал назначение for() - создавать объекты (массивы объектов)

если я правильно понимаю логику, то тело draw - это один кадр, а значит, анимация циклом внутри тела draw невозможна

ты бы тему почитал, я об этом и говорю.

af5 ★★★★★
() автор топика

теперь я знаю как нарисовать сову:

void setup() {
size(480, 120);
}
void draw() {
background(176, 204, 226);
translate(110, 110);
stroke(138, 138, 125);
strokeWeight(70);
line(0, -35, 0, -65); // Body
noStroke();
fill(255);
ellipse(-17.5, -65, 35, 35); // Left eye dome
ellipse(17.5, -65, 35, 35);  // Right eye dome
arc(0, -65, 70, 70, 0, PI);  // Chin
fill(51, 51, 30);
ellipse(-14, -65, 8, 8); // Left eye
ellipse(14, -65, 8, 8); // Right eye
quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak
}

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от af5

ты бы тему почитал, я об этом и говорю.

тему я всегда читаю целиком, если собираюсь отвечать

я знаю как нарисовать сову

а как анимацию делать ты уже понял, или еще нет?

CryAngel
()
Ответ на: комментарий от CryAngel

да, спасибо, ты всё объяснил.

af5 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.