|
 |
|
2011/9/26(Mon) 15:16:45|NO.41723
あの……
農業をやるっていうゲームがあるじゃないですか、
で、それを頑張って作ってみたんですけど
(まだ途中でしかも汚い。)
(しかも、意味が分からないかもしれません)
余分なところを教えていただいたり
アドバイスをいただけたりしないでしょうか
めんどくさいかと思いますが、
よろしくお願いします
*hajime
dim tomato,5
dim nasubi,5
tomato(0)="トマトの種"
tomato(1)="赤いトマト"
nasubi(0)="なすびの種"
nasubi(1)="紫のなすび"
k=1
m=1
s=0
*main;メインメニュー
cls
button goto "育てる",*siku
button goto "畑に行く",*hatake
stop
*siku;畑に植える作物を決定
cls
objsize 120,24
combox a,,""+tomato(0)+"\n"+nasubi(0)+"
button goto "決定",*enter
button goto "戻る",*main
stop
*enter;畑に空きがあるかのチェック
if (k=1){
goto*siiku
}else{
cls
dialog "畑はいっぱいです。",1
goto*siku
stop
}
*siiku;植えるかどうかの確認
if (a=0) {
cls
b=tomato(0)
dialog ""+tomato(0)+"を植えますか?",2
if stat =6 {
tomato(2)="tom"
m=1
s=0
c=1
k++
goto*ueru
}else{
goto*siku
}
}
if (a=1) {
cls
b=nasubi(0)
dialog ""+nasubi(0)+"を植えますか?",2
if stat=6 {
nasubi(2)="nas"
m=1
s=0
c=1
k++
goto*ueru
}else{
goto*siku
}
}
stop
*ueru
cls
mes ""+b+"を植えました"
button goto "了解",*main
stop
*hatake;畑の状況を確認
cls
mes "畑 1"
if c=0 {
mes"栽培中:なし"
}else:mes "栽培中:"+b+""
button goto "詳しく",*kuwasiku
pos 500,100
button goto "戻る",*main
stop
*kuwasiku
cls
if c=0 {
mes"栽培中:なし"
}else:mes "栽培中:"+b+"":mes "必要時間:"+m+"分"+s+"秒"
if k=1 {
button goto "時間詳細",*time2
}else{
button goto "時間詳細",*time
}
pos 500,100
button goto "戻る",*hatake
stop
*time
cls
pos 500,100
button goto "戻る",*kuwasiku
repeat
if (m=0 and s=0){
cls
mes "作物ができました"
button goto "収穫する",*toru
stop
}else{
font "MSゴシック",40,1
pos 200,190
mes "残り : "+m+"分"+s+"秒"
wait 100
if s=0 {
m--
s=60
}
s--
pos 500,100
button goto "戻る",*kuwasiku
color 255,255,255
boxf
color 0,0,0
loop
}
*time2
cls
mes "何も栽培していません"
pos 500,100
button goto "戻る",*kuwasiku
stop
*toru
cls
c=0
if b=tomato(0){
tomato(1)="赤いトマト"
tomato(2)="tom"
}if b=nasubi(0){
nasubi(1)="紫のなすび"
nasubi(2)="nas"
}
mes ""+b+"を収穫しました"
button goto "家へ",*main
stop
<pre/>

| |
|
2011/9/26(Mon) 17:25:58|NO.41724
むぅ…1回収穫しただけだけど、まぁしっかり動きますね
改善点というと人それぞれなので一概には言えませんが、
重要なのは「データが増えても大丈夫か?」という点だと思います。
例えば今後、「ピーマン」「にんじん」「たまねぎ」などの種が増えて、
収穫物も、「質の良いピーマン」「小さなピーマン」「触れるのも恐ろしいピーマン」などが増えると思います。
その際、毎回pi-man(0) = "ピーマンの種"などと書いていくのは非常に効率が悪く、タイプミスなどによるバグも爆発的に増えます。
改善点として私の場合は、
こうしたデータはnoteload等で外部から入力すべきだと思います。
さらに言えば、データを管理するモジュールを用意すべきだと思います。
;作物モジュール
#module 作物モジュール 作物名, 収穫物名, 収穫物種類数
;新規作物登録
#deffunc 新規作物 var _作物番号, str _作物名
newmod 作物モジュール変数, 作物モジュール, _作物番号, _作物名
return
;新規作物登録モジュール
#modinit var _作物番号, str _作物名
mref 現在作物番号, 2
_作物番号 = 現在作物番号
作物名 = _作物名
return
;収穫物追加
#deffunc 収穫物追加 int _作物変数, int _収穫物番号
_収穫物追加 作物モジュール変数(_作物変数), _収穫物番号
return
;収穫物追加モジュール
#modfunc _収穫物追加 int _収穫物番号
収穫物番号(収穫物種類数) = _収穫物番号
収穫物種類数 ++
return
;作物名取得
#defcfunc 作物名取得 int _作物番号
return _作物名取得(作物モジュール変数(_作物番号))
;作物名取得モジュール
#modcfunc _作物名取得
return 作物名
;収穫物ランダム取得
#defcfunc 収穫物ランダム取得 int _作物番号
return _収穫物ランダム取得(作物モジュール変数(_作物番号))
;収穫物ランダム取得モジュール
#modcfunc _収穫物ランダム取得
return 作物名取得(収穫物番号(rnd(収穫物種類数)))
#global
;作物を登録
新規作物 にんじんの種 , "にんじんの種"
新規作物 普通のにんじん , "普通のにんじん"
新規作物 青いにんじん , "大きなにんじん"
新規作物 忍者 , "にんじんかと思ったら忍者"
;にんじんの種を植えた場合に収穫できるものを登録
収穫物追加 にんじんの種, にんじんの種
収穫物追加 にんじんの種, 普通のにんじん
収穫物追加 にんじんの種, 青いにんじん
収穫物追加 にんじんの種, 忍者
;収穫物をランダムに表示
repeat 100
mes 作物名取得(にんじんの種) + "を植えたら、" + 収穫物ランダム取得(にんじんの種) + "が収穫できるかもしれない"
await 1
loop
注目して欲しいのは40行目以降、#globalの後なのですが、
#module~#globalまでを作っておけば、それ以降は作物の追加や収穫物の追加、取得がとても簡単になります。
とはいえ、そういうことを始めるとなんだかオブジェクト指向っぽくなって、
そうなるとHSPの方針にそぐわない? かもしれない? ので、
配列とラベルで開発した方が良いのでしょうか…
いやでもそれだと管理がたいへんだから……
などと、改善点は人によって違うので、開発方法もいろいろ試しながら、
自分がベストだと思う方法を見つけてみてください。

