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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0518
急行1分遅れRPG初挑戦で… 判らない…14未解決


急行1分遅れ

リンク

2008/5/18(Sun) 14:13:14|NO.15903


;screen 0,384,384 ;title "たいとるはさいごのおたのしみ" x=0 y=0 xx=1 yy=1 s=16 bit=32 xs=32*s ys=32*s dim stage,s,s stage(0,0)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 stage(0,1)=1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,2)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,3)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,4)=1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1 stage(0,5)=1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1 stage(0,6)=1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1 stage(0,7)=1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1 stage(0,8)=1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,9)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,10)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,11)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,12)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,13)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,14)=1,0,0,0,0,0,0,0,0,0,0,0,1,2,0,1 stage(0,15)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 screen 0,xs,ys ;buffer 1,xs,ys repeat redraw 1:redraw 0 color 255,255,255:boxf color stick key,15 if key=1{ foreach stage if stage(cnt\16,cnt/16-1)=0:xx- loop } if key=2{ foreach stage if stage(cnt\16-1,cnt/16)=0:yy- loop } if key=4{ foreach stage if stage(cnt\16,cnt/16+1)=0:xx+ loop } if key=8{ foreach stage if stage(cnt\16+1,cnt/16)=0:yy+ loop } x=xx*bit y=yy*bit x=limit(x,0,xs-bit) y=limit(y,0,ys-bit) pos x,y mes "人" wait 10 loop
こういうプログラムを書いています。
エラーがでてしまいました
どうしておかしくなるのか教えてください



この記事に返信する


f

リンク

2008/5/18(Sun) 15:01:30|NO.15905

エラーの出る所を

foreach stage dialog "" + (cnt\16+1) if stage(cnt\16+1,cnt/16)=0:yy+
こうしてみりゃ分かるんでね。



急行1分遅れ

リンク

2008/5/18(Sun) 19:29:20|NO.15909

つまり、どういうことですか



急行1分遅れ

リンク

2008/5/18(Sun) 19:42:30|NO.15911

そもそも、RPGってどうやって作れば良いんでしょうか



TODO

リンク

2008/5/18(Sun) 20:17:12|NO.15912

ググったりヤフったりすればでます



flory

リンク

2008/5/18(Sun) 20:24:43|NO.15913

fさんの言うことをとっっっってもわかりやすく説明するとですね、
「エラーには『配列の要素が無効です』と出るんだから、配列の要素が
期待したとおりになっているか自分で調べやがれ」
ということです。
そのくらいできますよね?ね?

付け加えて言うと、foreach構文は基本的に一次元配列に対して使うもので、
多次元配列までは数えきれないんじゃないかと思いますが。

そもそもforeachを使う必要性がわからない。



SYAM

リンク

2008/5/19(Mon) 08:48:04|NO.15920

そもそも「RPG」とは 何でしょう
とりあえずRPGを、のようなあいまいな要求を形にできるプログラム言語などこの世には存在しません。
コンピューターにとっては、
「具体的にどんな動きをするか」
だけが重要なことです。むしろそれがすべてです。
そのプログラムが何と呼ばれるモノかなんかは関係ありませんし、さらに言えばそれが何に使われるものかっていうことさえも、(コンピューター様にとっては)知ったことではないのです。

…一言でいうと、
どういう動きをするものなのか、仕様を先にシッカリ考えて作りなさい
ということです。
RPGって、単純なシューティングゲームやアクションゲームとちがい、具体的な動作を説明するだけでもかなりややこしいモノのハズです。プログラマーはそれを一つ残らず正確にコンピューター相手に説明しなければならないのですから、何をさせたいのかを先にシッカリ考えてハッキリさせときましょう。



急行1分遅れ

リンク

2008/5/19(Mon) 15:44:26|NO.15925


