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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1013
顔芸たびたびすみません^^; シューティングのスコア表示関連16解決


顔芸

リンク

2011/10/13(Thu) 23:00:15|NO.42353

立て続けにすみません;

今度はスコア表示についての質問なのですが、数値型変数の任意の桁を好きに取り出す命令
なんてありませんよね?そこでいろいろ調べてみるといったん文字型変数に換えてpeekで
取り出し・数値に戻す というやり方をみつけたのですが、それを試すと表示は
うまくいったのですがなぜか時折画面がチラつきます。変換がまずいんですかね・・
これはどういったわけなのでしょうか;



あと自分でも考えてみた手法が一つあるんですが・・



a=9876726;任意(10桁を想定) dim num,10 repeat 10 b=a repeat b/=10;最上位数が1の位にくるまで繰り返し割る c=int(b) if c-9<=0 :keta=cnt+1:atama=c:break;「小数以下切り捨てて9引いたら0以下」=一桁 loop num(cnt)=atama a-=atama*powf(10,keta);さっきの一桁×(ループ数+1)をaから引いて最上位数を消す if a-9<=0 :num(cnt+1)=a:break;aが既に一桁になってる最後のループ用判定 loop repeat 10 mes num(cnt) loop
なぜか8桁以上の数値を入れるとおかしな結果を返します。どこがおかしいのでしょうか;


どちらか一方で構いませんのでアドバイスを頂けると助かります。よろしくお願い致します。



この記事に返信する


暇人

リンク

2011/10/14(Fri) 00:41:25|NO.42364


repeat 10 mes ""+(cnt+1)+":"+int(powf(10,cnt))+" : "+powf(10,cnt) loop
8桁の所で見えない誤差が・・・
後2147483647を超える計算は標準命令じゃできない


>時折画面がチラつきます
変換部分とは違う所で問題おこしてるんじゃ・・・



info

リンク

2011/10/14(Fri) 03:00:09|NO.42365

桁の値はこの計算式で算出できます。

i = 1 v = 1234567 repeat 8 mes ((v / i) \ 10) i*=10 loop

ちらつきに関しては、
多分ループ内のredraw が抜けているのだと思います。
スクリプトをみない限りではどうとも言えませんが。
もしそうでしたら、redraw 命令で一度検索してみたらいかがでしょうか?



ANTARES

リンク

2011/10/14(Fri) 09:28:37|NO.42367

>数値型変数の任意の桁を好きに取り出す命令なんてありませんよね?

#include "hspmath.as" a=9876726 mes "文字列で" s=str(a) repeat strlen(s) mes strmid(s,cnt,1) loop mes "数学的に" l=int(logf(a)/logf(10)) ;10の何乗か? 小数以下切り捨てで桁数-1 if a==pow(10,l): l-- ;aが10のn乗なら1引く repeat l+1 mes a/(pow(10,l-cnt))\10 loop stop



顔芸

リンク

2011/10/14(Fri) 17:03:45|NO.42370

>暇人さん
なんということだorz 誤差・・考えてなかったです;

