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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0101
witch数字の画像7解決


witch

リンク

2016/1/1(Fri) 15:23:01|NO.73918

 初投稿よろしくお願いします
 ゲームとかの数字がふんわりしていたり、かっこいい感じ、シンプルな物
など色々あるのですがその数字をHSPで出す方法が下のスクリプトの用に
なってしまいました。
 まだHSPを初めて短い初心者なのでこの方法以外にもっと良い(コンパクトになった)
ものがあるのではと思い質問しました。
 このスクリプトのだめなところ、これ以外の方法がありましたら
教えて下さい。よろしくお願いします。

celload "damage1.gif",1						;画像を読み込む
celdiv 1,10,10 ;上で読み込んだ画像をx10y10で分ける dim damageti,5 ;最大99999までを計算出来る(5桁まで) *main redraw 0 gosub *damegime gosub *damekeisan redraw 1 await 10 goto *main *damegime damage=1+damage return *damekeisan color 255,255,255 boxf keta=strlen (str (damage)) ;上で決めたダメージの桁を調べる if keta>5 :end ;最大の桁より上で調べた桁の方が大きかった場合実行中断 ; damage=str (damage) ;ダメージを文字型にする repeat length (damageti) ;繰り返し damageti(cnt)=int (strmid (damage,cnt,1)) ;ダメージの1桁目から1文字を取り数値型に変換し代入 loop ; ; gmode 2 ;画像の合成に良いモードにする repeat keta ;繰り返し pos 100+cnt*20,100 ;画像1個文の大きさ横に移す celput 1,damageti(cnt),2.0,2.0 ;上で決めたダメージの1つ1つの数値の画像を出力 loop ; return
 ※画像"damage1.gif"には0〜9の数字の画像が縦10横100に横に書いてあります



この記事に返信する


kanamaru

リンク

2016/1/1(Fri) 16:25:11|NO.73919

logfで桁数求めて、10の累乗で割ったりして1桁取り出したりした方が早い気がする。
どっちにしろ、picmesというモジュールがあるので参考にしたらどうですか?



窓月らら

リンク

2016/1/1(Fri) 20:33:32|NO.73926

うちがよく使う方法。
ただしこれはアスキーコードを利用しているため英数字専用です。
WindowsでもAndroidでも有効です。GID_SAMP は画像IDが入ります。
bmpmes "TEST 012345" 等と書いて使います。

#deffunc bmpmes str _s // peek命令で使用するため変数にコピー strtmp=_s // 文字列を描画(範囲外はスペース) repeat strlen(strtmp) p=peek(strtmp,cnt)-48 // コードを取得("0"が開始点) if p>=0 { gcopy GID_SAMP,p*8,0,8,8 } // 描画 pos ginfo_cx+8 // 次の文字用に8px移動 loop return
難しく考えなくても、たったこれだけで実現できます。
ほぼ同等のものを去年のコンテスト作品で使用していますのでご参考までに。
http://hsp.tv/contest2015/cntst_fresult.html#1110

ちなみに日本語などの場合であっても、考え方は同じです。
しかしうちは日本語の場合は、既存の文字コードは使わずに独自で定義しています。
(それらを自動で行うツールを作ってあるので、そのうち公開します。)



窓月らら

リンク

2016/1/1(Fri) 22:45:13|NO.73934

あ、peekは関数だった。

ちなみにこの考え方は、2Dマップの表示なんかと同じですね。
番号を割り当てて、その並びの画像を作っておけばいいだけ。
プログラムのほうでは与えられた番号を元に画像の座標を計算して
コピーしてくるようにすればいいだけなので、超シンプルに書けます。



witch

リンク

2016/1/2(Sat) 02:58:20|NO.73940

kanamaruさん  logfを少し調べたのですが対数(log)をまだ授業で習っていませんので
       わかりませんでした; 少し勉強してみます。
        picmesについては調べても出なかった(探しミスかも)ので
       やめておきます。

窓月ららさん  自分本当に初心者なもので載せてあるスクリプトをコピペで
       実行するということをやってみましたらエラーになってしまい
       コンテスト作品の方も見てみたのですがわかりませんでした。
       (ゲームおもしろかったです^^)
        
        
プログラムは高校で使っているポケットコンピューターでゲームを作ったり
しながら覚えたのでまだHSPに慣れていません。



リンク

2016/1/2(Sat) 11:55:24|NO.73945

もとのプログラムから読み取れる仕様に忠実になるよう、窓月ららさんの
モジュールも利用させてもらってやってみました。
コンパクトにはなっていませんがposとbmpmesの2行の組み合わせだけで
数値を表示できるようになったので改良と言えるでしょうか。

#define KETA 5 ;最大桁数 #module #deffunc bmpmes2 int _s ;ららさんのを数値限定に改造 if powf(10,KETA@)-_s<1:end ;最大桁を超えたら中断 strtmp=str(_s) repeat strlen(strtmp) p=peek(strtmp,cnt)-48 if p>=0:celput 1,p,2,2 loop return #global gmode 2 celload "damage1.gif",1 celdiv 1,10,10 *main redraw 0 gosub *damegime gosub *damekeisan redraw 1 await 10 goto *main *damegime damage=1+damage return *damekeisan color 255,255,255 boxf pos 100,100 bmpmes2 damage ;ダメージ表示 return



窓月らら

リンク

2016/1/2(Sat) 11:55:59|NO.73946

ポケットコンピューターって昔ながらのあのポケコンですか?
・・・アマゾン見たら、いまでも売ってるんだ。。

上で書いたコードは単体では動きません、命令を定義してるだけです。
画像はコンテスト作品のを使って、以下のコードを実行してみてください。
(vpad_sample.pngと同じフォルダにこのプログラムを置いてから実行してください)

#const GID_SAMP 1 // 画像ID celload "vpad_sample.png",GID_SAMP c=0 goto *main #deffunc bmpmes str _s // peek命令で使用するため変数にコピー strtmp=_s // 文字列を描画(範囲外はスペース) repeat strlen(strtmp) p=peek(strtmp,cnt)-48 // コードを取得("0"が開始点) if p>=0 { gcopy GID_SAMP,p*8,0,8,8 } // 描画 pos ginfo_cx+8 // 次の文字用に8px移動 loop return *main redraw 0 color: boxf // 黒で全画面塗り潰し if c\60>=30 { pos 8,8: bmpmes "TEST PROGRAM" } pos 8,24: bmpmes "COUNT TEST1 "+c pos 8,32: bmpmes "COUNT TEST2 "+strf("[%07d]",c) redraw 1 await 17-(c\3=0) // 60FPS c++ goto *main
とりあえず、慣れるまでは mes命令でもいいと思いますけどね。



witch

リンク

2016/1/2(Sat) 14:09:35|NO.73956

撃さん  実行してみたら出来ました!
     わからない部分もありますが、マニュアル見ながら
    理解できるように頑張って行きたいと思います。

窓月ららさん  あのポケコンです;
        アスキーコードはポケコンで少しだけ使っていたので
       なんとなく意味がわかりました。
        実行してみたらかっこいい文字数字が・・
        
どちらのスクリプトもわからない命令(?)があるのでこれからゲームなどを作りながら
覚えていけたらと思ってます。
今回は撃さんのでやっていこうと思います。
ありがとうございました!



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