| |
|
2011/9/26(Mon) 19:23:49|NO.41733
トマトの種を植えて育てて作物を収穫したときに
「トマトの種を収穫しました」
と表示されます。
変数bを変えないと種をほじくるだけのゲームになってしまいますよ(笑)
あと、配列変数の使い方が少し不自然に思われました。
変数bで現在の作物を管理しているようですが、代入しているのは
tomato(0) (="トマトの種")
nasubi(0) (="なすびの種")
と文字列で、スマートな方法とは言えません。
bに数値を代入し、例えばyasai(b)のように配列から文字列を取得するほうがよいと思われます。
もしかしたら配列変数の使い方について勘違いしているかもしれないので
もう一度確認してみることをお勧めします。
|
|
2011/9/26(Mon) 19:57:43|NO.41737
>ひらまるさん
モジュールの使い方がよくわかりません……
今日で覚えたいです。
教えていただけないでしょうか
>FPW
了解です
もう一度、勉強し直します
|
|
2011/9/26(Mon) 20:19:03|NO.41740
>モジュールの使い方がよくわかりません……
>今日で覚えたいです。
なかなか一朝一夕で覚えるのは容易でないぞ。
データを管理しやすくなるような気はするが、ひらまる氏がドバっと貼ったモジュールの
コードを読もうとするとわけがわからなくなるはずだ。
HSPのヘルプに載ってるモジュールの説明は、ある程度(他の言語が)分かる人向けに書いてあり
モジュール変数、モジュール型変数といった、似てて全然意味の違う物が出てきて初心者には
もう兎角亀毛の如き意味不明さだ。
初心者がおいそれと手を出してすぐ利益が出るようなものでもないが、それでも覚えたいと言うなら
誰かがレスを10位使って教えてくれるだろう。
|
|
2011/9/26(Mon) 20:26:13|NO.41741
>ORZさん
そうなんですか
そんな簡単な話じゃないんですね
今日じゃなくても
がんばって覚えたいです。
どなたか
お時間のある方、
教えていただけないでしょうか
お願いします
|
|
2011/9/27(Tue) 03:54:53|NO.41758
投稿した後しばらくしてスレを開いたら、
>お時間のある方、
>教えていただけないでしょうか
ここでぱったりレスが止まっていて不覚にも笑ってしまいました;
ORZさんのおっしゃるとおり、教えてもらったらできた! みたいに簡単ではないと思います。
私の場合はなんとなくHSPのマニュアル
(命令リファレンスじゃなくて、「ヘルプ」→「HSPプログラミング・マニュアルを開く」の方)
を見ていたら、「モジュール定義命令」という項目があったので、何気なく読んでいたのですが、途中で
『何この機能全然知らなかった超便利なんだけど!!!!!』ってなりました。それからもうモジュールフェチです。
でも上にも書きましたが、モジュール型変数ばっかり使ってるとオブジェクト指向に近くなります。
そうするとモジュールだけじゃ不満がどんどん増えてきます。
私も最近C++でのオブジェクト指向ゲーム開発を始めたのですが、便利すぎて鼻血が止まりません。
とはいえ、HSPはとにかく簡単。他言語やると身にしみるけど、ほんとHSPは簡単。しかも高機能!
なによりコンパイルが異常に速い! 実行も十分速い!
のでまぁ、HSPでモジュール型変数を使ったゲームを作る価値は十分にありますね。
モジュールフェチの戯言かもしれませんが、まぁモジュールの使い方覚えても決して無意味じゃないよってことで。
うだうだ長文書いてるのは、自分でモジュールの説明をするのは面倒なので、
モジュールすごいよ~ 便利だよ~ っていうイメージを植えつけて、
自発的に学習してくれる方向に誘導しているからです。 あ、言っちゃった;
とりあえず上で書いた、
「ヘルプ」→「HSPプログラミング・マニュアルを開く」→「モジュール定義命令」
を読んでみてください。
もし内容がある程度理解できるなら儲けものです。がんがん使って覚えましょう。
F1で呼び出せるリファレンスでは、以下を検索してみてください。
#module
#global
#modinit
#modterm
#modfunc
#modcfunc
thismod
newmod
delmod
foreach
上で書いた作物モジュールでは、モジュールによる機能をほぼ踏襲しています。
作物モジュールの内容が理解できるようになれば、自作のモジュール開発も難しくないでしょう。
(作物モジュールでは、モジュール型変数を使う上で非常に強力なforeachを利用していませんので、
モジュール型変数に対してのforeachは自力で学習するか、どうしてもわからない部分は質問しましょう。)
モジュール機能はHSPの中でもHSPらしからぬ機能ですが、
使いこなせれば(特にゲーム開発では)強力なので、ぜひ習得をおすすめします。
あでも私は最近になって、HSPLetとかHSPDishでモジュール型変数が使えないので、慣れない配列によるデータ管理をはじめ、
やってられなくなったのでオブジェクト指向にシフトしました;
モジュール型変数を使うと、『ウィンドウズ上で動くプログラムしか作れない』
私が感じるモジュール型変数の注意点はこれだけですね。モジュールフェチなので。
逆にウィンドウズ上で動くゲームを作りたいのならば、モジュール型変数を使わない手はないとすら思います。
あでもモジュールの使い方を覚えるくらいならHSP以外の言語で汎用的なクラスの使い方を覚える…?
いやでもHSPの方が直感的で簡単だしなぁ…そこはきっと誰もが悩むところだと思うので、
いろんな人の意見を聞いたり、自分で悩んだりしてみてください。 うん。 頑張って!

| |
|
2011/9/27(Tue) 07:16:35|NO.41760
>ひらまるさん
ありがとうございます。
まだまだ初心者なので、すぐには覚えられないと思いますが、
必死に勉強して覚えたいと思います。
ありがとうございました。
|
|
2011/9/27(Tue) 19:50:07|NO.41781
ヘルプを読んでいますが、よくわかりません。
モジュールで命令を作成できるという事しか理解不能です。
(もしかして、これも間違ってますか?)
ああ゛、お助け下さい
|
|
2011/9/27(Tue) 20:34:35|NO.41782
>>モジュールで命令を作成できるという事しか理解不能です。
意味合い的には合っていますよ。
それも「理解できた」事に成ります、後は「習うより慣れろ」です。
サンプルを色々改造しているうちに、何となく覚えていきますよ。
|
|
2011/9/27(Tue) 20:44:37|NO.41783
基本的なことから難しいようなので、できるだけ専門用語を使わずに説明します。
まず基本的なことですが、#module~#globalまでに書いたことは、そのままだと実行されません。
mes "この行は実行される"
#module
mes "この行は実行されない"
#global
mes "この行は実行される"
これを実行するには、#deffunc,#defcfunc,#modfunc#modcfuncなどで命令や関数を定義する必要があります。
以下では#deffuncによって「文字列表示命令」という命令を作りました。
もし#deffuncや#defcfuncについてわからなければ、ラベルを便利にしたものと思ってください。
mes "この行は実行される"
#module
#deffunc 文字列表示命令
mes "この行も実行される"
return
#global
文字列表示命令
mes "この行は実行される"
また、モジュールの中と外では同じ名前の変数でも内容が異なります。
以下の例で、変数Aの値がモジュールの中と外で異なっているのがわかります。
変数A = 999999999
#module
#deffunc 変数Aの値を表示
mes "モジュール内の変数Aの値 = " + 変数A
return
#global
変数Aの値を表示
mes "モジュール外の変数Aの値 = " + 変数A
以上がおそらく、モジュールを扱う上での最も基本的なことだと思います。
まだモジュール型変数というものは出てきていませんが、
ここまでは理解しているでしょうか?
もしここまでが難しいようなら、上記の例を実行したり書き換えたり改造したりして、
どう書いたらどう動くか、どう書いたらエラーになるか、体験して覚えてください。
ここまでがわかればおそらく、自力での学習も可能だと思います。
あと今見つけたのですが、HSPスクリプトエディタの「ツール」→「HSPアシスタントを起動」→「Sample」→「Module」
に、モジュールのサンプルがいくつかあるようです。
ある程度参考になるかもしれないので、「edit」ボタンから中身を見て
(上書きしないように注意しながら)別の場所に保存していろいろいじくってみてください。
もしここまでを理解した上で、
モジュール変数やモジュール型変数の使い方がわからないということならば、
上記のサンプル等も活用して、
とにかく書いて実行して結果を見て改造して結果を予想して実行して結果を見てを繰り返してください。
プログラマはおそらく、一生がその繰り返しです。プログラマをこの輪廻の輪から解き放った人は英雄になれるでしょう。
まぁそんなわけで、英雄のいない世界に生まれ落ちた我々は、泥にまみれながら苦しくも楽しいプログラミング道を歩みましょうず…

