質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.87%

  • Processing

    231questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

弾幕ゲームの作成に関して

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 218

plarex

score 4

 processingでのゲーム作成

初めて投稿します。
最近processingを勉強し始め、ゲームを作るという課題が出て、私は弾幕シューティングゲームを作ろうと思い、作成している最中なのですが、弾を放射状に打ち出すことはできたのですがこれを画面上部(上部にボス的なものを配置する予定)から、なおかつ連続で打ち出すにはどのようにコードを書けばいいのでしょうか?

 発生している問題・エラーメッセージ

### 該当のソースコード
Bullet bullet;
ArrayList danmaku;

void setup() {
  size(320, 480);

  frameRate(30);

  noCursor();  // clear mouse cursor

  bullet = new Bullet(width/2, height/2, 10, 0, 0 ); //クラスからインスタンスを生成

  danmaku = new ArrayList();   //クラスから36個インスタンスを生成

  for (int i = 0; i < 360; i+= 10) { 
    float rad = radians(i);
    danmaku.add(new Bullet(width/2, height/2, 10, cos(rad), sin(rad)));
  }
}
// my ship function

void ship(int x, int y) {

  stroke(255, 255, 255);

  noFill();

  triangle(x, y -7, x - 10, y + 7, x + 10, y + 7);

  if (mousePressed) {
    line(x, y - 7, x, 0);
  }
}

// Bullet class

class Bullet {

  float tx, ty, tr, dx, dy;

  Bullet(float x, float y, float r, float temp_dx, float temp_dy ) {
    tx = x;
    ty = y;
    tr = r;
    dx = temp_dx;
    dy = temp_dy;
  }

  void update() { 
    tx += dx;
    ty += dy;

    stroke(255, 0, 0);

    ellipse(tx, ty, tr, tr);
  }
}




  void draw() {
    background(0); // clear

    ship(mouseX, mouseY);

    for (int i = danmaku.size() -1; i  >= 0; i--) {
      Bullet b = (Bullet)danmaku.get(i);
      b.update();
    }
  }

ここに言語名を入力
processing

 試したこと

 補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

上部にボス的なものを配置する予定

こういう場合(文章中に主語が出てきた場合)は専用のクラスを作成するとコードの管理が楽になります。
今回の場合はBossクラスになるかと。
Bossクラスは任意のタイミングで、弾幕を貼る。そのようなコードになります。

発射した弾の生存管理方法はいろいろな手法がありますが、
描画範囲外になったら生存フラグをfalseにして、描画時にリストから削除する形が楽かと。

あと変数の型をdouble型ではなくfloat型で宣言するのは、
宗教上の理由などがある場合を除き、float型の精度に起因する余計なトラブルを持ち込みむため、避けたほうが無難です。
この精度についての問題について、日本語で体系的に纏まっている情報としては2008年に出版された本ですが、「ゲームプログラマになる前に覚えておきたい技術」が纏まっています。
「ゲームプログラマになる前に覚えておきたい技術  float 中途半端な数による誤差」でキーワード検索してみてくださいな。

サンプルコードです。ご参考まで。

Bullet bullet;
private Boss boss = new Boss(100, 150);
private ArrayList<Bullet> danmaku = new ArrayList<Bullet>();

void setup() {
  size(320, 480);

  frameRate(30);

  noCursor();  // clear mouse cursor

  bullet = new Bullet(width/2, height/2, 10, 0, 0 ); //クラスからインスタンスを生成

}
// my ship function

void ship(int x, int y) {

  stroke(255, 255, 255);

  noFill();

  triangle(x, y -7, x - 10, y + 7, x + 10, y + 7);

  if (mousePressed) {
    line(x, y - 7, x, 0);
  }
}
class Boss {
  private int tx, ty;
  private int dx, dy;
  private long routine = 0;
  Boss(int x, int y) {
    tx = x;
    ty = y;
    dx = 1;
    dy = -5;
  }
  void move(){
    tx += dx;
    ty += dy;
    if(tx < 0 || tx > width){
      dx*= -1;
    }
    if(ty < 0 || ty > height){
      dy*= -1;
    }
  }
  void doShinking(){
    routine++;
    if(routine % 10 == 0){
      move();
    }
    if(routine % 30 == 0){
      danmaku.addAll(this.shot());
      println("#shot!!" +routine + ":" + tx + "," + ty);
    }
  }
  ArrayList<Bullet> shot() {
    ArrayList<Bullet> danmaku = new ArrayList();
    for (int i = 0; i < 360; i+= 10) { 
      double rad = radians(i);
      danmaku.add(new Bullet(this.tx, this.ty, 10, Math.cos(rad), Math.sin(rad)));
    }
    return danmaku;
  }
}
// Bullet class

class Bullet {

