ここから本文です

processingでチャリ走のようなゲームを作成しようとしています。void drawを使って...

chi********さん

2019/1/407:03:32

processingでチャリ走のようなゲームを作成しようとしています。void drawを使ってステージを移動させるまではできました。ここでステージを無限に生成したいのですがどのようにすれば良いですか?

float a = 500;
float b = random(30,500);
float ib = 600 - b;
int speed = 4;
float xx = 0;

void setup () {
size(600,800);
xx = a;
}

void draw () {
background(255,255,255);
fill(0,0,0);
nostroke();
xx = xx - speed;
rect(xx,b,50,ib);
}

閲覧数:
39
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2019/1/410:07:24

ステージって、まぁそういえばそうか。なんかゲームのステージというと、例えば落ちモノだったら規定の数十個分を処理した時に"STAGE 1 CLEAR"みたいになるものを思ってたのだけれど。

作ってみたけど、結構面倒。本当はArrayListとか使いたかっけど、あなたが知っているかどうかわからなかったから配列で我慢。
ここは何してる? の追加質問は受けますけど、それ以上の後出しでの「そのやり方は習ってない/知らないから他のやり方で」は勘弁して。

final float WIDTH_MIN=50; //ステージの最小幅
final float WIDTH_MAX=150; //ステージの最大幅
final float GAP_MIN = 10; //間隙の最小幅
final float GAP_MAX = 100; //間隙の最大幅
final float GAPH_MAX = 50; //高さの変化の最大
final float XOFFSET = 150; //X原点位置

final float R=30; //仮キャラクタ円のサイズ

int speed = 4;
float originHeight; //原点でのステージ高さを格納

class StageInfo {
float pos;//ステージの左端座標
float hh;//ステージ高さ
float ww;//ステージ幅
StageInfo(float p, float h, float w) {
pos=p;
if (h>=height-100) {//ステージ上限高さ
h=height-100;
}
if (h<50) {//ステージ下限高さ
h=50;
}
hh=h;
ww=w;
}
}

StageInfo[] stages;

void refreshStages(int speed) {//「無限に生成」のキモはこの関数に
int rightEnd=0; //一番右端のステージ番号
originHeight=0;
//ステージの移動
for (int i=0; i<stages.length; i++) {
if (stages[i]!=null) {//ステージが存在すれば
stages[i].pos-=speed;//左へ移動
if (stages[i].pos*(stages[i].pos+stages[i].ww)<=0) {//ステージが原点に掛かっている
originHeight=stages[i].hh;
}
rightEnd=i; //有効な右端ステージ番号を更新(最後のが残る)
} else {
break;
}
}

if (stages[0].pos+stages[0].ww<-XOFFSET) { //左端のステージが画面の外に出ている
for (int j=1; j<stages.length; j++) {//ステージを捨てて順番を詰める
stages[j-1]=stages[j];
}
rightEnd--;//右端番号も一個減らす
stages[stages.length-1]=null;//一番最後は空
}

while (stages[rightEnd].pos+stages[rightEnd].ww<width-XOFFSET) {//画面右端が間隙なら新しいステージ生成
stages[rightEnd+1]=new StageInfo(
stages[rightEnd].pos+stages[rightEnd].ww+random(GAP_MIN, GAP_MAX),
stages[rightEnd].hh+random(GAPH_MAX*2)-GAPH_MAX,
random(WIDTH_MIN, WIDTH_MAX));
rightEnd++;
}
}

void drawStages() {
for (int i=0; i<stages.length; i++) {
if (stages[i]!=null) {
noStroke();
fill(0);
rect(stages[i].pos, 0, stages[i].ww, stages[i].hh);
} else {
break;
}
}
}

void setup () {
size(600, 800);
ellipseMode(CENTER);
stages=new StageInfo[(int)Math.ceil(width/(WIDTH_MIN+GAP_MIN))+1];//一画面にあり得るステージの最大数個の配列
stages[0]=new StageInfo(-XOFFSET, height/2, XOFFSET+R*2+random(150));//スタート位置は確実に足場があるように
refreshStages(0);//残りの画面内ステージ生成
}

void draw () {
background(255, 255, 255);
translate(XOFFSET, height);//XOFFSET,heightの位置を0,0に設定する
scale(1, -1);//上向きをY軸正方向に
stroke(0);
fill(255, 0, 0);
ellipse(0, originHeight+R/2, R, R);
refreshStages(speed);
drawStages();
}

質問した人からのコメント

2019/1/7 14:49:51

ありがとうございます!
助かります。わからない関数は調べて自分で勉強しようと思います!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる