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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0812
K_KObaqで「ボールを落とさないゲーム」。障害物の作り方7解決


K_K

リンク

2013/8/12(Mon) 22:06:23|NO.56313

マウス操作のオブジェクトでボールのようなオブジェクトをはじいて、
落とさないようにするゲームを作ろうと考えています。

その中で、単純に固定された障害物は簡単に作れるのですが、
「一定時間回転する障害物」を作ろうとして、失敗しています。


#include "obaq.as" screen 0,400,600,,0,0 qreset qborder -50,-75,50,75 cc=0.0 repeat 5 cc+=(M_PI/2) qaddpoly c(cnt),4,10+cnt*20,30,cc,12,3 qinertia c(cnt),0,0 loop qaddpoly a,4,30,130,0,15,5 qdamper a,0,1 qinertia a,0,0 qaddpoly b,18,8,8,0,4,4 qdamper b,0,1 qinertia b,0.998 timer=0 *main redraw 0 color :boxf qcnvaxis mqx,mqy,mousex,mousey,1 if mqx<=0 :mqx=0 if mqx>=100:mqx=100 if mqy<=100:mqy=100 if mqy>=150:mqy=150 qpos a,mqx,mqy,0.0 qspeed a,,,,1 repeat 5 qgetpos c(cnt),ccx,ccy,ccr qpos c(cnt),10+cnt*20,30,ccr loop if timer=0{ repeat 5 qspeed c(cnt),0,0,(M_PI) loop } if timer=83{ repeat 5 qspeed c(cnt),0,0,-(M_PI) loop } timer++ qexec qdraw redraw 1 await 12 goto *main
「外力に関わらず、位置を変えずに一定の速度で回転させる」
という動作を実現させるにはどうすればいいでしょうか?

ちなみに、回転速度はよくわからなかったので適当です。
最初に書いてある単純に固定された障害物というのは入れてません。



この記事に返信する


K-s

リンク

2013/8/12(Mon) 23:41:39|NO.56318

始めの方にある

qinertia c(cnt),0,0
で惰性パラメータを0にしているのでqspeedで速度を加えても動きません。
なのでqposで角度を指定してやりましょう。

repeat 5 qgetpos c(cnt),ccx,ccy,ccr qpos c(cnt),10+cnt*20,30,ccr loop if timer=0{ repeat 5 qspeed c(cnt),0,0,(M_PI) loop } if timer=83{ repeat 5 qspeed c(cnt),0,0,-(M_PI) loop }
の部分を

if (timer >= 100) & (timer <= 400) { repeat 5 qgetpos c(cnt),ccx,ccy,ccr qpos c(cnt),ccx,ccy,ccr+0.03 loop }
に変えてみてください。(時間と回転速度ちょっと変えてます)



K_K

リンク

2013/8/13(Tue) 08:09:19|NO.56325

やっぱ惰性0にすると回転もできないんですね…

ちょっと試してきます(作業用のPCはオフラインなもので…)



K_K

リンク

2013/8/13(Tue) 17:30:32|NO.56344

当初の問題は解決しました。ありがとうございます。

ついでにもう一つ聞きたいのですが、

実際に動作させてみると、ゲームの趣旨に反して
明らかにボールの動作が早すぎますよね?

惰性の値を小さくしてしまうとあまりにもボールがはねないので、
色々試行錯誤して、最終的にこの動作に行きついたのですが…

反発係数や惰性などの値をどのようにすれば、
きれいに跳ね返ってくれるでしょうか。

よくあるブロック崩し程度の速度をイメージしてます。



K-s

リンク

2013/8/14(Wed) 00:09:29|NO.56359

どういう値が適切か分かりませんが、他の対策で

qgetspeed b, x, y, r spd = sqrt(x*x + y*y) if spd >= 0.5 { qinertia b, 0.998-spd/200 } else { qinertia b, 0.998 }
こういう風にボールの速度が早くなり過ぎたら制御するのも手だと思います。
それと下の台をqposでマウスの座標に直接持ってくるのではなく
マウスの位置に徐々に近づくようにして急激な移動は避けたり。
(qposで直接指定するのは本当はあまり良くないかも。qposの説明に…)
あとはqgravityで重力のパラメータを変えるなどでしょうか。

ご存知かもしれませんが、他の方が作られたOBAQを使ったブロック崩しがあるので
参考してみるのもいいと思います。
http://youtu.be/gZ3Ss1LQDzQ



K_K

リンク

2013/8/14(Wed) 09:34:06|NO.56361

リンク先のゲームですと、
うまくボールを跳ね上げるには、
ちゃんと下から上へ動かしながらぶつける必要があります。

それがなくてもそこそこ跳ね上がるようにしたいのですが、
反発係数をどうこうしてもうまくいかなかったんです。

何をどうすればそうなるでしょうか?


あと、
知恵袋にいたときにqposを使ったほうがいいとアドバイスを受けて、
あのようなプログラムになってます。
(知恵袋ではNO.56313の質問に回答がつかなかったんです。)



K-s

リンク

2013/8/14(Wed) 14:28:13|NO.56368

こんな感じでしょうか?

#include "obaq.as" screen 0,400,600,,0,0 qreset qborder -50,-75,50,75 repeat 3 qaddpoly c(cnt),4,20+cnt*30,30,0,12,3 qtype c(cnt),$1c0 loop qaddpoly a,4,30,120,0,15,5 qtype a,$1c0 df = 1.000 qaddpoly b,18,8,70,0,4,4 qdamper b,0,0 qinertia b,df qgravity 0,0 ; 重力なし qspeed b,0.2,0.2 ; ボールに初速を与えないと動かない *main redraw 0 color :boxf qcnvaxis mqx,mqy,mousex,mousey,1 if mqx<=0 :mqx=0 if mqx>=100:mqx=100 qpos a,mqx,120,0.0 ; ボールが速くなり過ぎると減速させます qgetspeed b, x, y, r spd = sqrt(x*x + y*y) if spd >= 0.4 { qinertia b, df-spd/200 } else { qinertia b, df } qgetpos c(1),ccx,ccy,ccr qpos c(1),ccx,ccy,ccr+0.03 qexec qdraw redraw 1 await 15 goto *main

あとはqinertiaの惰性パラメータを0にすることで外力でも動かなくできますが、
qtypeで設定してほうが分かりやすいと思いこっちでやってます。

qposは自分も詳しくは分からないんですが、一応説明にあったので…
OBAQは1フレームに何回か計算しているんですが、それ関係かなと。



K_K

リンク

2013/8/17(Sat) 08:37:09|NO.56461

qtypeですか〜
大変勉強になりました。

あとはゲームとして遊べるようなシステムを作っていく作業ですね…

頑張って完成させたいと思います。
ありがとうございました。



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