>infoさん
剰余か!Σ(゚□゚; スマートすぎて泣ける(TvT

>ANTARESさん
strmid、logですか なるほど。strmidは文字型を返すんですね。自分としては数字を画像として
貼り付けるための番号がほしいのでそうなるとここはやはりpeekの出番ですかね..?

毎度お騒がせして申し訳ないことに、使っていたes_putをやめて個々の数字をes_setで
スプライトとして管理したところ、チラつきが消えて万事解決しました^^;
表示の優先順位の関係でさわっていたら偶然にも;

es_putの立ち位置は描画系ってことになるんでしょうか?素早い画面更新には向かないんですかね?
また自分の使い方が悪いだけの気もしますがw;



ひらまる

リンク

2011/10/14(Fri) 17:42:57|NO.42372

配列使えば何桁でも計算できんじゃね? って思いついて書いてみたよ。
思いつきで書いた割には予想外に使える予感……

最大桁数 = 10 ; この変数を変えるだけで何桁でも可能。 dim スコア配列, 最大桁数 ; この配列にスコアが保存される。初期化する時もこの方法で。 ; ランダムにスコアを加算し続けるテスト。 randomize repeat ;「加算スコア」に加算したいスコアを代入して、*スコア追加を呼ぶことでスコアに追加する。 加算スコア = rnd( 32768 ) * 1000 + rnd( 32768 ) ; ちなみにrndは32768までの値しか出せない。 gosub *スコア追加 gosub *スコア表示 wait 1 loop stop *スコア追加 加算スコア文字列 = str(加算スコア) ; 加算スコアを文字列にする。 加算桁数 = strlen( 加算スコア文字列 ) ; 文字列にすれば文字数を取得するだけで桁数がわかる。 ; このループでは加算スコアの加算と、それに伴う値の繰上を行なっている。 repeat 最大桁数 加算終了 = 1 ; 加算終了フラグ。スコアの加算と繰り上げが行われている内は0にされて終了しない。 ;スコア加算処理 if cnt < 加算桁数 { スコア配列( cnt ) += int( strmid( 加算スコア文字列, 加算桁数 - ( cnt + 1 ), 1 ) ) 加算終了 = 0 } ;スコア繰上処理 if スコア配列( cnt ) >= 10 { ;カンスト判定 if cnt >= 最大桁数 - 1 { ;最大桁数を越えたらオール9でカンストを表す。 repeat 最大桁数 スコア配列( cnt ) = 9 loop 加算終了 = 1 } else { スコア配列( cnt ) -= 10 スコア配列( cnt + 1 ) += 1 加算終了 = 0 } } ;加算終了処理。 if 加算終了 == 1 : break loop return *スコア表示 ;画面クリアとかいろいろ。 redraw 0 pos 0,40 gcopy 0,0,0,ginfo_sx,ginfo_sy pos 0,0 color 200+rnd(56),200+rnd(56),200+rnd(56);色を変えていることに意味はない。 boxf 0,0,ginfo_sx,40 color 0,0,0 redraw 1 ; スコアをいくつ加算したか表示 mes "+" + 加算スコア ;スコア表示用の文字列を作成。これを応用すればスコアを画像で表示できる。 ;つまりスコア配列の要素0が1の位になってて、要素1が10の位になってる。そんな感じ。 表示スコア = "" repeat 最大桁数 表示スコア = str( スコア配列( cnt ) ) + 表示スコア loop ; 現在のスコアを表示 mes 表示スコア return
内容はコメント参照。
1行目を変えるだけで何桁でも表示可能。
カンスト処理もしてる。スコアが限界を越えるとオール9で表示される。



顔芸

リンク

2011/10/14(Fri) 19:06:39|NO.42374

>ひらまるさん
つまり桁ごとに配列変数の番号を割り振るということですね?そうすれば0〜9の数字さえ
入ればいいと・・
驚愕です(゚ロ゚;)すごくシンプルな発想、的を得たスクリプトで・・;;

ある意味万年カレンダー(?)みたいなイメージですねw桁を上げたかったら横に1コつける
というw

7桁で妥協していたのですが目標の10桁が扱えると非常にありがたいのですが・・
もしよろしければこの手法を使用させて頂けないでしょうか><



ひらまる

リンク

2011/10/14(Fri) 20:15:11|NO.42378

>もしよろしければこの手法を使用させて頂けないでしょうか><
もちろんいいよ。 私が掲示板に張ったスクリプトは基本好きに使っていいよ。



顔芸

リンク

2011/10/14(Fri) 20:53:45|NO.42380

>ひらまるさん
ありがとうございます><
今実装してみましたが快適に動きました!es_setの調整も楽だし、加点の種類によって違う
フラグ立てて飛ばすだけで簡単に使えますね^^10桁設定でカンスト機能も正常に動作しました。
本当にありがとうございました!モチベーションも一気に上がりました(笑

回答して下さったみなさんもありがとうございました。質問のたびに色々勉強になります本当に。
また機会があればよろしくお願いしますm(_ _)m



ANTARES

リンク

2011/10/14(Fri) 21:59:13|NO.42384

>自分としては数字を画像として
>貼り付けるための番号がほしいので
int関数で数値にできます。



暇人

リンク

2011/10/15(Sat) 01:36:32|NO.42387

>es_putの立ち位置は描画系ってことになるんでしょうか?
es_putはスプライト系とは違う描画になる
だからes_drawの前に使えばスプライトの奥に
後に使えば手前に描画される

es_drawはスプライトナンバーを分けて複数使えるので
敵(スプライト)、スコア(es_put)、弾(スプライト)
みたいな優先度も持たせられる



顔芸

リンク

2011/10/15(Sat) 10:03:46|NO.42393

お二方、ありがとうございます。
>暇人さん
そうなんですか・・知りませんでした。es_drawの前後でes_putの優先度が変わるとは。

es_mesはどうしてもスプライトの陰に隠れちゃうんですが、優先度はつけられないんですかね;
しかもes_putと同じくチラつきが発生しました。なんか怖くてes_setしか使えませんw;



暇人

リンク

2011/10/15(Sat) 13:58:56|NO.42398

es_mesもes_drawとは関係なく描画されるので
es_drawとes_syncの間に置けばスプライトで隠れる事は無い



顔芸

リンク

2011/10/15(Sat) 19:06:46|NO.42411

>暇人さん
本当ですね 初めて知りました;;
やっぱりチラつきますが^^;でも確認作業に使えるので非常に助かります!
ご返答ありがとうございました!



暇人

リンク

2011/10/15(Sat) 21:29:25|NO.42429

>やっぱりチラつきますが^^;
本家の方でフルスクリーン時にちらつくって報告上がってました(es_fmesとes_putについてでしたが)
どうもD3Dオンでフルスクリーンだとちらつく感じ

で、色々試した結果
D3Dオンで初期化した場合はなるべくD3D対応の命令を使う事で回避可能
es_clsは内部でcolor+es_boxfと同等のことをしている
なのでes_exboxfを使って画面クリアするようにする
これだけでちら付きは無くなると思うけどes_putもes_exputを使った方が良いかもしれない

文字表示系にはまだD3D対応のものは無いがes_clsを使わなければこちらではちら付かなかった



顔芸

リンク

2011/10/15(Sat) 22:01:19|NO.42430

>暇人さん
たしかにes_mes+es_exboxfでチラつきはありません。ご報告ありがとうございます。
質問は一応の解決を見たのでこれ以降は本当に自分の独り言程度に受け止めてやって下さい;

先日気が付いたんですがどうやらチラつきはmmplayに反応しているようなんです;
自分はそもそも画面消去系の命令も(背景で塗りつぶし)es_mesも使ってこなかったんですが、
スコアの一件で表示系と同時に被弾音用mmplayを実装したので原因が見えづらくなっていました。
被弾の瞬間に画面が白くなります。

es_mes,es_putかmmplayのどちらか一方を消すとチラつきも消えました。
逆にd3dのサンプルスクリプトにmmplayをのせるとチラつきが発現しました。
これももはや仕様(?)なんですかね・・ひとまず今のところes_mesもes_putも回避の方向で
進めているので問題はないわけですが・・



暇人

リンク

2011/10/15(Sat) 23:59:55|NO.42436

es_putはes_exputで改善されるかもしれない

>これももはや仕様(?)なんですかね
環境依存の問題かもしれない
mmplayはOSや設定インストール状況で使われるものが変るので
再現性あるスクリプトを上げれば回避方法か何かそのうち出てくるかもしれない・・・



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