[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 03/15 23:49 / Filesize : 242 KB / Number-of Response : 657
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【2D】ゲーム作成ツールGameMaker part3【マンセー】



1 名前:名前は開発中のものです。 mailto:sage [2008/05/11(日) 01:41:47 ID:PRhlwPyW]
無料Windows用2Dゲーム作成ツール"Game Maker"について、色々と語り合うスレッドです。

●本家(英語)
 ttp://www.gamemaker.nl/
●GameMaker Japan - 非公式情報サイト(日本語)
 ttp://gamemaker.main.jp/
●初心者向けチュートリアル
 ttp://gamemaker.main.jp/modules/articles/index.php?cat_id=1


前スレ: 【2D】ゲーム作成ツールGameMaker【マンセー】
pc8.2ch.net/test/read.cgi/gamedev/1087068523/

489 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 21:07:21 ID:bzoft8au]
>>488
押す(pressKeyDown)とパワーを貯めて(経過時間で数値を増加)
離す(pressKeyUp)とジャンプ処理

でどうですか?

490 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 22:28:28 ID:8vGbtbAk]


スープーメイリオブロ(英語は発音大事)みたいにしたいなら、
単純に押してる間だけスプライトを移動させていけばいいだろ

491 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 22:38:55 ID:Ib5prIDh]
>>486
親のイベントにあって子のイベントに無い物は、自動で子に引き継がれる。
子と同じイベントにある親のアクションを引き継がせる場合、
その起こしたいイベントの中でCall Parent Eventアクション(GML: event_inherited())を使う。

というわけで、>>486の例だと子のクリエイトのbに2を代入した前でも後でもいいから
親のイベントを呼んでやると、子もa=1を持つようになる。


>>488
ボタンを押した時にジャンプの高さを全て決めるのではなく、
ボタンを押してジャンプさせ、ボタンを離した時に、押してからの長さによって「ジャンプの上昇を止めて落下させる」という考え方がどっかで使われていたと思う。

492 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 22:56:55 ID:23J9ij0M]
>>491
ありがとうございます。
その方法は考えてませんでした。物凄く助かります。

493 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 23:26:08 ID:x//721CN]
範囲内ゼンブのオブジェクトに影響を及ぼすものはどうつくればいいのでしょう?
for(i=0;i<120;i+=1)
{col_body =collision_circle(self.x,self.y-120,i,all,true,true)}
with(col_body)

とすればうまいこと行くかなとおもったのですが一番最初に範囲に入ってきた物が効果を重ねて受けてしまうようでうまくいきません。

配列を使えばいいというのはなんとなくわかるんですがfor(i=0;i<instance_count;i+=1)
col_body[i] =collision_circle(self.x,self.y-120,120,all,true,true)
with(col_body[i])

とするとUnknown variable col_body or array index out of bounds
が出てきます……。根本的に書き方が違うのでしょうか?

494 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 23:45:40 ID:GUH2YmoS]
考え方を逆にして、全部のオブジェクトに対して「自分が範囲内にいるか」調べさせてみよう。
with (all) { // すべてのインスタンスをループ
 if (collision_circle(other.x, other.y-120, 120, self, true, true) { // もし範囲内にいたら
  // 何かする
 }
}

with文の中ではselfとotherの役割が入れ替わることに注意。

495 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 23:51:13 ID:GUH2YmoS]
ってnotmeをtrueにしちゃダメだな。ついでにselfよりidを使った方が安全かもしれない。
ということで2行目は
if (collision_circle(other.x, other.y-120, 120, id, true, false)) {
という感じで。
よく考えたら distance_to_point(other.x, other.y-120)<120 とかでも済むわけだけど。

496 名前:名前は開発中のものです。 mailto:sage [2008/11/29(土) 00:21:19 ID:IHR7UfyX]
>>495
うっほおおお!!!!!
ありがとうございます!!かれこれ一週間ぐらい悩んでたのでスッキリしました!
こんな簡単にいくものだとは……。悔しいですね……;ω;

497 名前:名前は開発中のものです。 mailto:sage [2008/11/29(土) 00:23:52 ID:cPQXEOUA]
>>493
GMのヘルプ
>The Game Maker Language (GML)
>GML Language Overview
>With constructions
の一番下にある例がまさにそれだな。

with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}



498 名前:名前は開発中のものです。 mailto:sage [2008/11/29(土) 01:08:40 ID:IHR7UfyX]
497さんもありがとうございます。いやあ新しい扉が開いたって感じです!

499 名前:名前は開発中のものです。 [2008/11/30(日) 11:51:36 ID:oUNmDB7a]
配列の例えばparts[i]というのがあるとして、
このiの値を取るにはどうしたらよいでしょうか?

500 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 17:50:24 ID:8ZPTNF4x]
>>499
例)partsという配列のi番目の要素を得る方法

parts[4] = 16;
parts[5] = 25;
i = 4;

hoge = parts[5]; // この時点で変数hogeには25という値が代入される
hoge = parts[i]; // この時点で変数hogeには16という値が代入される

i = 5;
hoge = parts[i]; // この時点で変数hogeには25という値が代入される

「iの値を取る」の意味が分からん
上の例で言うと、どういうケースでどの値を取得したいんだろう
配列の基本的な使い方が分からないのか
それとも要素からインデックス値を取得する方法かな

501 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 20:57:30 ID:ICPzjhiz]
i の値を取得するという意味なら

単に i を使えばいいだけ。 i に代入されれば、i が取得したい値そのものなんだから

何も難しいことない

502 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 21:02:36 ID:ICPzjhiz]
i さんに、「あなたはどの値を持っていますか?」なんて聞くようなプログラムなど要るはずがない。
i さんは、関数の中に入れば自分の持ってる値を提出するしかないからだ。

