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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0526
Gimicキャラクターの登録・削除7解決


Gimic

リンク

2011/5/26(Thu) 23:17:27|NO.39393

初心者です。2回目の投稿となります。
よろしくお願いします。

RPGのキャラ登録やSLGのユニット登録など、IDの登録状況を判断して
登録なら空きIDのみを選択させる、削除なら登録IDのみを選択させる
という処理をやりたいのですが、方法が考えつきません。

長くなりますがサンプル貼らせていただきます。
何卒ご教授願います。

また、そもそも配列でステータス管理なんかしない、など根本的な事柄も
ご指摘いただけるとありがたいです。

******************************************************************

;変数・配列のリストと初期化 key=0 select=0 X=0 Y=0 step=0 ;0=メニュー選択 1=ID選択 2=登録・削除実行 select_menu =0 ;0=登録 1=削除 select_id =0 entry_NAME ="" dim ID,5 ;キャラクターID sdim NAME,5,5 ;キャラクター名 dim flg,5 ;キャラクターの登録状況フラグ ID(0)=0,1,2,3,4 ;ID登録 NAME(0)="aaaaa","","ccccc","ddddd","" ;名前の初期登録 repeat 5 ;登録状況フラグ設定 if NAME(cnt)!"" :flg(cnt)=1 loop ;1回呼び出せばよい命令 screen 0 input entry_NAME buffer 1 onkey*key_check ;カーソルキーの判定 *key_check key=wparam if key=38 :select-- ;カーソルキー↑ if key=40 :select++ ;カーソルキー↓ getkey enter,13 ;エンターキーの入力回数でstepフラグを更新 if enter=1 :step++ if step>2 :step=2 ;メイン *main gsel 1 color 255,255,255 :boxf color 0,0,0 gosub*menu gosub*judge gosub*list gsel 0 gcopy 1,0,0,640,480 stop ;メニューの表示 *menu X=40 :Y=0 pos X,Y :mes "登録" pos X,Y+20 :mes "削除" pos X,Y+60 :mes "ID:" return ;メニュー・IDの選択と登録・削除の実行 *judge switch step case 0 ;メニュー選択 if select<0 :select=1 if select>1 :select=0 X=0 :Y=0 if select=0 :pos X,Y :mes "◆" if select=1 :pos X,Y+20 :mes "◆" select_menu = select swbreak //*********************************************** case 1 ;ID選択 if select<0 :select=4 if select>4 :select=0 X=80 :Y=60 pos X,Y :mes select select_id = select swbreak // IDを選択するときに「登録」なら空きIDのみを // 「削除」なら登録済みIDのみを表示させたい //*********************************************** case 2 ;IDの登録・削除の実行 if select_menu =0 :NAME(select_id)=entry_NAME if select_menu =1 :NAME(select_id)="" step=0 swbreak swend return ;キャラクターリスト *list X=0 :Y=100 pos X ,Y : mes "ID" pos X+30,Y :mes "NAME" pos X+90,Y :mes "flg" X=0 :Y=120 repeat 5 pos X ,Y :mes ID(cnt) pos X+30,Y :mes NAME(cnt) pos X+90,Y :mes flg(cnt) Y+=20 loop return
******************************************************************



この記事に返信する


ORZ

リンク

2011/5/26(Thu) 23:42:58|NO.39394

何で詰まっているのか全く理解できないんだけど、キャラクターの名前かなんかを
ずらっと出力するとき、repeatかなんかで回すだろ?
その時if あいてない:表示、とか、if あいてる:表示、という風にすればいいだけのことじゃん?
空いているという管理の仕方がわかんないの?リストアップの仕方がわかんないの?
それともこれはどっかからのコピペのコピペで、処理全体がよくわかってないの?



ひらまる

リンク

2011/5/27(Fri) 00:05:24|NO.39395

ええと…正直いろいろありえへんと思いましたが、
(ていうか名前登録用のflgってフラグがあるのに使ってない…??)
とりあえず登録と削除で選べるIDを制限したいということなら、

ボタン入力処理を、選択方向がわかるように書きなおしつつ、

selectAdd = 0 if key=38 :selectAdd = -1 ;カーソルキー↑ if key=40 :selectAdd = 1 ;カーソルキー↓
名前登録フラグ判定をつけつつ

case 1 ;ID選択 repeat select += selectAdd if select<0 :select=4 if select>4 :select=0 if flg( select ) != select_menu { if selectAdd == 0 : selectAdd = 1 continue } break loop X=80 :Y=60 pos X,Y :mes select select_id = select swbreak
IDの登録と削除の時にID登録フラグを変更する

case 2 ;IDの登録・削除の実行 if select_menu =0 { NAME(select_id)=entry_NAME flg(select_id)=1 } if select_menu =1 { NAME(select_id)="" flg(select_id)=0 } step=0 swbreak
の3つで実装可能だと思います。
以下、長くなりますが全ソースです。

