|
|
2007/1/21(Sun) 02:39:06|NO.4960
初めて書き込ませて頂きます(2度目かも)。
3年位前にこのプログラミングツールに知りました(最もその時は、1週間で
力尽きたが)。
最近になって、再びHSPの存在を思い出し、10月上旬位から、ラトルズ社の
"12歳からはじめるHSP3.0わくわくプログラミング"と、と言う本を片手に
勉強しています。
で、本題に入るのですが、現在RPGを作っています。タイトルに有るとおり
MAPを作りたいのですが、画像のリンクの仕方が、良く解らない物で。
実数による直取りは解る様になりましたが、複数になると、如何にも。
で、本にこんな書き方が、あったので、
sx = MX- 5
if sx < 0 : sx = 0
if sx > 34 : sx = 34
sy = my - 4
〜略〜
repeat 9
ycnt = cnt
repeat 11
xcnt = 10 - cnt
s = map(sx + xcnt ,sy + ycnt)
pos (xcnt + ycnt) * 24 , (ycnt - xcnt) * 12 + 120
if s < 5 : gcopy 1 , s * 48 , 0 , 48 , 48
if s > 4 {
ss = s / 100 - 1
gcopy 1 , ss * 48 , 48 , 48 , 48
}
〜略〜
と言うのがあったのを、(これはクォータビューによる物なので)少し改変して、
pos xcnt * 32 , ycnt * 32
if s < 上限 : gcopy 1 , s * 32 , sss * 32 , 32 , 32
if s > 上限-1 : (この中に入れる物が解らない)
と言う形にしました。
画像座標の一番上(若しくは左)は1はちゃんと取得されるのですけど、2番目以降
が取得出来なくて。
本の記述方法は、MAPエディタをベースにしたスタイルだから、今一つ解り難いので
す。(中心座標を取りながら、移動するとあったが)
どの様にすれば良いのでしょうか?(そもそもこの改変の仕方、合ってます?)
現行有るスレに、似たのが見つからなかったので、書きました。
|
|
2007/1/21(Sun) 02:43:32|NO.4961
何か、誤字脱字が多くてすみません(これ、直せないんだもん)。
|
|
2007/1/21(Sun) 04:42:18|NO.4962
本が無いので推測ですが
配列変数mapには5未満か5以上(100以上かな)で、大きく
2種類に分類されたデータが有ると思われる
横に並んだマップチップが2列あって
5未満が上の列で100以上(左から数えた番号を100倍)が下の列を使用って感じ?
100倍してるのは、一列目のマップチップの数が99まで増えても二列目の番号に影響しないから
>if s < 上限 : gcopy 1 , s * 32 , sss * 32 , 32 , 32
これだけでは、上限と使用出来るマップチップの関係が分からないので(sssも何か不明)
>if s > 上限-1 : (この中に入れる物が解らない)
これが、必要になるかどうかも分からない
本に有るのは
>if s > 4 {
二列目を使用
>ss = s / 100 - 1
100倍された番号を元に戻して、1を引く(一番左は一列目と同様な0にしたいから)
てか、hsp30\sample\game にある mapmove1.hsp とか見た方が早いような・・・
|
|
2007/1/21(Sun) 15:17:27|NO.4981
解答、ありがとうございます。
>配列変数mapには5未満か5以上(100以上かな)で、大きく
>2種類に分類されたデータが有ると思われる
0番〜4番と100番〜400番と言う風になってました。
>横に並んだマップチップが2列あって
>5未満が上の列で100以上(左から数えた番号を100倍)が下の列を使用って感じ?
>100倍してるのは、一列目のマップチップの数が99まで増えても二列目の番号に影響しないから
なるほど、そういう意味だったんですか。何で、100で割っているのか、解らなかった物で。
>>if s < 上限 : gcopy 1 , s * 32 , sss * 32 , 32 , 32
>これだけでは、上限と使用出来るマップチップの関係が分からないので(sssも何か不明)
説明不足ですみません。画像を取り込む際、MAPのテーブルに、値を代入する。一定の場所
までは読み込めるが、横(縦)の番号がその画像の最大値まで行けば、読めなくなるのは、
当たり前。で、次の桁(行)を読むには、、両方を浮動にすれば全ての領域を読み込める
んじゃないかと考えたのですが、実際はこれだけでは足りないと、言う答えが出て。で、
これを
s = map(sx + xcnt ,sy + ycnt)
2行にし、
s = map(sx + xcnt ,sy + ycnt)
sss = map(sx + xcnt ,sy + ycnt)
この様に、こうすれば、2つの値を自在に動かせるのでは?、と考えてみたのですが、
値が、切り替わる所かぐちゃぐちゃになる始末。
if s < 上限 の上限を切り替えても、1行(桁)目の、端までしか、呼んで
くれず、2行(桁)目以降の値を読み込んでくれませんでした。
ss = s / 100 - 1
この値を、切り替えれば、変化するにはするが、期待した答えは出ず。このレスを見た結
果これは、いらない物だったのか、と言う答えがでて、良かったです。
と、色々と試行錯誤をしたが、どうやっても期待した答えが出ず、上記の状態でいじれず
途方に、呉れていたんです(少しは、言いたい事、理解出来ましたでしょうか?)。
で早速、sampleを見てみて、グラフィックのところのgcopyを見て、 gcopy csrc,map(mapx+cnt,i)*cx,0
行をを見た所、片方は、浮動になっているけど、もう片方は固定。
で、懲りずに、固定になっている所を浮動にすれば、良いんじゃないか、と踏んでみたが、
gcopy csrc,map(mapx+cnt,i)*cx,0
↓
gcopy csrc,map(mapx+cnt,i)*cx,map(mapy+cnt,i)*cy
こんな感じ?ま、結果は、上記と同じ様なぐちゃぐちゃになると言う答えになりました。
いちいち、 if MAP == 1:gcopy 1 , 0 , 0 , 32, 32みたいに、ゴリゴリ書く訳
にも行かないので、(画像が大きくなると、この書き方だと半端な量じゃなくなるし)。
如何すれば、全ての領域を取得出来る様になるのでしょうか?
(質問ばかりで、申し訳ないです)

| |
|
2007/1/21(Sun) 15:30:22|NO.4983
ぐは、最後の数行が、<pre>に侵食されてしまった(閉じるの忘れた)。
見にくくなってしまいすみません。
おっと、足りなかった。
if MAP == 1:gcopy 1 , 0 , 0 , 32, 32
↓
if MAP == 1 : pos , x * 32 , y * 32 : gcopy 1 , 0 , 0 , 32, 32
の誤りです。
|
|
2007/1/21(Sun) 23:01:55|NO.4995
>s = map(sx + xcnt ,sy + ycnt)
> sss = map(sx + xcnt ,sy + ycnt)
>この様に、こうすれば、2つの値を自在に動かせるのでは?、と考えてみたのですが、
考え方としては間違ってませんが、やり方が間違ってますね・・・
>if MAP == 1 : pos , x * 32 , y * 32 : gcopy 1 , 0 , 0 , 32, 32
>みたいに、ゴリゴリ書く訳
物によっては、それでいい場合もあるけどね
ifの替わりにswitch文でやったり(使用するチップの場所によって処理量が変わるけど・・・)
> gcopy csrc,map(mapx+cnt,i)*cx,map(mapy+cnt,i)*cy
配列変数mapとマップチップが並んでる画像との関係が理解で来てないかな
チップ画像の並び方を良くみて考えてみてください
・チップ画像(横5、縦2)
A,B,C,D,E
F,G,H,I,J
この場合 H は 横2:縦1(0から数える為) と言う感じになる
マップ配列(map)を一種類しか使用しないなら 2:1 を
一つの数値で表現する必要がある
方法は、色々あると思うけど簡単なのを書いてみる
・使用するチップ画像が横最大5個と決まっているなら左上から番号をつけて
0,1,2,3,4
5,6,7,8,9
と、並んでる物と考えて、2:1 は 7 と表せる
これを配列mapに代入する
で、この7を取り出してチップ画像の位置に変換して 2:1 に戻すには
2=7\5 (5は横の個数) 横の個数で割った余りが横の位置になる
1=7/5 横の個数で割れば縦の位置が出る
それで、一つのチップが32*32のサイズなら
gcopy 1 , 2*32 , 1*32 , 32, 32
これで、チップが取り出せる
注意として
・横の個数は5個しか用意してなくても将来増えそうなら適当な扱いやすい数にしとく
数え方は、使用予定の分も含めて数える
A,B,C,D,E,@,@,@,@,@
F,G,H,I,J,@,@,@,@,@
で H なら 2:1 が 2:1*10 で 12 になる
|
|
2007/1/23(Tue) 13:31:12|NO.5031
※また、変になってしまったので、一度消して修正しました。
すいません。連絡が遅れてしまいました。
時間が取れなかった物で。
>・使用するチップ画像が横最大5個と決まっているなら左上から番号をつけて
>0,1,2,3,4
>5,6,7,8,9
>と、並んでる物と考えて、2:1 は 7 と表せる
>これを配列mapに代入する
これは、普通に解釈して良いのですか?
mapset x , y
それとも
mapset(xcnt, ycnt)←座標のカウント
で、しょうか?何か、意見が食違っている気がする。気のせい?
これは、
>2=7\5
>1=7/5
配列のXとY の要素に代入して、再びMAP配列に代入する、と言う事ですか?
それとも、別途にこの計算式を作るのですか?
前者だと、
mapset(xset \ yset + xcnt . xset / yset + ycnt)
このままだと、何の反応も無いので
mapset(xset \ yset + xcnt . xset / yset + ycnt) + 1
こうすると、Y軸が切り替わる。
もしかすると?これを
mapset(xset \ yset + xcnt . xset / yset + ycnt) + 変数
ifなどで、分岐すれば、切り替わる??(駄目かなぁ?)。
後者だと、全塗りつぶしになるから、違うと判断?
(でも、なんとなく塗りつぶしのやり方が、解った気が)。
すみません。どうも理解し切れていない物で。(あんまり、質問ばかりだ
と、教えて君になってしまうから、出来るだけ自力で何とかしたいが、解
らないまま、と言うのは嫌だからなぁ・・・)。
違う所があったならご指摘をお願いします。
|
|
2007/1/23(Tue) 17:29:21|NO.5037
>これは、普通に解釈して良いのですか?
配列変数 map(,)はマップチップ画像の通し番号を入れる
map(x,y)のx,yには表示するマップ画面の番地(0からの縦横のブロック数)を入れる
これを理解すれば、難しくありません
screen 1,5*32,2*32,0,0,00:title "マップチップ":repeat 5*2:color 255-cnt*5,255-cnt*20,255:boxf (cnt\5)*32,(cnt/5)*32,(cnt\5)*32+32,(cnt/5)*32+32:loop
dim map,12,10
map(0,0)=0,9,9,2,3,4,5,6,7,8,9,0
map(0,1)=0,1,8,8,4,5,6,7,8,9,8,0
map(0,2)=0,2,3,7,7,6,7,8,9,8,7,0
map(0,3)=0,3,4,5,6,6,8,9,8,7,6,0
map(0,4)=0,4,5,6,8,5,5,8,7,6,5,0
map(0,5)=0,5,6,7,8,9,4,4,6,5,4,0
map(0,6)=0,6,7,8,9,8,7,3,3,4,3,0
map(0,7)=0,7,8,9,8,7,6,5,2,2,2,0
map(0,8)=0,8,9,8,7,6,5,4,3,1,1,0
map(0,9)=0,9,8,7,6,5,4,3,2,1,0,0
screen 0,32*12,32*10,0,200,200
gmode 0,32,32,255
repeat 10
ycnt = cnt
repeat 12
xcnt = cnt
s = map(xcnt,ycnt)
pos xcnt*32,ycnt*32
gcopy 1,(s\5)*32,(s/5)*32
loop
loop
シンプルに書くとこんな感じ
|
|
2007/1/23(Tue) 19:05:10|NO.5045
何から何まで。感謝です!
なるほど、Gcopyその物に計算式を当てはめるのか。考えもしなかった・・・。
そうか、gcopyもdimも全て関数なんだよね。なら、計算式も入れられる訳だもんね。
ふーむ、1つの場所で変化があると、そこばっかりいじくってしまう。他の所に計算
式を入れるなんて、気づきもしない。経験不足でした。これからは、全ての所を疑う
癖を付けるたいと思います。
(さ、これで開発が続けられるぞ!!)
|
|