例えば i さんが 5 の値を持っていて
printf(%d, i);
のような仕事(関数)に従事したとする

なら、printfによって 5 という値が勝手に取り出されるだけ

特に今何を持っているのかを教えてもらう必要はない。


503 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 21:38:09 ID:q/jrPCNZ]
この場合、[i]というのは hoge という配列変数の何番目かという事を示している。

i=5だとするならば、hogeという配列の6番目という事をしめしている。
この書き方がされるまえには必ず、i には何らかの数値が代入されている。

よって、上記の氏たちのような返答でしか答えることができない。

というかjavaでもVBでもCでも何でいいので、プログラムのサイト調べておいで。

504 名前:499 [2008/11/30(日) 23:24:15 ID:oUNmDB7a]
えーと…説明不足でした。スイマセン
まずボスを作っていてまず本体となるobj_baseと両手足となるobj_partsがあります。
そしてもう一つobj_controllerがあります。
コントローラーでinst=instance_create(x,y,obj_base)とします、そしてinst.…=…と各変数を定義していきます。
そしてfor(i=0;i<4;i+=1)inst.parts[i]=obj_partsとしました。
パーツは両手足4つありそれぞれスプライトや描画位置が違うのでパーツのステップで
もしbase.parts[i]のiが0なら位置はどこどこ、1ならどこどこと決めるためにiの値を取りたいのです
長々と失礼しました。

505 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 23:54:17 ID:UwyYLNW7]
やはり悩む必要ねえと思うが

506 名前:名前は開発中のものです。 [2008/12/01(月) 00:08:59 ID:RRq5dBO9]
for(i=0;i<4;i+=1)inst.parts[i]=obj_parts
の意味が分からん。どういうつもりでそれを書いているのか。
それだと、parts[0]〜parts[3] まで、obj_parts が代入されるよ。
4つのオブジェクトを配列で管理しようとしているのかもしれないが、
結局右手をあらわす番号、左手をあらわす番号などは自分で決めるもの。
配列を使うのは、ループ使って処理しやすくするためなのだろう?
なら、こうなるはずだ。

for(i=0;i<4;i+=1) {
if (inst.parts[i] == 右手パーツ) {
//右手パーツの処理
} else if (inst.parts[i] == 左手パーツ) {
//左手パーツの処理
}
...
}

if 〜 else if 〜 の文は冗長でよろしくないが、switch文を使うとスマートに書ける。

507 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 00:21:52 ID:LiWv5v7d]
> for(i=0;i<4;i+=1)inst.parts[i]=obj_partsとしました。
これだとすべてインスタンスじゃなくてオブジェクト(obj_parts)への参照になってしまって
区別がつかないと思うけど。inst作った時と同じやり方で
for(i=0;i<4;i+=1) inst.parts[i] = instance_create(x, y, obj_parts)
とかすればいいと思うがどうか。

で、obj_parts自身のイベントの中で、自分が何番目のパーツなのか知りたいってことだよね?
上のやり方で各インスタンスを作った後でiを教えてやればいい。
for(i=0;i<4;i+=1) {
 inst.parts[i] = instance_create(x, y, obj_parts);
 inst.parts[i].number = i;
}

番号に頼らずに、右手・左手・右足・左足それぞれ別オブジェクトにしてしまう手もあるけどね。
上で出てきたParentの考え方を使えばすっきりまとまるはず。



508 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 00:25:03 ID:QQgG8mIq]
for(i=0;i<4;i+=1)inst.parts[i]=obj_parts

4まで数えるので、
inst_parts[0] = obj_parts
inst_parts[1] = obj_parts
inst_parts[2] = obj_parts
inst_parts[3] = obj_parts
inst_parts[4] = obj_parts

obj_partsが右手だったら、5要素全部に右手を代入していることになっている

509 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 02:36:53 ID:dWziD4by]
でも結局パーツごとに処理変数(スプライトとか位置とか)が違うんだったら

辺に端折らずに、それぞれ別個の変数で管理するほうが楽なんじゃない?
基本オブジェクト(胴体)の位置からそれぞれの位置を割り出して
HPなどの共有する値は共有するようにglobalすれば良いだろうし。

510 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 04:46:27 ID:Ekx4hYib]
もしかして、こうしたいんじゃなかろうか。

for(i=0;i<4;i+=1)
{
inst.parts[i] = instance_create(x, y, obj_parts);
inst.parts[i].number = i;
}

こうすることで、
「パーツのステップでもしbase.parts[i]のiが0なら位置はどこどこ、1ならどこどこと決める」
という動作ができる。
このとき、参照するのはiじゃなくnumberな。

511 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 05:08:55 ID:Ekx4hYib]
obj_partsが作られたとき、inst.parts[i]にインスタンスIDが代入される。
パーツのステップで、obj_partsが作られたときに代入したinst.parts[i]のiの値を使って位置を決めたい。
(と解釈した)

……ってことは、それぞれのパーツから見て、iって変わらないよね?
つまり、右手はいつも右手ってこと。
だったら、作ったときにそのiの値をそのパーツに持たせればいい。

というわけで、パーツが作られたとき、そのときのiの値をnumberという名前の変数としてパーツに持たせてみたのが>>510
これで、パーツのステップでnumberを使って位置を決めることで、「iを使って位置を決める」というのと同じ動作ができる。



……ところで、base.parts[i]て何。inst.parts[i]ならまだ分かるが。