| |
|
2011/9/27(Tue) 21:52:55|NO.41785
何度も何度もありがとうございます。
だんだんとわかってきました。
奥が深いんですね
いろいろ試してみます!!
|
|
2011/9/28(Wed) 20:36:58|NO.41798
;作物モジュール
#module 作物モジュール 作物名, 収穫物名, 収穫物種類数
;新規作物登録
#deffunc 新規作物 var _作物番号, str _作物名
newmod 作物モジュール変数, 作物モジュール, _作物番号, _作物名
return
これの2行目って
作物モジュールというモジュール名で、
作物名, 収穫物名, 収穫物種類数 の3つのモジュール変数があるということですよね?
4行目では 新規作物 という新規命令を作っているんですね
そのパラメーターは _作物番号 という変数と、_作物名 という文字列
そして5行目は
作物モジュール変数という名の、変数を複数入れておける箱で
その中に _作物番号, _作物名 の2つの変数が入っている
ここまでは分かっているつもりなのですが、
#deffuncとnewmodの絡みや
#modinit var _作物番号, str _作物名
mref 現在作物番号, 2
_作物番号 = 現在作物番号
作物名 = _作物名
の
_作物番号 = 現在作物番号
作物名 = _作物名
部分がよくわかりません。
助言をいただいた通りに色々といじってみてはいるのですが、糸口が見つからないのです。
もう少しお助けいただけないでしょうか
それとも、もう質問する事はやめたほうがいいのでしょうか
迷惑になっていないでしょうか
なっていったらすみません。
無視してください
|
|
2011/9/28(Wed) 20:58:04|NO.41800
ひらまるさんのスクリプトの
新規作物 にんじんの種 , "にんじんの種"
で新規作物命令、つまり「#deffunc 新規作物」のところが呼ばれますよね。
その命令は
#deffunc var _作物番号, str _作物名
と宣言されていますから、
変数「_作物番号」は変数「にんじんの種」、
文字列「_作物名」は文字列"にんじんの種"
です。
で、
newmod 作物モジュール変数, 作物モジュール, _作物番号, _作物名
という行。
作物モジュールとはこのモジュールですね。
newmodはモジュール型変数を作成し、該当モジュールのmodinitを呼びます。
#modinit var _作物番号, str _作物名
さきほどのnewmodでの引数は_作物番号,_作物名であり、
それがそのままmodinitの引数に行きます。
mref 現在作物番号, 2
_作物番号 = 現在作物番号
作物名 = _作物名
確かmrefで2をすると、モジュール型配列変数(作物モジュール変数)の
今の要素の番号を取得すると過去この掲示板にあったはず…
で、その番号を_作物番号、つまり例で行くと変数「にんじんの種」に入るわけで…。
そしてモジュール変数「作物名」に"にんじんの種"が…
だめだ、最後の四行くらい、意味わかりませんよね。。。
うまく説明できません。
前半のあたりは多分わかると思うんですけども。
だれか説明お願いします!
まあ、「オブジェクト指向」と検索すれば、
もっとわかりやすい説明をしてくれいているページがあるかもしれません。
|
|
2011/9/28(Wed) 22:03:23|NO.41802
機能だけ言えば、
>新規作物 にんじんの種 , "にんじんの種"
”にんじんの種”という名前の作物を登録して、
発行された作物IDを(にんじんの種)というグローバル変数に書き込んでもらう。
>収穫物追加 にんじんの種, 忍者
さきほど登録時に発行された作物ID同士を関連付ける。
>作物名取得(にんじんの種)
作物IDから、登録された作物名を返す。
>収穫物ランダム取得(にんじんの種)
作物IDから、ランダムで関連付けられた作物名を返す。
登録されていない作物IDによる作物名取得の場合とかの例外処理がされていないようです。
また、収穫物ランダム取得は作物IDを返すようにすると、収穫処理が楽になりそうです。
作物IDで植えて、文字列が収穫できては、次につながりませんからw
|
|
2011/9/28(Wed) 22:20:07|NO.41804
ここ↓について説明します。長文失礼。
#modinit ...
mref 現在作物番号, 2
_作物番号 = 現在作物番号
...
_作物番号 は、newmod で新しく作られた作物の、作物モジュール変数 という配列における位置(添字)を表します。
例えば、既に2つ作物を作っている(「新規作物」を2回使っている)とします。
すると、作物モジュール変数 という配列変数は、
作物モジュール変数(0) は (1つ目の作物)
作物モジュール変数(1) は (2つ目の作物)
という状態になっています。
ここで、更に「新規作物」命令呼んで、 作物モジュール変数 に newmod すると、
作物モジュール変数(2) が (新しい作物)
になります。
この 新しい作物 について #modinit の命令 (通称コンストラクタ) が呼ばれます。
mref 現在作物番号, 2
とすると、現在作物番号は、
「この 新しい作物 が 作物モジュール変数 のどの位置(配列添字)にあるか」
を示す値になります。
いまの例では、現在作物変数 の値は 2 です。
※ mes か logmes で確認してみてください。
モジュールの外はこの値を欲しがっているので、外部から与えられた変数「_作物番号」(にんじんの種、など)に、
これを代入しています。
欲しがる理由:
このモジュールでは、「作物」(にんじんの種、普通のにんじん、他)と、この作物番号は 1 対 1 に対応しています。
つまり、この 作物番号 を使えば 作物 の種類もわかります。
なので、「作物」に関して何か処理をしたい場合は、作物関連の関数・命令にこの番号を渡せばいい、
ということになります。
実際、「収穫物追加」などのモジュール外から呼ばれる命令・関数の第一引数は、
作物番号を受け取るようになっています。
つまり逆にいうと、作物に対して命令・関数を使うのに作物番号が必要ということです。
それから。
1. 「現在作物番号」に mref してから、それをそのまま「_作物変数」に代入する、という
二度手間っぽいことをしているのは何故か。
→ 現在作物番号が「クローン変数」という特殊な挙動をする変数になるから、なのですが、詳しくは割愛。
興味があれば dup 命令などを調べてみてください。
2. どうして 作物モジュール変数(x) が持つ、「作物」そのものの値を使わないのか
→ #deffunc の引数や、#defcfunc で作った関数の戻り値に使用できないから (たぶん)。
newmod で生成される値は struct 型という特殊な型で、扱いがややこしい。
※なお、この mref x, 2 で現在番号を得るという技巧は、わりと“黒い”ので注意。
なんでそうなるのか? と聞かれても「そうなるからそうなるんだ」としか言えないたぐいのもの。
modvar 引数(MPModVarData)で展開されるメモリが { var (MPVarData), int (int) } と一致するなんて誰が知ってんだ。

| |
|
2011/9/29(Thu) 01:51:51|NO.41811
>Cookiesさん
>たんすさん
>レノスさん
なんか私の張ったモジュールに関して詳細に説明していただいてありがとうございます;
わかりやすい説明で、私自信「へー、そうなんだー」と感心してしまいました……。
全体の概要はたんすさん、
#deffuncとnewmodの絡みはCookiesさん、
#modinitの内容はレノスさんのレスが非常にわかりやすいですね。
ほんと、わざわざ私のスクリプトを解読してまで説明してくださってありがとうございます。
おかげで私が補足するような説明が残ってないです(TωT)
>迷惑になっていないでしょうか
TSUさんは勉強熱心なので大丈夫でしょう。
だからこそこれだけのレスが付いているのだと思います。
それに、モジュール型変数はHSPの機能の中でも特に便利で難しくて独特なものです。
ネット上での初心者向けのわかりやすい情報も少ないですね。
私はHSPのマニュアルが一番わかりやすと思いました。
いろいろ試してみて、わからなければ質問して、頑張って身につけてみてください。
頑張りすぎずにふぁいと(・ω・)
|
|
2011/9/29(Thu) 21:03:25|NO.41832
皆さんありがとうございます!!
感謝のしようがありません
皆さんのおかげで、大分と分かってきました。
ここからもう一度、一人で悩み抜こうと思います。
また分からなくなったら質問させていただくかも知れませんが
その時はよろしくお願いします
|
|
2011/9/30(Fri) 20:07:20|NO.41849
やっぱ駄目だ。
僕には無理なんでしょうかね……
基本的なことや新規命令の作り方までは理解したんですけど、
newmodとかmrefとかさっぱりです
ヘルプや皆さんにいただいた回答も何十回と読んでいるのですが、
その辺が……
どの変数がどう繋がっててこうなる
っての全然わかりませんし……
皆さんがせっかく説明してくださっているのに
僕の理解力が少なく、ご迷惑のかけっぱなしで、
すいません
もう、どうしたらいいんだか
やはりモジュールに挑戦するのは早かったのですかね?
これだけでも回答していただければと思います。
「めんどくさい奴だな」と思ったら
無視してください
|
|
2011/9/30(Fri) 20:58:35|NO.41851
「人は「考え方」を手に入れたとたん、頭が良くなる生き物である。君にできないはずはない。」
とNHKの某番組も言っています。
使いこなすにはちょっと早いかもしれませんが、
挑戦すること自体は、早すぎることはないと思います。
かくいう私も、ひらまるさんのモジュールをなんとなく読み解くことは出来ても、
自分でゼロから構築することは出来ません。
英語の長文を読んでる気分ですね。
スクリプトの一行一行を自分の言葉で書き換えていくことができれば、処理の流れが見通せて、
ブロックごとになにをしているのかが推測できるようになるかも?
|
|
2011/9/30(Fri) 21:48:28|NO.41852
めんどくさいのは、このへんのオブジェクト指向のほうですよ。
一度理解できれば、モジュールを使ったり、書いたりは非常に簡単、というか便利であり、なおかつ安全で、誤解が少なく済んだりします。
しかし理解は面倒なんですよ。。。
他の方は知りませんが、私もこれは昔に全然意味が分からなかった覚えもありますしね。
>newmodとかmrefとかさっぱりです
newmodはまあ、理解してもらえないと無理ですが、
mrefは覚えるしかありません。丸暗記。
レノスさんも言っていますが、
>※なお、この mref x, 2 で現在番号を得るという技巧は、わりと“黒い”ので注意。
> なんでそうなるのか? と聞かれても「そうなるからそうなるんだ」としか言えないたぐいのもの。
なんですよ。
レノスさんの後半は大変参考になると思います。(読んでいるでしょうけども。)
まあ、"にんじんの種"っていうグループ?くくり?オブジェクトを作ってですね、
その情報をモジュール変数「作物モジュール変数」に入れとくんですよ。
で、管理番号として「作物番号」をオブジェクト(作物)ごとにひとつずつ発行して、
それを管理するときに使うんです。
「にんじんの種」っていうオブジェクトというよりは、
管理番号で管理されたオブジェクトを作って、
そのなかに作物名もデータとして入れるわけですけども。
そのデータってのは
#module 作物モジュール 作物名, 収穫物名, 収穫物種類数
にあるわけであります。
一つの作物に対して「作物名」,「収穫物名」,「収穫物種類数」というみっつのデータを入れることにしています。
管理番号については、(わかれば、ですが)ウィンドウメッセージなども似てるかもしれませんね。見かたによっては。
#define WM_KEYDOWN 0x0100ですが、
WM_KEYDOWNなんてのはわかりやすくしただけで、中身はただの0x0100という数です。
管理番号というただの数を、「にんじんの種」という名の変数に入れて、
いかにも「にんじんの種」というくくりに見せてますよね。
と、話がそれたかもしれませんが。
;収穫物追加
#deffunc 収穫物追加 int _作物変数, int _収穫物番号
_収穫物追加 作物モジュール変数(_作物変数), _収穫物番号
return
;収穫物追加モジュール
#modfunc _収穫物追加 int _収穫物番号
収穫物番号(収穫物種類数) = _収穫物番号
収穫物種類数 ++
return
は、収穫物追加命令(deffuncのほう)、が実行されて、
作物モジュール変数(_作物変数)をデータに_収穫物番号命令(modfuncのほう)を呼んでます。
deffuncのほうの命令で、データとして「作物モジュール変数(_作物変数)」を渡すといってますから、
modfuncのほうの命令の中の「作物名」,「収穫物名」,「収穫物種類数」はそのデータにアクセスすることになります。
収穫物追加命令に、変数「にんじんの種」,変数「普通のにんじん」を渡したとすれば、
(すなわち「収穫物追加 にんじんの種,普通のにんじん」とすれば、)
deffuncは「にんじんの種」の内容の管理番号が「作物モジュール変数」の配列に入ることによって
modfuncは「にんじんの種」のデータを手にすることができます!
何度も言うようですが、
#deffunc 収穫物追加 int _作物変数, int _収穫物番号
と宣言されてはいますけども、第一引数の「_作物変数」とは名ばかりで、しょせん「int」つまり数値です。
モジュールを利用する側にとっては、「変数」のほうが分かりやすく使えるでしょうが、
モジュールを理解するときには、ただの「数値」としてみてもらったほうが理解しやすいんじゃないかなと思います。(多分。)
前の私のレスよりはずっとわかりやすくかけたつもりなんですが。
でも、もしかしたらこのレスは逆効果になるかもしれません。
もしもこのレスを何回か読んでどんどんとこんがらがるようなら、
どうぞこの内容はすっかり忘れてください。
間違った理解をさせてしまうような気がして。。。

