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

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

ただいまの
回答率

90.83%

  • Java

    12867questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Processing

    232questions

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

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

解決済

回答 2

投稿 編集

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

AzukiV

score 3

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

私がとった方法は、一つのゲーム中のvoid setup(),void draw()の中にもう一つのゲームのvoid draw(),void setup()の内容を書くというものです。

しかし、一方のゲームしか起動しませんでした。

下記の二つのゲームを一つのゲームとして成り立たせたいです。
概要は青いボールを避けながら、上から降ってくる赤いボールに触れるというものです。

float frballx; //仲間ボールのx座標
float frbally; //仲間ボールのy座標

float frsp=0; //仲間ボールの速度
float fra=0; //仲間ボールの加速度
float g = 3;


float touch=0;

void setup(){

  size(500,650);

  frballx=width/2;
}

void draw(){
  background(255);
  smooth();

  frsp = frsp + g /30+fra;
  frbally = frbally + frsp;

  stroke(255,0,0);
  fill(255,0,0);
  ellipse(frballx,frbally,30,30);

  if(frbally>665){
    textSize(20);
    text("GameOver",20,20);
    frameRate(0);
  }
  if(mouseX>frballx-30 && mouseX<frballx+30 && mouseY>frbally-30 && mouseY<frbally+30){

    touch=80;

     fra=0.0001;

     next(); //次の球がでる
     }}

//次の球の設定  
void next(){
     frbally=-200; 
     frsp=0;
     frballx=20 + random(465);

}
enball[] ball = new enball[7]; //敵ボールの定義

int i = 0;  // forに使う
int j= 0;  // 同上

int M7 = 0;  // ボールが7個ある

float[] enballx = new float[7]; // 敵ボールの座標
float[] enbally = new float[7]; // 
int flg = 0;


void setup() {

  size(500,650);

  for (i = 0; i < 7; i=i+1) {

    ball[i] = new enball(30, 30, 30, 30); //敵ボール

   ball[j].set(mouseX + 15, mouseY + 15, random(5, 8), random(5,8)); //(float X, float Y, float enspX, float enspY) enspXは敵のボールのX速度 enspYは敵ボールのY速度

  j=j+1;
  if (j == 7) {   
     j = 0;
    M7 = 1;  
  }
}
}


void draw() {
  background(255);
  for (i = 0; i < 7; i=i+1) {

    ball[i].latest(); //最新の画面に切り替える       
    ball[i].hitwall(); //画面の上下左右端に当たったときの設定用
    ball[i].ballfun();          //ボールの設定用 function

    hitme();  // ボールが自機にヒットしたときの設定用
  }
  stroke(255,0,0);
  fill(255,0,0);
  rect(mouseX-5, mouseY-5, 10, 10); //自機の設定

}



class enball {  //敵ボール

  PVector posi;  //位置を定義
  PVector ensp;  //速度を定義
  enball(float X, float Y, float enspX, float enspY) { 

    posi = new PVector(X, Y);   //向きベクトル
    ensp = new PVector(enspX, enspY); //速度ベクトル
  }


  void latest() {  
    posi.add(ensp);  //位置+速度
  }


  void hitwall() {  
    if ((posi.x > width)||(posi.x < 0)) {
      ensp.x = -ensp.x;  //ボールが左右の壁に触れると反射
    }
    if ((posi.y > height)||(posi.y < 0)) {
      ensp.y = -ensp.y;  //ボールが上下の壁に触れると反射
    }
  }

  void ballfun() {  
    stroke(0,0,255);               
    fill(0,0,255);               
    ellipse(posi.x+10, posi.y+10, 30, 30);  //ボールの描画
    enballx[i] = posi.x;
    enbally[i] = posi.y;
  }

  void set(float X, float Y, float enspX, float enspY) {  //位置、速度
    posi.set(X, Y);   
    ensp.set(enspX, enspY);  
  }

}