512 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 11:26:32 ID:Ekx4hYib]
ってあるぇ? 今よく見てみたら>>507にあるじゃん。
しかも、よく読んでなかったのにnumberって変数の名前まで一致(意図してません)。
もう少し読もうな、俺。('A`)

513 名前:499 [2008/12/01(月) 13:30:41 ID:WFVB4NOy]
なるほど…
ではやっぱり配列の[]内の値をとるシンプルな関数などはないんですね…
やっぱり509氏の言うようにそれぞれ個別の変数を持たせた方がよさそうですね
皆さんいろいろな意見ありがとうございました

514 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 21:04:50 ID:LiWv5v7d]
>>513
やりたいことはわかったけど、「配列の[]内の値をとる」なんて自分用語は
やっぱり誰にも通じないぞ。「配列の要素から添字を調べる」とか
もっと簡単に「検索する」とか言うんだ。

配列の検索自体は難しいことじゃない(ループして調べるだけ)。
そういうスクリプトは簡単に書けるし、ds_listなら関数一発でできる。
ただ、君のやりたいこと実現するのに検索なんて必要ない、
もっと簡単に済む方法がいくらでもあるってだけのこと。

515 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 21:39:31 ID:hPo6+q3F]
指定したサウンドでなく「今鳴っているサウンド」を停止する方法はありますか?

516 名前:503 mailto:sage [2008/12/01(月) 22:44:50 ID:dWziD4by]
>>513
だーかーらー

i を使ってるのはfor文の中でしょ?
でfor文は繰り返す処理する処理で{}の中身を通して処理し、
最後に i++ で i に「+1」するんだ。

for(i=0;i<4;i+=1){中身} は、i の値が4になるまで繰り返す文 なんだ。
ここまではOK?

なので、 i の値はその処理内の実行回数の値である。
i は、そのときの値である。

i にどの数値が代入されてるか調べるには、単に i を見ればいい。

ということだから、プログラムの基本中の基本であり、どっかの解説サイトを見てこいと言ったんだ!!

517 名前:名前は開発中のものです。 mailto:sage [2008/12/01(月) 23:04:58 ID:VAhzR6SY]
>>516
おちつけwfor文がどうとかではなくて
定数定義とか列挙子みたいなことをやりたいんでしょ。たぶん
GMLで使えないけど




518 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 02:15:33 ID:cOR4nM2X]
i の値を取得するのは非常に簡単だから
Hello world レベルだから
実際、Hello world で使ってる関数の中身を数文字変えるだけ。


だから、そんなことで悩む事自体がおかしいのだ。
おかしいので、「そんなこと悩むわけがない、別のことを言いたいのではないか」
と思うし、実際文そのままの意味で取れば「そんなもん、幼稚園児でも出来るぞ」になるわけだ

言い回しがおかしいと答えも出ない

519 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 02:21:18 ID:cOR4nM2X]

なんつうのかな
箱にオモチャを入れました

箱の中身を知る方法ないですか

と聞かれたようなものだ。


開けて見りゃいいじゃねえかよ

箱(変数) を関数に渡す、関数で使うようにプログラムすれば
関数は勝手に箱開けて中身を使う。

それで知ることができる


非常に単純なことだから、悩むなんて誰も思わない。
Cだったら、printfなどの、数字や文字を画面に表示する関数で使って、「見る」だけでいいからだ。

520 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 10:40:55 ID:xezqMnLO]
流されかかってる>>515を拾ってみる。
とりあえず思いついた方法2つ。どちらもGMを使う。

1)全音停止
sound_stop_all()
↑を使えば全部止めることが出来る。
全部止めれば、「今鳴っているサウンド」を停止することができる。

2)確認→停止
sound_isplaying(index)
↑を使って、再生されているかどうかの確認が出来る。
これを使って戻り値がtrueならsound_stop(index)で止める、という方法。
チェックしたいサウンド分だけループさせることで、「今鳴っているサウンド」をピンポイントで停止させる。

521 名前:520 mailto:sage [2008/12/02(火) 11:00:03 ID:xezqMnLO]
>>520
誤)GM
正)GML
orz

522 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 14:41:52 ID:xRaNmqQG]
GMのヤバいところは、ほっておくとサウンドデバイスが増え続けること

ffdshowなどの、1デバイス1デコーダーのデコーダーで見るとわかるが、

音楽鳴るたびにデコーダが増える。
20曲鳴らせば20個のデコーダが用意され、デバイスを閉じても消えないことすらある。



523 名前:名前は開発中のものです。 [2008/12/02(火) 17:06:18 ID:We5UmkXJ]
ゼルダみたいなゲーム作りたいんだけど
お金表示やお金を作ることってできるんですか?(ゼルダで言うルピーみたいな

524 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 17:25:34 ID:Ujq+dWEg]
すごく初歩だと思うが質問させてください。

グラディウスみたいなのを想像してもらえればわかりやすいと思うけど、
自機の移動がうまくいかない。
上下左右それぞれ押したときにその方向に一定の速度を与え、
離したときにその方向の速度を0にしているんだが、
たまに引っかかったように動かなくなることがある。
急に逆方向のボタン(上と下、右と左)を押すとなることが多い。
ちなみに座標を移動させる場合も同じように引っかかる。

どうやったらもっとスムーズに動くんだろう?

525 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 20:58:31 ID:taOqiXBl]
>>523
変数使えば簡単にできるけど
初心者だったらscoreを流用するのがお手軽でおすすめ。

>>524
GMについてくるサンプルか公式のチュートリアルに
1945っていうシューティングがあるから、見て真似してみれば?

キーを下げた時(key press)と上げた時(key release)で制御してると
複数のキーの上げと下げが干渉してそんな不具合が起きやすい。
単に押している間(keyboard)だけ座標を増減させるようにすればすっきりする。

526 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 20:59:02 ID:UFWpQr+3]
>>523
できます。

