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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0831
WHITE回転画像の対応(?)8解決


WHITE

リンク

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 です



この記事に返信する


WHITE

リンク

2010/8/31(Tue) 19:41:19|NO.34751

補足

わかりにくい表現ですみません;
問題は0番の画像(angleが0.0のとき、つまり0度)と31番の画像(angleが1.0に
近いとき、つまり360度になる手前)の間が短くなっているということです。

これでも十分わかりにくいですね・・。



WHITE

リンク

2010/8/31(Tue) 19:50:32|NO.34753

さらに補足

画像の回転をライブラリでやりたくないのは
hgimg3を使うとオブジェクトの登録やらMOC情報やらでコーディング量が増えてしまう
うえに画像の回転さえ出来ればいいので、そのためだけにhgimg3のようなライブラリを
つかいたくないからです。

それ以外の方法で高速で画像の崩れない画像の回転ができる方法などがあればぜひ
教えてほしいです。



SYAM

リンク

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



SYAM

リンク

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



WHITE

リンク

2010/8/31(Tue) 20:10:07|NO.34757

SYAMさん
丁寧な回答ありがとうございます。

値の変化の様子をみると私の期待どうりの動作をしているようです。

でも、角度の修正を値の代入ではなくて加減算によって解決するというのはわかりましたが。
num = int ( angle*32 )
の部分はなぜこうなるのでしょうか?



WHITE

リンク

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

としてもうまくいきません、なぜでしょうか?



SYAM

リンク

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πを表現しないといけません。
そうなっていないから、うまくいかないのです。


最後に
質問するとき「うまくいきません」…とだけ書くのは、ダメです。
それだと動かないのか、あさっての方向に動くのか、そもそもエラーなのかが回答者には分かりません。
「具体的な結果」がどれほど重要な情報かは、プログラムを組んでいれば分かりますよね。
次からは気をつけてみてください。その方が回答も得られやすくて、質問する側にとってもお得です。



WHITE

リンク

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πを表現しないといけません。
>そうなっていないから、うまくいかないのです。

あ、そうですね、また換算しなきゃいけないわけですね
気がつきませんでした。



>質問するとき「うまくいきません」…とだけ書くのは、ダメです。
>それだと動かないのか、あさっての方向に動くのか、そもそもエラーなのかが回答者には分かりません。
>「具体的な結果」がどれほど重要な情報かは、プログラムを組んでいれば分かりますよね。

そうですね、結果を書いていませんでしたね;
気をつけます;。

回答ありがとうございました^^。



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