  private double tx, ty;
  private final double tr;
  private double dx, dy;
  private boolean is_alive = true;
  Bullet(double x, double y, double r, double temp_dx, double temp_dy ) {
    tx = x;
    ty = y;
    tr = r;
    dx = temp_dx;
    dy = temp_dy;
  }
  boolean isAlive(){
    return is_alive;
  }
  void update() { 
    tx += dx;
    ty += dy;
    if(Math.min(tx, ty) < 0){
      is_alive = false;
      //println("#" + tx + "," + ty);
      return ;
    }
    if(tx > width || ty > height){
      is_alive = false;
      return ;
    }
    stroke(255, 0, 0);

    ellipse((float)tx, (float)ty, (float)tr, (float)tr);
  }
}
  void draw() {
    background(0); // clear

    ship(mouseX, mouseY);
    boss.doShinking();

    for (int i = danmaku.size() -1; i  >= 0; i--) {
      Bullet b = (Bullet)danmaku.get(i);
      if(!b.isAlive()){
        danmaku.remove(i);
        continue;
      }
      b.update();
    }
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 14:51

    Processing固有の仕様なのですが、doubleよりfloatを優先しているのはご存知と思います。Processing固有の初等関数(cos, sinとか)も引数型はfloatなんですよね・・・。自分も初めて触った時「なぜfloat?」と思ったのですが、高精度な計算を必要としない応用が多いのかなぁなんて思いました。

    キャンセル

  • 2018/05/04 15:05 編集

    もしよろしければ、もう1つの質問も答えてくださると幸いです。

    キャンセル

  • 2018/05/04 16:18 編集

    もう1つの回答とは?ひょっとして自分のコメントに関係しますでしょうか?
    ---
    失礼しました。勘違いしてました。

    キャンセル

  • 2018/05/04 16:36

    >KSwordOfHasteさんへ
    どうなんでしょうねー。Processingの登場が2001年なので、その当時のマシンスペックではfloat型で扱うのが正義だった可能性もあるかと。

    キャンセル

  • 2018/05/04 16:52

    初リリースが2008年とかだったのでそうまで古くないのかと思ってましたが2001年なんですか!なんだか宗教上の理由な気がw;

    キャンセル

+1

setupはアプリケーション開始時に一度だけ、drawは何度も(フレームレートに指定した頻度で)呼び出されます。

ゲーム中に自動的に(連続的に)何かをする(弾を発射する)ならdrawに何かを書かないといけないことになるでしょう。

弾はある時間間隔で発射すると考えればよいでしょうね。というわけでdrawが呼び出された時、「今弾を発射すべきか」「まだ発射すべきでないか」を判断する必要があります。

ご質問のコードではフレームレートを30にしているのでdrawは1秒間に概ね30回ほど呼び出されます。仮にdrawが呼び出される度に1ずつ値を増加させるような変数を用意しておくと、その変数が15増える度に弾を発射することにすれば(概ね)0.5秒ごとに弾が発射できる・・・こんなふうに考えます。

また弾の位置はBulletクラスのコンストラクターの第一、第二引数に指定してますね?今のコードではwidth/2, height/2を指定しています。この式の意味はわかりますね?では上の方の座標を指定するのはどうしたらよいでしょうか?考えてみてください。

このように、どうしたら「必要な処理」「必要な判定」「必要な値の計算」が行えるか考えながらプログラムを作ってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    星を動かしたいです!

    書いた星を動かしたいです この中に組み込みたいと思っています( ;  ; ) 全然わからなくて困っているので助けてください! void setup(){ size(80

  • 受付中

    processingで特定の点の軌跡を残したい

    processing で、 円Aの周上を動径の回転に沿って移動する点を中心とする円Bを描き、 円Bの周上を動径の回転に沿って移動する点を中心とする円Cを描き、

  • 受付中

    unexpected token : voidとエラーする解決法

    processingでこのようなコードを打ち込んだのですが、 エラーが出ます。 どこが悪いのか教えてください。 ちなみにエラーはunexpected token : voidとでま

  • 解決済

    processingで範囲指定してフレームの保存を行うやり方

    前提・実現したいこと processingでプログラムを組んでいます。 現在、SaveFrameを使って実行結果の画像書き出しを行い、ツールからムービーメーカーで動画にしています。

  • 解決済

    円柱の曲面に文字や図形を表示したい。

    いつもお世話になっています。  前提・実現したいこと 表題通りです。 円柱の曲面に文字や図形を表示したいです。 テクスチャマッピングなるもので要件を満足する方法があるのです

  • 解決済

    表示に穴を開けるには。

     前提・実現したいこと 以下の図の赤丸のようにスケールバーの指定の場所をくり抜いて奥の表示を出現させるテクニック、あるいは目的の描写を周囲に被らせないように行うトリミングのテクニッ

  • 解決済

    Processing実行中のCPU使用率が異常に高い

    Processing実行中にタスクマネージャーを見てみると、Java(TM) Platform SE binaryが常に30%以上ものCPUを使っています。数行程度の簡単なコードで

  • 解決済

    二つのゲームを合わせて一つのゲームにしたい (削除依頼済)

    processingを学び始めてから間もなく知識が疎いです。 なんとかしてゲームを二つ作りました。 私の計画では、ここから二つのゲームを一つにしたいのですが、できません。 私が

同じタグがついた質問を見る

  • Processing

    231questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。