お金とか敵とかリンクとかはすべて「オブジェクト」という個体表示で考えます。

敵に当たるとダメージの部分を、
お金に触れると(お金が画面から消え)お金単位が増える。

と置き換えます。
どの言語を使っても考え方は同じになります。

527 名前:名前は開発中のものです。 [2008/12/02(火) 21:45:08 ID:We5UmkXJ]
>>525>>526
ありがとうございます。スコア使ってみますね



528 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 22:23:17 ID:uu7fmr/m]
なんか条件式がおかしいと思ったら
xprevious と ypreviousは >>377
>・(now all instances are set to their new positions)
これ以降じゃないと値が保障されないのか。ぬかったわ

529 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 22:42:03 ID:ATORRfCZ]
シミュレーションゲームの練習をしているのですが
範囲の求め方が分かりません。
自分のやり方だと先ず、プレイヤーを選択すると
移動範囲が出るようにはしたのですが、
この出し方がinstance_create(x,y,object)
で出しているのですがこの方法だと
どうすれば障害物の処理が出来るのかが分かりません;
もう一回一から作ったほうがいいのでしょうか・・・
説明が下手で申し訳ありません;

530 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 23:10:09 ID:uu7fmr/m]
自分もシュミレーション作ってるよ
ゲームにもよるけど障害物の処理ってのは避けて通るとかそういうことかな
具体的な状況がよく分からないかも

どこまで移動できるかだけでいいなら
プレイヤーに移動力のような値を持たせて
平地なら-1 砂地なら-2とかやって移動力がゼロ以上なら指定した場所までいけるとかできるけど


531 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 23:15:43 ID:ATORRfCZ]
>>530
仰るとおりです。
障害物をよけて通れるようにしたいのです。

ネットとかで調べるとそのようなやり方を良く見かけるのですが、
如何せんどう組み込めばいいのか分からず;
もう少しヒントを頂けると嬉しいです。
厚かましくてすみません;

532 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 23:21:00 ID:uu7fmr/m]
どういうゲームなのか教えて欲しいかも
たとえばFEやタクティクスのようにターン制なのか
ポピュラスのようにリアルタイムな感じなのか
マップの構造によっても変わってくるし


ていうかシュミレーション・・・これは恥ずかしい誤字だった///

533 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 23:24:40 ID:ATORRfCZ]
FE目指してます。
もう少し粘ってみます。

534 名前:名前は開発中のものです。 mailto:sage [2008/12/03(水) 00:07:38 ID:5ByG7lYo]
例えば、開始時の移動力が10あるとして
     5
     1 6
    4☆2 7 (星の位置がキャラクターだとして)
     3
☆を起点として1、2、3、4を調べ、座標とかかるコストを配列に保存する。
1に起点を移し周囲4マスを調べ、座標とそれまでにかかったコストを保存する。
すでに調べた座標は基本的に記録しないが
1→6 と 2→6のような経路が被る場合、移動コストが軽いほうを保存する。

移動コストが10より小さいものがなくなるまでこの作業を繰り返して
終わったら配列に保存された座標のところを移動範囲として表示すればいいような気がする
FEだったらこんな感じかな

535 名前:名前は開発中のものです。 mailto:sage [2008/12/03(水) 02:03:59 ID:r0U2/w9u]


通れないマップチップは、「通れまへんフラグ」を設定しておく
自分と敵との最短経路を弾き出し、その間に「通れまへん」があれば分岐



536 名前:524 mailto:sage [2008/12/03(水) 17:54:24 ID:XBsb6U76]
>>525
ありがとう、助かりました。

537 名前:名前は開発中のものです。 mailto:sage [2008/12/04(木) 19:42:54 ID:COm9ODRQ]
FEならSRC使うべきだろ常識的に考えて…



538 名前:名前は開発中のものです。 [2008/12/04(木) 19:51:06 ID:wis04ySw]
質問多くてすみません・・・
ゼルダでアイテム画面とかに移動する。というのはRPGのフィールドの位置保存
を使えばできると思ったんだけど、装備した元の位置の主人公のオブジェクト変更
ってできるんですか?


539 名前:名前は開発中のものです。 mailto:sage [2008/12/04(木) 20:23:54 ID:BFQV7gOy]
>>538
「元の位置の」ってのが何指してるのかどうしたいのかわからないけど

主人公の表示アイテムを変える方法としては、

1)アイテムに固有IDを割り振っておく
2)装備してるアイテムIDの画像を表示する

で、いけるんじゃないかな。
もともと表示するのはIDのアイテムで、アイテムが変わったら画像もチェンジする

アイテムごとに画像を用意しなくちゃいけないのは、そもそも当然のことだしね。

540 名前:名前は開発中のものです。 [2008/12/04(木) 20:32:17 ID:hYQrGj00]
はじめまして。
GM初級者です。
早速質問ですが、
複数のインスタンスから
一番別のオブジェクトに近いインスタンスを取得したいのですが、
どうすればいいでしょうか。


541 名前:名前は開発中のものです。 mailto:sage [2008/12/04(木) 21:33:34 ID:BvmV+/Fo]
>>540
質問がややこしくて読み間違えてるかもしれんが
恐らくinstance_nearest(x,y,obj)を探してるんだと思う

例えば、objMikata、objTeki、の2種類のオブジェクトがあるとして
objMikataのインスタンスが9個ある(insMikata1〜insMikata9)
同じくobjTekiのインスタンスが9個ある(insTeki1〜insTeki9)
この時、3番目の味方から最も近い敵は

nearestTeki = instance_nearest(insMikata3.x, insMikata3.y, objTeki);
こんな感じで求められる
詳しい説明や似たような関数はヘルプ参照

