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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0424
600-Kwpeek 縦横インデックスについて13解決


600-K

リンク

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



この記事に返信する


TMKL

リンク

2012/4/24(Tue) 18:28:18|NO.46251

1バイトでも
a〜z、A〜Z、半角カタカナ、各種半角記号が使えます

↓参考
http://charset.7jp.net/sjis.html
シフトJISの1バイトコード(半角文字)のエリアマップ



暇人

リンク

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と明確な差は出ないだろうけど



TMKL

リンク

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

とりあえず質問する前に調べるのが1番早くて簡単な解決法じゃないですかね。
http://hsp.tv/play/pforum.php?mode=all&num=45656



暇人

リンク

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
これでも良い
仮想画面バッファを複数使ってる場合の対処は必要だけど・・・



MillkeyWeler

リンク

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



cats

リンク

2012/4/26(Thu) 18:38:21|NO.46276

>使えるマップチップが10種類に限られてしまいます。
つまり0〜9の10種類ということですか?
それならマップデータの数字に「,」を入れて読み込めばどうですか?
そうすればいくらでも読み込めるはず・・・
下のページに載っています。
http://pokopokogame.blog55.fc2.com/blog-entry-74.html



ヂオン

リンク

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



600-K

リンク

2012/4/28(Sat) 17:35:28|NO.46295

文字や記号を使えばよかったんですね。
あと、暇人さん・・・
switch文の間違いの指摘ありがとうございます。

みなさんもご協力ありがとうございました。



TMKL

リンク

2012/4/28(Sat) 19:36:37|NO.46298

一番ためになることを言ったのは、てれてれさんですがね



TMKL

リンク

2012/4/29(Sun) 06:37:29|NO.46325

あ、私のNo.46254の発言ですが、
「^」は排他的論理和ではなく、べき乗ととらえてください(^_^;)



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