Tonyu2でのオブジェクト生成
投稿者 : モグラ(softbank060113172104.bbtec.net)
- 2020/02/16(Sun) 03:45
No.13899
|
|
|
|
|
Tonyu2に手を出してみたのですが、オブジェクトが生成されなくなりました。 【クラス名】としています。
【Boss】 HPを持っていて、ライフゲージを表示。プレイヤーの攻撃でHP減少 変数modeにより2形態となっていて、HPが0以下で形態変化。 1形態目では”new shot{};“でオブジェクトを発射。 2形態目ではある1フレームの時だけ【Enemy】生成。 //ここまではうまく処理しています
【Enemy】 【Boss】の周りを円運動し、【Shot】を発射。 HPなどのプログラムは【Boss】と同じく、形態変化なしでHPが0以下でdie()を呼び出します。
/* 上記の【Enemy】は【Shot】を発射できません。 別に作った【Bullet】【Player】は問題なく出現させられました。 また、2形態目に【Boss】も【Shot】の生成はできませんでした。 変数tを常に増加させ、(tの除数)=0で実行させているので、成り立っていないかと思って別の動作をさせましたが、それはプログラム通りうごきました。 また、while文に直接突っ込んでも生成はしませんでした。
【Enemy】は1度に4つ生成され、それらが個々に【Shot】 を出現させます。 この部分が問題を引き起こしているのでしょうか? */
|
Re: Tonyu2でのオブジェクト生成
投稿者 : モグラ(softbank060113172104.bbtec.net)
- 2020/02/16(Sun) 04:19
No.13900
|
|
|
|
すみません自己完結しました。 一形態目でfor文使ってたんで、それをそのまま突っ込んでみたらできました。 そのままforを外したときまたおかしくなったのですが、生成できる状態から丁寧に解体していったら上手くいきました。
ただ今後も起こしかねないので、理由がわかる際は返信くださると助かります
|
Re: Tonyu2でのオブジェクト生成
投稿者 : hoge1e3(019.221132184.m-net.ne.jp)
- 2020/02/16(Sun) 11:11
No.13901
|
|
|
|
いただいた内容から想像して作ってみました:
www.tonyu.jp/project/viewProject.cgi?mainkey=805& (「Webブラウザで編集」 からソースを見られます)
考えられる原因としては * t の値を初期化し忘れていると,t++ をしても値が増えない(=弾が発射されない)ことがあります. * mode=1 と 2のときに処理を別々に書いていると,弾の発射処理が行われなくなる場合があります. 例えば,★の部分がif(mode==1)☆の中に入っていたりすると,第2形態になったときに弾が発射されなくなる,などが考えられます.
Boss:
while(true) { if (t%30==0) {//★ new Shot{x,y}; } if (mode==1) {//☆ if (hp<=0) { for (i=0;i<4;i++) { new Enemy{t:i*90}; } mode=2; } } pa.fillStyle="red"; pa.fillRect(0,0,100,100); pa.fillStyle="lime"; pa.fillRect(0,0,hp,100); t++; update(); }
|
Re: Tonyu2でのオブジェクト生成
投稿者 : モグラ(softbank060113172104.bbtec.net)
- 2020/02/16(Sun) 16:23
No.13902
|
|
|
|
パソコンから返信すればコピペできることに気づきましたので載せます。
【Boss】
while(true){t++; if(mode==1){//花っぽく if(t%120>=70){ if(t%10==0){ vsp=(t%120)/100; for(n=0;n<12;n++){ new Shot{x,y,vrotation:n*30+t*3/5,sp:0.5+vsp*2,p:20}; new Shot{x,y,vrotation:n*30-t*3/5,sp:0.5+vsp*2,p:20}; } } } } if(mode==2){ if(t==0){ for(r=0;r<360;r+=90){ new Enemy{x:x+cos(r)*100,y:y+sin(r)*100,mode:1,scaleX:0.8,p:16,t:r,HP:40}; } } if(vmode!=0){ if(t%(120/vmode)==0){ for(n=0;n<360;n+=36){ new Shot{x,y,vrotation:n+t,sp:2,p:16}; } } } } b=crashTo(Bullet); if(b && HP>0){ b.die(); HP--; } if(HP<=0){ HP=0; mode++; if(mode==2){vHP=200;vmode=0;} if(mode==3){vHP=180;m=rnd(50)+100;} if(mode==4){vHP=350;r=180;} while(HP<vHP){HP+=5; fillRect(40,10,($screenWidth-80)*HP/vHP,5,color(255,255,255)); update();} t=-1; } fillRect(40,10,($screenWidth-80)*HP/vHP,5,color(255,255,255)); update(); }
【Enemy】 while(true){ if(mode==1){t++; x=$Boss.x+cos(5/3*t)*100; y=$Boss.y+sin(t)*100; if(t%7==0){ new Shot{x,y,vrotation:t*2+360,sp:3,p:18}; new Shot{x,y,vrotation:t*2+180,sp:3,p:18}; } if($Boss.mode>=3)die(); } fillRect(x-20,y+20,40*HP/vHP,5,color(180,255,255)); b=crashTo(Bullet); if(b && HP>0){ b.die(); HP--; } if(HP<=0){die();$Boss.vmode++;} update(); }
【Shot】 scaleX=0.4; if(wait==null)wait=0; while(wait>0){wait--;update();} while(true){ if(screenOut()>=20)die(); if(vrotation){rotation=vrotation;vx=cos(vrotation)*sp;vy=sin(vrotation)*sp;} x+=vx;y+=vy; update(); if(bound>0){ if(x>$screenWidth || x<0){vx=-vx;x+=vx;bound--;} if(y<0){vy=-vy;y+=vy;bound--;} } }
これはうまくいった物ですが、この次に載せる物はうまくいっていない物です。いまうまくいっている部分を張り替えたところ同じ現象が確認できました。
|
Re: Tonyu2でのオブジェクト生成
投稿者 : モグラ(softbank060113172104.bbtec.net)
- 2020/02/16(Sun) 16:30
No.13903
|
|
|
|
【Boss】、【Shot】は同じなので割愛します。
【Enemy】 while(true){ if(mode==1){t++; x=$Boss.x+cos(5/3*t)*100; y=$Boss.y+sin(t)*100; if(t%7==0){ new Shot{x,y,vrotation:n,sp:3,p:20};//6行目 } if($Boss.mode>=3)die(); } fillRect(x-20,y+20,40*HP/vHP,5,color(180,255,255)); b=crashTo(Bullet); if(b && HP>0){ b.die(); HP--; } if(HP<=0){die();$Boss.vmode++;} update(); }
プログラム見返して気づきましたが、6行目の不具合が起こる部分、値のないnをかけることにより、sin、cosの値が出ず、【Shot】側で vx=cos(vrotation)*sp;vy=sin(vrotation)*sp; x+=vx;y+=vy; と定義している以上動くことができないようです。 ただ、生成座標が強制的に{x:0,y:0}になっているのですが、これは new object名{};の{}内に未定義の値が入っていた場合に起こる仕様でしょうか?
|
Re: Tonyu2でのオブジェクト生成
投稿者 : hoge1e3(othello.hino.meisei-u.ac.jp)
- 2020/02/17(Mon) 11:37
No.13904
|
|
|
|
プログラムの掲載ありがとうございます。
Enemyの new Shot{x,y,vrotation:n,sp:3,p:20};//6行目 ですが,nが初期化されていない(undefined)なので,vrotationもundefinedになります.
すると,Shotの if(vrotation){rotation=vrotation;vx=cos(vrotation)*sp;vy=sin(vrotation)*sp;} x+=vx;y+=vy; の部分で,vx,vyが初期化されなくなります(undefinedになる)
x(数値)にundefinedを足すと,NaN(Not a number)という特殊な値になってしまい,それ以降は何を足してもNaNのままになってしまいます.画面左上にくっついたままになる理由はこれです.
|
Re: Tonyu2でのオブジェクト生成
投稿者 : モグラ(softbank060113172104.bbtec.net)
- 2020/02/17(Mon) 22:02
No.13905
|
|
|
|
ご返信ありがとうございました! いろいろと納得できました。 左上から動かない時は、変数の未定義を疑ってみます。
プログラムを組んでる時は座標とか変数とか、視覚化しておきたい値をテキストで表示させてたのですが、NaNが謎で気になってました。そちらも教えていただきありがとうございました!
|
|