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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0305
トンタンタンRPGなどのマップについて20解決


トンタンタン

リンク

2008/3/5(Wed) 13:26:57|NO.13924

本を参考にしながら、二次元配列を使って、マップを描画するところを作っています。
その二次元配列の部分で質問があります。
     map(0,0) =0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
といった感じでやっていくようですが、これだと、0〜9までの10種類までしかマップチップが
使えません。

もっとたくさんの種類のマップチップを使いたいのですが、マップエディタを使えばいいのでしょうか?

本には、一応マップエディタが付属しているのですが、サンプルゲーム用になっていて、うまく
つかえません。

どうすればいいでしょうか?



この記事に返信する


Megane

リンク

2008/3/5(Wed) 14:11:17|NO.13925

>>0〜9までの10種類までしかマップチップが使えません。

そう思ってしまうのもなんとなく分からないでもないですが、
実際に試してみてください。

map(0,0)=0,1,2,3,4,5,6,7,8,9,10

などと、指定する数字は一桁でなくても大丈夫ですよ。



トンタンタン

リンク

2008/3/5(Wed) 14:41:19|NO.13926

すみません。
map(0,0) =0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ではなくて、
テキストファイルに、 0000000000000000 0000000000000000 0000011111130000 といった感じに書いておいたのを、読み込んで使用するようにしていました。 そのため、10とすると、 0000000000000000 00000000000100000 0000011111130000 となってしまい、うまくいきません。



トンタンタン

リンク

2008/3/5(Wed) 14:43:51|NO.13927

また、すみません。
この掲示板に書き込んでみたら、数字が横一列に並んでしまいました。
わけがわからなくなってしまってすみません。

テキストファイルに数字を書き込んで読み込んでいるので、10にすると、1と0だと
読み込まれてしまうので、できないという意味です。



f

リンク

2008/3/5(Wed) 16:18:38|NO.13928

文字列を1文字づつ取り出している部分を特定しなさい。
そこを、アルファベットを使うように改造しなさい。
さもなくば、2文字取り出すように改造しなさい。


文字列のデータをどうやって2次元配列に取り込んでいるのか見せない以上、
それ以上の事は言えないだろう。



トンタンタン

リンク

2008/3/5(Wed) 16:36:14|NO.13929

>>文字列を1文字づつ取り出している部分を特定しなさい。

文字列を取り出している部分のスクリプトは、
sdim maps,270
bload"map.txt",maps,270,272*(stage-1) dim map,17,16 repeat 16 rcnt=cnt repeat 15 S=strmid(maps,cnt*18+rcnt,1) map(rcnt,cnt)=int(S) loop loop
です。

>>そこを、アルファベットを使うように改造しなさい。

ということは、
        
dim map,17,16

の部分と        
map(rcnt,cnt)=int(S)

をそれぞれ、
sdim map,17,16

map(rcnt,cnt)
にして、テキストファイルに数字で書いていた部分をアルファベットにすればいいということでしょうか?

ただ、sdim命令は配列変数にすると0にクリアされると、ヘルプに書いてあったので、
                
dim map,17,16
map(rcnt,cnt)=int(S)

のままにして、 テキストファイルに数字で書いて、0ならAに変換するということでしょうか?



トンタンタン

リンク

2008/3/5(Wed) 16:38:15|NO.13930

何度も間違いをしてすみません。
を付け忘れてスクリプトでない部分まで青文字になってしまいました。
すみませんでした。



Megane

リンク

2008/3/5(Wed) 17:30:28|NO.13931

>>dim map,17,16
この部分はdimのままです。(というか、map 16,15でいいですよ?)


今、strmidで取り出してきてSに代入された文字が、
"0"なら、intにより数値の0に変換されて、map(rcnt,cnt)に入れられる、
"1"なら1が、"2"なら2が…となるわけですが、それでは
マップデータに使えるのは一文字で表される数字、つまり0から9までですね。

そこでアルファベットを使うというのは、例えば
テキストの方にアルファベットで aaaaabaacccaaaaa…などとマップを書いておいて、
上のスクリプトでintを使っていた部分で、
Sに代入された文字が、"a"なら0、"b"なら1…と変換できれば、26文字使えますね。
大文字も使えれば52種類になります。
そういった別の変換方法を探しなさい、ということでしょう。

2文字にしろというのは、strmidで読み込む文字数を2文字にすれば、
"00"(intを使えば0に)から"99"まで100種類使えますね。
ただしそうするならば、strmidで読み込むごとに読む場所を2ずつずらさなければいけません。