;変数・配列のリストと初期化 key=0 select=0 X=0 Y=0 step=0 ;0=メニュー選択 1=ID選択 2=登録・削除実行 select_menu =0 ;0=登録 1=削除 select_id =0 entry_NAME ="" dim ID,5 ;キャラクターID sdim NAME,5,5 ;キャラクター名 dim flg,5 ;キャラクターの登録状況フラグ ID(0)=0,1,2,3,4 ;ID登録 NAME(0)="aaaaa","","ccccc","ddddd","" ;名前の初期登録 repeat 5 ;登録状況フラグ設定 if NAME(cnt)!"" :flg(cnt)=1 loop ;1回呼び出せばよい命令 screen 0 input entry_NAME buffer 1 onkey*key_check ;カーソルキーの判定 *key_check key=wparam ;*********このへんから********* if key=38 :selectAdd = -1 ;カーソルキー↑ if key=40 :selectAdd = 1 ;カーソルキー↓ ;*********このへんまで********* getkey enter,13 ;エンターキーの入力回数でstepフラグを更新 if enter=1 :step++ if step>2 :step=2 ;メイン *main gsel 1 color 255,255,255 :boxf color 0,0,0 gosub*menu gosub*judge gosub*list gsel 0 gcopy 1,0,0,640,480 stop ;メニューの表示 *menu X=40 :Y=0 pos X,Y :mes "登録" pos X,Y+20 :mes "削除" pos X,Y+60 :mes "ID:" return ;メニュー・IDの選択と登録・削除の実行 *judge switch step case 0 ;メニュー選択 select += selectAdd if select<0 :select=1 if select>1 :select=0 X=0 :Y=0 if select=0 :pos X,Y :mes "◆" if select=1 :pos X,Y+20 :mes "◆" select_menu = select swbreak //*********************************************** case 1 ;ID選択 ;*********このへんから********* repeat select += selectAdd if select<0 :select=4 if select>4 :select=0 if flg( select ) != select_menu { if selectAdd == 0 : selectAdd = 1 continue } break loop ;*********このへんまで********* X=80 :Y=60 pos X,Y :mes select select_id = select swbreak // IDを選択するときに「登録」なら空きIDのみを // 「削除」なら登録済みIDのみを表示させたい //*********************************************** case 2 ;IDの登録・削除の実行 ;*********このへんから********* if select_menu =0 { NAME(select_id)=entry_NAME flg(select_id)=1 } if select_menu =1 { NAME(select_id)="" flg(select_id)=0 } ;*********このへんまで********* step=0 swbreak swend return ;キャラクターリスト *list X=0 :Y=100 pos X ,Y : mes "ID" pos X+30,Y :mes "NAME" pos X+90,Y :mes "flg" X=0 :Y=120 repeat 5 pos X ,Y :mes ID(cnt) pos X+30,Y :mes NAME(cnt) pos X+90,Y :mes flg(cnt) Y+=20 loop return



Gimic

リンク

2011/5/27(Fri) 19:29:53|NO.39397

皆さんありがとうございます。

>>ひらまるさん
名前登録用のflgのフラグを作ってみたものの、
正直どう扱ってよいかが分かりませんでした。

repeat〜loopの中にcontinue,breakを使って調べるのですね。
理解できました。

カーソルの制御もキーが押されるたびに、selectAddが1増減とした方が汎用性が高いですね。
selectを直接増減させると場面が変わるたびにselectを0にする処理を入れる必要がありました。

あと、登録・削除をした際にflgを入れ替えるのを忘れてました。。。

>>ORZさん
if あいてない:表示、とか、if あいてる:表示 はflgを立てることで管理しようと
いうとこまでは考えてはいたのですが、その先が分かってませんでした^^;


本当に皆さんから見れば「ありえない」というコードの書き方をしていると思います。
お手数でなければ、ひとつでも多く「ありえない」部分について
ご指摘いただけるとありがたいです。

初心者と書いていますが、HSP初心者ではなく、プログラム初心者です。
素人と書いた方が自分ではしっくりきます。
HSP入門講座と呼ばれるサイトいくつかとリファレンスが主な情報源です。
サンプルはまだ1割も理解できていません^^;

これに懲りずにまた見かけたときにコメントいただけると嬉しいです。

ありがとうございました!



たんす

リンク

2011/5/27(Fri) 21:13:02|NO.39398

ひらまるさんのスクリプトを実行させていただきました。

一度上下キーを入力すると、
以降上下キー以外が入力されても登録・削除カーソルがピコピコ動きました。

空白(文字列未入力)でも登録(flg=1)が完了してしまいました。

登録枠がいっぱいのときに登録を選ぶと、応答がなくなりました。

キャラ登録が0件のときに削除を選ぶと、応答がなくなりました。

登録名に文字数制限は無いのでしょうか。


以上がぱっと見で気になった点です。



ひらまる

リンク

2011/5/27(Fri) 21:34:14|NO.39399

>たんすさん
そういったデバッグが非常にありがたいです。
以下解決策です。

>一度上下キーを入力すると、
>以降上下キー以外が入力されても登録・削除カーソルがピコピコ動きました。

;*********このへんから********* selectAdd = 0 ;この行を追加 if key=38 :selectAdd = -1 ;カーソルキー↑ if key=40 :selectAdd = 1 ;カーソルキー↓ ;*********このへんまで*********
>空白(文字列未入力)でも登録(flg=1)が完了してしまいました。

