>そこそこゲームの体をなしているもので、最小限の部分がどこまでかわからないんです。
これは最低限質問者がやるべき事
この過程で質問する前に問題部分が分かり自分で解決できる事が多い
後、少なくても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を大きく設定して動作を視認しやすくしたりして
自分の考えと違う動作になってる部分を探す事から