안녕하세요.
또 기초적인 궁금점이 있어서 질문을 올립니다..^^;
질문이 많아서 죄송해요.
제가 프로세싱을 혼자 시작한지 얼마 안되고 프로그래밍쪽으로는 거의 제로이거든요.. ㅠㅠ
아래 코드는 Openprocessing.org 사이트에서 가져온 코드인데요.
본래에 있던 mousePressed 대신 소니아 라이브러리를 가져와서
볼륨이 0.5에서 1사이인 소리가 입력될 경우 particle이 나오게 바꾸어봤어요.
몇가지 알고 싶은 것이 있는데,
첫번째로 소리로 발생한 움직이는 particle 들을 키보드의 버튼 하나를 누름으로써
마치 얼음 땡 놀이 처럼 정지시키게 하는게 궁금합니다.
processing.org 에서 어떤분 답변은 그냥 update 하던걸 중지시키라고 하는데 중지를 어디서 어떻게 하는건지를 ㅠㅠ..
제가 하고 싶은 것은 키보드를 눌러서 정지된 그 화면을 바로 processing.pdf 라이브러리를 가져와 pdf 모드로 설정 후 바로 키보드 버튼을 눌러 smileblue 님이 포스팅 해주셨던 프린터로 출력하기 인데요..
링크해주신 프로세싱 구버전을 다운받아서 정적인 이미지를 만든 후 PDF 모드로 설정하고 바로 키보드를 누르면 출력하게하는 연습도 해봤는데 지금 같은 경우에는 일단 움직이는 particle 들을 어떻게 정지시키는지조차 몰라서 어떻게 손을 못대겠어요..
어떻게 해결할 수 있을까요?
class Moving
{
float x = 30;
float y = 30;
float xv = -3+random(6);
float yv = -random(4);
float maxYV = 20;
float gravity = 0.1;
float friction = 1;
float radius = random(5,20);
color c = color(random(255),random(255),random(255), random(100,255));
Moving(){
}
Moving(float xp,float yp)
{
x = xp;
y = yp;
}
Moving(float xp,float yp,float xvel,float yvel)
{
this(xp, yp);
xv = xvel;
yv = yvel;
}
void run()
{
update();
render();
}
public void update()
{
if(x <= radius)
{
xv = abs(xv);
}
else if(x >= width - radius)
{
xv = -abs(xv);
}
if(y + radius >= height)
{
yv = -abs(yv);
if(y + radius - height >= 0.15)
{
y = height - radius;
if(yv > -0.1)
{
xv *= 0.96;
}
}
}
if((yv < maxYV))
{
yv += gravity;
}
yv *= friction;
//println(yv);
y += yv;
x += xv;
}
void render()
{
noStroke();
fill(c);
ellipse(x,y,radius,radius);
}
}
class MovingSystem
{
ArrayList movings = new ArrayList();
MovingSystem() {
}
void add(Moving m)
{
movings.add(m);
}
void removeAll()
{
movings.clear();
}
void run()
{
for (int i = 0; i < movings.size(); i++)
{
Moving m = (Moving)movings.get(i);
m.run();
if (movings.size() > 50) {
movings.remove(0);
}
}
}
}
import pitaru.sonia_v2_9.*;
MovingSystem ms = new MovingSystem();
void setup()
{
size(800, 600, P2D);
Sonia.start(this);
LiveInput.start();
smooth();
noStroke();
ellipseMode(RADIUS);
}
void draw()
{
background(255);
float vol = LiveInput.getLevel();
if (vol > 0.5 && vol < 1)
{
ms.add(new Moving());
}
ms.run();
이}
public void stop() {
Sonia.stop();
super.stop();
}
void keyPressed()
{
if (key != CODED)
{
switch(key)
{
case 'r' :
ms.removeAll();
break;
}
}
}

안녕하세요.. ^^
기초적인 질문은 아니고요..클래스를 이해하셔야..수정할 수 있는 소스 입니다.^^;;;; (절대 기초적인거 아니예요.ㅜㅜ)
참 소냐에서 에러나던데..무시하고 진행했습니다.(아마 수정하셔야 할 것 같네요^^)
우선 두개의 클래스를 사용해서 파티클 이미지를 만든 소스 입니다.
클래시 부분은 전혀 수정할 내용은 없고요.
import pitaru.sonia_v2_9.*;
MovingSystem ms = new MovingSystem();
PImage temp_screen;
void setup()
{
size(800, 600, P2D);
Sonia.start(this);
LiveInput.start();
smooth();
noStroke();
ellipseMode(RADIUS);
}
void draw()
{
//background(255);
float vol = LiveInput.getLevel();
if (vol > 0.5 && vol < 1)
{
ms.add(new Moving());
}
if(keyPressed && key =='r')
{
println("Stop");
temp_screen = get(0, 0, width, height);
}
else
{
background(255);
ms.run();
println("Play");
}
}
public void stop() {
Sonia.stop();
super.stop();
}
//void keyPressed()
//{
// if (key != CODED)
// {
// switch(key)
// {
// case 'r' :
//
// ms.removeAll();
//
// break;
// }
// }
//}
제가 수정한 부분은 빨간색으로 표시했습니다.
우선 기존 주신 소스에서 화면이 흰색으로 바뀌는 이유는 background()가 화면을 계속 고쳐주고 있는 것과 removeAll가 모든 파티클을 삭제하기 때문입니다.
그래서 저는 키보드(r)를 눌렀을 때는 if 문을 사용해서 background()부분과 run부분을 돌아가지 않게 했어요.
다시 말해 화면이 새로 고쳐지지 않게 한 것입니다. 그리고 키보드를 눌렀을 때 PImage temp_screen 에 현재 화면을 저장하게 했습니다. temp_screen는 이미지 이기때문에 PDF 파일로 바꾸지 않고 바로 사용하시면 될 것 같네요.