• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Flash Lite1.1について)

Flash Lite1.1で携帯ゲームのブロック崩しを作成する方法と困っている点

BlurFiltanの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

スクリプトだけでは不明な点が多く こちらで全く同じようなものを作って再現することはできませんが 書かれていらっしゃるスクリプトが もし仮に フレーム3 に書かれたものであるとするなら 書かれていらっしゃるスクリプトの続き(下)にでも 次のようなスクリプトを付け足せば良いのではないかと思います。 // ---残っている(表示されている)ブロック数のカウント--- // 変数 visible_block の初期化 visible_block = 0; //ブロックの個数分ループ for (i=1; i<=40; i++) { //もし block○ の _visible が true であれば if (eval("block" add i)._visible) { // 変数 visible_block をカウントアップ visible_block++; } } // もし変数 visible_block の値が 0 のままであれば if (visible_block == 0) { // フレーム5 へ行って停止 gotoAndStop(5); } else { //それ以外はループ再生 //(実際にはどう書いているのか不明) gotoAndPlay(2); } 最後の //それ以外はループ再生 //(実際にはどう書いているのか不明) gotoAndPlay(2); この部分は 実際にはどのようなものを作られているのか知りませんから 本当はどう書くべきかなどわかりません。 (そもそもご質問に,どこに書かれたスクリプトなのかという説明が全くありませんし。) 上記スクリプトは あくまでも考え方の一例です。 考え方をわかりやすくするために残っているブロック数をカウントしているだけです。 わざわざ残っているブロック数を全てカウントアップしなくても eval("block" add i)._visible が true であるものが1つでも見つかった瞬間に visible_block を 1 にでもして その後すぐに break; しても良いと思います。 これの方が無駄な演算は少なくできます↓。 // ---残っている(表示されている)ブロックの有無を取得--- // 変数 visible_block の初期化 visible_block = 0; //ブロックの個数分ループ for (i=1; i<=40; i++) { //もし block○ の _visible が true であれば if (eval("block" add i)._visible) { // 変数 visible_block の値を 1 にする visible_block = 1; //即この for 文を抜ける break; } } // もし変数 visible_block の値が 0 のままであれば if (visible_block == 0) { // フレーム5 へ行って停止 gotoAndStop(5); } else { //それ以外はループ再生 //(実際にはどう書いているのか不明) gotoAndPlay(2); } とにかく block○(block1~block40) の全ての _visible が false になったときに 通常のループ再生から抜け出て(通常のループ再生はさせないようにして) gotoAndStop(5); させるように考えれば良いでしょう。

RRHH
質問者

補足

説明が不十分で申し訳ありませんでした。補足させていただきます。 元々からスクリプトは少々いじっておりますが、 3フレームまであり1フレーム目がスタートボタンのある場面でフレームには //ボールの初期移動量 vx = 7; vy = 7; stop(); と言うスクリプト、スタートボタンは、 on (press) { //元々から操作方法は変更しました。 gotoAndPlay(2); } というスクリプトになっています。 また、2と3フレーム目には、40個のブロックとパドルとボールがあり、 2フレーム目のスクリプトが最初に記載した // ボール移動 ball._x += vx; ball._y += vy; // 壁とボールの当たり判定 if(ball._x<5 && vx<0){ vx = -vx; } if(ball._x>235 && vx>0){ vx = -vx; } if(ball._y<5 && vy<0){ vy = -vy; } // ボールが下に落ちたらゲームオーバー if(ball._y>235){ gotoAndStop(4); //元々移動先が1フレーム目だったのを新たにつくった4フレーム目に変更しました。 } // パドルとの当たり判定 if(ball._x>pad._x-40-5 && ball._x<pad._x+40+5 && ball._y>pad._y-5-5 && ball._y<pad._y+5+5 && vy>0){ vy = -vy; vx = (ball._x-pad._x)/80*15; } // ブロックとの当たり判定 for (i=1; i<=40; i++) { bx = eval("block" add i)._x; by = eval("block" add i)._y; if (ball._x>bx-20-5 && ball._x<bx+20+5 && ball._y>by-5-5 && ball._y<by+5+5 && eval("block" add i)._visible == true) { eval("block" add i)._visible = false; // 左端or右端に当たった場合 if (ball._x<bx-20 || ball._x>bx+20) { vx = -vx; } else { // 上端or下端に当たった場合 vy = -vy; } } } そして3フレーム目のスクリプトが gotoAndPlay(2); になっています。 また、ブロックのインスタンス名はご想像どおりblock1~block40が付けられています。 そこに新たにリプレイボタンの付いたゲームオーバー画面の4フレーム目とクリア画面の5フレーム目を作りました。 もちろんフレームのスクリプトは両方とも stop(); で、リプレイボタンは on (press) { gotoAndPlay(2); } となっています。 この状態で、ご回答いただいたスクリプトの追加を両方試してみたのですが、 // ボールが下に落ちたらゲームオーバー if(ball._y>235){ gotoAndStop(4); } このスクリプトがきかなくなるのか、 ボールが下に落ちると5フレーム目のクリア画面に移動してしまいます。 追加する位置が悪いのではとも考えたのですが、良く分からず困っています。 どうか宜しくお願い致します。