542 名前:540 [2008/12/04(木) 22:08:30 ID:hYQrGj00]
>>541
それです!
ありがとうございました。

543 名前:名前は開発中のものです。 [2008/12/05(金) 17:53:46 ID:X+fPv7FO]
>>539
助かりました。
ありがとうございます!

544 名前:名前は開発中のものです。 [2008/12/06(土) 17:02:27 ID:DxqncoX6]
また問題が出ました。
何度も何度もすみません。
敵が全滅したり
味方が全滅したりすると
変数の参照先がなくなり
エラーになります。
解決策はないでしょうか?


545 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 17:49:42 ID:6jDgYk9y]
参照するまえに、存在するか確認する。
存在するなら参照する。しなかったら何もしなくていい。
instance_exists(obj)を使えば存在するかどうかが、
instance_number(obj)を使えば個数がわかる。


546 名前:544 mailto:sage [2008/12/06(土) 18:50:41 ID:DxqncoX6]
ありがとうございます。

547 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 19:09:11 ID:uswEIGEy]
ターン制を自分なりに頑張ってみたのですが、
完成したと思ったらやっぱり色々とおかしかったのでアドバイスをいただきたい次第です


まず敵を用意して、生成時にglobal.bに+1する。

global.aを用意して、1の時主人公が行動できる→何か行動したらa=2にする
a=2になったとき敵達のターンになり、何か行動したら一体につきglobal.bを-1する。
global.b=0になったときa=1にして、現在ルームにいる敵の数をbに代入する


これで作ってみたのですが時々何故かbが0より少なくなったり敵が挙動不審な動きになってしまいます。


その辺りはまだ許容範囲だとしてもう一つ、
・主人公が敵に囲まれているときに相手達のターンになり、敵が攻撃してくる
の際一斉に殴りかかってくるような有様になってしまいます。

そこで現在いるモンスターに何か順番に番号を与えて、たとえば敵Aに1、Bに2、Cに3、Dに4…という具合に。
「global.Nを用意して、主人公が行動、つまりa=2になったらNを1にする
N=1のときAが行動し、bから-1してN=2にする→N=2になったのでBが行動し、bから-1してN=3にする→
N=3のときCが…〜→b=0になったらa=0、N=0にする」

こうすればおそらく順番に行動してくれると思うのですが
(b-=1のタイミングは攻撃や移動などのアニメーション終了時なのでちゃんと順に動くはず)
「現在いる敵に何か順番に『番号』を与える」「Nの値と等しい『番号』を持つ敵が行動し始める」
という処理をどう行えばいいのか分かりません。
敵の数は死んだり新しく出現したりでa=2になるごとに変動してしまうので初めから固定で番号を与えることはできません。


長文かつ分かりにくい文章だと思いますがどうすればよいか分かる方ご教授願います…



548 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 21:06:12 ID:eG4vVrw2]
一般には待ち行列とかキューとか言われる構造を使うと思う。
1. 主人公とすべての敵のインスタンスIDをキューに入れる
2. キューからインスタンスを一つ取り出し、そのインスタンスに行動させる
3. 行動が終わったら2に戻る。キューが空になっていたら1に戻って最初から

具体的にどう実装するかだけど、まずコントローラオブジェクトを一つ用意して
次のように処理させる。
(ds_queue使ってもいいけど、レジストしてないかもしれないので配列で実装してみた)
・Createイベントで以下の変数を用意
global.current_id = noone; // 現在行動しているインスタンスのID(nooneなら誰もいない)
queue_size = 0; // キューの中身の要素数
queue_pos = 0; // キューの何番目まで処理したか
・Stepイベントで次のように処理
if (!instance_exists(global.current_id)) { // 行動しているインスタンスがいない場合
 if (queue_pos >= queue_size) { // キューが空だったら……
  queue[0] = obj_player.id; // 先頭に主人公のIDを入れ……
  queue_size = 1;
  with (obj_enemy) { // 他のすべての敵もキューに入れる
   other.queue[other.queue_size] = id;
   other.queue_size += 1;
  }
  queue_pos = 0;
 }
 // キューから一つ取り出して行動を開始させる
 global.current_id = queue[queue_pos];
 queue_pos += 1;
}

主人公と敵のインスタンスは
・global.current_id == id だったら自分が行動する
・行動が終わったらglobal.current_idをnooneに戻す
とすればいい。

549 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 21:34:34 ID:uswEIGEy]
ありがとうございます
ちょっと難しそうですが頑張ってみます。

550 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 21:44:15 ID:Gr9J9Ja2]
やはり548氏が説明されてるキューが一般的だと思う
あえて別の方法を挙げると
ターン情報をグローバル変数ではなく各ユニットに持たせるようなやり方

ユニットは配列に格納しておきそれぞれにターン値を設定する
unitList[0].turn = 15; // ターン値の初期値
unitList[0].speed = 7; // 素早さ
毎ターンごとに全ユニットのturnプロパティに素早さパラメータを加算
unitList[0].turn = 15 + unitList[0].speed;
turnの値が100以上になったユニットがいれば彼のアクティブターン
いなければ素早さ加算を繰り返す

魔法や呪文で素早さやターン順が変わるゲームではこの方法も分かりやすいかもしれない

551 名前:名前は開発中のものです。 mailto:sage [2008/12/06(土) 22:33:58 ID:uswEIGEy]
>>548
stepの部分を入れてみたところ色々なところが構文エラーになってしまったのがどうしてでしょうか…
obj.enemyなどの部分はちゃんとオブジェクト名に直しました(そこは関係なかったみたいですが)。