;screen 0,384,384 ;title "たいとるはさいごのおたのしみ" x=0 y=0 xx=1 yy=1 s=16 bit=32 xs=32*s ys=32*s dim stage,s,s stage(0,0)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 stage(0,1)=1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,2)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,3)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,4)=1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1 stage(0,5)=1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1 stage(0,6)=1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1 stage(0,7)=1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1 stage(0,8)=1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,9)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,10)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,11)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,12)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,13)=1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,14)=1,0,0,0,0,0,0,0,0,0,0,0,1,2,0,1 stage(0,15)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 screen 0,xs,ys ;buffer 1,xs,ys repeat redraw 1:redraw 0 color 255,255,255:boxf color x=xx*bit y=yy*bit x=limit(x,0,xs-bit) y=limit(y,0,ys-bit) stick key,15 if key=1{ if stage(xx-1,yy)=0:xx- } if key=2{ if stage(xx,yy-1)=0:yy- } if key=4{ if stage(xx+1,yy)=0:xx+ } if key=8{ if stage(xx,yy+1)=0:yy+ } repeat s*s if stage(cnt/16,cnt\16)=0:color 192,192,192:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=1:color 255,64,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=2:color 128,128,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit loop color pos x,y mes "人" wait 1 loop
なんとか動くようにはなりました。



急行1分遅れ

リンク

2008/5/21(Wed) 15:36:10|NO.15961


screen 0,384,384 title "RPGをつくる!" x=0 y=0 xx=1 yy=1 s=16 bit=32 xs=32*s ys=32*s mese="" mati=0 dim stage,s,s stage(0,0)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 stage(0,1)=1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,2)=1,4,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,3)=1,2,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,4)=1,2,1,0,0,0,0,0,1,0,0,0,0,0,0,1 stage(0,5)=1,2,1,1,1,1,1,0,1,1,1,1,1,1,1,1 stage(0,6)=1,2,1,0,0,0,1,0,0,0,0,0,0,0,1,1 stage(0,7)=1,2,1,0,1,1,1,1,1,1,1,0,1,0,1,1 stage(0,8)=1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,9)=1,2,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,10)=1,2,1,0,1,0,0,1,0,0,1,1,1,1,0,1 stage(0,11)=1,2,1,0,1,0,1,1,1,0,0,0,0,1,0,1 stage(0,12)=1,2,1,0,1,0,0,0,0,0,1,1,0,1,0,1 stage(0,13)=1,2,1,0,1,1,1,1,1,0,1,1,1,1,0,1 stage(0,14)=1,2,0,0,0,0,0,0,0,0,0,0,1,3,0,1 stage(0,15)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;screen 1,xs,ys buffer 1,xs,ys x=xx*bit y=yy*bit keyf=8;始めの矢印書くため repeat entkey=0 if mati=0:mese="" gsel 0 redraw 0 color 20,20,20:boxf color 192,192,255:boxf 5,261,379,379 color 255,255,255 line 0,256,256,256 line 256,0,256,256 line 5,261,379,261 line 5,261,5,379 line 5,379,379,379 line 379,261,379,379 pos 10,266 color mes mese pos 0,0 gcopy 1,x-128,y-128,256,256 redraw 1 gsel 1 redraw 0 color 120,120,120:boxf -128,-128,xs+128,ys+128 x=xx*bit y=yy*bit x=limit(x,0,xs-bit) y=limit(y,0,ys-bit) stick key,15+32 if key!0:if key<10:keyf=key:mati=0 ;ストラクチヤ始め if key=1{ if stage(xx-1,yy)=0:xx- if stage(xx-1,yy)=2:xx- } if keyf=1{ if stage(xx-1,yy)=3:gosub *s3 if stage(xx-1,yy)=4:gosub *s4 } if key=2{ if stage(xx,yy-1)=0:yy- if stage(xx,yy-1)=2:yy- } if keyf=2{ if stage(xx,yy-1)=3:gosub *s3 if stage(xx,yy-1)=4:gosub *s4 } if key=4{ if stage(xx+1,yy)=0:xx+ if stage(xx+1,yy)=2:xx+ } if keyf=4{ if stage(xx+1,yy)=3:gosub *s3 if stage(xx+1,yy)=4:gosub *s4 } if key=8{ if stage(xx,yy+1)=0:yy+ if stage(xx,yy+1)=2:yy+ } if keyf=8{ if stage(xx,yy+1)=3:gosub *s3 if stage(xx,yy+1)=4:gosub *s4 } ;ストラクチヤ終わり repeat s*s if stage(cnt/16,cnt\16)=0:color 192,192,192:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=1:color 255,64,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=2:color 64,64,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=3:color 128,128,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=4:color 32,192,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit color pos x,y if keyf=1:mes "←" if keyf=2:mes "↑" if keyf=4:mes "→" if keyf=8:mes "↓" loop redraw 1 wait 10 loop *s3 gosub *enter if entkey=1:mese="しゃべる事もできます。" return *s4 gosub *enter if entkey=1{ mese="やぁ、こんにちは。" stage(1,2)=2 } *enter *nan stick entman,32 if entman=32:entkey=1 mati=1 return
ここまでできましたが、
しゃべって
  ↓