関連するQ&A

  • Hspゲーム

    HSPでブロック崩しを作ってます。ブロックを全て消したあとにgame clearと入れたいのですが、どのようなソースをどこに入れればいいのかわかりません。 これがソースです。 ;設定など #define Ver "3.12" #define SOFTNAME "ブロック崩し" #define TITLEBAR SOFTNAME+" #define EXENAME "block" #packopt type 0 #packopt name EXENAME #packopt runtime "hsp3c.hrt" #packopt hide 0 ;ウインドウの作成 screen 0,320,240 : title TITLEBAR ;初期化 *init ;主な変数の宣言  dim block,8,4;ブロックの状態 あれば1 repeat 4 : j=cnt repeat 8 : i=cnt block(i,j)=1 loop loop ball_flag = 0;ボールの状態 あれば1 ball_num = 2;ボールの残り数 ball_x = 320;ボールの座標 ball_y = 240;最初は見えないように画面外に ball_vx = 0;ボールの速度 ball_vy = 0 bar_x = 0;バーの座標 ;メインループ *main await 17;1秒に60回ループする ;キー入力処理 stick ky,15 if ky&128 : end;Escで終了 ;バーの座標はマウスの位置で決める bar_x = mousex - 24 ;ボールがあるときとないとき if ball_flag = 0 { if ky&256 {;クリックされたら ball_flag = 1 ball_x = bar_x + 16 ball_y = 208 ball_vx = 4 ball_vy = -4 } } else { ;前回の座標を記録(ブロックとの衝突判定で使う) ball_x_before = ball_x ball_y_before = ball_y ;速度の分だけ座標に足す ball_x += ball_vx : ball_y += ball_vy ;画面の端に当たったら反射 if ball_x < 0 { ball_x = 0 ball_vx = -ball_vx } if ball_x > 304 { ball_x = 304 ball_vx = -ball_vx } if ball_y < 0 { ball_y = 0 ball_vy = -ball_vy } if ball_y > 240 {;下に落ちたらボールを消す ball_flag = 0 ball_num-- if ball_num = -1 { pos 200,200 : color 255,255,255 mes "ゲームオーバー" stop } } ;バーに当たったら反射 if (204 < ball_y) & (ball_y < 209) { if (bar_x-16 < ball_x) & (ball_x < bar_x+48) { ball_vy = -ball_vy } } } ;ブロックとの衝突判定 tmp=0;二重のrepeat-loopから一気に抜け出すためのフラグ repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { if (32 + i*32 - 16 < ball_x) & (ball_x < 62 + i*32) { if (32 + j*16 - 16 < ball_y) & (ball_y < 46 + j*16) { block(i,j) = 0;ブロックを消す ;前回のx座標がすでに範囲に入っていた場合y方向の向きを反転 if (32 + i*32 - 16 < ball_x_before) & (ball_x_before < 62 + i*32) { ball_vy = -ball_vy tmp=1 : break } ;前回のy座標がすでに範囲に入っていた場合x方向の向きを反転 if (32 + j*16 - 16 < ball_y_before) & (ball_y_before < 46 + j*16) { ball_vx = -ball_vx tmp=1 : break } ;どちらも入ってない場合は両方判定 ball_vx = -ball_vx ball_vy = -ball_vy } } } loop if tmp=1 : break loop ;いろいろ描画 redraw 0 color 0,0,0 : boxf;白で全体を塗りつぶす ;ボールとバー pos ball_x,ball_y : color 255,255,0 : mes "●" pos bar_x,220 : mes "-------" ;ブロック repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { boxf 32 + i*32, 32 + j*16, 62 + i*32, 46 + j*16 } loop loop redraw 1 goto *main よろしくお願いします。

  • ブロック崩し

    大学でプログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。DXライブラリで作ってます。 #include "DxLib.h" typedef struct _racket{ int g_racket; int g_x; int g_y; }racket; typedef struct _block{ int stone; int x; int y; }block; typedef struct _tama{ int ball; int x; int y; int vx; int vy; }tama; int Key; tama ta; void ball_attack() { ta.x = 300; ta.y = 450; ta.vx = 4; ta.vy = 4; ta.ball = LoadGraph("ball.bmp"); DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //tama ta; racket ra; //ta.x = 300; //ta.y = 450; //ta.vx = 4; //ta.vy = 4; ra.g_x = 300; ra.g_y = 420; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 透過色を変更 SetTransColor( 255 , 255 , 255 ) ; ra.g_racket = LoadGraph("ziki.bmp"); //ta.ball = LoadGraph("ball.bmp"); while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } ClearDrawScreen(); ball_attack(); /* DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy*/; // キー入力取得 Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // 右を押していたら右に進む if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ; // 左を押していたら左に進む if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ; ScreenFlip(); } WaitKey(); DxLib_End(); return 0; }

  • Java ブロック崩し 当たり判定

    こんにちは、Java初心者の者です。 今週の末に、文化祭があるので、その際の出し物で「ブロック崩し」を出すことにしたのですが、 ブロックの当たり判定がおかしいのです。 おかしいというか、正確にはブロックとの当たり判定自体はあるのですが、ブロックと当たったらブロックが消えるようにしているはずが、消えないのです。 一応、消えてはくれるのですがボールとブロックが離れたらまた元の色に戻ってしまいます。 フラグ管理を使っての処理で、ボールとブロックが触れたらフラグを「偽」。そしたらそれに該当するブロックを描画しないようにする仕組みなのですが、どうも上手くいきません。 以下コードです。 ~~~~中略~~~~ //ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; k++; } } //ブロックに当たった時の処理 for(int i=0;i<30;i++) { if(flag[i] == true) { if(y + ball_y >= block_y[i] && y <= block_y[i]+block_h && x + ball_x >= block_x[i] && x <= block_x[i] + block_w) { vy = -vy; flag[i] = false; } } } //ブロックの描画 for(int i=0;i<30;i++) { if(flag[i] == true ) { //ブロックの描画 offg.setColor(Color.yellow); offg.fillRect(block_x[i],block_y[i],block_w,block_h); //ブロックの枠線 offg.setColor(Color.black); offg.drawRect(block_x[i],block_y[i],block_w,block_h); } } ~~~~中略~~~~~ paintメソッドの部分だけ載せてます。 どこかおかしいところがあれば、アドバイスを頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Lite1.0でのシューティングゲームですが

    いつも大変参考にさせていただいております。 さて、本題ですが、Lite1.0でシューティングゲームを作成しているのですが 動きと当たり判定の連動がうまく行きません。 今現在設定している敵MCのあたり判定は以下の通りです。 //自機(攻撃側)とのあたり判定 if (../pc:_y >= _y - 10 and _y + 10 >= ../pc:_y) { if (../pc:_x == _x) { if (/game:hp <> 0) { if (/game:dmg <> 1) { tellTarget ("../pc") { gotoAndPlay("dmg"); } tellTarget ("../../hp") { nextFrame(); } } } } } //弾とのあたり判定 if (../tama:fire == 1) { if (../tama:_y >= _y - 10 and _y + 10 >= ../tama:_y) { if (../tama:_x >= _x -10 and _x + 10 >= ../tama:_x) { tellTarget ("../tama") { gotoAndStop(1); } gotoAndPlay("baku"); } } } インスタンス名の説明をします。 pcが自機、tamaは自機が発射する弾。 gameがシーン1に置かれている全体のMC。 hpが自機のパワー数、dmgはダメージ。 このASを敵MCの1フレーム目に記載しております。 そして、2フレーム目に gotoAndPlay(_currentframe - 1); 3フレーム目~7フレーム目には /game:score += 10; ラベルはbakuとしています。 そして、8フレーム目に stop(); ラベルをendとしています。 タイムラインは(全てMC) シーン1→game→ステージ(敵や弾・自機)→敵(あたり判定をしているMC) となっております。 そして、以前の質問にあった、こちらの動きを付けたいと考えております。 ↓ http://oshiete1.goo.ne.jp/qa2802247.html あたり判定は問題なく出来ているのですが、 これに動きをつけると動作しなくなってしまう・・・ と言いますか、どのように連動させるべきかうまいこと分かりません。 ゲームのイメージとしてはインベーダーゲームと思って下さい。 また違った方法で動きをつける様になるのでしょうか。 説明が長くなってしまって申し訳ございませんが 宜しくお願いいたします。

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • FLASH LITE1.1 任意に問題を表示

    40問の問題をランダムに表示させようとしていますがうまくいきません。 MCにq1~q40のラベルをつくり、ランダム関数で任意に表示させようとしています。 具体的には次の関数を書きました。 //m1~m40に順に1~40を代入 for(i=1;i<=40;i++){set("m" add i,i);} //m1~m40の値をシャッフル for(i=0;i<100;i++){ r1=random(40)+1; r2=random(40)+1; tV=eval("m" add r1); set("m" add r1,eval("m" add r2)); set("m" add r2,tV); } //ムービークリップqtの中の任意のラベル(q1~q40)を再生 tellTarget("/qt"){gotoAndPlay("q" add m1);} ("q" add m1)のところを例えば("q5")などと、具体的なラベル名を入れると動くので、 変数のどこかの取り扱いに間違いがあると思うのですが、どこがおかしいのかわかりません。 おわかりの方がいたら是非、ご教授願いたく思います。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 衝突判定について

    お世話になります。 現在、ある領域内で、球体を動かす処理をしています。 球体は複数ありそれぞれB1・B2・B3としています。 領域の境界を上がL1下がL2右がL3左がL4という具合に それぞれムービークリップを配置してます。 そこで問題なのですが、球体同士がぶつかったら、お互い 別方向に弾けるという処理をしているのですが、3回に一回 位の割合で、別方向に弾けないことがあります。 例えばB1とB2がぶつかった場合、B1は弾けるがB2は変化無く 動いてしまいます。何か良い方法は無いでしょうか? 下記にコードを記載します。よろしくお願いいたします。 onClipEvent(load) //初期値 { vx = 5; vy = 5; a = 1; b = 1; } onClipEvent(enterFrame){ //境界に達した時の処理 for (i=1;i<=4;i++){ kyokai = this.hitTest(_root[ "L" + i ]); if (kyokai==true && i == 1) {vy = 5; b = 1;} if (kyokai==true && i == 2) {vy = -5; b = -1;} if (kyokai==true && i == 3) {vx = -5; a = -1; } if (kyokai==true && i == 4) {vx = 5; a = 1; } } this._x += vx; this._y += vy; //他の球体を監視し、自分の領域に来たら //進行方向を逆にする for (i=1;i<=3;i++){ if(i!=1){ hantei = this.hitTest(_root[ "B" + i ]);} if (hantei==true){ if(a==-1) {vx=5; this._x = this._x+20;} if (b==-1) {vy=5; this._y = this._y+20;} if(a==1) {vx=-5; this._x = this._x-20;} if (b==1) vy=-5; this._y = this._y-20;} } }

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • if文での記述の仕方がわからなくて困っています

    winxp flash8です。いつもありがとうございます。 if分で分岐したいのですが記述の仕方が違っているらしくスクリプトが通らなくて困っています。下記のようにかいています。 if (eval ("atari" + i) == 0)が違うようです。 // 30個のブロックをfor文で処理する for (i = 0; i < 30; i++) { if (flg[i] == 1) { continue; } // 次のループへ // ボールとブロック t i 番目 が当たったとき if (this._parent.tama0.hitTest (eval ("this._parent.t" + i))) { trace((eval ("atari" + i))); if (eval ("atari" + i) == 0) { //シルエットをとる eval ("this._parent.t" + i).gotoAndStop (1); set(eval ("atari" + i), 1); } else if (eval ("atari" + i) == 1) { // ブロックを非表示に eval ("this._parent.t" + i)._x = 77; eval ("this._parent.t" + i)._y = -100; flg[i] = 1; // 消えた事をあらわすフラグ

    • ベストアンサー
    • Flash
  • 変数変換と微分

    よろしくお願いします。ある本で次の図と記述があります。 ※vxのxはvの右下に付く添え字です。 Fxx=μ(dvx/dy)+μ(dvy/dx) これを以下の式でxy座標からXY座標に変換 X=(x+y)/√2,Y=(-x+y)/√2 上記の両式をt,x,yで微分すると VX=(dX/dt)=(vx+vy)/√2 VY=(dY/dt)=(-vx+vy)/√2 (∂X/∂x)=1/√2,(∂X/∂y)=1/√2,(∂Y/∂x)=-1/√2,(∂Y/∂x)=1/√2 が得られます。 さらに整理して vx=(VX-VY)/√2,vy=(VX+VY)/√2 これらを使って,一番最初の式に出てくる微分(dvx/dy)と(dvy/dx)を変数X,Yによる微分に変数変換します。 (dvx/dy)=(∂X/∂y)(∂vx/∂X)+(∂Y/∂y)(∂vx/∂Y) (dvy/dx)=(∂X/∂x)(∂vy/∂X)+(∂Y/∂x)(∂vy/∂Y) ここで質問です。  上記の式の最後の2行 つまり, (dvx/dy)=(∂X/∂y)(∂vx/∂X)+(∂Y/∂y)(∂vx/∂Y) (dvy/dx)=(∂X/∂x)(∂vy/∂X)+(∂Y/∂x)(∂vy/∂Y)  この式が出てきた経緯が分かりません。(dvxをdyで微分するとなぜ右辺のようになるのかが分かりません。同様にdvyをdxで微分するとなぜ右辺のようになるのかが分かりません。)  どなたか解説をお願いできないでしょうか。