552 名前:名前は開発中のものです。 mailto:sage [2008/12/07(日) 01:43:46 ID:Hva4nw+k]
すみません、{などの位置を正したら直ったみたいです。

>>548の場合私が設定したglobal.aやbなどは無くても大丈夫なのでしょうか?

553 名前:名前は開発中のものです。 [2008/12/07(日) 15:34:40 ID:BlF8unb/]
また問題が...
自分のオブジェクトと敵のオブジェクトの間に
壁オブジェクトがあったら弾を打たず、
無かったら撃つという風にしたいのですが・・・
回答はしたいときで構いません。
よろしくお願いします。

554 名前:名前は開発中のものです。 mailto:sage [2008/12/07(日) 16:47:56 ID:iNdKCD5t]
>>553
ヘルプでcollision_line関数を調べてみましょう・・・

555 名前:553 mailto:sage [2008/12/07(日) 18:01:29 ID:BlF8unb/]
またまたありがとうございます

556 名前:名前は開発中のものです。 [2008/12/10(水) 20:08:22 ID:Pwqi4CyR]
www2.uploda.org/uporg1845643.gmk.html
今こんなゲームを作っています
クリックしたとこに緑のやつが移動
近くに赤いやつがいたら勝手に撃つ
左上はレーダー

ですが、
なぜか赤いやつの処理だけが遅いのです。
緑のほうが、数も処理数も多いはずです。
赤が一匹だけでもかくかくになってしまいます。
見ていただけたらうれしいです。

557 名前:名前は開発中のものです。 [2008/12/10(水) 20:09:11 ID:Pwqi4CyR]
連レスorz
パスは fedora8 です



558 名前:名前は開発中のものです。 mailto:sage [2008/12/10(水) 20:27:44 ID:edz1Bxdl]
緑の奴にinstance_exists(object3)があるから
もし赤い奴がなければこれ以降が無視されるので軽い
衝突判定だとか索敵を毎ステップやると当然重くなるよ

あと他の人に見てもらうならコメントか何かはつけるべし


559 名前:名前は開発中のものです。 mailto:sage [2008/12/10(水) 20:56:57 ID:nqQ/Z5/R]
ルームのスピードはそのまま(30fps)で特定のキャラクターのスプライトを10fpsでアニメーションさせる、というようなことは可能でしょうか?

560 名前:名前は開発中のものです。 mailto:sage [2008/12/10(水) 22:32:55 ID:eRvJFMy9]
>>559
image_speed アニメーションの速度
image_index アニメーションの何コマ目を表示しようとしてるか
image_number アニメーションの長さ(総コマ数)

ヘルプの同じページに3つとも例文付きで載ってます
徐々にアニメーションを早くしたり、特定のコマで停止したり
状況に応じて動的にアニメーション速度を変更できます

561 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 08:01:09 ID:0wlARFf+]
ステップの処理速度を早くしたいのですが
ルームのfpsを高くするだけで効果はあるのでしょうか?

562 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 08:47:48 ID:BGyF9xSS]
>>561
ステップの処理速度を早くしたい、というのは、
動作が重いのを何とかしたい、ということだろうか。

基本的に、効率が悪いと重くなる。
処理速度を上げたいのなら、効率を上げるのが一番いい方法。

例えばマ○オで、そのステージ全体の処理を全て実行するのは無駄が多すぎるのがわかるだろうか。
見えない部分、画面からあまりにも離れた場所の処理を省くことで、効率も処理速度も大きく変わる。

同じ要領で、毎ステップ実行しなきゃいけないことなのかどうかを考えながら、
無駄な部分を出来る限り省いてみるといいと思う。


563 名前:561 mailto:sage [2008/12/11(木) 09:52:59 ID:uFLRyYUD]
説明不足でした。すみません
キャラAが行動し終わったらすぐキャラBが行動し、Bが行動し終わったらキャラCがすぐ行動し…
という動作をあくまでも順番通りに、かつほぼ瞬時に行いたいのですがどうも若干遅延したり最初に動くキャラと最後に動くキャラで行動終了に差が出来たりしてしまうのです。
これはfpsを高くすることで若干でも解消できるのでしょうか。

564 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 14:11:51 ID:BGyF9xSS]
何だかどうしてもfpsを上げたいようだね。
それに、解消できるかどうかは、試してみればわかるようなことだと思うが……。
理論的には目立たなくなるだろうけど、でも「目立たなくすること」が最終目的じゃないはず。
「あくまでも順番通りに、かつほぼ瞬時に行いたい」
本来なら、これをどうやったら実行できるかと考えるべき。
うまくいかないのなら、何故ズレが生じるのかと原因を考えるべき。

ABCとキャラが三人いるとしても、ABCの順に処理されるとは限らない。
もしかしたらGMは、BCAの順に処理してるかもしれない。
もしそうだったら、
  1フレーム目
  B:「Aが未処理」
  C:「Bが未処理」
  A:処理
  2フレーム目
  B:処理(Aが処理済)
  C:処理(Bが処理済)
という感じに、1フレーム目にAが処理され、2フレーム目にBCが処理されることになる。
これが多分遅延される原理だと思う。

他のオブジェクトに順番を覚えさせ、
そのオブジェクトがABC全員を操作するのがいいんじゃないかと。
例えば、Zってのを作って、ABC自身は何もせず、ZがAを処理してBを処理して……と。
順番を扱うときには配列等を使うのもあり。

565 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 16:37:49 ID:nF6qn38V]
結論から言えばfpsを変えても解消できないだな
1フレーム毎にオブジェクトが全部更新されるから、何の差か知らないけれど
ある経過時間での差は変わらないよ

キャラA、B、Cが別々に動いてそれぞれの行動開始までの時間がばらつくというのなら
最初のフレームで行動決定処理(AI部分)をやって次のフレームで行動開始ってすれば
揃っているように見えるけど・・・ゲームによりけりかもね

