|
|
|
2006/11/2(Thu) 09:14:58|NO.3225
こんにちは
自キャラ移動型のRPG作っています
マップを24*24で作って表示は12*12でしていますが
障害物判定がうまくいきません(HSP2ではできたのですが)
どこかおかしいですか?
#include "hspda.as"
buffer 4 ;マップチップ画像
picload "mapmoj1.bmp"
buffer 5,32*24,32*24 ;全体マップを製作してbufferに指定
sdim map,6424,24*24
sdim map2,6424,24*24
notesel map
noteload "a.txt" ;中身は、(Xマスの数,Yマスの数,通行コード)
repeat noteinfo(0)
noteget map2.cnt,cnt
wait 1
loop
repeat noteinfo(0)
redraw 2
csvsel map2
sdim xxx,6424,3
csvstr xxx,map2.cnt
cntt = cnt
repeat 24
if (cntt>((24*cnt)-1))&(cntt <(24*(cnt+1))) :pos 32*(cntt-(24*cnt)),32*cnt:gcopy 4,32*int(xxx.0),32*int(xxx.1),32,32
loop
loop
buffer 3 ; 画像ファイル
picload "pc_02.bmp"
redraw 1
pattern = 1, 2, 1, 0
screen 0,32*12,32*12
x1=0 : y1=0 ; 左上XY
x2=(32*12)-32 : y2=(32*12)-32 ; 右下XY
mx=32*6 ; X座標
my=32*6 ; Y座標
msp=8 ; スピード
*main
repeat 100
mmx = mx/32
mmy = (my/32)*24
pp = mmx+mmy
stick key,15,1 ; キー入力
if key=1 :if pp<0:pp=0:else:pp-=1:csvstr xxx,map2.pp:if xxx.2 = 1 :pp+=1:mx=mx+8:break:else:mx=limit( mx-msp, x1, x2 ):k=3
if key=4 :pp+=1:csvstr xxx,map1.pp:if xxx.2 = 1 :pp-=1:mx=mx-8:break:else: mx=limit( mx+msp, x1, x2 ):k=1
if key=2 :if mmy<= 0 : pp = 0:else:pp-=24:csvstr xxx,map2.pp:if xxx.2 = 1 :pp+=24:my=my+8:break:else:my=limit( my-msp, y1, y2 ):k=0
if key=8 :pp+=24:csvstr xxx,map1.pp:if xxx.2 = 1 :pp-=24:my=my-8:break:else: my=limit( my+msp, y1, y2 ):k=2
redraw 0 ; 描画始め
gosub *map_draw
cnunt = cnt
pos mx,my
gmode 2
gcopy 3,32*pattern(cnunt\4),32*k
redraw 1 ; 描画終わり
wait 10
k = 2
loop
goto *main
*map_draw ;マップ1/4表示
pos 0,0:gcopy 5,0,0,32*12,32*12
return
| |
|
2006/11/3(Fri) 14:15:29|NO.3235
・・・とりあえず、「動作する」スクリプトにしてもらえると、原因を考えやすいです。
・・・どうせ解析するにしても、心理的に大分違うので・・・。
とりあえず、やりたいらしい事のサンプルを作ってみました。
マップデータは24*24、表示は12*12との事ですが、それだと中心が無いので11*11にしました。
screen 0,11*32,11*32,0
sdim mapsouce,24,24
dim map,24,24
dim map2,24,24
gosub *map_souce_set
gosub *map_data_set
obstacle_view_flg =0 ;コレを1にすると、障害物情報が可視になる
map_x=0
map_y=0
eof=0
*main
gosub *key_in
gosub *move_check
gosub *move
gosub *map_write
wait 10
if eof=0 :goto *main
end
*map_data_set
for i,0,23
for o,0,23
map(o,i) = int( strmid( mapsouce(i),o,1) )
if map(o,i) < 5 {
map2(o,i)=0
}
else {
map2(o,i)=1
}
next
next
return
*Key_in
move_x=0
move_y=0
getkey key,100:if key=1 :move_x=-1 ;テンキー4
getkey key,102:if key=1 :move_x= 1 ;テンキー6
getkey key,104:if key=1 :move_y=-1 ;テンキー8
getkey key, 98:if key=1 :move_y= 1 ;テンキー2
getkey key, 27:if key=1 :eof = 1 ;esc
return
*move_check
map_point_x = map_x + move_x + 5
map_point_y = map_y + move_y + 5
gosub *map_point_get
if map2( map_point_x , map_point_y ) = 1 {
move_x = 0
move_y = 0
}
return
*move
map_x = map_x + move_x
map_y = map_y + move_y
if map_x < 0 :map_x = map_x + 24
if map_x >23 :map_x = map_x - 24
if map_y < 0 :map_y = map_y + 24
if map_y >23 :map_y = map_y - 24
return
*map_write
redraw 0
for i,0,11
for o,0,11
map_point_x = map_x + o
map_point_y = map_y + i
gosub *map_point_get
;マップチット表示(単純に色分け)
switch map( map_point_x , map_point_y )
case 0
color 0,255, 0
swbreak
case 1
color 0,200, 0
swbreak
case 5
color 200,100,100
swbreak
default
color 255,255,255
swbreak
swend
boxf o*32 , i*32 , o*32 + 32 ,i*32 + 32
;通れる部分を白で、障害物を赤で表示
if obstacle_view_flg = 1 {
switch map2( map_point_x , map_point_y )
case 0
color 255,255,255
swbreak
case 1
color 255, 0, 0
swbreak
swend
boxf o*32 + 12, i*32 + 12, o*32 + 20 ,i*32 + 20
}
next
next
;中心位置に青で自分表示
color 0, 0,255
boxf 5*32 + 5, 5*32 + 5, 5*32 + 27 ,5*32 + 27
redraw 1
return
*map_point_get
if map_point_x < 0 :map_point_x = map_point_x + 24
if map_point_x >23 :map_point_x = map_point_x - 24
if map_point_y < 0 :map_point_y = map_point_y + 24
if map_point_y >23 :map_point_y = map_point_y - 24
return
*map_souce_set
mapsouce( 0)="000000000010000000000000"
mapsouce( 1)="011100000000001000000000"
mapsouce( 2)="000000000000000000000000"
mapsouce( 3)="000000000000000000000000"
mapsouce( 4)="000011011000000001000000"
mapsouce( 5)="000000000000000000000000"
mapsouce( 6)="000000000000000000100000"
mapsouce( 7)="000000000000000000100000"
mapsouce( 8)="000000000000000000000000"
mapsouce( 9)="000000001000000000000000"
mapsouce(10)="000000000000555555000000"
mapsouce(11)="000555555555500005001000"
mapsouce(12)="000000000000500005000000"
mapsouce(13)="000000000000501105000001"
mapsouce(14)="000000000000500005000000"
mapsouce(15)="000000000000500105000000"
mapsouce(16)="000000000100500005000000"
mapsouce(17)="000000000000500005000010"
mapsouce(18)="000000100000000005001000"
mapsouce(19)="000005555555555555100000"
mapsouce(20)="000000000000001010000000"
mapsouce(21)="000000000000100000000000"
mapsouce(22)="000010000010001000000000"
mapsouce(23)="000000001000000100000000"
return
| |
|
2006/11/3(Fri) 14:25:09|NO.3236
理屈は上のスクリプト参照で・・・。
a.txtの中身がどうなってるのか教えてくれれば・・・・
元のスクリプトでも解析しやすいかと・・・
|
|
2006/11/3(Fri) 17:01:55|NO.3238
こんにちは
a.txtの内容は
map画像のxコマ数,yコマ数,チップ情報
例
1行目: 8,14,1
2行目: 0,0,1
3行目: 9,12,15
noteget map2.cnt,cntで
map2に配列変数として保存して
csvstr xxx,map2.cntで数値を分ける
xxx.0はxコマ数
xxx.1はyコマ数
xxx.2は通行コード
map製作で、gcopy 4,32*xxx.0,32*xxx.1,32,32になります
ppはキャラの移動先のチップ番号なのでmap.ppで通行コードを読み取り判別します
|
|
2006/11/3(Fri) 17:08:45|NO.3239
一応、判別するようになりました(少しずれると判別しないけど)
#include "hspda.as"
buffer 4 ;マップチップ画像
picload "mapmoj1.bmp"
buffer 5,32*24,32*24 ;全体マップを製作してbufferに指定
sdim map,6424,24*24
sdim map2,6424,24*24
notesel map
noteload "a.txt" ;中身は、(Xマスの数,Yマスの数,通行コード)
repeat noteinfo(0)
noteget map2.cnt,cnt
wait 1
loop
repeat noteinfo(0)
redraw 2
csvsel map2
sdim xxx,6424,3
sdim xxx2,6424,3
csvstr xxx,map2.cnt
cntt = cnt
repeat 24
if (cntt>((24*cnt)-1))&(cntt <(24*(cnt+1))) :pos 32*(cntt-(24*cnt)),32*cnt:gcopy 4,32*int(xxx.0),32*int(xxx.1),32,32
loop
loop
buffer 3 ; 画像ファイル
picload "pc_02.bmp"
redraw 1
pattern = 1, 2, 1, 0
screen 0,32*12,32*12
x1=0 : y1=0 ; 左上XY
x2=(32*12)-32 : y2=(32*12)-32 ; 右下XY
mx=32*6 ; X座標
my=32*6 ; Y座標
msp=8 ; スピード
*main
repeat 100
stick key,15,1 ; キー入力
if key=1 :mx=limit( mx-msp, x1, x2 ):k=3
if key=4 :mx=limit( mx+msp, x1, x2 ):k=1
if key=2 :my=limit( my-msp, y1, y2 ):k=0
if key=8 :my=limit( my+msp, y1, y2 ):k=2
redraw 0 ; 描画始め
gosub *map_draw
mmx = mx/32
mmx2=(mx+16)/32 ;key=4の場合判断チップキャラが半分状態にする)
mmy = ((my/32)*24)
mmy2=(((my+30)/32)*24) ;key=8の判断の座標
pp = mmx+mmy
pp2= mmx2+mmy
pp3= mmx+mmy2
if key=1:csvstr xxx,map2.pp :if xxx.2=int(1):mx+= 8
if key=4:csvstr xxx,map2.pp2 :if xxx.2=int(1):mx-= 8
if key=2:csvstr xxx,map2.pp :if xxx.2=int(1):my+= 8
if key=8:csvstr xxx,map2.pp3 :if xxx.2=int(1):my-= 8
cnunt = cnt
pos mx,my
gmode 2
gcopy 3,32*pattern(cnunt\4),32*k
redraw 1 ; 描画終わり
wait 10
k = 2
loop
goto *main
*map_draw ;マップ1/4表示
pos 0,0:gcopy 5,0,0,32*12,32*12
return
| |
|