|
|
2012/4/24(Tue) 17:22:23|NO.46248
2Dスクロールアクションゲームを作っていて、マップを作る作業中なのですが、
使えるマップチップが10種類に限られてしまいます。
1byte取得を2byteにして、スクリプトを改良したいです。
良い方法はありませんか?
notesel map:noteload "001.txt"
noteget mapline,0
mapx =strlen(mapline)
mapy =noteinfo(0)
mapsize=mapx*mapy
gsel 2
repeat mapsize
;==========この下
x =cnt\mapx ;横インデックス
y =cnt/mapx ;縦インデックス
noteget mapline,y ;1行取得
code =peek(mapline,x);1byte取得
switch code
case '1' ;強い木箱
pos x*37,y*37
gmode 0:gcopy 1,0,0,37,37
swbreak
swend
switch code
case '2' ;弱い木箱
pos x*37,y*37
gmode 0:gcopy 1,37,0,37,37
swbreak
swend
await 1
loop
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
gsel 0
gmode 2:pos 0,0
gcopy 2,0,0,640,480
color : pos 0,0 : mes "処理終了"
redraw
stop
|
|
2012/4/24(Tue) 18:47:07|NO.46253
ん?
文字コード使ってるならまだ2byteは必要ないでしょ
mes '1'
mes 'a'
mes 'A'
mes ','
mes '<'
半角英数字記号が全部使える
後switch文の使い方がおかしい
普通はこう↓
switch code
case '1' ;強い木箱
pos x*37,y*37
gmode 0:gcopy 1,0,0,37,37
swbreak
case '2' ;弱い木箱
pos x*37,y*37
gmode 0:gcopy 1,37,0,37,37
swbreak
swend
使用するコードが決まってるなら
ldim チップラベル,256
チップラベル('a')=*lab_a,*lab_b,*lab_c,*lab_d
txt="abcd"
repeat 4
code =peek(txt,cnt)
gosub チップラベル(code)
loop
stop
*lab_a
mes "a"
return
*lab_b
mes "b"
return
*lab_c
mes "c"
return
*lab_d
mes "d"
return
こんな方法もある
利点はチップの種類が増えても処理速度が変らない
まぁ、1フレームに数百回ならswitchと明確な差は出ないだろうけど
|
|
2012/4/24(Tue) 18:59:46|NO.46254
言葉の意味について話すと、
1byte=8bitだから、
8個の0と1すなわち
二進数 00000000
から
二進数 11111111
の、2^8=256種類が表現できます
(文字列だからこれより減りますが)
ちなみに、2byteは、
2^16=65536種類が表現できます
|
|
2012/4/24(Tue) 20:38:36|NO.46255
|
|
2012/4/24(Tue) 22:14:40|NO.46257
そういや
画像のコピーだけなら
buffer 1
boxf:color 200,200:pos 0,8
mes "aaaabbbbccccdddd"
celdiv 1,32,32
txt="abcd"
チップNo('a')=0,1,2,3
gsel 0
gmode 0
repeat 4
pos cnt*32,100
celput 1,チップNo(peek(txt,cnt))
loop
これでも良い
仮想画面バッファを複数使ってる場合の対処は必要だけど・・・
|
|
2012/4/25(Wed) 05:05:49|NO.46259
たぶん、TMKL さんの回答であってると思うが。
やりたい事として、質問者さんは処理フラグを含めたいんじゃないかなー?
10種類のマップチップしか使えなくて、処理フラグ(ここは進めない・ここは進める)とか
毒ゾーンなどの処理フラグを含めるなら1byte でも十分に間に合うかと。
(1byte でも 16種類『マップチップ』 と 16種類『処理フラグ』が限界)
上記で、もっと処理フラグを増やすなら、まぁ質問者さんの2byte に変更したいは、わかるけど。
もうちょっとやりたい内容を書くと、適切な回答にはなるかなーと思う。
|
|
2012/4/25(Wed) 20:58:35|NO.46268
wpeekで取り出した時は下位バイトが右に来るので
1バイトずつ取り出した時とは順序が逆になる
tmp="01"
mes strf("$%04x",wpeek(tmp,0))
mes strf("$%0x%0x",peek(tmp,0),peek(tmp,1))
wpeek使う場合
tmp="01021112"
code_01=wpeek(tmp,0)//"01"を2byte読み出しすると変数には10の順にコードが並ぶから前もってコード化
code_02=wpeek(tmp,2)
code_11=wpeek(tmp,4)
code_12=wpeek(tmp,6)
notesel map;:noteload "001.txt"
map={"
010101010101
020202020202
121212121212
111111111111"}
buffer 1
color 200 : boxf 0,0,35,35
color 200,200 : boxf 37,0,37+35,35
color 200,200,200 : boxf 37*2,0,37*2+35,35
color 0,200,200 : boxf 37*3,0,37*3+35,35
buffer 2
noteget mapline,0
mapx =strlen(mapline)/2 //2バイトでチップ一個分なので半分に
mapy =noteinfo(0)
mapsize=mapx*mapy
gsel 2
repeat mapsize
;==========この下
x =cnt\mapx ;横インデックス
y =cnt/mapx ;縦インデックス
noteget mapline,y ;1行取得
code =wpeek(mapline,x*2);2byte取得//2byteなので横方向*2
switch code
case code_01
pos x*37,y*37
gmode 0:gcopy 1,0,0,37,37
swbreak
case code_02
pos x*37,y*37
gmode 0:gcopy 1,37,0,37,37
swbreak
case code_11
pos x*37,y*37
gmode 0:gcopy 1,37*2,0,37,37
swbreak
case code_12
pos x*37,y*37
gmode 0:gcopy 1,37*3,0,37,37
swbreak
swend
await 0
loop
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
gsel 0
gmode 2:pos 0,0
gcopy 2,0,0,640,480
color : pos 0,0 : mes "処理終了"
redraw
stop
| |
|
2012/4/27(Fri) 17:39:17|NO.46280
このスクリプトなら 以下の条件を満たせます。
スクリプトにマップデータをテキストとして記述できる、
データ を 1byte 配列にでき、なおかつ256個のチップパターンを保存できる。
ファイルを3つ作成するので
一時的なフォルダを作ってこのスクリプトを保存することをお勧めします。
// マップファイル名
#define TXT_FN_MAPA "mapa.dat"
#define TXT_FN_MAPB "mapb.dat"
#define TXT_FN_MAPC "mapc.dat"
#pack TXT_FN_MAPC
#pack TXT_FN_MAPB
#pack TXT_FN_MAPA
// 使用するウィンドウID
#enum WID_MAIN = 0
#enum WID_CIP
#ifdef _debug
// csv を 1byte 配列に変換 して保存
; デバッグ時のみ有効
compilemap TXT_FN_MAPA,{"
5 5
FF AA FF AA FF
FF AA FF AA FF
FF AA FF AA FF
FF AA FF AA FF
FF AA FF AA FF
"}
compilemap TXT_FN_MAPB,{"
6 5
12 3B 12 3B 12 43
12 3B 12 3B 12 45
12 3B 12 3B 12 46
12 3B 12 3B 12 47
12 3B 12 3B 12 48
"}
compilemap TXT_FN_MAPC,{"
7 5
12 3B 12 3B 12 43 aa
12 3B 12 3B 12 45 bb
12 3B 12 3B 12 46 cc
12 3B 12 3B 12 47 dd
12 3B 12 3B 12 48 ee
"}
#endif
// cip 画像作成
#const CIPSIZE 32
#const CIPLENX 16
screen WID_CIP , CIPLENX*CIPSIZE , CIPLENX*CIPSIZE
title "仮のマップチップ"
font msGothic , 32/3*2-1
repeat 256
x=cnt\CIPLENX*CIPSIZE:y=cnt/CIPLENX*CIPSIZE
hsvcolor cnt,170,255:boxf x,y,x+CIPSIZE-1,y+CIPSIZE-1
color:pos x,y:mes strf("%02x",cnt)
loop
// ロードしてみる
readmap TXT_FN_MAPA:wait 100
readmap TXT_FN_MAPB:wait 100
readmap TXT_FN_MAPC:wait 100
stop
//======================================================
//■使用する命令
#ifdef _debug
#module
//■マップをコンパイルする
// デバッグ時のみ有効
// ' '(スペース) または '\n'(改行) をセパレータした 2文字以下の 16 進数を バイナリ化して保存する。
// 先頭の2要素 が マップサイズと成る。
// つまり 01 01 FF
// とした場合 マップサイズは 1,1 となり それ以降がマップデータとなる。
#define ctype IsWchar(%1) ((%1>=129 & %1<=159) or (%1>=224 & %1<=252))
#deffunc compilemap str fn_,str tx_ , local i_ , local tgt_
#const EXPANDSIZE 64
tx = tx_:tgt_=0:buffsize=EXPANDSIZE:sdim map,buffsize
repeat strlen(tx)
w=wpeek(tx,cnt):c=w&0xFF
is_linebreak=(w==0x0a0d)
size = (IsWchar(c) or is_linebreak) + 1
if(is_linebreak!=0) or (c==' '){
get=strmid(tx,tgt_,cnt-tgt_)
if(get!=""){
if(maxsize<=(i_+1)){maxsize = i_+1+buffsize:memexpand map,maxsize}
poke map,i_,int("$"+get)
i_++
}
tgt_=cnt+size
}
continue cnt+size
loop
exist fn_:if(strsize!=-1){notesel dummy:dummy="":notesave fn_}
bsave fn_,map,i_,0
return
#global
#endif
//■ マップを読み込んで描画する
; 戻り値として
; MAP マップデータ
; MAP_LENGTHX マップの広さX
; MAP_LENGTHY マップの広さY
; にそれぞれ値を代入する
#deffunc readmap str fn_,local fs_
exist fn_
if(strsize!=-1){
fs_ = strsize
dim MAP_LENGTHX:dim MAP_LENGTHY
MAPELEMENT_TOTAL=fs_-2:sdim MAP,MAPELEMENT_TOTAL
bload fn_,MAP_LENGTHX,1,0
bload fn_,MAP_LENGTHY,1,1
bload fn_,MAP,MAPELEMENT_TOTAL,2
screen WID_MAIN:title strf("マップの広さ %d,%d : マップ要素の総数 = %d",MAP_LENGTHX,MAP_LENGTHY,MAPELEMENT_TOTAL)
gmode 0,CIPSIZE,CIPSIZE
repeat MAPELEMENT_TOTAL
x = cnt\MAP_LENGTHX*CIPSIZE
y = cnt/MAP_LENGTHX*CIPSIZE
cip = peek(map,cnt)
cx = cip\CIPLENX*CIPSIZE
cy = cip/CIPLENX*CIPSIZE
pos x,y
gcopy WID_CIP,cx,cy
loop
}else{
dialog "マップファイルが存在しません(ナンデ?)",1,"readmap@"+__file__
end
}
return
| |
|
2012/4/27(Fri) 17:52:52|NO.46281
ちなみにチップ情報を2byteに拡張したいのならこんな方法もあります。
tx={"00010203
04050607
08091011
12131415"}
notesel tx
noteget cline , 0
mapx=strlen(cline)/2
mapy=notemax
repeat mapx*mapy
x = cnt\mapx
y = cnt/mapx
mes strf("cip=%s:pos %d,%d",strmid(tx,cnt*2+y*2,2),x,y)
loop
|
|
2012/4/28(Sat) 17:35:28|NO.46295
文字や記号を使えばよかったんですね。
あと、暇人さん・・・
switch文の間違いの指摘ありがとうございます。
みなさんもご協力ありがとうございました。
|
|
2012/4/28(Sat) 19:36:37|NO.46298
一番ためになることを言ったのは、てれてれさんですがね
|
|
2012/4/29(Sun) 06:37:29|NO.46325
あ、私のNo.46254の発言ですが、
「^」は排他的論理和ではなく、べき乗ととらえてください(^_^;)
|
|