エンターキー押すのをまって
  ↓
エンターキー判定
  ↓
続きをしゃべる
の方法が判りません、教えてください。



レヴィン

リンク

2008/5/21(Wed) 23:02:10|NO.15974

>>続きをしゃべる
>>の方法が判りません、教えてください。

とりあえず、ソース内に会話を書いてるうちは難しい…というより
面倒でやる気なくすかも。
この話しかけるところまではできてるようですから、
多分ここから先も言えばわかるという前提で書きます。

結論から言うと、ここから先、普通のRPGのような会話モードにしたい場合は
ノベルエンジンのようなもの作る必要があります。
要するにスクリプト言語を作るってことです。
(HSPもスクリプト言語なので、その中に更にスクリプト言語があるという
も変な話ですがww)

テキストファイルにいろいろ書いてある命令やら文章をノートパッド系の命令で
読み込んでそこから動作を決定するということが必要になります。

GENKIさんが作ったノベルエンジンが参考になるかと(ソースも
公開されてるし)。
http://homepage3.nifty.com/ghpk/index.htm

俺も格ゲーのストーリーモード用にノベルエンジンを作る時に参考したサイトがあるので
それも載せときます。
http://nekomamire.sakura.ne.jp/



レヴィン

リンク

2008/5/22(Thu) 10:24:49|NO.15977

↑だけじゃさすがにヒントになってねーよって思ったので追記。

話しかけたらイベント開始フラグを立てて、上で書いたように
ノベルエンジン的なものを使って会話文を表示し、イベント終了後にフラグを
倒せばいいです。
あと、イベント中は移動不能にするのが基本とかと。
(まぁ、クロノトリガーみたいに会話中でも一部を除いて移動可能なRPGもありますが^^;)

RPGツクール2,3,2000,2003あたりをやったことあれば伝わるとは思うんですが…



急行1分遅れ

リンク

2008/5/22(Thu) 17:13:33|NO.15979