f

リンク

2008/3/5(Wed) 17:47:58|NO.13932

strmidを使うなら、2文字取り出すほうが簡単でね。
難しくないので頑張ってみ?

データの文字列の方、修正忘れるなよ。



トンタンタン

リンク

2008/3/6(Thu) 00:12:21|NO.13941

親切に教えていただき、ありがとうございます。

>>dim map,17,16
>>この部分はdimのままです。(というか、map 16,15でいいですよ?)

僕が買った本では、サンプルプログラムが15×15サイズで作られているですが、
『移動先のチェック時にハミ出すことがあるので、実際は16×16サイズにする』とありました。
そのため、僕も17×16サイズ分、dimで配列変数をとるようにしました。

また質問です。お二人の書き込みを参考にして、スクリプトを書いてみましたが、うまくいきません。
以下に、スクリプトを書きますので、間違いの指摘をお願いします。

1)テキストデータの数字をアルファベットにして、数字に変換する

    sdim maps,270
bload"map.txt",maps,270,272*(stage-1) dim map,17,16 repeat 16 rcnt=cnt repeat 15 S=strmid(maps,cnt*18+rcnt,1) if S="a":S=0 if S="b":S=1 map(rcnt,cnt)=int(S) loop loop

こんな感じにしてみましたが、aだった場合も、bだった場合も、どちらも1と判断されて
しまいます。

2)読み込む文字数を2文字にする。

 こちらは、1文字から2文字ずつに増やしたので、サイズが倍になるため、数字を計算
し直してみました。

sdim maps,510
bload"map.txt",maps,510,512*(stage-1) ;テキストからmapsへ読み込むサイズ=(1行のサイズ+改行分の2byte)*行数={(16*2)byte+2byte}*15=510 ;次マップのデータの始まり=読み込むサイズ+改行分の2byte=510+2=512 dim map,17,16 repeat 16 rcnt=cnt repeat 15 S=strmid(maps,cnt*34+rcnt,2) ;0行目の始まり=0*34+0=0 ;1行目の始まり=1*34+1=35 if S="a":S=0 if S="b":S=1 map(rcnt,cnt)=int(S) loop loop
こんな感じです。でも、うまくいきません。

1)の方法と 2)の方法の上記のスクリプトの間違いの指摘をお願いします。



f

リンク

2008/3/6(Thu) 00:24:59|NO.13943

	if S="a":S=0
if S="b":S=1 map(rcnt,cnt)=int(S)

ifで判別は・・・、まあ良いとする。
で、ifの段階でもう数値変数に成っているのに、int(s)する必要は無い。
そのまま配列に入れてしまえ。ifを並べる方法で行くつもりなら、そこだけ直せば良いだろう。


さて、2文字の方だが、

>そこを、アルファベットを使うように改造しなさい。
>さもなくば、2文字取り出すように改造しなさい。

これは、両方同時にやれ、と言っているのではなく、どちらかの手段を使えと言っているのだが。
この方法を使うならアルファベットを使う手段を混ぜなくて良い。



f

リンク

2008/3/6(Thu) 00:59:53|NO.13946

気が向いたので作っておいたが、見た所これは不要な程度にstrmidは理解しているようだな。
せっかく作ったので捨てておく。
	sdim m,17,16
m( 0)="OOOOOOOOOOOOOOOO":m( 1)="O O" m( 2)="O OOOOOO OOOOO O":m( 3)="O O O O O O O" m( 4)="O O O O O O O":m( 5)="O OO OOOOO O O O" m( 6)="O O O O":m( 7)="O O OOOOOOOOOOO" m( 8)="O O O":m( 9)="O OOOOOOOOOO O O" m(10)="O O O O O":m(11)="O O OOOO O O O" m(12)="O O O O O O":m(13)="O OOOOO O O O O" m(14)="O O O O":m(15)="OOOOOOOOOOOOOOOO" font "MS ゴシック",16:x=1:y=1 *lp:stick s , 15: mx=((s&4)!=0)-((s&1)!=0):my=((s&8)!=0)-((s&2)!=0) if strmid( m( y+my ) , x+mx , 1) = "O" { mx=0:my=0 } x+=mx:y+=my:redraw 0:color 255,0,0:boxf 0,0,25,50 pos 1,1:color 255,255,255 mes strmid( m( y - 1 ) , x - 1 , 3 ) mes strmid( m( y ) , x - 1 , 3 ) mes strmid( m( y + 1 ) , x - 1 , 3 ) color 255,255,0:pos 9 , 17 :mes "@":redraw 1:await 100 goto *lp



