中央からボールを飛ばすだけのプログラム3 クリックでマウスの方向を追いかけるよ

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    初めて自分でclassを作った気がするが、勝手がいまいちわからない。
    本当は範囲外に出た時はArrayList.remove()して、ArrayList.add(new Ball())したほうがスマートなのかなーと思ったが、removeするときの指定方法がわからなかったのでとりあえずBall()と同じ処理を書いておいた。
    Ball.move()をvoidからbooleanにして範囲外に出た時はfalseを返して、falseならremoveうんたらーと考えたが面倒になったので投げた。
    実は30行目のfor (Ball b : balls)の表記もよくわかっていない、100%はわかっていないが、30%くらいわかっている(一応うごかせるレベル)のでこれで実装。(すごくずさんなプログラミングだ)

    長いので”追記”に移動

    //中央からボールを飛ばす
    //クリックした場所に向かってボールが飛ぶ
    ArrayList<Ball> balls = new ArrayList<Ball>();
    
    float wind_x = 0;
    float wind_y = 0;
    
    //生成するボール数
    int ball_num = 15;
    
    void setup() {
      size(500, 500);
      background(255, 255, 255);
      smooth();
      noStroke();
    
      for (int i =0; i<ball_num; i++) {
        balls.add(new Ball());
      }
    }
    
    
    void draw() {
      fill(255, 255, 255, 30);
      rect(0, 0, width, height);
    
      if (mousePressed == true)
        wind();
    
      for (Ball b : balls) {
        b.move();
        b.display();
      }
    }
    
    void wind() {
      //中央からクリックした距離に応じて移動速度を変化
      float dist = sqrt(sq(mouseX - (width/2)) + sq(mouseY - (height/2)));
      float coe = 0.015;
    
      float X = (mouseX-width/2);
      float Y = (mouseY-height/2);
    
      float Angle;
    
      if (mouseX > width/2)
        Angle = atan(Y/X);
      else
        Angle = atan(Y/X) + PI;
    
      float dir_x = cos(Angle);
      float dir_y = sin(Angle);
    
      wind_x = dir_x * dist * coe;
      wind_y = dir_y * dist * coe;
    }
    
    void mouseReleased() {
      wind_x =0;
      wind_y =0;
    }
    
    class Ball {
      float r = 1;
      float x;
      float y;
      float x_ang;
      float y_ang;
    
      float speed;
    
      float ball_size;
    
      color rand_c;
      color black = color(0, 0, 0);
      color white = color(255, 255, 255);
    
      Ball() {
        x =width/2;
        y = height/2;
    
        x_ang = random(-1, 1);
        y_ang = random(-1, 1);
    
        speed = random(1, 3);
        ball_size = 30;
    
        rand_c = color(random(255), random(255), random(255), random(255));
      }
    
      void move() {
        x += (x_ang + wind_x) * speed;
        y += (y_ang + wind_y) * speed;
    
        if ((x < 0)||(x > width)||(y<0)||(y>height)) {
          x = width/2;
          y = height/2;
    
          x_ang = random(-1, 1);
          y_ang = random(-1, 1);
    
          speed = random(1, 3);
          ball_size = 30;
    
          rand_c = color(random(255), random(255), random(255), random(255));
        }
      }
    
      void display() {
        fill(rand_c);
        ellipse(x, y, ball_size, ball_size);
      }
    }
    

    for (Ball b : balls)をやめて、範囲外に出た時にはArrayList.remove()してからArrayList.add(new Ball())にしてみた。

    //中央からボールを飛ばす
    //クリックした方向に向かってボールが飛ぶ
    ArrayList<Ball> balls = new ArrayList<Ball>();
    
    float wind_x = 0;
    float wind_y = 0;
    
    //生成するボール数
    int ball_num = 20;
    
    color black = color(0, 0, 0);
    color white = color(255, 255, 255);
    
    void setup() {
      size(500, 500);
      background(white);
      smooth();
      noStroke();
    
      for (int i =0; i<ball_num; i++)
        balls.add(new Ball());
    }
    
    
    void draw() {
      fill(white, 30);
      rect(0, 0, width, height);
    
      if (mousePressed == true)
        wind();
    
      for (int i =0; i<balls.size (); i++) {
        Ball b = (Ball)balls.get(i);
        if (b.update() == true) {
          b.display();
        } else {
          balls.remove(i);
          balls.add(new Ball());
        }
      }
    }
    
    void wind() {
      //中央からクリックした距離に応じて移動速度を変化
      float dist = sqrt(sq(mouseX - (width/2)) + sq(mouseY - (height/2)));
      float coe = 0.015;
    
      float X = (mouseX-width/2);
      float Y = (mouseY-height/2);
    
      float Angle;
    
      if (mouseX > width/2)
        Angle = atan(Y/X);
      else
        Angle = atan(Y/X) + PI;
    
      float dir_x = cos(Angle);
      float dir_y = sin(Angle);
    
      wind_x = dir_x * dist * coe;
      wind_y = dir_y * dist * coe;
    }
    
    void mouseReleased() {
      wind_x =0;
      wind_y =0;
    }
    
    class Ball {
      float x;
      float y;
      float x_ang;
      float y_ang;
    
      float speed;
    
      float ball_size = 30;
    
      color c;
    
      Ball() {
        x =width/2;
        y = height/2;
    
        x_ang = random(-1, 1);
        y_ang = random(-1, 1);
    
        speed = random(1, 3);
    
        c = color(random(255), random(255), random(255), random(255));
      }
    
      boolean update() {
        x += (x_ang + wind_x) * speed;
        y += (y_ang + wind_y) * speed;
    
        if ((x < 0)||(x > width)||(y<0)||(y>height)) {
          return false;
        }
        return true;
      }
    
      void display() {
        fill(c);
        ellipse(x, y, ball_size, ball_size);
      }
    }
    
    スポンサーサイト