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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1102
AKI通行判定がおかしのですが4解決


AKI

リンク

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の中身がどうなってるのか教えてくれれば・・・・
元のスクリプトでも解析しやすいかと・・・



AKI

リンク

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で通行コードを読み取り判別します



AKI

リンク

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



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