Javaの「args(起動ポケット)」をProcessingのワープ土管アニメーションで視覚化してみた【WSN : L-010】

ワタタクの作品アーカイブ「WSN: L-010」。Javaのmainメソッドの引数「String[] args」をデータが流れるパイプラインとして表現したフロー図。電子の闇のような深いネイビーの背景の左側に「COMMAND LINE(外の世界)」の枠があり、「java MarioGame むてき」という文字が入力されている。そこから中央に伸びる紫色の太い直線「ワープ土管:String[] args」を通って、右側の「PROGRAM INTERNAL(プログラムの内部)」の枠へとデータが流れ込んでいる。内部では流し込まれたデータが読み取りに成功し、右側の空間全体に「★ STATUS: GOLDEN MUTEKI MODE ★」を象徴する無数の光り輝く黄金の粒子が激しく発光しながら飛び散っている。
  • URLをコピーしました!
今回の記事の目的
  • Javaの起動パラメーター String[] args の本質である、「外の世界からデータを流し込むワープ土管」の仕組みをProcessingのキャンバス上に視覚化する。
  • 外からデータが注入された瞬間に、内部の変数(ゲームモード)が動的に切り替わるシステムを体感する。
ワタタク

どうも上達の研究家のワタタクです。

前回の記事(public static void main(String[] args) の最深部!「おまけの引き出し(args)」をわかるように完全解体!

では、起動呪文の5つの単語の目的を解体しました。

今回はその最深部にある、カッコの中の居候。 String[] args (ストリング・アレイ・アーグス)

これ、「書けって言われるから書いてるけど、一体何のためにあるの?」と脳内フリーズを起こしがちなパーツですよね。 その本質は、プログラムを起動するまさにその瞬間に、外の世界(コマンド画面)から中に秘密のメッセージを流し込むための「ワープ土管(受付バケツ)」です!

今回はLinked Logカテゴリーとして、「外の世界から『むてき』という文字データが投げ込まれた瞬間、argsという土管を通ってプログラムの脳みそに届き、ゲームのモードが黄金の無敵状態へとリアルタイムに書き換わる世界」をProcessingのコードで表現してみました!

コードの中に「受け皿」を用意する意味が、一発で脳にマッピングされる設計図と実装コードを共有します。

この記事を書いた人

クリエイティブコーダー Watataku のプロフィール写真
ワタタク(Watataku)

上達の研究家 / アーティスト

「才能」ではなく「発見」で描く。文系・36歳からの上達ハック。

  • ゼロから独学でクリエイティブコーディングに挑戦し、以下の実績を達成
    • 開始1年8ヶ月目までに公募6つに挑戦し、3つ入選(勝率50%)
      • KITTE大阪の18メートルあるAxCROSS大型スクリーン
      • 虎ノ門ヒルズステーションタワーB2F TOKYO NODE エントランスサイネージで展示
      • UN:O(東京大手町)にある会員限定のサテライトオフィスにて2作品常設展示
  • 開始1年9ヶ月目に、虎ノ門ヒルズ49階、地上250mのインフィニティプールへ作品提供・展示
  • 実際の展示作品と動画、音楽やSEOでの実績はポートフォリオに載せております→https://my-portfolio-blue-three-63.vercel.app/works
目次

脳内をビジュアライズするための設計思想

Javaの String[] args をグラフィックに落とし込むため、以下の3つのギミックを仕込みました。

1. 「外の世界(コマンド入力)」と「プログラムの内部」の境界線

画面の左側を「外の世界(黒いコマンド画面)」、右側を「プログラムの内部(マリオのゲーム空間)」としてバシッと2分割。プログラムが起動する瞬間の「データの移動」を表現。

2. データを中に引き込む「argsという名のワープ土管」

2つの世界を繋ぐ境界線に、大きな紫色のチューブ(args という名のワープ土管)を配置。画面をクリックすると、外の世界で入力された「むてき」という文字のデータ(Particle)が、この土管をシュッと通り抜けて内部へデプロイ(注入)されるアニメーションを設計しました。

3. データを受け取って「黄金に覚醒する」メインステージ

最初は普通のステージ1(青い粒子)で動いていたプログラムが、土管から「むてき」のデータを受け取った(args[0].equals("むてき"))瞬間、内部の変数が書き換わり、画面全体が激しくきらめく「黄金の無敵モード(ゴールドオーラ)」へと変身する動的なエフェクトを実装しました。

Processing実装コード

実行すると、外の世界と内部の世界を繋ぐシステムが立ち上がります。

実行結果。

ワタタクの作品アーカイブ「WSN: L-010」。Javaのmainメソッドの引数「String[] args」をデータが流れるパイプラインとして表現したフロー図。電子の闇のような深いネイビーの背景の左側に「COMMAND LINE(外の世界)」の枠があり、「java MarioGame むてき」という文字が入力されている。そこから中央に伸びる紫色の太い直線「ワープ土管:String[] args」を通って、右側の「PROGRAM INTERNAL(プログラムの内部)」の枠へとデータが流れ込んでいる。内部では流し込まれたデータが読み取りに成功し、右側の空間全体に「★ STATUS: GOLDEN MUTEKI MODE ★」を象徴する無数の光り輝く黄金の粒子が激しく発光しながら飛び散っている。
// ==========================================
// 知識を視覚化する:Javaの「起動ポケット(String[] args)」
// (マウスクリックでデータ注入&デスクトップ自動保存)
// ==========================================

PFont jpFont;
boolean isLoaded = false; // 外からデータが注入されたか
float tubeProgress = 0;   // 土管の中をデータが移動する進捗
float angle = 0;

int pCount = 50;
float[] px = new float[pCount];
float[] py = new float[pCount];
float[] pSpeedX = new float[pCount];
float[] pSpeedY = new float[pCount];

void setup() {
  size(1200, 600);
  initGameParticles(false); // 最初は通常モード
}

// 内部のゲームステージの粒子を初期化
void initGameParticles(boolean muteki) {
  for (int i = 0; i < pCount; i++) {
    px[i] = random(750, 1100);
    py[i] = random(200, 450);
    pSpeedX[i] = random(-1.5, 1.5);
    pSpeedY[i] = random(-1.5, 1.5);
  }
}

void draw() {
  jpFont = createFont("Meiryo", 24, true);
  textFont(jpFont);
  background(20, 24, 35); // 深みのあるサイバースペース
  
  angle += 0.05;
  
  // タイトル共通設定
  textSize(24);
  textAlign(CENTER, TOP);
  fill(245);
  text("【起動ポケット(String[] args)の世界】\n外の世界からデータを流し込み、内部の変数をリアルタイムにハックする", width / 2, 30);

  // -------------------------------------------------------------
  // 左側:外の世界(コマンドライン画面)
  // -------------------------------------------------------------
  stroke(60, 70, 90);
  fill(10, 12, 18);
  rect(50, 140, 320, 320, 10);
  
  fill(100, 120, 140);
  textSize(12);
  text("💻 COMMAND LINE (外の世界)", 70, 160);
  
  fill(255);
  textSize(16);
  textAlign(LEFT, CENTER);
  text("> java MarioGame", 70, 230);
  
  // クリック前は文字が薄く、クリックするとデータが確定する演出
  if (!isLoaded && tubeProgress == 0) {
    fill(241, 196, 15, 100);
    text("むてき  ◀ クリックで入力!", 220, 230);
  } else {
    fill(241, 196, 15);
    text("むてき", 220, 230);
  }

  // -------------------------------------------------------------
  // 中央:データを引き込むワープ土管(args)
  // -------------------------------------------------------------
  // 土管(チューブ)の描画
  noFill();
  stroke(155, 89, 182, 100); // argsを象徴する紫の土管
  strokeWeight(24);
  line(270, 245, 650, 245);
  stroke(155, 89, 182);
  strokeWeight(2);
  line(270, 245, 650, 245);
  
  fill(155, 89, 182);
  textSize(14);
  textAlign(CENTER, BOTTOM);
  text("ワープ土管: String[] args", 460, 225);

  // 土管の中を通るデータの光(アニメーション処理)
  if (tubeProgress > 0 && tubeProgress < 1) {
    tubeProgress += 0.04;
    float lx = lerp(270, 650, tubeProgress);
    fill(255, 255, 200);
    noStroke();
    ellipse(lx, 245, 18, 18);
    fill(241, 196, 15);
    textSize(12);
    text("\"むてき\"", lx, 275);
  } else if (tubeProgress >= 1 && !isLoaded) {
    isLoaded = true; // 内部にデータがデプロイされた!
    initGameParticles(true);
  }

  // -------------------------------------------------------------
  // 右側:プログラムの内部(MarioGameの脳みそ)
  // -------------------------------------------------------------
  stroke(isLoaded ? color(241, 196, 15, 150) : color(52, 152, 219, 150));
  strokeWeight(2);
  fill(28, 34, 48);
  rect(650, 140, 500, 320, 10);
  
  fill(130, 145, 165);
  textSize(12);
  textAlign(LEFT, TOP);
  text("🕹️ PROGRAM INTERNAL (プログラムの内部)", 670, 160);
  
  // 脳みそのチェック構文(コード)を画面に表示
  fill(150);
  textSize(13);
  text("if (args.length > 0) {", 680, 200);
  
  if (isLoaded) fill(241, 196, 15); else fill(100);
  text("    if (args[0].equals(\"むてき\")) {", 680, 225);
  text("        startMode = \"★無敵状態\"; ◀ 読み取り成功!", 680, 250);
  fill(150);
  text("    }\n}", 680, 250);

  // ステージ内のマリオゲームの状態ログ表示
  fill(255);
  textSize(16);
  text("現在の設定:", 680, 330);
  if (isLoaded) {
    fill(241, 196, 15); // 無敵モード(ゴールド)
    text("マリオは無敵状態になりました!", 770, 330);
    text("★ STATUS: GOLDEN MUTEKI MODE ★", 680, 410);
  } else {
    fill(52, 152, 219); // 通常モード(ブルー)
    text("現在のステージ: 1 からスタート", 770, 330);
    text("● STATUS: NORMAL MODE", 680, 410);
  }

  // 内部で躍動するプログラム粒子(Particle)の描画
  for (int i = 0; i < pCount; i++) {
    px[i] += pSpeedX[i];
    py[i] += pSpeedY[i];
    
    // ゲームのハコの中で跳ね返る
    if (px[i] < 720 || px[i] > 1120) pSpeedX[i] *= -1;
    if (py[i] < 350 || py[i] > 440) pSpeedY[i] *= -1;
    
    noStroke();
    if (isLoaded) {
      // 無敵状態:ゴールドに激しく明滅するネオンオーラ
      fill(241, 196, 15, random(100, 255));
      ellipse(px[i], py[i], 10, 10);
      fill(241, 196, 15, 40);
      ellipse(px[i], py[i], 20, 20);
    } else {
      // 通常状態:静かなブルーの粒子
      fill(52, 152, 219, 180);
      ellipse(px[i], py[i], 8, 8);
    }
  }

  // 操作案内表示
  fill(120);
  textSize(12);
  textAlign(CENTER, BOTTOM);
  text("🖱️ 画面をクリック:外の世界からデータを流し込む!", width / 2, height - 10);
}

// マウスクリックで土管にデータを流し込み、同時にデスクトップへ保存
void mousePressed() {
  if (tubeProgress == 0) {
    tubeProgress = 0.01; // アニメーション開始
  } else if (isLoaded) {
    // リセット処理(もう一度試せるように)
    isLoaded = false;
    tubeProgress = 0;
    initGameParticles(false);
  }
  

}

コード表現に落とし込んでみて気づいたこと

Javaの String[] args というラストパーツを、ただの「書き換えることのないお決まりの記号」として放置せず、Processingの「世界の境界線をまたぐインタラクティブなアニメーション」としてビルドしたことで、この引数の本当のありがたみが鳥肌が立つほど腑に落ちました。

コードの中に直接 startStage = 5; と書き込んでしまうと、ゲームは一生そのモードでしか起動しません。しかし、args という「受け皿(仕様)」だけをコード内に定義しておき、実際に動かす瞬間に外の黒い画面から むてき というデータを投げ込む。

この「コードの中(設計)」と「外の世界(実行アクション)」の見事な役割分担こそが、Javaの大規模開発を支えるオブジェクト指向の本当の柔軟性であり、優しさの仕様なんだなと深く感動しました。

クリックした瞬間に光のデータが紫の土管(args)を渡っていき、右側のメインステージがパッと黄金の無敵カラーに覚醒するエフェクトは、動かしていてめちゃくちゃ脳汁が出ます!

皆さんもぜひ、この外の世界からプログラムの脳みそをハックする快感を、手元で動かして体感してみてください!

ワタタク

それでは今日もレッツワクワクコーディング。

関連記事

ワタタク(Watataku)
上達の研究家 / アーティスト
独学1年9ヶ月で虎ノ門ヒルズ49階、地上250mのインフィニティプールへ作品提供・展示

言葉×コード×手書き。三位一体の表現が成長する過程の記録

【発信】クリエイティブコーディング(2024.3~) / 絵(2025.11~) / モレスキン / 思考法 / 生き方

▼運営者について
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次