void hitme() {  //敵ボールが自機ふヒットしたときGameOver

  if (M7 == 1 && mouseX + 18 > enballx[i] && mouseX - 18 < enballx[i] && mouseY + 18 > enbally[i] && mouseY - 18 < enbally[i] || flg == 1) {

    fill(255,0,0);  // 文字色
    textSize(20);
    text("GameOver",20,20);
    noLoop();  
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/05 13:33

    実際のコードも何も提示されていないのがまずダメです。 >何がだめなのでしょうか?  わかりにくいと自覚があるのでしたら分かりやすい質問に再編してください。https://teratail.com/help/question-tips

    キャンセル

  • AzukiV

    2018/06/05 13:41

    分かりました

    キャンセル

  • coco_bauer

    2018/06/05 16:37

    「二つのゲームを一つにしたい」というのは具体的にどうするという事ですか? 2つのゲームの同時に動かすには、プロセスやスレッドなどを使って並行/並列に処理する必要がありますが、そうした実行機構を用意してありますか?

    キャンセル

  • AzukiV

    2018/06/05 18:32

    語彙力がなくて、すみません。2つのゲームの同時に動かすということです。実行機構は用意できていません。

    キャンセル

回答 2

checkベストアンサー

0

私がとった方法は、一つのゲーム中のvoid setup(),void draw()の中にもう一つのゲームのvoid draw(),void setup()の内容を書くというものです。

2つのゲームを組み合わせて、1つのゲームにしたいということですよね?
以下のようなコードでどうでしょうか。

EnemyBall[] ball = new EnemyBall[7]; //敵ボールの定義
FriendBall frendball = new FriendBall();

float touch=0;
class FriendBall {
  float frballx; //仲間ボールのx座標
  float frbally; //仲間ボールのy座標
  float frsp=0; //仲間ボールの速度
  float fra=0; //仲間ボールの加速度
  final float g = 3;
  FriendBall() { 
    frballx = width / 2;
  }
  void latest() {
    frsp = frsp + g /30+fra;
    frbally += frsp;
  }
  void ballfun() {
    stroke(255,0,0);
    fill(255,0,0);
    ellipse(frballx, frbally, 30, 30);
  }
  void next() {
     frbally=-200;
     fra=0.0001;
     frsp=0;
     frballx=20 + random(465);
  }
  boolean isGameOver(){
    return frbally > 665;
  }
}
class EnemyBall {  //敵ボール

  PVector posi;  //位置を定義
  PVector ensp;  //速度を定義
  EnemyBall(float X, float Y, float enspX, float enspY) { 
    posi = new PVector(X, Y);   //向きベクトル
    ensp = new PVector(enspX, enspY); //速度ベクトル
  }

  void latest() {  
    posi.add(ensp);  //位置+速度
  }

  void hitwall() {  
    if ((posi.x > width)||(posi.x < 0)) {
      ensp.x = -ensp.x;  //ボールが左右の壁に触れると反射
    }
    if ((posi.y > height)||(posi.y < 0)) {
      ensp.y = -ensp.y;  //ボールが上下の壁に触れると反射
    }
  }

  void ballfun() {  
    stroke(0,0,255);               
    fill(0,0,255);               
    ellipse(posi.x+10, posi.y+10, 30, 30);  //ボールの描画
  }

  void set(float X, float Y, float enspX, float enspY) {  //位置、速度
    posi.set(X, Y);   
    ensp.set(enspX, enspY);  
  }
}

void setup() {
  size(500,650);
  for (int i = 0; i < ball.length; i++) {
    ball[i] = new EnemyBall(30, 30, 30, 30); //敵ボール
    ball[i].set(mouseX + 15, mouseY + 15, random(5, 8), random(5,8)); //(float X, float Y, float enspX, float enspY) enspXは敵のボールのX速度 enspYは敵ボールのY速度
  }
}

void draw() {
  background(255);
  for(EnemyBall enemy:ball) {
    enemy.latest(); //最新の画面に切り替える       
    enemy.hitwall(); //画面の上下左右端に当たったときの設定用
    enemy.ballfun();          //ボールの設定用 function
    hitme(enemy);  // ボールが自機にヒットしたときの設定用
  }
  stroke(255,0,0);
  fill(255,0,0);
  rect(mouseX-5, mouseY-5, 10, 10); //自機の設定
  frendball.latest();
  frendball.ballfun();
  if(frendball.isGameOver()){
    textSize(20);
    text("GameOver",20,20);
    noLoop();
  }
  if(mouseX > frendball.frballx-30 && mouseX < frendball.frballx+30 && mouseY > frendball.frbally-30 && mouseY < frendball.frbally+30){
    touch=80;
    frendball.next(); //次の球がでる
  }
}

void hitme(EnemyBall enemy) {  //敵ボールが自機にヒットしたときGameOver
  if (mouseX + 18 > enemy.posi.x && mouseX - 18 < enemy.posi.x && mouseY + 18 > enemy.posi.y && mouseY - 18 < enemy.posi.y) {
    fill(255,0,0);  // 文字色
    textSize(20);
    text("GameOver",20,20);
    noLoop();
  }
}

◇主な変更点
FriendBallクラスを新設(質問分の最初のコードで行っている事を一部クラス化)
enballJavaの命名規則に合わせてクラス名の先頭を大文字に名称をEnemyBallに変更

◇余談
FriendBallクラスの変数:frballxfrballyEnemyBallクラスと同様にPVectorで管理したほうがよいかもです。
変数:frspfraも同様です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/06 00:28

    すでにこちらの方でも自力で完成してましたが
    やっぱり慣れている方のソースコードを見ると圧巻とします。

    私もこのような整ったものを書けるように努力したいと思います。ありがとうございました。

    キャンセル

0

すでにこちらの方でも自力で完成してましたが
やっぱり慣れている方のソースコードを見ると圧巻とします。

私もこのような整ったものを書けるように努力したいと思います。ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Java

    12867questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Processing

    232questions

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