screen 0,384,384 title "RPGをつくる!" x=0 y=0 xx=1 yy=1 s=16 bit=32 xs=32*s ys=32*s mese="" mati=0 entmati=0 dim stage,s,s stage(0,0)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 stage(0,1)=1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,2)=1,4,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,3)=1,2,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,4)=1,2,1,0,0,0,0,0,1,0,0,0,0,0,0,1 stage(0,5)=1,2,1,1,1,1,1,0,1,1,1,1,1,1,1,1 stage(0,6)=1,2,1,0,0,0,1,0,0,0,0,0,0,0,1,1 stage(0,7)=1,2,1,0,1,1,1,1,1,1,1,0,1,0,1,1 stage(0,8)=1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1 stage(0,9)=1,2,1,0,1,1,1,1,1,1,1,1,1,1,0,1 stage(0,10)=1,2,1,0,1,0,0,1,0,0,1,1,1,1,0,1 stage(0,11)=1,2,1,0,1,0,1,1,1,0,0,0,0,1,0,1 stage(0,12)=1,2,1,0,1,0,0,0,0,0,1,1,0,1,0,1 stage(0,13)=1,2,1,0,1,1,1,1,1,0,1,1,1,1,0,1 stage(0,14)=1,2,0,0,0,0,0,0,0,0,0,0,1,3,0,1 stage(0,15)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;screen 1,xs,ys buffer 1,xs,ys x=xx*bit y=yy*bit keyf=8;始めの矢印書くため repeat gsel 1 entkey=0 if mati=0:mese="" gosub *zeromenkaiga redraw 0 color 120,120,120:boxf -128,-128,xs+128,ys+128 x=xx*bit y=yy*bit x=limit(x,0,xs-bit) y=limit(y,0,ys-bit) if entmati=0:stick key,15+32 if key!0:if key<10:keyf=key:mati=0 ;ストラクチヤ始め if key=1{ if stage(xx-1,yy)=0:xx- if stage(xx-1,yy)=2:xx- } if keyf=1{ if stage(xx-1,yy)=3:gosub *s3 if stage(xx-1,yy)=4:gosub *s4 } if key=2{ if stage(xx,yy-1)=0:yy- if stage(xx,yy-1)=2:yy- } if keyf=2{ if stage(xx,yy-1)=3:gosub *s3 if stage(xx,yy-1)=4:gosub *s4 } if key=4{ if stage(xx+1,yy)=0:xx+ if stage(xx+1,yy)=2:xx+ } if keyf=4{ if stage(xx+1,yy)=3:gosub *s3 if stage(xx+1,yy)=4:gosub *s4 } if key=8{ if stage(xx,yy+1)=0:yy+ if stage(xx,yy+1)=2:yy+ } if keyf=8{ if stage(xx,yy+1)=3:gosub *s3 if stage(xx,yy+1)=4:gosub *s4 } ;ストラクチヤ終わり repeat s*s if stage(cnt/16,cnt\16)=0:color 192,192,192:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=1:color 255,64,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=2:color 64,64,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=3:color 128,128,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit if stage(cnt/16,cnt\16)=4:color 32,192,64:boxf cnt/16*bit,cnt\16*bit,cnt/16*bit+bit,cnt\16*bit+bit color pos x,y if keyf=1:mes "←" if keyf=2:mes "↑" if keyf=4:mes "→" if keyf=8:mes "↓" loop redraw 1 wait 10 loop *s3 gosub *enter if entkey=1:mese="しゃべる事もできます。" return *s4 gosub *enter if entkey=1{ mese="やぁ、こんにちは。" if entmati=0:entmati=1:return mese="じゃ、また今度。" stage(1,2)=2 entmeti=0 } return *enter *nan stick entman,32 if entman=32:entkey=1 mati=1 return *zeromenkaiga gsel 0 redraw 0 color 20,20,20:boxf color 192,192,255:boxf 5,261,379,379 color 255,255,255 line 0,256,256,256 line 256,0,256,256 line 5,261,379,261 line 5,261,5,379 line 5,379,379,379 line 379,261,379,379 pos 10,266 color mes mese pos 0,0 gcopy 1,x-128,y-128,256,256 redraw 1 gsel 1 return
とまってしまいました…
どうしてか判りません、教えてください。
直、言語の作成はしない予定です。



otta

リンク

2008/5/23(Fri) 16:47:42|NO.16030

>どうしてか判りません、教えてください。

Debug Windowで変数の値をチェックしてみましょう。
想定外の数値が代入されている変数はありませんか?



やみねこ

リンク

2008/5/23(Fri) 18:13:03|NO.16040

スクリプト貼り付けの注意書き見てなかった…

もしかして、主人公って矢印ですかね?…
そうだとしたら、座標を書き換えてないような。

あと、ottaさんの言うとおり、logmesを活用してみては?
str型なので、数値の場合はstr()で囲む必要がありますが。

以上です。


スクリプトの貼り方を間違えたので、ファイルをpreで囲むスクリプト作ってみた。
そういう小物をUPするところは無いんだろうか?…



yamineko

リンク

2008/5/23(Fri) 19:14:35|NO.16041

スクリプトをpreで囲んだときのテストを兼ねてUPさせていただきます。
ごく小さなミスでしたよ。

これからも頑張ってね。 ^^

*s4

	gosub *enter
	if entkey=1{

		mese="やぁ、こんにちは。"
		if entmati=0:entmati=1:return

		mese="じゃ、また今度。"
		stage(1,2)=2

		entmati=0
		;   ^ここ

	}
return




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