|
|
|
2010/8/31(Tue) 19:29:01|NO.34749
360/32分割した回転画像(360/32度ずつ回転させた画像をたてにつなげたもの)を
0〜1の範囲の値に対応させて表示させたいのですがうまくいきません。
いまのとこ
num を表示すべき画像の番号として
現在角度をあらわす変数を angle とし
num = int( angle / (1.0/32) ) のようにしてまず1.0を1/32した値で割り、どの
画像を表示するべきかをもとめ、このままでは画像が反時計回りに1個ぶんずれてしまう
ので
if( ( angle\(1.0/32.0) )> (1.0/64.0) ) { num++ }
のように割った余りが分割数/2より大きい場合には時計回りに一個分ずらして
表示するようにしています。
なお、angleは必ず 0.0〜0.999999 の間にあるようにして
num が32を超えてしまった場合には0にもどすようにしています。
なにがうまくいかないかというと、0.0と0.999999の境あたりで一気に画像が回転
してしまうんです。
ものすごい説明下手ですみません;;
どうやって検索すればいいかわからず資料が入手できず、
「回転式2」というソフトにサンプルが載っていましたがHSP3ではなぜかうまく機能せず、
画像の回転を他のグラフィックライブラリを用いて行うのはちょっと嫌なので
困っています。
スクリプトをのせておきます。
#const div32 1.0/32.0
#const div64 1.0/64.0
buffer 3
picload "test_image.bmp" //画像ファイルを指定してください
gsel 0
angle = 0.0
speed = 0.005
while
redraw 0
color 0,0,0
boxf 0,0,640,480
getkey key_left,37
getkey key_right,39
if( key_left = 1 ){
if( (angle-speed)<0.000000 ){ angle = 0.999999 - ((angle-speed)*(-1.0)) }
else { angle = angle - speed }
}
if( key_right = 1 ){
if( (angle+speed)>=1.000000 ){ angle = (angle+speed)-(1.000000) }
else { angle = angle + speed }
}
num = int ( angle / div32 )
if( (angle \ div32) > div64 ) { num++ }
if( num=32 ){ num = 31 }
pos 0,0
color 255,255,255
mes angle
mes num
gcopy 3,0,num*32,32,32
wait 1
redraw 1
wend
360度を32分割して縦につなげた、1コマ32x32の画像があれば機能します。
カーソルキーで左右回転します
上の数値は angle です
下の数値は num です
| |
|
2010/8/31(Tue) 19:41:19|NO.34751
補足
わかりにくい表現ですみません;
問題は0番の画像(angleが0.0のとき、つまり0度)と31番の画像(angleが1.0に
近いとき、つまり360度になる手前)の間が短くなっているということです。
これでも十分わかりにくいですね・・。
|
|
2010/8/31(Tue) 19:50:32|NO.34753
さらに補足
画像の回転をライブラリでやりたくないのは
hgimg3を使うとオブジェクトの登録やらMOC情報やらでコーディング量が増えてしまう
うえに画像の回転さえ出来ればいいので、そのためだけにhgimg3のようなライブラリを
つかいたくないからです。
それ以外の方法で高速で画像の崩れない画像の回転ができる方法などがあればぜひ
教えてほしいです。
|
|
2010/8/31(Tue) 20:00:13|NO.34755
よくわからないけどこれではダメ?
#const div32 1.0/32.0
#const div64 1.0/64.0
;buffer 3
;picload "test_image.bmp" //画像ファイルを指定してください
buffer 3,32,32*32,0:cls 4
color 255,255,255
repeat 32
pos 0,32*cnt
mes cnt
loop
gsel 0
angle = 0.0
speed = 0.005
while
redraw 0
color 0,0,0
boxf 0,0,640,480
getkey key_left,37
getkey key_right,39
if( key_left = 1 ){
angle -= speed
if(angle<0):angle += 1.0
}
if( key_right = 1 ){
angle += speed
if(angle>=1.0):angle -=1.0
}
num = int ( angle * 32 )
pos 0,0
color 255,255,255
mes angle
mes num
gcopy 3,0,num*32,32,32
wait 1
redraw 1
wend
|
|
2010/8/31(Tue) 20:03:24|NO.34756
ダメだった。ごめん。こっちで。
#const div32 1.0/32.0
#const div64 1.0/64.0
;buffer 3
;picload "test_image.bmp" //画像ファイルを指定してください
buffer 3,32,32*32,0:cls 4
color 255,255,255
repeat 32
pos 0,32*cnt
mes cnt
loop
gsel 0
angle = 0.0
speed = 0.005
while
redraw 0
color 0,0,0
boxf 0,0,640,480
getkey key_left,37
getkey key_right,39
if( key_left = 1 ){
angle -= speed
}
if( key_right = 1 ){
angle += speed
}
while (angle<0)
angle += 1.0
wend
while (angle>=1.0)
angle -= 1.0
wend
num = int ( angle * 32 )
pos 0,0
color 255,255,255
mes angle
mes num
gcopy 3,0,num*32,32,32
wait 1
redraw 1
wend
|
|
2010/8/31(Tue) 20:10:07|NO.34757
SYAMさん
丁寧な回答ありがとうございます。
値の変化の様子をみると私の期待どうりの動作をしているようです。
でも、角度の修正を値の代入ではなくて加減算によって解決するというのはわかりましたが。
num = int ( angle*32 )
の部分はなぜこうなるのでしょうか?
|
|
2010/8/31(Tue) 20:22:55|NO.34758
あと、向いてる方向に移動させたいのですが
x=x+cos(angle*M_PI)*0.5
y=y+sin(angle*M_PI)*0.5
としてもうまくいきません、なぜでしょうか?
|
|
2010/8/31(Tue) 20:45:05|NO.34759
>num = int ( angle*32 )
>の部分はなぜこうなるのでしょうか?
angle が 0.0 〜1.0(未満)であるわけですから、
angle に何か適当な数値を掛けると 0〜その数値(未満)になります。
なので、angle = 0 のとき num=0 ですし、
仮に angle=1.0 なら num=32になります。(実際にはそれ未満にしかなりませんが)
つぎ。
angleがそのような範囲の数値ですから、
0.0〜1.0(未満)の数値を使って、0.0〜2.0πを表現しないといけません。
そうなっていないから、うまくいかないのです。
最後に
質問するとき「うまくいきません」…とだけ書くのは、ダメです。
それだと動かないのか、あさっての方向に動くのか、そもそもエラーなのかが回答者には分かりません。
「具体的な結果」がどれほど重要な情報かは、プログラムを組んでいれば分かりますよね。
次からは気をつけてみてください。その方が回答も得られやすくて、質問する側にとってもお得です。
|
|
2010/8/31(Tue) 21:04:28|NO.34760
>angle が 0.0 〜1.0(未満)であるわけですから、
>angle に何か適当な数値を掛けると 0〜その数値(未満)になります。
>なので、angle = 0 のとき num=0 ですし、
>仮に angle=1.0 なら num=32になります。(実際にはそれ未満にしかなりませんが)
なるほど、たしかにそうなりますね。
>angleがそのような範囲の数値ですから、
>0.0〜1.0(未満)の数値を使って、0.0〜2.0πを表現しないといけません。
>そうなっていないから、うまくいかないのです。
あ、そうですね、また換算しなきゃいけないわけですね
気がつきませんでした。
>質問するとき「うまくいきません」…とだけ書くのは、ダメです。
>それだと動かないのか、あさっての方向に動くのか、そもそもエラーなのかが回答者には分かりません。
>「具体的な結果」がどれほど重要な情報かは、プログラムを組んでいれば分かりますよね。
そうですね、結果を書いていませんでしたね;
気をつけます;。
回答ありがとうございました^^。
|
|