トンタンタン

リンク

2008/3/6(Thu) 01:01:22|NO.13947

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

>そこを、アルファベットを使うように改造しなさい。
>さもなくば、2文字取り出すように改造しなさい。
>これは、両方同時にやれ、と言っているのではなく、どちらかの手段を使えと言っているのだが。
>この方法を使うならアルファベットを使う手段を混ぜなくて良い。

いえ、混ぜては使っていません。一応、2通りの方法を試してみて、それぞれのスクリプトの
直しをお願いしました。ですので、同時に使ってはいません。

アルファベットのほうを使うことにしたので、2文字の方法については、もう聞きませんが、
このアルファベットの方法で、あと、もうひとつ質問があります。

if S="a":S=0
if S="b":S=1

の部分を、

if S="a":S=0
if S="b":S=1 if S="c":S=2 if S="d":S=3 if S="e":S=4

としてみましたが、b,c,d,eはきちんと、数字に変換されるのに、aだけは、0として認知されません。
0は使わないようにするしか、ないのでしょうか?



トンタンタン

リンク

2008/3/6(Thu) 01:04:13|NO.13948

サンプルスクリプト、ありがとうございます。

僕が質問を書いている間に、fさんのサンプルスクリプトの投稿がされて、
入れ違いになってしまったみたいですね。

aの数字のへんかんについての質問、お願いします。



トンタンタン

リンク

2008/3/6(Thu) 01:11:59|NO.13949

自己解決しました。
0は使わずに、1からはじめることにしました。

fさん、Meganesさん、本当にありがとうございました。

fさんのサンプルスクリプトも参考にさせていただきますね。



トンタンタン

リンク

2008/3/6(Thu) 01:12:34|NO.13950

すみません。解決のチェックを入れ忘れてました。



f

リンク

2008/3/6(Thu) 01:16:05|NO.13951

>いえ、混ぜては使っていません。一応、2通りの方法を試してみて、それぞれのスクリプトの

	;0行目の始まり=0*34+0=0
;1行目の始まり=1*34+1=35 if S="a":S=0 if S="b":S=1 map(rcnt,cnt)=int(S)

ここは何かね?

それはそうと、先刻は言わなかったが
if s=....を繰り返すなら、値を受ける変数は別にしておく方が良い。
if s="a" : r=0
こんな感じな。
そうしないと変更したあとの変数で比較を繰り返すだろう。
偶然一致する事態になったりしたらどうする。
(まあこのパターンならまず無いだろうが。)



で、"a"が・・・0で認識できないとはどういう意味か?
スクリプト上は普通に見る限り0に成っているはずだが。
0に成らないと言うなら幾つになっているのか?
内容をmesで表示するなりして確認位はしたのか?



f

リンク

2008/3/6(Thu) 01:16:56|NO.13952

・・・・解決と言うなら、まあ良いが。



ANTARES

リンク

2008/3/6(Thu) 02:20:38|NO.13956

>としてみましたが、b,c,d,eはきちんと、数字に変換されるのに、
>aだけは、0として認知されません。

>偶然一致する事態になったりしたらどうする。
 まさに、これですな。


s="a" if s="a": s=0 mes "s="+s+" \"b\"="+int("b") if s="b": s=1 mes "s="+s



naznyark

リンク

2008/3/6(Thu) 02:45:22|NO.13958

あ、先を越された。まあ詳細の説明だから載せとこう。

> aだけは、0として認知されません。

変数 S の内容が文字列型で "a" の場合には

if S="a":S=0
の行で比較 ( "a"="a" ) が真となり、S の内容は整数型の 0 になります。
そして次の行

if S="b":S=1
で整数 0 と文字列 "b" の比較 ( 0="b" ) が行なわれます。

HSP では異なる型間の演算は右側の値が左側の値の型に変換されて処理されます。
これは比較演算でも同じです。

つまり比較 ( 0="b" ) は整数 0 と整数に変換された "b" との比較であり
文字列 "b" は整数に変換すると 0 になるので、
比較 ( 0="b" ) は ( 0=0 ) であり結果は真になります。

よって S の内容が文字列型の "a" のときに

if S="a":S=0 if S="b":S=1
の2行が処理されると比較 ( S="a" )、比較 ( S="b" ) がともに真となり
結果的に S の内容は整数型の 1 になります。



f

リンク

2008/3/6(Thu) 08:19:53|NO.13963

ああ、いかん、そういうことか。
大ボケをかましていた・・・。



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