|
|
|
2023/11/29(Wed) 10:56:29|NO.100691
こんにちは
いま、OBAQを使ってぱち_んこ風のゲームをテストで作っているのですが、
いろいろと変な挙動をしてうまいこと動いてくれません。
球が線を超えたり、球同士が合体したり、通過できない釘の間を通過したり、など
どのようにすれば良いのか分からず、困っております。
皆さんのお知恵をお借りしたいと思います。
以下にコードをのせます。
操作方法は、クリックで、mousexにより発射強度が変わります。
よろしくお願いいたします。
#include "hsp3dish.as"
wx=360:wy=640
screen 0,wx,wy
randomize
*start
qreset
frame=0
key_cnt=0
//壁の設定(おおまかに)
qborder -200,-200,200,200
//盤面の設定
model=0.0, 160.0, 90.0, 160.0, 90.0, 45.0, 89.8, 41.1, 89.3, 37.2, 88.5, 33.4, 87.3, 29.6, 85.8, 26.0, 84.0, 22.5, 81.9, 19.2, 79.5, 16.1, 76.8, 13.2, 73.9, 10.5, 70.8, 8.1, 67.5, 6.0, 64.0, 4.2, 60.4, 2.7, 56.6, 1.5, 52.8, 0.7, 48.9, 0.2, 45.0, 0.0, 41.1, 0.2, 37.2, 0.7, 33.4, 1.5, 29.6, 2.7, 26.0, 4.2, 22.5, 6.0, 19.2, 8.1, 16.1, 10.5, 13.2, 13.2, 10.5, 16.1, 8.1, 19.2, 6.0, 22.5, 4.2, 26.0, 2.7, 29.6, 1.5, 33.4, 0.7, 37.2, 0.2, 41.1, 0.0, 45.0
qaddmodel bg,model,-1, 0, 0, 0, 1, 1, colsw_none
qtype bg, type_bind|type_inner
//レール1
model2 = 10.1, 160.0, 10.1, 50.0, 10.0, 50.0, 10.0, 160.0
qaddmodel bg2,model2,-1, 0, 0, 0, 1, 1, colsw_none
qtype bg2, type_bind
//排出口
qaddpoly bg3, 4, 45, 159, 0, 10, 1, colsw_none
qtype bg3, type_bind
qgroup bg3,2,1,2
//釘の設定
repeat 40
qaddpoly kugi, 20, 15+rnd(70), 20+rnd(110), 0, 0.5, 0.5, colsw_none
qtype kugi, type_bind
loop
//重力設定
qgravity 0, 0.05
*main
stick key1,256
if (key1 & 256) {
if key_cnt < 0 {
qaddpoly ball1, 20, 5, 140, 0, 5, 5, colsw_none
qweight ball1, 10, 1000
qspeed ball1, 0, -3.-(1.0*mousex/180), 0, 2
qdamper ball1, 0.5, 0.0
qgroup ball1,2,0,2
key_cnt = 30
}
}
qcollision bg3
qgetcol var_id,var_x,var_y
if var_id >= 0 {
qdel var_id
}
qexec
key_cnt--
//描画
redraw 0
color 0,0,0 : boxf
qdraw
redraw 1
await 33
goto *main
| |
|
2023/11/29(Wed) 10:58:33|NO.100692
どうやら ぱち_んこ (アンダーバーなし) という文字列は弾かれるみたいです
投稿時にはお気をつけください。
|
|
2023/12/4(Mon) 16:28:15|NO.100723
こんにちは。
レスが付かないのを考えると、
OBAQってあまり使われてないのでしょうか。
せっかく素晴らしい物理エンジンなので、
広く使われてほしいですね。
まだ解決していないので、ご回答お待ちしております。
|
|
2023/12/4(Mon) 21:37:08|NO.100732
前に自分も作ろうと思ったことあります。
まず、ドット単位を細かくすると良くなったような。
参考にならないかも知れませんが。
#include "obaq.as"
screen 0,640,640:title "OBAQ"
qreset
qborder -70,-70,550,999 ; 外壁
qaddpoly obj,10, 55,30 ,,8,8;オブジェクトの追加
qview 1.0,1.0 ;ビュー設定(ズーム倍率)
k=40,500, 63,500, 40,510, 63,510, 40,520, 63,520, 40,530, 63,530, 43,600, 65,600
i=0
repeat length(k)/2
qaddpoly kg,10, k(i),k(i+1) ,,3,3;オブジェクトの追加
qtype kg,type_bind ;背景に完全に固定
qmat kg,mat_wire,$FF0000
i+=2
loop
qaddpoly obj1,4, 53,460 ,,30,5;オブジェクトの追加
qtype obj1,type_bindX|type_bindY
qmat obj1,mat_wire,$FF0000
;qaddpoly obj2,4, 63,370 ,,5,30;オブジェクトの追加
;qtype obj2,type_bindX|type_bindY
onclick gosub *発射
*main
redraw 0
color:boxf
qexec
qdraw 1
redraw
await 20
goto *main
*発射
qaddpoly bl,10, 40,30 ,,8,8;オブジェクトの追加
;qinertia bx(bxCnt),0.995;,2 ;惰性(0.0〜1.0)、重力(-99.0〜99.0)
;qdamper bx(bxCnt),1.0,0.7
;qweight bx(bxCnt),6.0,100
qspeed bl, double(vx),double(vy), double(vr), 0 ;初速を指定
qmat bl,mat_wire,$FF0000
bt=1
return
あと、この方はobaqで作ったみたいです。すごいですね。
https://www.youtube.com/watch?v=UHApOkgViLw
| |
|
2023/12/4(Mon) 22:27:00|NO.100733
ObaQ使用作品は、今年のコンテストでもいくつか出てたはず。とはいえあれはもっと利用者増えてほしい。
ObaQなどの物理エンジンは、衝突時の跳ね返り計算にペナルティ法という方法がよく使われます。
この方法は、物体同士がめり込んだ量によって跳ね返る力の大きさを決めます。
深くめり込めば強く反発し、浅くしかめり込まなければ弱く反発します。
またこの方法は、物体どうしの重なりが大きすぎると上手く計算できないことがあるようで、ObaQの場合は重なるとくっついて離れなくなったりなどの挙動をします。
物体どうしの衝突には重なりを必須とするため、物体の移動速度が速すぎても問題が起きます。
今回の例だと、ボールとの衝突コース上に釘があっても、ボールの移動が速すぎて1フレーム後には釘を通り過ぎた位置にボールが移動済みになり、ボールと釘の重なり(衝突)が発生しないという現象が起きます。
この問題を回避するには、ボールの移動速度をボールの直径と比較して小さく抑える。または、ボールが1フレーム間に通過した軌道と釘の衝突判定を計算するなどの方法があります。
ということで、簡単にできる解決策は以下のようなものが上げられます。
・釘を大きくする。
・ボールの移動速度が一定以上超えないようにする。
・線の利用を避けて厚みのあるオブジェクトを使う。
・変な挙動もそれはそれで面白いので、そういうものとして楽しむ。
|
|
2023/12/4(Mon) 22:49:47|NO.100736
ふとアイデアを思いつきました。
スピードが速すぎてすり抜けてしまう問題は、計算回数を増やすことで症状を軽減できるようです。
ただし計算量が増えるので重くなります。
#include "hsp3dish.as"
rep = 4 ; 計算回数
wx=360:wy=640
screen 0,wx,wy
randomize
*start
qreset
frame=0
key_cnt=0
//壁の設定(おおまかに)
qborder -200,-200,200,200
//盤面の設定
model=0.0, 160.0, 90.0, 160.0, 90.0, 45.0, 89.8, 41.1, 89.3, 37.2, 88.5, 33.4, 87.3, 29.6, 85.8, 26.0, 84.0, 22.5, 81.9, 19.2, 79.5, 16.1, 76.8, 13.2, 73.9, 10.5, 70.8, 8.1, 67.5, 6.0, 64.0, 4.2, 60.4, 2.7, 56.6, 1.5, 52.8, 0.7, 48.9, 0.2, 45.0, 0.0, 41.1, 0.2, 37.2, 0.7, 33.4, 1.5, 29.6, 2.7, 26.0, 4.2, 22.5, 6.0, 19.2, 8.1, 16.1, 10.5, 13.2, 13.2, 10.5, 16.1, 8.1, 19.2, 6.0, 22.5, 4.2, 26.0, 2.7, 29.6, 1.5, 33.4, 0.7, 37.2, 0.2, 41.1, 0.0, 45.0
qaddmodel bg,model,-1, 0, 0, 0, 1, 1, colsw_none
qtype bg, type_bind|type_inner
//レール1
model2 = 10.1, 160.0, 10.1, 50.0, 10.0, 50.0, 10.0, 160.0
qaddmodel bg2,model2,-1, 0, 0, 0, 1, 1, colsw_none
qtype bg2, type_bind
//排出口
qaddpoly bg3, 4, 45, 159, 0, 10, 1, colsw_none
qtype bg3, type_bind
qgroup bg3,2,1,2
//釘の設定
repeat 40
qaddpoly kugi, 20, 15+rnd(70), 20+rnd(110), 0, 0.5, 0.5, colsw_none
qtype kugi, type_bind
loop
//重力設定
qgravity 0, 0.05 / (rep*rep) ; 重力加速度なので2乗で割る
ff = 0
*main
stick key1,256
if (key1 & 256) {
if key_cnt < 0 {
qaddpoly ball1, 20, 5, 140, 0, 5, 5, colsw_none
qweight ball1, 10, 1000
qspeed ball1, 0, (-3.0*double(mousex)/180.0) / rep, 0, 2
qdamper ball1, 0.5, 0.0
qgroup ball1,2,0,2
key_cnt = 30
}
}
qcollision bg3
qgetcol var_id,var_x,var_y
if var_id >= 0 {
qdel var_id
}
qexec
key_cnt--
//描画 描画をrep回に1回だけにする
if ff=0 {
redraw 0
color 0,0,0 : boxf
qdraw
redraw 1
await 33
}
ff++
if ff>=rep : ff=0
goto *main
いなえの鉛筆なくなっちゃったのか…。
| |
|
2023/12/6(Wed) 09:26:19|NO.100749
さか さん
ありがとうございます。
なるほど、ズーム倍率を変えるといい感じなのですね。
書いていただいたコードも、ちゃんと動いているように見えます。
youtubeで動画あげてる方、すごいですね。
なかなかクオリティ高いです。
紹介ありがとうございます!
GENKI さん
ありがとうございます。
利用者、増えてほしいですよね。
物理エンジンの計算方法、勉強になります。
速度を速くしすぎるとだめなんですね。
また、コードの提示ありがとうございます。
計算方法を増やせば、いい感じに動きそうですね。
全く考えつきませんでした。。。
ありがとうございます!もうちょっと試行錯誤してみます!
|
|