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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0716
ユナン言い表しにくいのですが、バイナリデータの読み書きについて3未解決


ユナン

リンク

2008/7/16(Wed) 20:48:17|NO.17337

HSP3で作成しています
以下のスクリプトをコピーして試してみてください

保存したあと読み込みをしてもどうしても一部だけ反映されません
ちなみにある種のヘッダファイルを作ろうと思っています

よろしくお願いします。


screen 0,500,800,,0,0
//マップチップサイズなど確保 - 24byte
dim HEAD_DATE,6
HEAD_DATE.0=30:HEAD_DATE.1=30
HEAD_DATE.2=16:HEAD_DATE.3=16
HEAD_DATE.4=30:HEAD_DATE.5=16

//マップメインデータ確保 - 30*30*4byte
dim map,HEAD_DATE.0,HEAD_DATE.1

//マップチップの名前確保 - 32byte
sdim imagename,32
dirlist imagename,"chipset10.bmp"

//名前確認
mes imagename

//全てのデータサイズ
datesize=24+32+(HEAD_DATE.0*HEAD_DATE.1*4)+100

//メインデータに適当に値を代入
repeat HEAD_DATE.0
j=cnt
repeat HEAD_DATE.1
i=cnt
map.j.i=rnd(460)
loop
loop

//①確認用
pos 150,0
mes map.0.0
mes map.2.0
mes map.28.0
mes map.29.0
mes map.29.29 //341
mes map.20.1
mes map.29.15
mes map.6.8
mes map.20.20
mes map.20.29
mes map.28.28
mes map.28.29
mes map.29.28


//セーブ、ロードボタン作成
pos 20,50
button goto"save",*save
button goto"load",*load

stop

*save
//MAP_Dateにヘッダ情報をまとめます
sdim MAP_Date,datesize
memcpy MAP_Date,HEAD_DATE,24
memcpy MAP_Date,imagename,32,24
memcpy MAP_Date,map,HEAD_DATE.0*HEAD_DATE.1*4,56
dialog "map",17,"マップデータ"
if(stat==0){stop}
bsave refstr,MAP_Date,datesize
stop

*load
//MAP_Date2に読み込んだデータを入れます
sdim MAP_Date2,10000
dialog "map",16,"マップデータ"
if stat=0:stop
exist refstr
if(strsize==-1):end
bload refstr,MAP_Date2,strsize

//マップチップサイズなどを読み込み
dim HEAD_DATE2,12
i_index=0:j_index=0
repeat 6
k=cnt
temp=wpeek(MAP_Date2,i_index)
wpoke HEAD_DATE2.k,j_index,temp
i_index=i_index+4:j_index=j_index+4
loop

mes HEAD_DATE2.0
mes HEAD_DATE2.1
mes HEAD_DATE2.2
mes HEAD_DATE2.3
mes HEAD_DATE2.4
mes HEAD_DATE2.5
mes HEAD_DATE2.6
mes HEAD_DATE2.7
mes HEAD_DATE2.8
mes HEAD_DATE2.9
mes HEAD_DATE2.10
mes HEAD_DATE2.11

//マップチップの名前読み込み
sdim imagename2,32
n_index=0 //i_index=24 - 現在のオフセット
repeat 16
i=cnt
string=wpeek(MAP_DATE2,i_index)
wpoke imagename2,n_index,string
n_index=n_index+2:i_index=i_index+2
loop
mes "imagename:"+imagename2

//マップメインデータ読み込み
dim map2,HEAD_DATE2.0,HEAD_DATE2.2

i_index=56:j_index=0
repeat 440
map_c_d=wpeek(MAP_Date2,i_index)
wpoke map2,j_index,map_c_d
i_index=i_index+8:j_index=j_index+8
yoko++
loop

//ここの数値と①の数値を同じにしたい
pos 200,0
mes map2.0.0
mes map2.2.0
mes map2.28.0
mes map2.29.0
mes map2.29.29
mes map2.20.1
mes map2.29.15
mes map2.6.8
mes map2.20.20
mes map2.20.29
mes map2.28.28
mes map2.28.29
mes map2.29.28
stop



この記事に返信する


SYAM

リンク

2008/7/16(Wed) 22:21:30|NO.17339

マップメインデータ読み込み…のところで、

なぜ8バイト刻みに読み書きしているのでしょう?
4バイトではないでしょうか?

なぜ440回ループなんでしょう?
実際には(この場合)データは30×30 = 900個あるはずです。



ANTARES

リンク

2008/7/16(Wed) 23:26:18|NO.17341

つーか、memcpyの方が早くね?

memcpy imagename2,MAP_Date2,32,0,24
memcpy map2,MAP_Date2,HEAD_DATE2.0*HEAD_DATE2.2*4,0,56

>repeat 6
>    k=cnt
>    temp=wpeek(MAP_Date2,i_index)
>    wpoke HEAD_DATE2.k,j_index,temp
>    i_index=i_index+4:j_index=j_index+4
>loop

repeat 6
    wpoke HEAD_DATE2,j_index,wpeek(MAP_Date2,i_index)
    i_index+=4
    j_index+=8
loop



レノス

リンク

2008/7/17(Thu) 23:32:47|NO.17358

補足:データは data です。



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