////////// ユーザーが状況を見て数値を変える //////////////////// int gosaPer = 5; // 横幅のgosaPerパーセント以内の移動は誤差とみなす ////////// 定義された数値(ユーザーは基本編集しない) //////////////////// color bgColor = color(0); // 背景色。黒 int gosa; // 誤差の値。setup()内で計算 int refreshTime = 30; // フレームレート(1秒間に再描 画 する回数) int w = 800; int h = 600; ////////// 変数(ユーザーは編集しない //////////////////// int scrX, scrY; // 出力画像中央の座標 int fromX = 0, fromY = 0; // 出力画像の移動元座標 int toX = w/2, toY = h/2; // 出力画像の移動先座標 int vx, vy; // 移動量 int imgCnt = 9; // 出力画像番号 ////////// image //////////////////// PImage[] imgNum; boolean drawNum = false; ////////// 各種初期設定など //////////////////// void setup() { size(w, h); // ウィンドウの作成 frameRate(refreshTime); // フレームレートの設定 background(bgColor); // 画面色の設定 // 楕円描画関係の初期設定 smooth(); stroke(255); strokeWeight(5); noFill(); // 出力画像の読み込み imgNum = new PImage[10]; for(int i = 0; i < 10; i++){ imgNum[i] = loadImage("num" + i + ".png"); } // 誤差の範囲の設定 gosa = width * gosaPer / 100; } ////////// 定期的に行う処理 //////////////////// void draw() { background(bgColor); // 画面を塗りつぶす searchMouse(); // マウスポインタを探す if(toX == scrX && toY == scrY){ if(!drawNum){ drawNum = true; imgCnt++; if(imgCnt >= 10) imgCnt = 0; } } else{ drawNum = false; } // 出力する if(drawNum){ // 画像の出力 image(imgNum[imgCnt], scrX - imgNum[imgCnt].width / 2, scrY - imgNum[imgCnt].height / 2); } else{ // 楕円の描画 ellipse(scrX, scrY, imgNum[imgCnt].width / 2, imgNum[imgCnt].height / 2); } } //////////////////// マウスポインタを探す・誤差を無視する ////////////////////////////// void searchMouse() { int x = mouseX; int y = mouseY; if(fromX == -1 && fromY == -1){ // 1回目 scrX = toX = fromX = x; scrY = toY = fromY = y; } else{ // 2回目以降 if( !gosaCheck(x, fromX) || !gosaCheck(y, fromY) ){ // 誤差の範囲外 = 移動してる fromX = toX; fromY = toY; toX = x; toY = y; } } movingImg(); // 出力画像の移動 } // 誤差チェック boolean gosaCheck(int n1, int n2) { int g = n1 - n2; if(g < 0) g *= -1; if(g < gosa) return true; return false; } //////////////////// 出力画像の移動 ////////////////////////////// void movingImg() { // xについて if(scrX != toX){ // 現在地と目的地が違う = 移動の必要あり vx = (toX - scrX) / 5; if(vx == 0) scrX = toX; // あまりに近かったら到達させる else scrX += vx; } // yについて if(scrY != toY){ // 現在地と目的地が違う = 移動の必要あり vy = (toY - scrY) / 5; if(vy == 0) scrY = toY; // あまりに近かったら到達させる else scrY += vy; } }