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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1129
mofumofuOBAQによるぱち_んこ風ゲームの作り方6未解決


mofumofu

リンク

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



この記事に返信する


mofumofu

リンク

2023/11/29(Wed) 10:58:33|NO.100692

どうやら ぱち_んこ (アンダーバーなし) という文字列は弾かれるみたいです
投稿時にはお気をつけください。



mofumofu

リンク

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



GENKI

リンク

2023/12/4(Mon) 22:27:00|NO.100733

ObaQ使用作品は、今年のコンテストでもいくつか出てたはず。とはいえあれはもっと利用者増えてほしい。

ObaQなどの物理エンジンは、衝突時の跳ね返り計算にペナルティ法という方法がよく使われます。
この方法は、物体同士がめり込んだ量によって跳ね返る力の大きさを決めます。
深くめり込めば強く反発し、浅くしかめり込まなければ弱く反発します。
またこの方法は、物体どうしの重なりが大きすぎると上手く計算できないことがあるようで、ObaQの場合は重なるとくっついて離れなくなったりなどの挙動をします。

物体どうしの衝突には重なりを必須とするため、物体の移動速度が速すぎても問題が起きます。
今回の例だと、ボールとの衝突コース上に釘があっても、ボールの移動が速すぎて1フレーム後には釘を通り過ぎた位置にボールが移動済みになり、ボールと釘の重なり(衝突)が発生しないという現象が起きます。
この問題を回避するには、ボールの移動速度をボールの直径と比較して小さく抑える。または、ボールが1フレーム間に通過した軌道と釘の衝突判定を計算するなどの方法があります。

ということで、簡単にできる解決策は以下のようなものが上げられます。

・釘を大きくする。
・ボールの移動速度が一定以上超えないようにする。
・線の利用を避けて厚みのあるオブジェクトを使う。
・変な挙動もそれはそれで面白いので、そういうものとして楽しむ。



GENKI

リンク

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


いなえの鉛筆なくなっちゃったのか…。



mofumofu

リンク

2023/12/6(Wed) 09:26:19|NO.100749

さか さん

ありがとうございます。
なるほど、ズーム倍率を変えるといい感じなのですね。

書いていただいたコードも、ちゃんと動いているように見えます。


youtubeで動画あげてる方、すごいですね。
なかなかクオリティ高いです。
紹介ありがとうございます!


GENKI さん

ありがとうございます。

利用者、増えてほしいですよね。
物理エンジンの計算方法、勉強になります。
速度を速くしすぎるとだめなんですね。

また、コードの提示ありがとうございます。
計算方法を増やせば、いい感じに動きそうですね。
全く考えつきませんでした。。。
ありがとうございます!もうちょっと試行錯誤してみます!



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100691への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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