if select_menu =0 && entry_NAME != "" { ;条件を追加 NAME(select_id)=entry_NAME flg(select_id)=1 }
>登録枠がいっぱいのときに登録を選ぶと、応答がなくなりました。
これについては1〜2行の追加よりも、
登録数を格納する変数をつくり、
登録したときに+1、削除したときに-1し、
現在の登録数が登録できる最大数より小さい場合に登録可能にするように、条件を追加するのが良いかと。

if select_menu =0 && entry_NAME != "" && NowNum < MaxNum{ ;さらに条件を追加 NAME(select_id)=entry_NAME flg(select_id)=1 }
>キャラ登録が0件のときに削除を選ぶと、応答がなくなりました。
これも上記と同様に、

if select_menu =1 && NowNum > 0 { ; 条件を追加 NAME(select_id)="" flg(select_id)=0 }
>登録名に文字数制限は無いのでしょうか。

input entry_NAME,,,NameMaxStr ; 文字数の最大値を設定

こんな感じでしょうか。
とはいえ、このソース全体が、
ある程度基本を押さえつつも、非常に拡張性が低いソースであると思います。

どのような言語でもそうですが、
モジュール化や関数化をバランス良く行うと、
後で自分が見たときにわかりやすいソースになります。
私が思う一番の近道は、完成度の高い他人のソースを理解し、改造して遊ぶことだと思いますが、
なかなか完成度の高いオープンソースのHSP製ゲームがないのが現状です;



Gimic

リンク

2011/5/27(Fri) 22:15:07|NO.39400

>>たんすさん

>一度上下キーを入力すると、
>以降上下キー以外が入力されても登録・削除カーソルがピコピコ動きました。

なるほど・・・一度上下キーが押されるとselectAdd =1の状態になって、
他のキーが押される都度、下の処理を通るときselectの値を増やしてしまうのですね。。。


*judge switch step case 0 ;メニュー選択 select += selectAdd     ;

>空白(文字列未入力)でも登録(flg=1)が完了してしまいました。
 作成時にこの問題に気づくことはできたのですが、解決策見つからずでした。。。

>登録枠がいっぱいのときに登録を選ぶと、応答がなくなりました。
>キャラ登録が0件のときに削除を選ぶと、応答がなくなりました。
 気づきもしませんでした。。。

>登録名に文字数制限は無いのでしょうか。
sdim の第2パラメータが文字数の枠を指定できると誤った理解をしていました。
デフォルト文字数なのですね。どんどんそこから増えもするわけですね。

>>ひらまるさん
 迅速な回答ありがとうございました^^
 本来自分で直すべきバグなのに 先に答えてもらって申し訳ない限りです;;

お二人のやりとりを見て、「ああそう考えるのかぁ」と大変参考にさせてもらっています。
ありがとうございます。


モジュール化や関数化は、今は敢えて避けて通っています。
まずは標準関数を使いこなせないと、という思いだけでですが。

ただ見やすい書き方だけは意識して積み重ねようと思います。

完成度が高い低いはまだ理解できないのですが、それを感じ取れるよう精進したいですね^^

ひとまずサンプルスクリプトと今日届いたHSP入門の付録CDのサンプルを研究したいと思います。



ひらまる

リンク

2011/5/28(Sat) 00:10:22|NO.39405

>Gimicさん
向上心はすばらしいと思いますし、
理解力もあるようですから、無理して挫折するタイプだとは思いませんが、
くれぐれも無理して挫折するようなことがないように頑張ってください。
プログラミング自体も、実際ゲームのようなもので、趣味でやるなら楽しまなきゃ損です。

HSPは非常に優れた言語であり、とてもお世話になっていますが、
自分はHSPを使う前はTonyuSystemを使っていました。
TonyuSystemで作ったゲームは、基本的にオープンソース
(昔のRPGツクールのように、エディットデータ=実行データ)なので、
他人のプログラムを見て勉強するには良い環境だったと思います。
しかし、TonyuSystemはオブジェクト指向であり、構文もHSPとは全く異なるので、
混乱を避けるためにおすすめはしません。そういうものもあるんだよというだけです。

どのような言語でも、まずヘルプを読めるようになることが第一だと思います。
ヘルプさえ読めれば、たいていのことはなんとかなります。
また、入門書や入門サイトなどでは、著者のやり方で書いてありますが、
必ずしもそれが正解とは限りません。
特にインターネット上の入門サイトは、
初心者が中級者に上がるときに覚書のように書いたものが多く、
頭から信じてしまうのは危険です。
どんなすばらしいソースも、
それ以上の改良ができると思いこんで見るようにすると良いかもしれません。

なんかいろいろ書きましたが、今日はテンションが高かっただけです。
ほとんどがたわごとですから、あまり気にしないでください(超無責任)
あとキャラエディットのあるゲームは大好きで、
キャラエディット画面を作るだけでもかなり萌えます。
私の場合、エディット画面だけ作って満足になってしまいますけどね!



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