|
|
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
「外力に関わらず、位置を変えずに一定の速度で回転させる」
という動作を実現させるにはどうすればいいでしょうか?
ちなみに、回転速度はよくわからなかったので適当です。
最初に書いてある単純に固定された障害物というのは入れてません。
|
|
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
}
に変えてみてください。(時間と回転速度ちょっと変えてます)
|
|
2013/8/13(Tue) 08:09:19|NO.56325
やっぱ惰性0にすると回転もできないんですね…
ちょっと試してきます(作業用のPCはオフラインなもので…)
|
|
2013/8/13(Tue) 17:30:32|NO.56344
当初の問題は解決しました。ありがとうございます。
ついでにもう一つ聞きたいのですが、
実際に動作させてみると、ゲームの趣旨に反して
明らかにボールの動作が早すぎますよね?
惰性の値を小さくしてしまうとあまりにもボールがはねないので、
色々試行錯誤して、最終的にこの動作に行きついたのですが…
反発係数や惰性などの値をどのようにすれば、
きれいに跳ね返ってくれるでしょうか。
よくあるブロック崩し程度の速度をイメージしてます。
|
|
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
|
|
2013/8/14(Wed) 09:34:06|NO.56361
リンク先のゲームですと、
うまくボールを跳ね上げるには、
ちゃんと下から上へ動かしながらぶつける必要があります。
それがなくてもそこそこ跳ね上がるようにしたいのですが、
反発係数をどうこうしてもうまくいかなかったんです。
何をどうすればそうなるでしょうか?
あと、
知恵袋にいたときにqposを使ったほうがいいとアドバイスを受けて、
あのようなプログラムになってます。
(知恵袋ではNO.56313の質問に回答がつかなかったんです。)
|
|
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フレームに何回か計算しているんですが、それ関係かなと。
|
|
2013/8/17(Sat) 08:37:09|NO.56461
qtypeですか〜
大変勉強になりました。
あとはゲームとして遊べるようなシステムを作っていく作業ですね…
頑張って完成させたいと思います。
ありがとうございました。
|
|