566 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 18:43:18 ID:0wlARFf+]
なるほど、ありがとうございます
一応>>548を参考にして形だけは出来たのですが先述の通り遅延が生じたり
敵の数が多くなると処理が遅くなって(主人公の動ける順番が回ってくるのが遅くなって)
一歩動くと次動くまでに若干待たされ動作が快適とは言えないような状態になってしまうのです

解消する方法は無いでしょうか…

567 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 19:45:07 ID:nF6qn38V]
ゲームの設計かキューの使い方、どちらかが間違っているような気がする

スペックにもよるけどインスタンス5〜600体ぐらいなら
上記のキュー設計で処理落ちすることはあんまりないと思うんだけどなあ
主人公サイドはキューに詰め込まなくてもいいとか細かいことはあるけど



568 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 20:57:24 ID:0wlARFf+]
処理落ちというか主人公が動いたときに一斉に行動するのではなく敵がちょっと遅れて動くんです。
敵の数が多ければ多いほど番号が最後に割り振られてる敵?の動きがかなり遅れています。

569 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 20:59:36 ID:5W34XGsl]
>>568
1)情報を小出しにしない。
2)仕様はなるべく提示
3)表現したい目的を言う

570 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 21:22:53 ID:YYSIE6Pp]
もともと>547で敵が全部一斉に動くのがイヤだというから>548のキュー案が出てきたわけで
「順番に動く」と「一斉に動く」は両立しないんだけど、結局どうしたいの?

>566で言ってる主人公が待たされるのを解消したいと言うのなら
行動完了するまで待たないで、行動開始してから数ステップ経過したら
次のキャラに行動を始めさせるという手がある。
キャラ数に応じて間隔を変えるようにすれば>568の問題もばっちり。
もちろん、複数のキャラがある程度並行して動けるように設計しとかないといけない。

571 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 22:19:17 ID:0wlARFf+]
「一斉に動く」というのは視覚的な物で>>570さんのおっしゃる「ある程度並行して動く」というのが正しい表現ですね。すみません。

今は>>548さんの案でシステムを組んで、
主人公:「global.current_id = idで行動できる状態になる」「移動、攻撃など何かを行ったらglobal.current_id = noone」
敵:「global.current_id = idで行動できる状態になる」「移動、攻撃など何かを行ったらglobal.current_id = noone」(同じ)
でそれぞれ動くようにしています。

敵が1体の時でも主人公が動く→敵が動くの過程で「視覚的に」同時には動かず、
・主人公が動く→動き終わる(行きたいマスに行く)と敵がすぐ動く
の流れになりどうも不自然になってしまいます。
敵の数が多くなればなるほどそれが連鎖して
・主人公動く→動き終わると敵Aが動く→Aが動き終わるとBが動く…
となり少しずつ遅延されていってしまいます。

以前の
global.a=1で主人公のターン
global.a=2で敵のターン
主人公行動でa=2に
敵のクリエイト時にglobal.b+=1
global.bの最大値をglobal.cに記録
敵が行動するとglobal.b-=1
global.b=0になった時にa=1に戻し、cをbに代入
だと視覚的でなく実際に「主人公と敵全員が一斉に動いた」のですが
これでは順番に動くというのが全く無視されるため廃止しました。

自分の希望としては
・(視覚的にでもいいので)全員が同時に動く。
・順番に攻撃したりするために(内部処理の面だけでもいいので)順番に行動しているようにする。
の二つが同時に満たされるといいのですがいい方法は無いでしょうか。
何度も申し訳ありません


572 名前:名前は開発中のものです。 mailto:sage [2008/12/11(木) 22:41:52 ID:YYSIE6Pp]
普通のターン制ゲームでも、敵がたくさんいたら全員が攻撃し終わるまで待たされるだろ?
と書こうとしたけど、でも全員が歩き終わるのを待ったりはしないよな?と思ったのでちょっと考えてみた。

シレンなり何なり君が参考にしてるゲームで自分と敵の動きをじっくり観察すればわかるはずだけど、
その手のゲームでは1ターンが実際には複数のフェーズから成り立っている。
(1) 自分が行動する(歩く、攻撃する、道具を使うなど)
(2) 敵が歩く(全員同時に)
(3) 敵が攻撃する(一体ずつ順番に)
自分が歩いた時には(1)と(2)が同時に起こるけど、それ以外の行動をとると(1)が終わってから(2)が起こる。
誰も攻撃行動をとらなければ、主人公は立ち止まることなくスムーズに歩き続けられるわけだ。

この辺を踏まえて、歩くのとその他の行動を分けて別々に実行させるようにしたらどうかな。
ただ、敵はあくまで1ターンに「歩く」と「攻撃する」のどちらか片方しかしないと思うので、
どちらの行動をとるかは(2)より前(ひいては主人公が歩き始める時)に決めておく必要がある。
まとめるとこんな感じかな。
・主人公が行動決定したら、その他のキャラ全員がどう行動するか決定。変数にでも覚えておく
・主人公の攻撃行動、終わるまで待つ(攻撃しない場合はすぐ次に進む)
・歩く予定のキャラ全員を同時に歩かせる。全員の行動が終わるまで待つ
・攻撃予定のキャラに、キューを使って順番に攻撃行動を行わせる
・全員行動し終わったら最初に戻る

573 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 00:41:26 ID:YwPJgrfp]
攻撃はなるべく隣接したときや一直線上にきたときに行いたいので
行動前に決定するのはちょっと自分の技能じゃ辛いかなぁと…