| |
|
2011/9/30(Fri) 21:53:56|NO.41853
んー。読み返してみたらやっぱりわかりにくいかも。。
>deffuncは「にんじんの種」の内容の管理番号が「作物モジュール変数」の配列に入ることによって
>modfuncは「にんじんの種」のデータを手にすることができます!
日本語としておかしい気が。
deffuncが変数「にんじんの種」の内容の管理番号を、配列モジュール変数「作物モジュール変数」の要素番号にすることによって
modfuncは「にんじんの種」のデータを手にすることができます!
のほうがいいかな。
そしてその取得した「にんじんの種」のデータの中に
「普通のにんじん」の管理番号を入れることによって、
「にんじんの種→普通のにんじん」というふうに関連付けられます。
遅いですが、長文失礼でした。
|
|
2011/9/30(Fri) 22:49:57|NO.41854
>使いこなすにはちょっと早いかもしれませんが、
>挑戦すること自体は、早すぎることはないと思います。
>By たんすさん
超良いこと言いますね。その通りだと思います。
ところで、プログラムを学ぶ場合、最小構成を考えるとうまくいくことが多いです。
最初から全体を把握するのはとても難しいので、
まず、正常に動く最小構成を把握した方が良いかもしれません。
以下にその例を出します。
#module モジュール名 モジュールID
;モジュール生成時に呼ばれる命令
#modinit
mref 現在モジュールID, 2
モジュールID = 現在モジュールID
mes "モジュールID[ " + モジュールID + " ]番のモジュールが生成されたよ。"
return
;モジュール削除時に呼ばれる命令
#modterm
mes "モジュールID[ " + モジュールID + " ]番のモジュールが削除されたよ。"
return
;モジュールのIDを表示する自作命令
#modfunc モジュールID表示
mes "呼ばれたモジュールのIDは[ " + モジュールID + " ]だよ。"
return
#global
モジュール数 = 3
mes "\nここからモジュールを生成するよ。"
repeat モジュール数
newmod モジュール型変数, モジュール名
loop
mes "\nここからモジュール命令を呼ぶよ。"
repeat モジュール数
モジュールID表示 モジュール型変数( cnt )
loop
mes "\nここでランダムにモジュールを1つ削除するよ。"
delmod モジュール型変数( rnd( モジュール数 ) )
mes "\nここから残ったモジュールの命令を全部呼ぶよ。"
foreach モジュール型変数
モジュールID表示 モジュール型変数( cnt )
loop
上記の「モジュール名」モジュールは、モジュール型変数の動作を確認する最低限の機能しか備えていません。
モジュール型変数の生成、命令呼出、削除がなんとなくわかっていただけるのではないでしょうか。
[モジュール数]の値を変えたり、[モジュールID表示]の表示メッセージを変えたりして、
モジュールの扱いに慣れてもらえれば幸いだにゅ。(・ω・)
|
|
2011/10/1(Sat) 22:49:10|NO.41889
皆様、本当にありがとうございます。
お世話になりすぎててすみません。
一つ、お伺いしたいのですが、
ひらまるさんのスクリプト(下の)での、
#module モジュール名 モジュールID
;モジュール生成時に呼ばれる命令
#modinit
mref 現在モジュールID, 2
モジュールID = 現在モジュールID
mes "モジュールID[ " + モジュールID + " ]番のモジュールが生成されたよ。"
return
;モジュール削除時に呼ばれる命令
#modterm
mes "モジュールID[ " + モジュールID + " ]番のモジュールが削除されたよ。"
return
;モジュールのIDを表示する自作命令
#modfunc モジュールID表示
mes "呼ばれたモジュールのIDは[ " + モジュールID + " ]だよ。"
return
#global
モジュール数 = 3
mes "\nここからモジュールを生成するよ。"
repeat モジュール数
newmod モジュール型変数, モジュール名
loop
mes "\nここからモジュール命令を呼ぶよ。"
repeat モジュール数
モジュールID表示 モジュール型変数( cnt )
loop
mes "\nここでランダムにモジュールを1つ削除するよ。"
delmod モジュール型変数( rnd( モジュール数 ) )
mes "\nここから残ったモジュールの命令を全部呼ぶよ。"
foreach モジュール型変数
モジュールID表示 モジュール型変数( cnt )
loop
ここ
mes "モジュールID[ " + モジュールID + " ]番のモジュールが生成されたよ。"
の部分の + モジュールID + はどのようにして導き出されたのですか?
教えてください。
|
|
2011/10/1(Sat) 22:58:05|NO.41890
つまりこれですよね?
mref 現在モジュールID, 2
モジュールID = 現在モジュールID
> + モジュールID + はどのようにして導き出されたのですか?
mrefの第二引数に2を与えて取得した値を代入して導き出しました、としか答えようがないです。
|
|
2011/10/1(Sat) 23:23:12|NO.41891
NO.41804でレノスさんが解説されていますが、
mref 現在モジュールID, 2
モジュールID = 現在モジュールID
の行で、「現在モジュールID」に現在のモジュールIDが代入されており、
その後「モジュールID」に「現在モジュールID」が代入されています。
この「モジュールID」は、モジュールの宣言部分、
#module モジュール名 モジュールID
でモジュール変数として定義されているので、
個別の変数として保持することができています。
そしてこのモジュールIDがなぜ、mref 現在モジュールID, 2で割りだせるのかというと、
理由はわかりません。なぜか取得できるのです。
mrefで取得しておきながらもう一度モジュールIDに代入している理由も、レノスさんが解説しています。
重要なのは、モジュールIDでモジュールが管理できるというところです。
だいぶ理解してきたようなので、モジュールの扱いに慣れるのも近いかもしれません。頑張りましょう(・ω・)
(眠くて締めが適当になってるにゅ。)
|
|
2011/10/2(Sun) 11:01:35|NO.41898
なるほど、
全部繋がってたんですね。
またまた疑問なのですが、
mref 現在モジュールID, 2
の 2 という数字はどのような基準で決めたのですか?
0~7だったら、何でもいいってことではないのですか?
教えていただけないでしょうか
|
|
2011/10/2(Sun) 11:35:38|NO.41900
さっきのスレでは、mrefに2で取得できるというのを知ったのは
このスレでもモジュールを書いているひらまるさん、
それからinfoさん、ORZさん、木村さんと多数だったようですねw
私もその一人だったわけですが。
OpenHSPあたりを探ればわからないこともないのかもしれませんが。
HSP2時代は命令/関数の引数をmrefで取得してたようですが、何か関係あるんでしょうかね。
mrefの0,1,2には数値が入ってるようですが、あとは全部0でした。
0,1,2それぞれで値は違いました。
|
|
2011/10/2(Sun) 11:38:57|NO.41901
じゃあ、ここは2だと覚えたほうがいいかもしれませんね
ありがとうございました
|
|
2011/10/2(Sun) 12:08:33|NO.41904
;モジュール生成時に呼ばれる命令
#modinit
mref 現在モジュールID, 2
モジュールID = 現在モジュールID
mes "モジュールID[ " + モジュールID + " ]番のモジュールが生成されたよ。"
return
ここが
結局、わからなくなるんですよね……
現在モジュールID と モジュールIDは変数ですよね?
現在モジュールIDには2が入るのではないですよね?
|
|
2011/10/2(Sun) 12:26:38|NO.41905
こういうのは、概念は日常生活、スクリプトは身近な具体例にするとわかりやすい。
最近は学校でも『消しゴムスタンプ』なるものが流行っているそうだ。おっさん達には芋版の方が馴染みがあるかもしれないな。
モジュール機能というのは、そのスタンプを作る事に相当する。ただのスタンプじゃなくて動くスタンプだが。
一番最初の方で、変数やモジュールを定義しておくと、それがスタンプになるわけだ。
そして後の方でnewmodすることで、いくらでも同じものをペタペタと生み出す事が出来るようになる。
スタンプがインクの色を変えれば絵の色も変わるのと同じで、newmodの度に変数の中身を変えてやれば
『絵としては同じだが、ちょっと色が違うモノ』をいくらでも作る事が出来るようになる。これが重要だ。
絵、というのは形だ。プログラムでは持つデータの種類や数に相当する。
具体的な例でいえばRPGの装備品、剣とかだな。例えば剣は必ず『名前、攻撃力、値段』をデータとして持っているので
『剣モジュール』とでも称して、name,attack,goldという変数を持たせておく。これスタンプの形ね。
そしてnewmodするときに、nameに銅の剣、とか、はかぶさの剣、とかを入れてやるだけだ。これが色決め。
形としては剣だが、それぞれちょっと違う物がいくらでも作れる事が分かるだろう。
第一部完
|
|
2011/10/2(Sun) 12:40:03|NO.41906
TSU氏が何を悩んでるって、最初にmrefを使うなぞというある種難解なサンプルを見てしまったからに尽きる。
自分の番号はそりゃ知りたいが、そんなものは使いこなせるようになってから覚えればいい。
初心者にモジュール機能は不要、モジュール機能の理解にmrefなど不要。従ってmrefは初心者にはとても不要。
なのでmrefの事は現在は脳味噌から消し去っても問題ない。
#modinitというのは、『今から押すスタンプの色をどうしようかな』という時に使う。
newmodを使うと、自動的にmodinitの部分へジャンプする。なのでこの部分には
自分はある物のスタンプであるが、他と違う個性、を設定する処理を書く。自分は形は隣のスタンプと一緒だが
色は青なんだよ、という事を覚えこむような処理が望ましいな。
mrefというのは、基本的には『自分が何個目に押されたスタンプであるか』を取得しているにすぎない。
先の剣モジュールの例では、name,attack,goldという形=変数がスタンプとして定義されているので
#modinitに
name=modinitから渡される武器の名前
attack=同じく攻撃力
gold=同じく値段
という風に書く事で、そのスタンプは形は剣だが、個性を持つ事になる。他の人が書いたmesは
動作した時にmodinitが呼ばれるタイミングを視覚的に理解するために付け加えられた不純物で
本来は必要ないぞ。
独習C++とかでも沢山用いられるが、この間Javaのコードでコンストラクタにダイアログを出す処理を
書いたまま提出してきた大○○に遭遇したのでボクは薦めない。ちなみにこれは愚痴だから君には関係ないぞ。
第二部完
|
|
2011/10/2(Sun) 21:35:33|NO.41929
要領はわかりました!
ただ、
やっぱり不明ですね
|
|
2011/10/2(Sun) 23:57:06|NO.41932
理解できない事に時間を費やしても仕方がありません。
ORZ氏の言う通り、無理に覚える必要はない機能です。
今は、現状のやり方で作りましょう。
中途半端な知識で使うと泥沼にハマります。
|
|
2011/10/3(Mon) 00:30:11|NO.41934
そういうこと。最近ゲーム作ってるか? 勉強だけで手を付けてないだろ?
勉強も大事だがツマンネーだろ? ゲーム作ろうぜ。もしかしたらそのうちレベルが上がって
知らず知らずのうちに会得出来ているかもしれないしな。
|
|
2011/10/3(Mon) 16:10:47|NO.41943
ですかね。
作りたいんですけど、
そのレベルもまだまだでして……
|
|
2011/10/3(Mon) 18:02:53|NO.41951
むぅ…やはり難しい概念なのでしょうか…。
自分は小学生くらいの頃にRPGツクールで遊んでいて、
中学生くらいのときにTonyuSystemで遊んでいたので、
オブジェクト指向は知らない内に身についていました。
だからこそHSPのモジュール機能を見つけたときは、
「なにこれ超便利じゃん! なんで誰も教えてくれなかったの!(><)」と思ったものです。
しかしそうですね…もしかしたら最初から理解するのは難しい概念なのかもしれませんね…
とはいえ、こういった便利なものがあると知れただけで収穫なのか…
せっかくだから習得してしまった方がお得なのか…
それはTSUさんが決めることなのでしょうね。
いきなりモジュール型変数とか言い出して、混乱を招いてしまいすみません;
自分はモジュール型変数の機能を知らなかった時期を非常にもったいないと感じていたので、
最初から覚えてしまった方がお得というイメージを持っていました。
しかし本来、面白いゲームを作るのに手段は一切関係ありません。
TSUさんのように、たまにプログラムを見直すことが大切なのだと思います。
|
|
2011/10/3(Mon) 20:29:51|NO.41963
>ひらまるさん
最初から理解するのは難しい概念なのだとしても、
僕は少しでも今のうちに習得しておきたいです!!
ただ、
今の僕の理解力では理解できないのかもしれません。
しかし 僕としては習得しておきたいのです。
>いきなりモジュール型変数とか言い出して、混乱を招いてしまいすみません;
確かに初めのほうは分かりませんでしたが、
今はわかります。
大丈夫です!!
謝らないでください。
HSP初心者で知識も殆どありません。
この僕の相手をしてくださるのなら、してください。
お願いします。
|
|
2011/10/3(Mon) 20:43:35|NO.41964
スレの流れが少々変わってきたようなので、
質問者様のほか回答者様に対しての失礼も承知で言わせていただきます。
とりあえずここまでの優しい皆様方の丁寧な説明での理解が困難なようでしたら、
モジュールは恐らく質問者様の身の丈にあった技術とは言えないでしょう。
モジュールは便利ですが、プログラミングに必ずしも必要な技術ではありません。
皆様がおっしゃるとおり質問者様が理解のしやすい他の方法での開発をおすすめ致します。
|
|
2011/10/3(Mon) 21:07:39|NO.41966
てれてれさんの言うことも一理ありますね。
しかしまぁ、TSUさんのやる気は続いているようですし、
私も仕事の合間に構ってもらえるのが嬉しいので、
TSUさんが求める限りは付き合いますよ。
しばらく話が脱線していましたが、モジュールの説明を再開させていただきましょうか(・ω・)
(無駄な脱線だったとは思いません)
とりあえず、TSUさんがどのくらいモジュールを理解したのか、
「モジュールってこんなもん」みたいな説明をしてみてください。
その後足りないところ、間違っているところを補っていきたいと思います(・ω・)
|
|
2011/10/3(Mon) 21:49:58|NO.41971
>てれてれさん
僕もそう思います。
ぜんぜん身の丈にあってません。
でも、ここまで教えていただいたので
「やーめた」と諦めれば皆さんに失礼だと思うんですよね。
それに僕も覚えたいですし……
>ひらまるさん
えっと……
モジュールで自作命令が作れる。
モジュールには名前も付けれて、変数も持たせることができる。
newmod命令でその変数に値を代入できる。
モジュールの中と外では変数の値が違う。
こんな感じですか?
|
|
2011/10/3(Mon) 23:16:38|NO.41976
>TSUさん
そうですね。ほとんど合っています。
今までのモジュールサンプルにコメントが非常に少ないと思ったので、
コメントてんこ盛りのサンプルを用意しました。
#module 人物モジュール 名前
//①-①
;新しい人物を生成する命令。
;生成した人物のモジュールIDを、引数とした「_モジュールID」変数に返す。
#deffunc 新規人物 var _モジュールID
;「人物モジュール」という名前のモジュールを生成して、「人物モジュール型変数」という変数に格納する。
;実際は「人物モジュール型変数」は配列になっていて、生成したモジュールは「人物モジュール型変数( モジュールID )」に格納されている。
;newmod命令を使うと、「人物モジュール型変数」配列の空いているところを探して自動的にモジュールを格納してくれる。
newmod 人物モジュール型変数, 人物モジュール, _モジュールID
return
//①-②
;上の新規人物命令でnewmod命令が呼ばれることによって呼ばれる命令。
;生成したモジュールのIDを、引数とした「_モジュールID」変数に返す。
#modinit var _モジュールID
mref 現在モジュールID, 2 ; mref 変数, 2 でモジュールIDが取得できる理由は不明。
_モジュールID = 現在モジュールID ; わざわざ「現在モジュール」という変数を使っているのは、NO.41804でレノスさんが解説している。
return
//②-①
;モジュールに名前を設定する命令。
;「人物モジュール型変数」配列の、「_モジュールID」番目のモジュール型変数に「_名前」で指定された名前を設定する。
#deffunc 名前設定 int _モジュールID, str _名前
_名前設定 人物モジュール型変数( _モジュールID ), _名前
return
//②-②
;モジュールに名前を設定するモジュール命令。
;モジュール変数「名前」に、引数として得た「_名前」を代入する。
#modfunc _名前設定 str _名前
名前 = _名前
return
//③-①
;モジュールにつけられた名前を返す関数。
;「名前取得( モジュールID )」と表記することで、「_名前表示( 人物モジュール型変数( 人物ID ) )」を呼ぶことができる。
#defcfunc 名前取得 int _モジュールID
return _名前取得( 人物モジュール型変数( _モジュールID ) )
//③-②
;モジュールにつけられた名前を返すモジュール関数。
;「_名前表示( 人物モジュール型変数( 人物ID ) )」と表記することで、人物IDにつけられた名前を取得することができる。
#modcfunc _名前取得
return 名前
#global
//①
;モジュール機能を使って、人物A,B,Cというオブジェクトを生成。
新規人物 人物A ; 新しい人物を生成して、人物Aという変数に代入。人物Aという変数の中身は実は「0」という数値。
新規人物 人物B ; 新しい人物を生成して、人物Bという変数に代入。人物Bという変数の中身は実は「1」という数値。
新規人物 人物C ; 新しい人物を生成して、人物Cという変数に代入。人物Cという変数の中身は実は「2」という数値。
mes "人物A,B,Cの中身が実は数値であることを表すために変数の内容を表示。"
mes "人物A = " + 人物A
mes "人物B = " + 人物B
mes "人物C = " + 人物C
mes ""
//②
;人物A,B,Cに名前を付けてみる。
名前設定 人物A, "サイクロン"
名前設定 人物B, "ジョーカー"
名前設定 人物C, "エクストリーム"
;上記で説明しているが、人物A,B,Cは実は数値であり、その本質は
;「人物モジュール型変数」配列の何番目であるかという値である。
;「人物A」は「人物モジュール型変数( 人物A )」=「人物モジュール型変数( 0 )」、
;「人物B」は「人物モジュール型変数( 人物B )」=「人物モジュール型変数( 1 )」、
;「人物C」は「人物モジュール型変数( 人物C )」=「人物モジュール型変数( 2 )」のモジュール型変数を表している。
//③
mes "人物A,B,Cに付けられた名前を表示してみる。"
mes "人物Aの名前は、" + 名前取得( 人物A ) + "だよ。"
mes "人物Bの名前は、" + 名前取得( 人物B ) + "だよ。"
mes "人物Cの名前は、" + 名前取得( 人物C ) + "だよ。"
mes ""
mes "人物A,B,Cが数値であることを再確認する。"
mes "人物ID 0 の名前は、" + 名前取得( 0 ) + "だよ。"
mes "人物ID 1 の名前は、" + 名前取得( 1 ) + "だよ。"
mes "人物ID 2 の名前は、" + 名前取得( 2 ) + "だよ。"
mes ""
//④
mes "ここまでの内容は、配列でも可能。"
人物名配列( 0 ) = "タカ"
人物名配列( 1 ) = "トラ"
人物名配列( 2 ) = "バッタ"
mes "人物名配列( 0 )の内容は、" + 人物名配列( 0 ) + "だよ。"
mes "人物名配列( 1 )の内容は、" + 人物名配列( 1 ) + "だよ。"
mes "人物名配列( 2 )の内容は、" + 人物名配列( 2 ) + "だよ。"
mes ""
mes "ではなぜモジュールを使うのか。"
mes "それはモジュールは名前のような1つの値だけでなく"
mes "年齢や体重などといった複数のデータや、"
mes "技リスト、武器リストなどの配列までも同時に保持できるからです。"
このモジュールを改造してでも、1から作るのでも良いので、
「名前だけでなく、年齢、体重も設定、取得できるモジュール」を作ってみてください。
理解はあやふやでも、コピー&ペーストを繰り返して少し内容を変えるだけで、
「機能」だけは作ることができるはずです。そうしている内に理解できることもあると思います。
頑張ってください(・ω・)

