【2D】ゲーム作成ツールGameMaker part3【マンセー】
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2008/05/11(日) 01:41:47ID:PRhlwPyW●本家(英語)
ttp://www.gamemaker.nl/
●GameMaker Japan - 非公式情報サイト(日本語)
ttp://gamemaker.main.jp/
●初心者向けチュートリアル
ttp://gamemaker.main.jp/modules/articles/index.php?cat_id=1
前スレ: 【2D】ゲーム作成ツールGameMaker【マンセー】
http://pc8.2ch.net/test/read.cgi/gamedev/1087068523/
0492名前は開発中のものです。
2008/11/28(金) 22:56:55ID:23J9ij0Mありがとうございます。
その方法は考えてませんでした。物凄く助かります。
0493名前は開発中のものです。
2008/11/28(金) 23:26:08ID:x//721CNfor(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
が出てきます……。根本的に書き方が違うのでしょうか?
0494名前は開発中のものです。
2008/11/28(金) 23:45:40ID:GUH2YmoSwith (all) { // すべてのインスタンスをループ
if (collision_circle(other.x, other.y-120, 120, self, true, true) { // もし範囲内にいたら
// 何かする
}
}
with文の中ではselfとotherの役割が入れ替わることに注意。
0495名前は開発中のものです。
2008/11/28(金) 23:51:13ID:GUH2YmoSということで2行目は
if (collision_circle(other.x, other.y-120, 120, id, true, false)) {
という感じで。
よく考えたら distance_to_point(other.x, other.y-120)<120 とかでも済むわけだけど。
0496名前は開発中のものです。
2008/11/29(土) 00:21:19ID:IHR7UfyXうっほおおお!!!!!
ありがとうございます!!かれこれ一週間ぐらい悩んでたのでスッキリしました!
こんな簡単にいくものだとは……。悔しいですね……;ω;
0497名前は開発中のものです。
2008/11/29(土) 00:23:52ID:cPQXEOUAGMのヘルプ
>The Game Maker Language (GML)
>GML Language Overview
>With constructions
の一番下にある例がまさにそれだな。
with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}
0498名前は開発中のものです。
2008/11/29(土) 01:08:40ID:IHR7UfyX0499名前は開発中のものです。
2008/11/30(日) 11:51:36ID:oUNmDB7aこのiの値を取るにはどうしたらよいでしょうか?
0500名前は開発中のものです。
2008/11/30(日) 17:50:24ID:8ZPTNF4x例)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の値を取る」の意味が分からん
上の例で言うと、どういうケースでどの値を取得したいんだろう
配列の基本的な使い方が分からないのか
それとも要素からインデックス値を取得する方法かな
0501名前は開発中のものです。
2008/11/30(日) 20:57:30ID:ICPzjhiz単に i を使えばいいだけ。 i に代入されれば、i が取得したい値そのものなんだから
何も難しいことない
0502名前は開発中のものです。
2008/11/30(日) 21:02:36ID:ICPzjhizi さんは、関数の中に入れば自分の持ってる値を提出するしかないからだ。
例えば i さんが 5 の値を持っていて
printf(%d, i);
のような仕事(関数)に従事したとする
なら、printfによって 5 という値が勝手に取り出されるだけ
特に今何を持っているのかを教えてもらう必要はない。
0503名前は開発中のものです。
2008/11/30(日) 21:38:09ID:q/jrPCNZi=5だとするならば、hogeという配列の6番目という事をしめしている。
この書き方がされるまえには必ず、i には何らかの数値が代入されている。
よって、上記の氏たちのような返答でしか答えることができない。
というかjavaでもVBでもCでも何でいいので、プログラムのサイト調べておいで。
0504499
2008/11/30(日) 23:24:15ID: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の値を取りたいのです
長々と失礼しました。
0505名前は開発中のものです。
2008/11/30(日) 23:54:17ID:UwyYLNW70506名前は開発中のものです。
2008/12/01(月) 00:08:59ID:RRq5dBO9の意味が分からん。どういうつもりでそれを書いているのか。
それだと、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文を使うとスマートに書ける。
0507名前は開発中のものです。
2008/12/01(月) 00:21:52ID:LiWv5v7dこれだとすべてインスタンスじゃなくてオブジェクト(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の考え方を使えばすっきりまとまるはず。
0508名前は開発中のものです。
2008/12/01(月) 00:25:03ID:QQgG8mIq4まで数えるので、
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要素全部に右手を代入していることになっている
0509名前は開発中のものです。
2008/12/01(月) 02:36:53ID:dWziD4by辺に端折らずに、それぞれ別個の変数で管理するほうが楽なんじゃない?
基本オブジェクト(胴体)の位置からそれぞれの位置を割り出して
HPなどの共有する値は共有するようにglobalすれば良いだろうし。
0510名前は開発中のものです。
2008/12/01(月) 04:46:27ID:Ekx4hYibfor(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な。
0511名前は開発中のものです。
2008/12/01(月) 05:08:55ID:Ekx4hYibパーツのステップで、obj_partsが作られたときに代入したinst.parts[i]のiの値を使って位置を決めたい。
(と解釈した)
……ってことは、それぞれのパーツから見て、iって変わらないよね?
つまり、右手はいつも右手ってこと。
だったら、作ったときにそのiの値をそのパーツに持たせればいい。
というわけで、パーツが作られたとき、そのときのiの値をnumberという名前の変数としてパーツに持たせてみたのが>>510。
これで、パーツのステップでnumberを使って位置を決めることで、「iを使って位置を決める」というのと同じ動作ができる。
……ところで、base.parts[i]て何。inst.parts[i]ならまだ分かるが。
0512名前は開発中のものです。
2008/12/01(月) 11:26:32ID:Ekx4hYibしかも、よく読んでなかったのにnumberって変数の名前まで一致(意図してません)。
もう少し読もうな、俺。('A`)
0513499
2008/12/01(月) 13:30:41ID:WFVB4NOyではやっぱり配列の[]内の値をとるシンプルな関数などはないんですね…
やっぱり509氏の言うようにそれぞれ個別の変数を持たせた方がよさそうですね
皆さんいろいろな意見ありがとうございました
0514名前は開発中のものです。
2008/12/01(月) 21:04:50ID:LiWv5v7dやりたいことはわかったけど、「配列の[]内の値をとる」なんて自分用語は
やっぱり誰にも通じないぞ。「配列の要素から添字を調べる」とか
もっと簡単に「検索する」とか言うんだ。
配列の検索自体は難しいことじゃない(ループして調べるだけ)。
そういうスクリプトは簡単に書けるし、ds_listなら関数一発でできる。
ただ、君のやりたいこと実現するのに検索なんて必要ない、
もっと簡単に済む方法がいくらでもあるってだけのこと。
0515名前は開発中のものです。
2008/12/01(月) 21:39:31ID:hPo6+q3F0516503
2008/12/01(月) 22:44:50ID:dWziD4byだーかーらー
i を使ってるのはfor文の中でしょ?
でfor文は繰り返す処理する処理で{}の中身を通して処理し、
最後に i++ で i に「+1」するんだ。
for(i=0;i<4;i+=1){中身} は、i の値が4になるまで繰り返す文 なんだ。
ここまではOK?
なので、 i の値はその処理内の実行回数の値である。
i は、そのときの値である。
i にどの数値が代入されてるか調べるには、単に i を見ればいい。
ということだから、プログラムの基本中の基本であり、どっかの解説サイトを見てこいと言ったんだ!!
0517名前は開発中のものです。
2008/12/01(月) 23:04:58ID:VAhzR6SYおちつけwfor文がどうとかではなくて
定数定義とか列挙子みたいなことをやりたいんでしょ。たぶん
GMLで使えないけど
0518名前は開発中のものです。
2008/12/02(火) 02:15:33ID:cOR4nM2XHello world レベルだから
実際、Hello world で使ってる関数の中身を数文字変えるだけ。
だから、そんなことで悩む事自体がおかしいのだ。
おかしいので、「そんなこと悩むわけがない、別のことを言いたいのではないか」
と思うし、実際文そのままの意味で取れば「そんなもん、幼稚園児でも出来るぞ」になるわけだ
言い回しがおかしいと答えも出ない
0519名前は開発中のものです。
2008/12/02(火) 02:21:18ID:cOR4nM2Xなんつうのかな
箱にオモチャを入れました
箱の中身を知る方法ないですか
と聞かれたようなものだ。
開けて見りゃいいじゃねえかよ
箱(変数) を関数に渡す、関数で使うようにプログラムすれば
関数は勝手に箱開けて中身を使う。
それで知ることができる
非常に単純なことだから、悩むなんて誰も思わない。
Cだったら、printfなどの、数字や文字を画面に表示する関数で使って、「見る」だけでいいからだ。
0520名前は開発中のものです。
2008/12/02(火) 10:40:55ID:xezqMnLOとりあえず思いついた方法2つ。どちらもGMを使う。
1)全音停止
sound_stop_all()
↑を使えば全部止めることが出来る。
全部止めれば、「今鳴っているサウンド」を停止することができる。
2)確認→停止
sound_isplaying(index)
↑を使って、再生されているかどうかの確認が出来る。
これを使って戻り値がtrueならsound_stop(index)で止める、という方法。
チェックしたいサウンド分だけループさせることで、「今鳴っているサウンド」をピンポイントで停止させる。
0522名前は開発中のものです。
2008/12/02(火) 14:41:52ID:xRaNmqQGffdshowなどの、1デバイス1デコーダーのデコーダーで見るとわかるが、
音楽鳴るたびにデコーダが増える。
20曲鳴らせば20個のデコーダが用意され、デバイスを閉じても消えないことすらある。
0523名前は開発中のものです。
2008/12/02(火) 17:06:18ID:We5UmkXJお金表示やお金を作ることってできるんですか?(ゼルダで言うルピーみたいな
0524名前は開発中のものです。
2008/12/02(火) 17:25:34ID:Ujq+dWEgグラディウスみたいなのを想像してもらえればわかりやすいと思うけど、
自機の移動がうまくいかない。
上下左右それぞれ押したときにその方向に一定の速度を与え、
離したときにその方向の速度を0にしているんだが、
たまに引っかかったように動かなくなることがある。
急に逆方向のボタン(上と下、右と左)を押すとなることが多い。
ちなみに座標を移動させる場合も同じように引っかかる。
どうやったらもっとスムーズに動くんだろう?
0525名前は開発中のものです。
2008/12/02(火) 20:58:31ID:taOqiXBl変数使えば簡単にできるけど
初心者だったらscoreを流用するのがお手軽でおすすめ。
>>524
GMについてくるサンプルか公式のチュートリアルに
1945っていうシューティングがあるから、見て真似してみれば?
キーを下げた時(key press)と上げた時(key release)で制御してると
複数のキーの上げと下げが干渉してそんな不具合が起きやすい。
単に押している間(keyboard)だけ座標を増減させるようにすればすっきりする。
0526名前は開発中のものです。
2008/12/02(火) 20:59:02ID:UFWpQr+3できます。
お金とか敵とかリンクとかはすべて「オブジェクト」という個体表示で考えます。
敵に当たるとダメージの部分を、
お金に触れると(お金が画面から消え)お金単位が増える。
と置き換えます。
どの言語を使っても考え方は同じになります。
0528名前は開発中のものです。
2008/12/02(火) 22:23:17ID:uu7fmr/mxprevious と ypreviousは >>377の
>・(now all instances are set to their new positions)
これ以降じゃないと値が保障されないのか。ぬかったわ
0529名前は開発中のものです。
2008/12/02(火) 22:42:03ID:ATORRfCZ範囲の求め方が分かりません。
自分のやり方だと先ず、プレイヤーを選択すると
移動範囲が出るようにはしたのですが、
この出し方がinstance_create(x,y,object)
で出しているのですがこの方法だと
どうすれば障害物の処理が出来るのかが分かりません;
もう一回一から作ったほうがいいのでしょうか・・・
説明が下手で申し訳ありません;
0530名前は開発中のものです。
2008/12/02(火) 23:10:09ID:uu7fmr/mゲームにもよるけど障害物の処理ってのは避けて通るとかそういうことかな
具体的な状況がよく分からないかも
どこまで移動できるかだけでいいなら
プレイヤーに移動力のような値を持たせて
平地なら-1 砂地なら-2とかやって移動力がゼロ以上なら指定した場所までいけるとかできるけど
0531名前は開発中のものです。
2008/12/02(火) 23:15:43ID:ATORRfCZ仰るとおりです。
障害物をよけて通れるようにしたいのです。
ネットとかで調べるとそのようなやり方を良く見かけるのですが、
如何せんどう組み込めばいいのか分からず;
もう少しヒントを頂けると嬉しいです。
厚かましくてすみません;
0532名前は開発中のものです。
2008/12/02(火) 23:21:00ID:uu7fmr/mたとえばFEやタクティクスのようにターン制なのか
ポピュラスのようにリアルタイムな感じなのか
マップの構造によっても変わってくるし
ていうかシュミレーション・・・これは恥ずかしい誤字だった///
0533名前は開発中のものです。
2008/12/02(火) 23:24:40ID:ATORRfCZもう少し粘ってみます。
0534名前は開発中のものです。
2008/12/03(水) 00:07:38ID:5ByG7lYo5
1 6
4☆2 7 (星の位置がキャラクターだとして)
3
☆を起点として1、2、3、4を調べ、座標とかかるコストを配列に保存する。
1に起点を移し周囲4マスを調べ、座標とそれまでにかかったコストを保存する。
すでに調べた座標は基本的に記録しないが
1→6 と 2→6のような経路が被る場合、移動コストが軽いほうを保存する。
移動コストが10より小さいものがなくなるまでこの作業を繰り返して
終わったら配列に保存された座標のところを移動範囲として表示すればいいような気がする
FEだったらこんな感じかな
0535名前は開発中のものです。
2008/12/03(水) 02:03:59ID:r0U2/w9u通れないマップチップは、「通れまへんフラグ」を設定しておく
自分と敵との最短経路を弾き出し、その間に「通れまへん」があれば分岐
0537名前は開発中のものです。
2008/12/04(木) 19:42:54ID:COm9ODRQ0538名前は開発中のものです。
2008/12/04(木) 19:51:06ID:wis04ySwゼルダでアイテム画面とかに移動する。というのはRPGのフィールドの位置保存
を使えばできると思ったんだけど、装備した元の位置の主人公のオブジェクト変更
ってできるんですか?
0539名前は開発中のものです。
2008/12/04(木) 20:23:54ID:BFQV7gOy「元の位置の」ってのが何指してるのかどうしたいのかわからないけど
主人公の表示アイテムを変える方法としては、
1)アイテムに固有IDを割り振っておく
2)装備してるアイテムIDの画像を表示する
で、いけるんじゃないかな。
もともと表示するのはIDのアイテムで、アイテムが変わったら画像もチェンジする
アイテムごとに画像を用意しなくちゃいけないのは、そもそも当然のことだしね。
0540名前は開発中のものです。
2008/12/04(木) 20:32:17ID:hYQrGj00GM初級者です。
早速質問ですが、
複数のインスタンスから
一番別のオブジェクトに近いインスタンスを取得したいのですが、
どうすればいいでしょうか。
0541名前は開発中のものです。
2008/12/04(木) 21:33:34ID:BvmV+/Fo質問がややこしくて読み間違えてるかもしれんが
恐らく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);
こんな感じで求められる
詳しい説明や似たような関数はヘルプ参照
0542540
2008/12/04(木) 22:08:30ID:hYQrGj00それです!
ありがとうございました。
0543名前は開発中のものです。
2008/12/05(金) 17:53:46ID:X+fPv7FO助かりました。
ありがとうございます!
0544名前は開発中のものです。
2008/12/06(土) 17:02:27ID:DxqncoX6何度も何度もすみません。
敵が全滅したり
味方が全滅したりすると
変数の参照先がなくなり
エラーになります。
解決策はないでしょうか?
0545名前は開発中のものです。
2008/12/06(土) 17:49:42ID:6jDgYk9y存在するなら参照する。しなかったら何もしなくていい。
instance_exists(obj)を使えば存在するかどうかが、
instance_number(obj)を使えば個数がわかる。
0546544
2008/12/06(土) 18:50:41ID:DxqncoX60547名前は開発中のものです。
2008/12/06(土) 19:09:11ID: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になるごとに変動してしまうので初めから固定で番号を与えることはできません。
長文かつ分かりにくい文章だと思いますがどうすればよいか分かる方ご教授願います…
0548名前は開発中のものです。
2008/12/06(土) 21:06:12ID:eG4vVrw21. 主人公とすべての敵のインスタンス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に戻す
とすればいい。
0549名前は開発中のものです。
2008/12/06(土) 21:34:34ID:uswEIGEyちょっと難しそうですが頑張ってみます。
0550名前は開発中のものです。
2008/12/06(土) 21:44:15ID:Gr9J9Ja2あえて別の方法を挙げると
ターン情報をグローバル変数ではなく各ユニットに持たせるようなやり方
ユニットは配列に格納しておきそれぞれにターン値を設定する
unitList[0].turn = 15; // ターン値の初期値
unitList[0].speed = 7; // 素早さ
毎ターンごとに全ユニットのturnプロパティに素早さパラメータを加算
unitList[0].turn = 15 + unitList[0].speed;
turnの値が100以上になったユニットがいれば彼のアクティブターン
いなければ素早さ加算を繰り返す
魔法や呪文で素早さやターン順が変わるゲームではこの方法も分かりやすいかもしれない
0551名前は開発中のものです。
2008/12/06(土) 22:33:58ID:uswEIGEystepの部分を入れてみたところ色々なところが構文エラーになってしまったのがどうしてでしょうか…
obj.enemyなどの部分はちゃんとオブジェクト名に直しました(そこは関係なかったみたいですが)。
0552名前は開発中のものです。
2008/12/07(日) 01:43:46ID:Hva4nw+k>>548の場合私が設定したglobal.aやbなどは無くても大丈夫なのでしょうか?
0553名前は開発中のものです。
2008/12/07(日) 15:34:40ID:BlF8unb/自分のオブジェクトと敵のオブジェクトの間に
壁オブジェクトがあったら弾を打たず、
無かったら撃つという風にしたいのですが・・・
回答はしたいときで構いません。
よろしくお願いします。
0554名前は開発中のものです。
2008/12/07(日) 16:47:56ID:iNdKCD5tヘルプでcollision_line関数を調べてみましょう・・・
0555553
2008/12/07(日) 18:01:29ID:BlF8unb/0556名前は開発中のものです。
2008/12/10(水) 20:08:22ID:Pwqi4CyR今こんなゲームを作っています
クリックしたとこに緑のやつが移動
近くに赤いやつがいたら勝手に撃つ
左上はレーダー
ですが、
なぜか赤いやつの処理だけが遅いのです。
緑のほうが、数も処理数も多いはずです。
赤が一匹だけでもかくかくになってしまいます。
見ていただけたらうれしいです。
0557名前は開発中のものです。
2008/12/10(水) 20:09:11ID:Pwqi4CyRパスは fedora8 です
0558名前は開発中のものです。
2008/12/10(水) 20:27:44ID:edz1Bxdlもし赤い奴がなければこれ以降が無視されるので軽い
衝突判定だとか索敵を毎ステップやると当然重くなるよ
あと他の人に見てもらうならコメントか何かはつけるべし
0559名前は開発中のものです。
2008/12/10(水) 20:56:57ID:nqQ/Z5/R0560名前は開発中のものです。
2008/12/10(水) 22:32:55ID:eRvJFMy9image_speed アニメーションの速度
image_index アニメーションの何コマ目を表示しようとしてるか
image_number アニメーションの長さ(総コマ数)
ヘルプの同じページに3つとも例文付きで載ってます
徐々にアニメーションを早くしたり、特定のコマで停止したり
状況に応じて動的にアニメーション速度を変更できます
0561名前は開発中のものです。
2008/12/11(木) 08:01:09ID:0wlARFf+ルームのfpsを高くするだけで効果はあるのでしょうか?
0562名前は開発中のものです。
2008/12/11(木) 08:47:48ID:BGyF9xSSステップの処理速度を早くしたい、というのは、
動作が重いのを何とかしたい、ということだろうか。
基本的に、効率が悪いと重くなる。
処理速度を上げたいのなら、効率を上げるのが一番いい方法。
例えばマ○オで、そのステージ全体の処理を全て実行するのは無駄が多すぎるのがわかるだろうか。
見えない部分、画面からあまりにも離れた場所の処理を省くことで、効率も処理速度も大きく変わる。
同じ要領で、毎ステップ実行しなきゃいけないことなのかどうかを考えながら、
無駄な部分を出来る限り省いてみるといいと思う。
0563561
2008/12/11(木) 09:52:59ID:uFLRyYUDキャラAが行動し終わったらすぐキャラBが行動し、Bが行動し終わったらキャラCがすぐ行動し…
という動作をあくまでも順番通りに、かつほぼ瞬時に行いたいのですがどうも若干遅延したり最初に動くキャラと最後に動くキャラで行動終了に差が出来たりしてしまうのです。
これはfpsを高くすることで若干でも解消できるのでしょうか。
0564名前は開発中のものです。
2008/12/11(木) 14:11:51ID:BGyF9xSSそれに、解消できるかどうかは、試してみればわかるようなことだと思うが……。
理論的には目立たなくなるだろうけど、でも「目立たなくすること」が最終目的じゃないはず。
「あくまでも順番通りに、かつほぼ瞬時に行いたい」
本来なら、これをどうやったら実行できるかと考えるべき。
うまくいかないのなら、何故ズレが生じるのかと原因を考えるべき。
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を処理して……と。
順番を扱うときには配列等を使うのもあり。
0565名前は開発中のものです。
2008/12/11(木) 16:37:49ID:nF6qn38V1フレーム毎にオブジェクトが全部更新されるから、何の差か知らないけれど
ある経過時間での差は変わらないよ
キャラA、B、Cが別々に動いてそれぞれの行動開始までの時間がばらつくというのなら
最初のフレームで行動決定処理(AI部分)をやって次のフレームで行動開始ってすれば
揃っているように見えるけど・・・ゲームによりけりかもね
0566名前は開発中のものです。
2008/12/11(木) 18:43:18ID:0wlARFf+一応>>548を参考にして形だけは出来たのですが先述の通り遅延が生じたり
敵の数が多くなると処理が遅くなって(主人公の動ける順番が回ってくるのが遅くなって)
一歩動くと次動くまでに若干待たされ動作が快適とは言えないような状態になってしまうのです
解消する方法は無いでしょうか…
0567名前は開発中のものです。
2008/12/11(木) 19:45:07ID:nF6qn38Vスペックにもよるけどインスタンス5〜600体ぐらいなら
上記のキュー設計で処理落ちすることはあんまりないと思うんだけどなあ
主人公サイドはキューに詰め込まなくてもいいとか細かいことはあるけど
0568名前は開発中のものです。
2008/12/11(木) 20:57:24ID:0wlARFf+敵の数が多ければ多いほど番号が最後に割り振られてる敵?の動きがかなり遅れています。
0569名前は開発中のものです。
2008/12/11(木) 20:59:36ID:5W34XGsl1)情報を小出しにしない。
2)仕様はなるべく提示
3)表現したい目的を言う
0570名前は開発中のものです。
2008/12/11(木) 21:22:53ID:YYSIE6Pp「順番に動く」と「一斉に動く」は両立しないんだけど、結局どうしたいの?
>566で言ってる主人公が待たされるのを解消したいと言うのなら
行動完了するまで待たないで、行動開始してから数ステップ経過したら
次のキャラに行動を始めさせるという手がある。
キャラ数に応じて間隔を変えるようにすれば>568の問題もばっちり。
もちろん、複数のキャラがある程度並行して動けるように設計しとかないといけない。
0571名前は開発中のものです。
2008/12/11(木) 22:19:17ID:0wlARFf+今は>>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に代入
だと視覚的でなく実際に「主人公と敵全員が一斉に動いた」のですが
これでは順番に動くというのが全く無視されるため廃止しました。
自分の希望としては
・(視覚的にでもいいので)全員が同時に動く。
・順番に攻撃したりするために(内部処理の面だけでもいいので)順番に行動しているようにする。
の二つが同時に満たされるといいのですがいい方法は無いでしょうか。
何度も申し訳ありません
0572名前は開発中のものです。
2008/12/11(木) 22:41:52ID:YYSIE6Ppと書こうとしたけど、でも全員が歩き終わるのを待ったりはしないよな?と思ったのでちょっと考えてみた。
シレンなり何なり君が参考にしてるゲームで自分と敵の動きをじっくり観察すればわかるはずだけど、
その手のゲームでは1ターンが実際には複数のフェーズから成り立っている。
(1) 自分が行動する(歩く、攻撃する、道具を使うなど)
(2) 敵が歩く(全員同時に)
(3) 敵が攻撃する(一体ずつ順番に)
自分が歩いた時には(1)と(2)が同時に起こるけど、それ以外の行動をとると(1)が終わってから(2)が起こる。
誰も攻撃行動をとらなければ、主人公は立ち止まることなくスムーズに歩き続けられるわけだ。
この辺を踏まえて、歩くのとその他の行動を分けて別々に実行させるようにしたらどうかな。
ただ、敵はあくまで1ターンに「歩く」と「攻撃する」のどちらか片方しかしないと思うので、
どちらの行動をとるかは(2)より前(ひいては主人公が歩き始める時)に決めておく必要がある。
まとめるとこんな感じかな。
・主人公が行動決定したら、その他のキャラ全員がどう行動するか決定。変数にでも覚えておく
・主人公の攻撃行動、終わるまで待つ(攻撃しない場合はすぐ次に進む)
・歩く予定のキャラ全員を同時に歩かせる。全員の行動が終わるまで待つ
・攻撃予定のキャラに、キューを使って順番に攻撃行動を行わせる
・全員行動し終わったら最初に戻る
0573名前は開発中のものです。
2008/12/12(金) 00:41:26ID:YwPJgrfp行動前に決定するのはちょっと自分の技能じゃ辛いかなぁと…
主人公が行動する→敵:主人公の行動と同時に、攻撃範囲内に主人公がいなければ移動や特殊行動、いる場合は一旦待機
→移動するべき敵が全員移動し終わったら攻撃準備している敵のフェイズに入る→キューを使って順番に攻撃処理→主人公が動ける状態に戻す
として
変数aを用意→a=1の時主人公行動可能状態→主人公行動時にa=2→a=2になったら敵の行動開始(a=2になった際敵の数をbに記録)→
・攻撃範囲内に主人公がいない敵:移動や特殊行動をし、b-=1
・攻撃範囲内に主人公がいる敵:キューを利用して順番に攻撃。何らかの変数等をON状態にしてその敵だけキューに対応させる?>攻撃したらb-=1
b=0になったらa=1に戻して再び主人公行動可能状態に
とこんな感じでいいのでしょうか?
攻撃をする敵に関するキューをどう組めばいいやらよく分からないのですが…
0574名前は開発中のものです。
2008/12/12(金) 01:37:09ID:AbV0Ta9Oフェーズが変わったら一個取り出してと処理していけば問題ないんじゃないか
根本的に a が 0,1,2,4 とかビットフラグで管理したいのかもしれないけど
慣れていないならきちんと名前をつけて真偽値でやるべき
フェーズ管理についても同様。変数の状態で管理するのではなく
主人公行動、敵の行動、敵の攻撃 etc とそれぞれフラグ管理するべき
bの意味が果てしなくないように見える
0575名前は開発中のものです。
2008/12/12(金) 14:22:36ID:UTYwgiXi0576名前は開発中のものです。
2008/12/12(金) 19:19:55ID:b5nKeRJCマスクはmask_indexに再代入すればできるはず
0577名前は開発中のものです。
2008/12/12(金) 21:00:29ID:6TlHc+FTgmkはgmdに変換できないでしょうか
0578名前は開発中のものです。
2008/12/12(金) 22:10:49ID:Vplk2GsRobject_set_parentで親を変えることはできるが、インスタンスではなく
オブジェクト自体(設計図)に作用するから期待するような結果にはならない。
親を変えたいって質問はたまに見るけど、そういう時はたいてい設計が間違ってるべ。
>>577
LGMでGM7→6に変換できるらしいけど、使ったことないから本当かどうかはわからん。
ttp://www.ismavatar.com/lgm/
って、gmdってことはさらに6→5に落とさないといけないのか。
互換性ない機能も多いからほとんど無理じゃないかな?
0579名前は開発中のものです。
2008/12/12(金) 22:16:46ID:agcPaJTz0580名前は開発中のものです。
2008/12/12(金) 22:59:50ID:AbV0Ta9Oもしデバッグでサイドボタン押したときのmouse_buttonの値が0〜3以外だったら
その値を割り当てればいいし、キーコンフィグっぽくするなら
global.mb_side_one |= mouse_bottun
とかすればできそうではあるけど対応していないような気もする
0581名前は開発中のものです。
2008/12/12(金) 23:36:54ID:agcPaJTzレスありがとう
デバッグでGM5.3とLGMで確認したところ無反応でした
0583582
2008/12/13(土) 14:58:29ID:K75p9U8Ghttp://www2.uploda.org/uporg1852115.gm6.html
PASSは GT
このobject3の変数 "near"がおかしいです
クリックでobject0を近づけると
ちゃんとスクリプトやCreateイベントで定義してあるのに
Unknown variable near で
エラーになります
バグでしょうか?
0584名前は開発中のものです。
2008/12/13(土) 16:00:12ID:682sG2h4with (ebul){
move_towards_point((near).x,(near).y,2)
}
with文内の変数は呼び出し元(この場合object3)の変数の意味にならないよ。
ちゃんと other. をつけてやらんと。(詳しくはヘルプ参照)
以下のように修正したらエラーは出なくなったぞ。仕様かどうか分からんが。
move_towards_point((other.near).x,(other.near).y,2)
つーか、こんなことでツール側のバグとか疑うなよ・・・。自分のバグじゃないかw
0586名前は開発中のものです。
2008/12/14(日) 22:59:58ID:VLzMeB5w>wwww
とか
>バグでしょうか?
言い出す前に、テメーの無能を疑えよな
0587名前は開発中のものです。
2008/12/15(月) 14:09:14ID:VQe5+xHLなんとなく高圧的な人増えたな。嫌味っぽく言ってもなんもならんのに
0588名前は開発中のものです。
2008/12/15(月) 18:09:05ID:6p1v9SNR0589名前は開発中のものです。
2008/12/16(火) 11:54:03ID:Pj6nrR98カーソルが合わさっているとき使用するとそのアイテムの効果が現れたりするにはどうすればいいのでしょうか。
アイテム自体は全部完成しており、アイテム名のスプライトやシステム上の番号等は割り振ってあります。5.3です
0590名前は開発中のものです。
2008/12/16(火) 12:21:24ID:KxWOE/yV取得したアイテム番号を代入していく感じにすればイイのでは?
get_item[0] = 取得したアイテム番号
[]内は取得するに従い数値を上げていけばよい。
配列の長さを調べる術はないので、自分で管理しないといけない。
もしくは、データ構造で map が使えるなら、それを使ってもよい。
たとえば、キーネームをアイテム名、値に所持数とやると管理しやすい。
ただし、mapはキーネームでソートされてしまうんで、取得順となると工夫しないといけないね。
アイテムメニューのシステムは面倒だが地道にやるしかないのでは。
カーソルの操作処理とかも、いちいちオブジェクトを用意してやらないといけない。
アイテム効果を発動させるには、
メニュー欄に表示されるアイテムオブジェクトに、
使用するときのキー入力イベント(mouseクリックボタン等)を持たせて、
そのイベント内で、
・アイテム効果発動
・アイテム消費
の処理を記述していく感じかな。
概念的なことしか書いてないが、参考になれば。
0591名前は開発中のものです。
2008/12/17(水) 08:18:19ID:BlN9VESDアイテムを使用した時はグローバル変数から1マイナスする。
ってな感じでどうかな?
■ このスレッドは過去ログ倉庫に格納されています