HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0831
K_KObaqにてパチンコのチューリップ?のようなもの5解決


K_K

リンク

2013/8/31(Sat) 20:48:40|NO.56779

私はhttp://hsp.tv/play/pforum.php?mode=all&num=56313
ゲームを作ろうとしていたものです。

何とかゲームとしての体を整えることはできたのですが、
パチンコでのチューリップ?的なものを作ったところ、たまに変な動作をします。
一個だけボールが入るのですが、
それからある程度の時間ずっと点数が加算され続けるのです。

どうしてこうなるのでしょう?

qcollision d(6) repeat qgetcol aball,bx,by if aball==-1:break qdel aball repeat 50 if b(cnt)==aball{ cnn=cnt:break } loop bs(cnn)=0 gosub *addball score+=10000 loop
仕様としては、
ボールが入る(d(6)にボールb(n)が接触する)と
・そのボールを削除する
・ボールの存在フラグ(bs(n))を0にする
・新しいボールをボールの初期位置に追加(サブルーチン*addball)
・点数(score)に10000加算



この記事に返信する


暇人

リンク

2013/9/1(Sun) 14:33:37|NO.56798

コピペして実行出来ないスクリプトは、かえって問題が見え難くなる(他の部分に問題があったり)

#include "obaq.as" qreset gosub *addball qaddpoly t, 4, 80,100,0;, 6,12 qgroup t,1,0,2 ; コリジョンのグループ設定 qtype t,$1c0 *main redraw 0 gradf ,,,,1,0,128 qexec stick key,15 ; キーの取得 if key&128 : end ; [ESC]キーで終了 aball_bak=-1 qcollision t repeat qgetcol aball,bx,by if aball==-1:break if aball ! aball_bak {//qgetcolは一つのオブジェクトに対して一回とは限らないので、同じIDは一度だけ処理するようにする(NO.56779みたいにしてるならbsのフラグで判定しても良い) aball_bak=aball qdel aball gosub *addball score+=10000 } loop qdraw color 255,255,255 pos 0,0:mes "score:"+score redraw 1 await 15 goto *main *addball qaddpoly i, 18, 80,20,0, 2,2 qgroup i,2 return
普通にやれば特に問題が起きない



K_K

リンク

2013/9/14(Sat) 20:03:22|NO.57139

そこそこゲームの体をなしているもので、最小限の部分がどこまでかわからないんです。

qcollision d(6) repeat qgetcol aball,bx,by if aball==-1:break cnn=100 repeat 50 if b(cnt)==aball{ cnn=cnt:break } loop if cnn!=100{ if bs(cnn)!=0{ bs(cnn)=0 qdel b(cnn) gosub *addball score+=10000 } } loop

とりあえず、試しにbsを使った判定を使ってみたのですが、やはり多重判定が起こります。

それとは別に、おそらくフレームごとの点数判定にも異常があるようで、
ボールが減った時などに異常に大きい値があるようです。
そちらの仕様は、各フレームについて、
それぞれのボールの速度の二乗に比例する点数が加算されるようになっています。

また、ボールが画面外に出た場合(画面の少し外側に外壁があるので画面外にも入れます。)
そのボールを削除し、ボールの速度に反比例する値をライフから引くようにしています。

repeat 50 if bs(cnt)==1{ qgetspeed b(cnt), x, y, r spd = sqrt(x*x + y*y) if spd >= 0.3 { qinertia b(cnt), df-spd/170 } else { qinertia b(cnt), df } score+=spd*spd*5 qgetpos b(cnt),x,y,r if y>=150{ qdel b(cnt) bs(cnt)=0 life-=0.5/spd } } loop
このスクリプトの前半はhttp://hsp.tv/play/pforum.php?mode=all&num=56313
速度をある程度抑制したい、ということで作った内容です。



あり

リンク

2013/9/14(Sat) 20:59:57|NO.57141

当ったボールのコリジョングループを衝突除外のグループに変更する
というのは試しましたか?



暇人

リンク

2013/9/15(Sun) 04:16:41|NO.57144

>そこそこゲームの体をなしているもので、最小限の部分がどこまでかわからないんです。
これは最低限質問者がやるべき事
この過程で質問する前に問題部分が分かり自分で解決できる事が多い
後、少なくてもNO.56779のに*addballのサブルーチン部分は付けるべき

>if bs(cnn)!=0{
> bs(cnn)=0
> qdel b(cnn)
ここで削除されたIDと同じものが
> gosub *addball
ここで再度作られてる可能性がある(bs(cnn)も再度フラグ立てられてるだろう)
qgetcolでqdelと得点加算が全て終ってから
後でgosub *addballすれば良い

複数オブジェクトがあると同じIDが複数存在しても
連続するとは限らないのでNO.56798のような方法は使えない
削除したIDの方にフラグを立てる方法もある

#include "obaq.as" qreset qaddpoly t, 4, 80,100,0;, 6,12 qgroup t,1,0,2 ; コリジョンのグループ設定 qtype t,$1c0 qgetreq maxobj,REQ_MAXOBJ dim del_id,maxobj //削除されたフラグ用(存在フラグとは別と考えた方が良い) max=3 dim b,max repeat max cn=cnt gosub *addball loop *main redraw 0 gradf ,,,,1,0,128 qexec stick key,15 ; キーの取得 if key&128 : end ; [ESC]キーで終了 memset del_id,0,maxobj*4 //前回の削除フラグをクリア qcollision t repeat qgetcol aball,bx,by if aball==-1:break if del_id(aball)=0 {//今回まだ削除されてない del_id(aball)=1 //削除されたIDにフラグを立てる qdel aball cn=bcn(aball) //IDを基に要素数を取得 gosub *addball score+=10000 } loop qdraw color 255,255,255 pos 0,0:mes "score:"+score redraw 1 await 15 goto *main *addball qaddpoly i, 18, 72+7*cn,25-7*cn,0, 2,2 if i<0{return} qgroup i,2 b(cn)=i //要素数からID取得用 bcn(i)=cn //IDから要素数取得用 return


>ボールが減った時などに異常に大きい値があるようです。
ボールを一つにして速度等全て常に確認できるように表示したり
awaitを大きく設定して動作を視認しやすくしたりして
自分の考えと違う動作になってる部分を探す事から



K_K

リンク

2013/9/25(Wed) 21:34:08|NO.57339

ご回答ありがとうございました。

ご指摘の通り、削除したボールのフラグが再びたてられていることがわかりました。

削除用の新しいフラグ配列を作るのが面倒だったので、
追加する必要のあるボールの個数だけカウントしてボールを削除、
チューリップの判定ループを抜けた後にその個数分gosub *addballすることで解決しました。

稚拙な私の質問にも、まじめに答えていただき、本当にありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.