| |
|
2011/10/4(Tue) 16:52:47|NO.41987
#module 人物モジュール 名前
//①-①
;新しい人物を生成する命令。
;生成した人物のモジュールIDを、引数とした「_モジュールID」変数に返す。
#deffunc 新規人物 var _モジュールID
;「人物モジュール」という名前のモジュールを生成して、「人物モジュール型変数」という変数に格納する。
;実際は「人物モジュール型変数」は配列になっていて、生成したモジュールは「人物モジュール型変数( モジュールID )」に格納されている。
;newmod命令を使うと、「人物モジュール型変数」配列の空いているところを探して自動的にモジュールを格納してくれる。
newmod 人物モジュール型変数, 人物モジュール, _モジュールID
return
//①-②
;上の新規人物命令でnewmod命令が呼ばれることによって呼ばれる命令。
;生成したモジュールのIDを、引数とした「_モジュールID」変数に返す。
#modinit var _モジュールID
mref 現在モジュールID, 2 ; mref 変数, 2 でモジュールIDが取得できる理由は不明。
_モジュールID = 現在モジュールID ; わざわざ「現在モジュール」という変数を使っているのは、NO.41804でレノスさんが解説している。
return
//②-①
;モジュールに名前を設定する命令。
;「人物モジュール型変数」配列の、「_モジュールID」番目のモジュール型変数に「_名前」で指定された名前を設定する。
#deffunc 名前設定 int _モジュールID, str _名前
_名前設定 人物モジュール型変数( _モジュールID ), _名前
return
//②-②
;モジュールに名前を設定するモジュール命令。
;モジュール変数「名前」に、引数として得た「_名前」を代入する。
#modfunc _名前設定 str _名前
名前 = _名前
return
//③-①
;モジュールにつけられた名前を返す関数。
;「名前取得( モジュールID )」と表記することで、「_名前表示( 人物モジュール型変数( 人物ID ) )」を呼ぶことができる。
#defcfunc 名前取得 int _モジュールID
return _名前取得( 人物モジュール型変数( _モジュールID ) )
//③-②
;モジュールにつけられた名前を返すモジュール関数。
;「_名前表示( 人物モジュール型変数( 人物ID ) )」と表記することで、人物IDにつけられた名前を取得することができる。
#modcfunc _名前取得
return 名前
#deffunc 体重設定 int _モジュールID, str _体重
_体重設定 人物モジュール型変数( _モジュールID ), _体重
return
#modfunc _体重設定 str _体重
体重 = _体重
return
#defcfunc 体重取得 int _モジュールID
return _体重取得( 人物モジュール型変数( _モジュールID ) )
#modcfunc _体重取得
return 体重
#global
//①
screen 0,600,600
;モジュール機能を使って、人物A,B,Cというオブジェクトを生成。
新規人物 人物A ; 新しい人物を生成して、人物Aという変数に代入。人物Aという変数の中身は実は「0」という数値。
新規人物 人物B ; 新しい人物を生成して、人物Bという変数に代入。人物Bという変数の中身は実は「1」という数値。
新規人物 人物C ; 新しい人物を生成して、人物Cという変数に代入。人物Cという変数の中身は実は「2」という数値。
mes "人物A,B,Cの中身が実は数値であることを表すために変数の内容を表示。"
mes "人物A = " + 人物A
mes "人物B = " + 人物B
mes "人物C = " + 人物C
mes ""
//②
;人物A,B,Cに名前を付けてみる。
名前設定 人物A, "サイクロン"
名前設定 人物B, "ジョーカー"
名前設定 人物C, "エクストリーム"
体重設定 人物A, "50kg"
体重設定 人物B, "60kg"
体重設定 人物C, "70kg"
mes "Aの体重は、" + 体重取得( 人物A ) + "です。"
mes "Bの体重は、" + 体重取得( 人物B ) + "です。"
mes "Cの体重は、" + 体重取得( 人物C ) + "です。"
mes ""
;上記で説明しているが、人物A,B,Cは実は数値であり、その本質は
;「人物モジュール型変数」配列の何番目であるかという値である。
;「人物A」は「人物モジュール型変数( 人物A )」=「人物モジュール型変数( 0 )」、
;「人物B」は「人物モジュール型変数( 人物B )」=「人物モジュール型変数( 1 )」、
;「人物C」は「人物モジュール型変数( 人物C )」=「人物モジュール型変数( 2 )」のモジュール型変数を表している。
//③
mes "人物A,B,Cに付けられた名前を表示してみる。"
mes "人物Aの名前は、" + 名前取得( 人物A ) + "だよ。"
mes "人物Bの名前は、" + 名前取得( 人物B ) + "だよ。"
mes "人物Cの名前は、" + 名前取得( 人物C ) + "だよ。"
mes ""
mes "人物A,B,Cが数値であることを再確認する。"
mes "人物ID 0 の名前は、" + 名前取得( 0 ) + "だよ。"
mes "人物ID 1 の名前は、" + 名前取得( 1 ) + "だよ。"
mes "人物ID 2 の名前は、" + 名前取得( 2 ) + "だよ。"
mes ""
//④
mes "ここまでの内容は、配列でも可能。"
人物名配列( 0 ) = "タカ"
人物名配列( 1 ) = "トラ"
人物名配列( 2 ) = "バッタ"
mes "人物名配列( 0 )の内容は、" + 人物名配列( 0 ) + "だよ。"
mes "人物名配列( 1 )の内容は、" + 人物名配列( 1 ) + "だよ。"
mes "人物名配列( 2 )の内容は、" + 人物名配列( 2 ) + "だよ。"
mes ""
mes "ではなぜモジュールを使うのか。"
mes "それはモジュールは名前のような1つの値だけでなく"
mes "年齢や体重などといった複数のデータや、"
mes "技リスト、武器リストなどの配列までも同時に保持できるからです。"
体重をつけてみたのですが、
全員の体重が Cさんと同じになってしまいます。
あれ?
体重設定 , "70kg"
で実行してみても70kgのままになってます。
どうしてなんでしょうか?
教えていただけないでしょうか

| |
|
2011/10/4(Tue) 18:15:00|NO.41991
ひらまるさんではありませんが回答させていただきます。
>体重設定 , "70kg"
>で実行してみても70kgのままになってます。
命令のところはあってますが、ORZさんの例でいうスタンプの型作りが途中で終わってます。
要素として"体重"をそれぞれ持つように書いてないので、全員の体重を一括書き換えしてしまってます。
というのは、#moduleのあとにモジュール変数として「体重」が書かれていないためです。
#module 名前,体重
としてやればちゃんと動くはずです。
|
|
2011/10/4(Tue) 19:21:02|NO.42001
>Cookiesさん
解説ありがとうございます。
ここまで作れたのなら、モジュールの恩恵を半分以上得られたことになります。
これでTSUさんは、
「いろんな型の変数や配列を、モジュールIDという1つの変数で管理する」ことができるようになりました。
もう半分はnewmod delmod foreachによる、生成、削除、列挙の処理でしょうか。
今ちょっと忙しいのでこれについては後で寝る前にでも書きます。
ともあれ、今回体重の設定と取得を作ったことで、
作物の名前や収穫物もこのようにして作れるということがなんとなくわかってきたのではないでしょうか。
少し理解が進んだと思ったら、今までのモジュールを読み返してみるのも手です。
わかるようになったところ、まだわからないところを再確認してみましょう。
|
|
2011/10/4(Tue) 20:07:02|NO.42004
>Cookiesさん
ありがとうございます。
無事にできました
これからは気をつけます!!
>ひらまるさん
これが1つの変数で管理するという事なのですね。
だんだんとわかってきました。
作物モジュールにも少し手を出してみようと思います。
|
|
2011/10/5(Wed) 16:07:40|NO.42031
投稿がちょっと遅れちゃったかな。
前回はモジュール型変数によって
「いろんな型の変数や配列を、モジュールIDという1つの変数で管理する」
ことをやったけど、モジュールのすごいとこはもう一つ、量産性なんだよ。
んなわけで以下にサンプルを張るよ。今のTSUさんならある程度理解できるんじゃないかな?
#module 泡モジュール x, y, addx, addy, size, R, G, B
//==========モジュールの生成==========
#deffunc 新規泡
;泡モジュールという名前のモジュールを生成して、泡モジュール型変数という配列の空いている場所に格納する。
newmod 泡モジュール型変数, 泡モジュール
return
//==========モジュールの初期化==========
#modinit
x = rnd( ginfo_sx ) ;泡の初期X座標
y = rnd( ginfo_sy ) ;泡の初期Y座標
addx = 0.0 ;泡の初速度X
addy = 3.0 ;泡の初速度Y
size = 10 + rnd( 50 ) ;泡の半径
R = rnd( 256 ) ; 泡の色 赤要素
G = rnd( 256 ) ; 泡の色 緑要素
B = rnd( 256 ) ; 泡の色 青要素
return
//==========全モジュールの動作==========
#deffunc 泡全移動
;泡モジュール型変数配列の要素分ループする(delmodによって削除された分は自動的に除かれている)
foreach 泡モジュール型変数
;泡モジュール型変数配列のcnt番目に格納されているモジュールに対して、泡移動命令を行う。
泡移動 泡モジュール型変数( cnt )
loop
return
//==========個別モジュールの動作==========
#modfunc 泡移動
;泡移動加速度加算
addx += 0.1 *( -3 + rnd( 7 ) )
addy -= 0.1
;加速度分移動
x += addx
y += addy
//==========モジュールの削除==========
;Y座標が半径より小さくなったら
; = 泡がウィンドウの上端にぶつかったら
if y < size {
;(thismod = このモジュール)を(delmod = モジュール削除)する。
delmod thismod
}
return
//==========全モジュールの描画==========
#deffunc 泡全描画
;泡モジュール型変数配列の要素分ループする(delmodによって削除された分は自動的に除かれている)
foreach 泡モジュール型変数
;泡モジュール型変数配列のcnt番目に格納されているモジュールに対して、泡描画命令を行う。
泡描画 泡モジュール型変数( cnt )
loop
return
//==========個別モジュールの描画==========
#modfunc 泡描画
color R, G, B ;R,G,Bの色で
circle x - size, y - size, x + size, y + size, 0 ; 半径sizeの円を、X,Yの位置から描く。
return
//この画面更新はモジュールとは関係なく、ただなめらかな描画をするための命令。
#deffunc 画面更新
redraw 1
redraw 0
color 255, 255, 255
boxf
await 1
return
#global
//メインループ
repeat
新規泡
泡全移動
泡全描画
画面更新
loop
モジュール型変数を使うと、こんな風に大量のオブジェクトを惜しげもなく生成、削除することができるんだよ。
生成のためのnewmodは今までもいっぱいやったけど、
foreachとdelmodには触れてなかったから、その辺に注意すると良いよ。
あと知ってると思うけど、わからない命令にカーソルを合わせてF1キーを押すとヘルプが出るよ。
今ならこのヘルプもだいぶ理解できると思うから活用してみるといいよ。

| |
|
2011/10/5(Wed) 20:19:30|NO.42042
>ひらまるさん
全体的な流れや、こう記述してあるからこうなる
というのは分かりました
またひとつ疑問なのですが、
#modfunc 泡移動
;泡移動加速度加算
addx += 0.1 *( -3 + rnd( 7 ) )
addy -= 0.1
;加速度分移動
x += addx
y += addy
泡移動加速度加算では泡の移動速度
加速度分移動では泡の移動距離
を表しているのですよね??
間違っているでしょうか?
|
|
2011/10/5(Wed) 20:25:43|NO.42044
>泡移動加速度加算では泡の移動速度
>加速度分移動では泡の移動距離
>を表しているのですよね??
そうですね。モジュール機能とは直接関係ありませんが、ゲームではよく使う方法だと思います。
この泡も初速度としてaddYに3.0を代入しているので、最初は下に向かって1フレーム3.0の速度で進みます。
しかし1フレームごとにaddYは-0.1されているので、下に行く勢いが少しずつ弱まり、最終的には上に向かって進んで行きます。
余談ですがこうした、「一旦後ろに引いてから動くとそれらしく見える」っていうのはディズニーが発見したらしいですよ(・ω・)
|
|
2011/10/5(Wed) 20:48:36|NO.42045
>ひらまるさん
へぇ~
そうなんですか
全然知りませんでした。
為になります!
#module サッカー選手モジュール 名前
#deffunc 新規選手登録 var _モジュールID
newmod 選手モジュール型変数, サッカー選手モジュール, _モジュールID
return
#modinit var _モジュールID
mref 現在モジュールID, 2
_モジュールID = 現在モジュールID
return
#deffunc 名前設定 int _モジュールID, str _名前
_名前設定 選手モジュール型変数( _モジュールID ), _名前
return
#modfunc _名前設定 str _名前
名前 = _名前
return
#defcfunc 名前取得 int _モジュールID
return _名前取得 ( 選手モジュール型変数( _モジュールID ) )
#modcfunc _名前取得
return 名前
#global
新規選手登録 人物A
新規選手登録 人物B
名前設定 人物A, "あいうえお"
名前設定 人物B, "かきくけこ"
mes "人物 A,B につけられた名前を取得"
mes "人物Aの名前は、" + 名前取得( 人物A ) + "です。"
mes "人物Bの名前は、" + 名前取得( 人物B ) + "です。"
stop
ひらまるさんのスクリプトを横に見ながら自分で書いてみたのですが、
18行目でエラーが出てしまいます。
なぜなのか教えていただけないでしょうか
お願いします
|
|
2011/10/5(Wed) 21:58:52|NO.42047
うわ間違って投稿中に更新ボタン押しちゃった!!!
だからいつもはテキストエディタで書いてからコピペして投稿するのに今日に限って……ORZ
まぁいいや 書きなおすからちょっと待ってて;
|
|
2011/10/5(Wed) 21:59:10|NO.42048
>18行目でエラーが出てしまいます。
いくら命令名を日本語にしたからって、命令と引数の区切りを全角スペースにしちゃダメですよ。
「_名前設定」の次が全角です。グローバル領域の名前設定についても。
しかしそうすると5行目でエラーが出ますねぇ。。。確かに変数は指定されてるんですが。
デバッグウィンドウを見てみると、変数タブの変数「選手モジュール型変数」の変数名が、
「選手モジュール型変数@サッカー選手モジュー」と切れてました。
試しにモジュール名を「サッカー選手モジュー」、
ついでに5行目のnewmodの第二引数もそうしてみたところ、ちゃんと動きました。
HDLの項目「#module」において、
>モジュール名は、18文字以内の長さで他の変数名などのキーワードと重複することはできませ>ん。
とあります。
これに引っかかってるのかなぁ。
でも「サッカー選手モジュー」ってバイト数だと18超えるけど文字数だと越えませんよね。
だいたいが18バイトじゃなくて20バイトだし。
|
|
2011/10/5(Wed) 22:09:33|NO.42051
一回書いた内容をもっかい書く気力はないから要点をまとめるよ
(そのほうがわかりやすいからそうしてとか言わない
まず、エラーの原因は全角スペース。
半角スペースは記号として扱われるけど、全角スペースは文字として扱われるのが原因。
対処法というか予防法として、HSPスクリプトエディタの
「ツール」→「オプション」→「表示」→「全角スペース」をオンにすると、
全角スペースが視覚的に表示されてエラーの原因を見つけやすくなるよ。
それともう一つ、かなり重要なのが、
モジュール名は半角20文字、全角10文字を越えるとエラーになるってこと!
しかもエラー内容が「モジュール名が長すぎます」とかじゃなくて、
newmodしたときに「モジュール変数が指定されていません」とかいうよくわからないエラー!!
ちなみにモジュールを指定するときにモジュールを変数を指定しなくても同様のエラーが出ます。
○「#module モジュール名 モジュール変数」
×「#module モジュール名」
この辺は完全にHSP独自の仕様です。私もたまにひっかかります;
あと内容を書きなおしている間にCookiesさんに回答されてしまったのも悔しいです。
悔しいです(`皿´)ww
|
|
2011/10/5(Wed) 22:13:08|NO.42052
>>ひらまるさん
ごめんなさいです。。
いつもこの投稿欄に書いて、書き終わってから全部切り取って更新し、
新規投稿がないか確認してからやっているのですが。。
少し文章を手直ししてる間に…
20秒の差でしたね。
>「ツール」→「オプション」→「表示」→「全角スペース」をオンにすると、
初めて知りました。
実は全角スペース問題を発見するのにずいぶん手間取ってしまいましたよ。
これから試したいと思います。便利そうですね。
(よし、ひらまるさんから投稿はないな。)
|
|
2011/10/5(Wed) 22:19:23|NO.42053
>Cookiesさん
>ひらまるさん
お二人とも回答・解説ありがとうございます。
全角が文字扱いされるとは……
対処法、使わせていただきます。
文字数の制限があるとは、
しかも全角10文字までって少なくないですか!!
もうっ!!
まぁ、
なんとか少しは使いこなせているでしょうか?
こんな感じでいいですかね
|
|
2011/10/5(Wed) 22:40:15|NO.42055
>(よし、ひらまるさんから投稿はないな。)
> by Cookiesさん
いやそこまで神経質にならなくても(笑ω笑
>なんとか少しは使いこなせているでしょうか?
> by TSUさん
そうですね。かなり進歩したと思います。
農業ゲームならば、
作物モジュール
農具モジュール
農地モジュール
などの様々なモジュールが必要だと思います。その際に、
「作物には名前と植えたときに収穫できるものと…あと植えられるかどうかのフラグも必要だな…」
「農具には名前と…耐久度? あとは使用できる場所とかも保持するか? それとも使用できる場所に行くと農具を持っているかどうか判定するか…」
「農地は広さや土の質を農地ごとに設定したら面白いかもしれないな…育ちやすい作物の一覧とかがあっても良いかもしれない…」
などといった仕様を思いつくこともあると思います。
今までは配列で頑張って管理していたものを、モジュールIDで管理すると、なんかすっきりしてわかりやすい気がしませんか?
いろんなものをモジュール化して、ゲーム開発に役立ててみてください。
質問があればいつでも受け付けますが、現状、モジュールの使い方は大方理解できたと思います。
あとは数やって経験ですね。少しずつ効率的な使い方ができるようになると思います。
しかしHSP初心者でモジュール型変数が使える人はおそらく少ないと思うので(私も数年間存在すら知りませんでした)
TSUさんは一歩リードという感じでしょうか。これからも頑張ってください。
そしてあわよくば、いつか面白いゲームをプレイさせてください(ーωーb
|
|
2011/10/5(Wed) 23:03:39|NO.42056
ひとりごとです。
モジュール変数って、データベースっぽいですね。
|
|
2011/10/5(Wed) 23:07:00|NO.42057
>ひらまるさん
モジュールって便利!
って実感しました。
もっともっとたくさんのモジュールを作って慣れたいと思います。
まだまだ未熟者なので、またご質問させていただくことがあるかもしれません
その時はどうぞよろしくお願います。
「人は「考え方」を手に入れたとたん、頭が良くなる生き物である。
君にできないはずはない。」
今なら分かる気がします。
回答を下さった皆さんありがとうございました。
[解決]とさせていただきます。
本当にありがとうございました。
|
|
2011/10/5(Wed) 23:33:40|NO.42061
>モジュール変数って、データベースっぽいですね。
そうですねぇ。
変数や定数を格納できる構造体のようにも使え、
メソッドや関数を定義できるクラスのようにも使え、
しかし継承やメンバの概念がない、まさしくモジュール的な機能ですねぇ…
|
|
2011/10/6(Thu) 00:00:13|NO.42062
個人的にはメンバ変数をモジュール名の後ろに定義していく仕様はfxxkinだと思うんだがその辺
他の人はどう思っているのか気になる。
|
|
2011/10/6(Thu) 01:56:49|NO.42066
モジュール変数(メンバ変数)が増えれば増えるほど1行が長くなるのはfucxxxですよね…;
HSPのモジュール機能は
変数が全てprivateで、モジュール命令や関数を使わないとアクセスできなかったり、
命令や関数が全てstaticで、モジュールごとに別の名前をつけなくちゃならなかったり、
柔軟性の無さはウルトラ級ですが、インタプリタ言語にこうした機能があるだけ感謝すべきなのか…う~ん……
|
|
2011/10/6(Thu) 20:15:27|NO.42074
ここまでやるならHSPの意味無いなぁと思ったり
|
|
2011/10/6(Thu) 21:39:19|NO.42075
あの……
まだここにも質問を書いてもいいのでしょうか?
どなたかがこのスレを見ているならば回答をお願いしたいです。
モジュールを書いていると、どうしても長くなってしまいます
これは何とかできますか?
ネットで調べてみると、include がなんとか……って書いてあったのですが
うん??
となります
見ていらっしゃる方がいましたら
教えていただけないでしょうか
よろしくお願いします
|
|
2011/10/7(Fri) 00:09:47|NO.42079
モジュールを書いたスクリプトを、保存。
例として CharacterDataBase.as とする。
それと同じフォルダが有るスクリプトに。
#include "CharacterDataBase.as"
の様に記述すると、一つのスクリプトの様に結合される。
もちろん、そこで定義されている
変数、ラベル、自作関数を呼び出すことも可能。
#include プリプロセッサ命令 の 引数は フルパスの指定も可能。
// 例
#include "c:\\program files\\hsp321\\common\\user32.as"
スクリプトが長くなりすぎると、可読性とかがアレなので。
長いスクリプトは、#include で結合することをお勧めします。
|
|
2011/10/7(Fri) 16:46:08|NO.42086
>infoさん
ありがとうございます
|
|