主人公が行動する→敵:主人公の行動と同時に、攻撃範囲内に主人公がいなければ移動や特殊行動、いる場合は一旦待機
→移動するべき敵が全員移動し終わったら攻撃準備している敵のフェイズに入る→キューを使って順番に攻撃処理→主人公が動ける状態に戻す

として

変数aを用意→a=1の時主人公行動可能状態→主人公行動時にa=2→a=2になったら敵の行動開始(a=2になった際敵の数をbに記録)→
・攻撃範囲内に主人公がいない敵:移動や特殊行動をし、b-=1
・攻撃範囲内に主人公がいる敵:キューを利用して順番に攻撃。何らかの変数等をON状態にしてその敵だけキューに対応させる?>攻撃したらb-=1
b=0になったらa=1に戻して再び主人公行動可能状態に

とこんな感じでいいのでしょうか?
攻撃をする敵に関するキューをどう組めばいいやらよく分からないのですが…

574 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 01:37:09 ID:AbV0Ta9O]
攻撃範囲にいたらキューに追加
フェーズが変わったら一個取り出してと処理していけば問題ないんじゃないか

根本的に a が 0,1,2,4 とかビットフラグで管理したいのかもしれないけど
慣れていないならきちんと名前をつけて真偽値でやるべき
フェーズ管理についても同様。変数の状態で管理するのではなく
主人公行動、敵の行動、敵の攻撃 etc とそれぞれフラグ管理するべき

bの意味が果てしなくないように見える

575 名前:名前は開発中のものです。 [2008/12/12(金) 14:22:36 ID:UTYwgiXi]
オブジェクトの親やマスクを途中で変えたいのですがどうやればいいのでしょうか?

576 名前:名前は開発中のものです。 [2008/12/12(金) 19:19:55 ID:b5nKeRJC]
親を変えるのは不可能だけど
マスクはmask_indexに再代入すればできるはず

577 名前:名前は開発中のものです。 [2008/12/12(金) 21:00:29 ID:6TlHc+FT]
すみません
gmkはgmdに変換できないでしょうか



578 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 22:10:49 ID:Vplk2GsR]
>>575
object_set_parentで親を変えることはできるが、インスタンスではなく
オブジェクト自体(設計図)に作用するから期待するような結果にはならない。
親を変えたいって質問はたまに見るけど、そういう時はたいてい設計が間違ってるべ。

>>577
LGMでGM7→6に変換できるらしいけど、使ったことないから本当かどうかはわからん。
ttp://www.ismavatar.com/lgm/
って、gmdってことはさらに6→5に落とさないといけないのか。
互換性ない機能も多いからほとんど無理じゃないかな?

579 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 22:16:46 ID:agcPaJTz]
GMで5ボタンマウス等のサイドボタン使う事はできませんか?

580 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 22:59:50 ID:AbV0Ta9O]
Help見る限り無理っぽそうだけど

もしデバッグでサイドボタン押したときのmouse_buttonの値が0〜3以外だったら
その値を割り当てればいいし、キーコンフィグっぽくするなら
global.mb_side_one |= mouse_bottun
とかすればできそうではあるけど対応していないような気もする

581 名前:名前は開発中のものです。 mailto:sage [2008/12/12(金) 23:36:54 ID:agcPaJTz]
>>580
レスありがとう
デバッグでGM5.3とLGMで確認したところ無反応でした

582 名前:577 mailto:sage [2008/12/13(土) 00:38:49 ID:K75p9U8G]
>>578
ありがとうございます
LGMですね
やってみます

583 名前:582 [2008/12/13(土) 14:58:29 ID:K75p9U8G]
LGMでGM6.1A用に変換しました
www2.uploda.org/uporg1852115.gm6.html
PASSは GT
このobject3の変数 "near"がおかしいです
クリックでobject0を近づけると
ちゃんとスクリプトやCreateイベントで定義してあるのに
Unknown variable near で
エラーになります
バグでしょうか?

584 名前:名前は開発中のものです。 mailto:sage [2008/12/13(土) 16:00:12 ID:682sG2h4]
多分ここだろ。
with (ebul){
move_towards_point((near).x,(near).y,2)
}
with文内の変数は呼び出し元(この場合object3)の変数の意味にならないよ。
ちゃんと other. をつけてやらんと。(詳しくはヘルプ参照)

以下のように修正したらエラーは出なくなったぞ。仕様かどうか分からんが。
move_towards_point((other.near).x,(other.near).y,2)

つーか、こんなことでツール側のバグとか疑うなよ・・・。自分のバグじゃないかw

585 名前:583 mailto:sage [2008/12/13(土) 16:21:59 ID:K75p9U8G]
>>584
wwww
そうでしたね
修正します

586 名前:名前は開発中のものです。 mailto:sage [2008/12/14(日) 22:59:58 ID:VLzMeB5w]
>>585
>wwww
とか
>バグでしょうか?
言い出す前に、テメーの無能を疑えよな

587 名前:名前は開発中のものです。 mailto:sage [2008/12/15(月) 14:09:14 ID:VQe5+xHL]
>>586には同意としても
なんとなく高圧的な人増えたな。嫌味っぽく言ってもなんもならんのに



588 名前:名前は開発中のものです。 mailto:sage [2008/12/15(月) 18:09:05 ID:6p1v9SNR]
質問する側もちょっとは考えろという事でしょう

589 名前:名前は開発中のものです。 mailto:sage [2008/12/16(火) 11:54:03 ID:Pj6nrR98]
RPG的なものを作っているのですが、手に入れたアイテムをアイテム欄などで取得順に表示したり
カーソルが合わさっているとき使用するとそのアイテムの効果が現れたりするにはどうすればいいのでしょうか。
アイテム自体は全部完成しており、アイテム名のスプライトやシステム上の番号等は割り振ってあります。5.3です






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<242KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef