- 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/
- 411 名前:名前は開発中のものです。 mailto:sage [2008/11/14(金) 23:40:22 ID:izAxC9WD]
- うん、その作業をちまちまやってますw
この仕様ならargumentって要素があんまり意味ないような気がするんだけどなあ せめてScriptsに隠蔽要素が欲しかった
- 412 名前:名前は開発中のものです。 [2008/11/15(土) 00:09:50 ID:HG68xRSC]
-
メーカーに勤めてないとなかなかわかりづらい豆知識 リフレッシュレート よい子のみなちゃんは、60Hzと設定したら モニタもそのとおりに60Hzでリフレッシュしていると思っているかもしれないが 否!!!!!!!!!!!!!!!!!! 60Hzで設定していても、モニタ側は59.944Hzや58.989Hzなど、 とにかく中途半端な数値でしかリフレッシュしないものがある。 モニタが粗悪品だったり、グラフィックボード(特にRADEON)が悪さをしていることが多い。 そしてこの場合、滑らかに移動しているように見えず、かなりカクカクして見える。 これを直すには、ビデオBIOSの更新やモニタのファームウェア更新しかないので 相当面倒だ。個人で直すことはまず出来ない。
- 413 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 05:12:01 ID:gZryKwbH]
- でも逆に言うと、Scriptsからローカル変数をいじれるんだよね。
今の仕様でいいと思うんだけどな。
- 414 名前:名前は開発中のものです。 [2008/11/15(土) 12:32:10 ID:cZlHfE8C]
- 今GM5.3Aでアクションゲームを作ろうとしているのですが、キャラクターの移動が良いように行われません。
(移動させるキーを押す→キャラクター移動→キーを放してもその場で静止せず、ずっと移動し続ける) どのように行えばキーを放す際に静止するようにできるのでしょうか?初歩的な質問ですいません;
- 415 名前:名前は開発中のものです。 [2008/11/15(土) 13:05:07 ID:cZlHfE8C]
- ↑自己解決しました;
- 416 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 14:24:35 ID:PB/Zmvn5]
- 「変数が○になったとき」や「変数が○以上になった時」ではなく
「変数Aに数値が加算されたとき」という条件を作るにはどのようにすればいいのでしょうか?
- 417 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 15:00:10 ID:gZryKwbH]
- 加算されたとき
→1フレーム前の数値よりも今のフレームの数値が大きくなったとき (>>374-377と同じ考え方) もしくは、その数値に加算したときに起こしたいアクションを置く(そのまんま) (変数Aに加算した直後、起こしたいアクションを行う)
- 418 名前:名前は開発中のものです。 [2008/11/15(土) 15:22:11 ID:cZlHfE8C]
- どうも414です。
ジャンプをさせようとしてジャンプは出来るようになったのですが、今度はキャラクターが地上にいる状態で動けなくなってしまいました。 (正確にはジャンプは出来るが横移動が全くできない状態) どの様にすれば解決できるでしょうか?
- 419 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 16:40:37 ID:PB/Zmvn5]
- >>417
>>374〜的なやり方で行くと stepに difference=LEVEL difference<prev_differenceのときやりたい処理を行う End stepに prev_difference=difference とこんな風でいいのでしょうか?
- 420 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 18:04:15 ID:gZryKwbH]
- >>419
パニくっているときは、とりあえず適当にいろいろ放り込んでしまいがち。 でも、それは全然解決にならない。詰まったときこそ落ち着こう。 「行き詰ったら原点に返れ」 詰まったらまず、何をしたいのかを明確にする。それから、したいことを分析しよう。 見たところ、レベルが上がったときに何かをしたいようだね。 まぁそれでできなくはないんだけど。……一つ問題を除けば。 この場合differenceは今のレベル、prev_differenceは1フレーム前のレベル。 difference<prev_differenceってのはどういう意味になるか。 今のレベルが1フレーム前のレベルより小さいとき、つまりレベルが下がったときになる。 何をしているのか分からないままとりあえず入れるんじゃなくて、何をやってるのかを考えて理解しよう。 ちなみにdifferenceってのは「差」のこと。 前の例では競争だったから、二人の差ということでdifferenceという単語を使っただけ。 prevってのは「前」を意味するpreviousの略。 differenceは使わずに、LEVELとprev_LEVELの2つだけでいい。 わかりづらかったら、いっそmae_LEVELと書いてしまうのもありだな。 自分がわからないプログラムは作らない。これ鉄則。 <Step> LEVEL > mae_LEVEL // 今のレベルが前のレベルより大きくなったとき <End Step> mae_LEVEL = LEVEL // 「前のレベル」を今のレベルに更新する。
- 421 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 18:04:49 ID:gZryKwbH]
- >>418
地上にいる間ずっと、地面との接触が起きているのかもしれない。 でも>>414のことも考えると、歩かせるアクションの方にも問題があるのかもしれない。 どこかで「止める」アクションを使っていてそれが影響しているとか。 サンプルが非公式情報サイトかどこかになかったかな……。 サンプルを探してみるのもいいし、GMにexampleとして最初から入っているものがあったらそれを見てみるのもいい。
- 422 名前:名前は開発中のものです。 mailto:sage [2008/11/15(土) 18:08:02 ID:PB/Zmvn5]
- >>420
なるほど…丁寧にありがとうございます
- 423 名前:名前は開発中のものです。 [2008/11/15(土) 18:39:46 ID:cZlHfE8C]
- >>421
了解しました。 返答ありがとうございます
- 424 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 10:34:59 ID:aHkifR23]
- 3桁の数値を獲得してそれぞれオリジナルのスプライトで表示したいのですが
百の位と十の位と一の位を獲得するにはどのようにしたらいいのでしょう。
- 425 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 12:24:09 ID:uIhvcRmv]
- >>424
>400あたり参照 計算で出したいなら、一の位は10で割った余り、すなわち number mod 10 十の位は10で割ってから一の位をとればいいから (number div 10) mod 10 同じ考えで百の位は (number div 100) mod 10
- 426 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 14:19:08 ID:aHkifR23]
- >>425
簡単に作ることができました!ありがとうございます
- 427 名前:名前は開発中のものです。 [2008/11/16(日) 17:29:30 ID:HhlndW4R]
- アクションゲームで、敵AのCreateに変数hp(体力)を設定して、主人公の攻撃が当たった時にhpを減らすよう設定しました。
その敵Aを数体設置してテストプレイを始め一体を倒したところちょっと経ってから「UNKNOWN variable hp」のようなエラーが出てしまうようになりました。 変数操作も消滅もモンスター内でselfで行っているのですが何か間違っているのでしょうか…
- 428 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 18:48:04 ID:l0hPwkQ6]
- >>427
エラーメッセージでどのオブジェクトのどのイベントの どのアクションってところまで教えてくれるんだから、まずはそこを見るべし。 そのエラーになる要因はいくつも考えられるけど、それだけの情報じゃ絞りこめん。 > 一体を倒したところちょっと経ってから その倒したところで何をしてるの? 例えば他のオブジェクトにchangeしたりしてない?
- 429 名前:名前は開発中のものです。 [2008/11/16(日) 18:56:22 ID:HhlndW4R]
- >>428
ステップで「hpが0以下になったら消滅(死亡)」と言うのを設定しているんですがそれが変数を見失ってるみたいです。 倒したあとは自分がその辺を動き回っているだけでオブジェクト変更などは行っていないはずです
- 430 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 19:27:32 ID:OWHuy+Yr]
- 良ければうp
- 431 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 02:32:01 ID:TD8Ccrf3]
- Createイベントで変数を初期化してるのにエラーが出るって場合は
イベント自体実行されていないことが考えられる。よくある例としては ・Parentのイベントで変数を定義してるけど、子オブジェクトで継承イベントを呼んでない ・change the instanceでインスタンスを変更するときにイベントを実行していない また、instance.variable のようにドット付きで変数を参照している場合には instanceの方が存在してないという可能性もある。 削除されたインスタンスを参照していたり、deactivateされていたりなど。 ただ、話を聞くかぎりではどちらにも当てはまらないみたいだから 原因は他のところにあると思う。 やっぱり実際のオブジェクト情報を見ないと特定は難しいかな。
- 432 名前:名前は開発中のものです。 [2008/11/17(月) 05:45:22 ID:GSdqregN]
- まあいいとこ、
それらのインスタンスで「共有」してる形になっているので ある一体が消えると変数も消えてしまってる ってとこじゃないの インスタンスABCDEで一つの変数を見ていて インスタンスAが消えたと同時に変数も消え BCDEが参照できなくなっていると
- 433 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 10:24:12 ID:JkLZj++k]
- >主人公の攻撃が当たった時にhpを減らすよう設定
>ステップで「hpが0以下になったら消滅(死亡)」 この辺の実行される順番に問題があると予想してみる。 もしそうだったら、「hpが0以下になったら消滅(死亡)」を、ステップじゃなくコリジョンイベントで実行したら直る、……かもしれない。
- 434 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 16:16:23 ID:7QGWWpc1]
- マウスの動きに合わせて動くオブジェクトを作りたいのですがどうすれば良いでしょうか?
stepでマウスの座標に移動させてしまうと、 そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻ってしまいます。 説明が下手ですみませんが、よろしくお願いします。
- 435 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 18:01:40 ID:JkLZj++k]
- >マウスの動きに合わせて動くオブジェクトを作りたい
これがやりたいことなら、 >そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻る これは正しい動作ってことになるよね。マウスの動きに合わせて動いてるんだから。 どういうときにどういう動作をさせたいのか。 やりたいことをもう少し詳しく具体的に考えて。
- 436 名前:名前は開発中のものです。 [2008/11/17(月) 20:03:59 ID:qkRbLFEU]
- >>434
つまり一定速度でマウスに向かわせたいってこと?? もしそうならpoint_directionを使うといいと思う
- 437 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 21:34:27 ID:7QGWWpc1]
- 説明が下手で申し訳ありません。
>>435,>>436 そうです、それが正しい動作なのです。 ですが私が目指しているのは「マウスの座標に移動する」のではなく「マウスの動きにあわせる」なのです。 例えばマウスを右に動かしたらオブジェクトも右に、マウスの移動量だけ動く。という事がしたいのです。
- 438 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 22:07:33 ID:PQNNdjbn]
- >>437
移動する前にマウス座標と移動したあとのマウス座標を比較するとかで対応とか無理ですか?
- 439 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 22:08:05 ID:PQNNdjbn]
- 移動する前と後の座標を比較 ですね。誤字申し訳ない。
- 440 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 22:38:22 ID:7QGWWpc1]
- >>438,>>439
ありがとうございます。 何となくやり方は分かりましたがそれをコードで表すにはどうすべきか迷っております。 ちなみにGM6です。
- 441 名前:名前は開発中のものです。 [2008/11/17(月) 23:26:43 ID:qkRbLFEU]
- うーん、まだやりたいことがよく分からないけど…
つまり初めはマウスと同じ位置にインスタンスがあって、で何かによってズラされると マウスに平行して動くってこと?? もしそうなら例えば ステップイベントでx、y、をマウス座標+global.pos_x,global.pos_yてして 変数の値をコントロールするとか…
- 442 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 23:39:43 ID:PQNNdjbn]
- >>440
>>441 のように、マウス座標取得してウンヌン。 >>420あたりの感じでできますか? 自分もいまいち理解しきれてませんが、 マウスを転がすところがした方向にインスタンスを移動させたいって事だと思います。 この場合、マウスポインタが画面外に出た場合や さらに移動させようとしてマウスを元に戻した場合など変になりませんか? 純粋にマウスが移動したピクセス値だけを取得する関数ってありましたっけ?
- 443 名前:名前は開発中のものです。 mailto:sage [2008/11/17(月) 23:46:34 ID:TD8Ccrf3]
- 考え方としては>374の方が近いんじゃないかな
毎回mouse_x, mouse_yの値を覚えといて x += mouse_x - (前回の値) とかすればよろし
- 444 名前:名前は開発中のものです。 mailto:sage [2008/11/18(火) 00:19:10 ID:0wQt7vmy]
- 基本的に、ピログラムってのは原始的なもの。
高度な、「以前の値から勝手に加減して現在位置を割り出す」なんてことはできない。 たいていが まずマウスの位置をプログラマが取得 更にマウスの位置をプログラマで取得、 その差を自分ではじき出して移動量とする そんな感じで書かないといけない 一個の関数でポンってできるようなものはあまりない。
- 445 名前:440 mailto:sage [2008/11/18(火) 06:04:44 ID:MofBkydO]
- >>441-444
ありがとうございます。前回の値を覚えさせておく事で何とか私の思っている通りに出来ました。 マウス座標 - 前回のマウス座標 + 前回のオブジェクト座標 に移動させる事で出来ました。 本当にありがとうございました。
- 446 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 15:26:02 ID:DeAHgIn+]
- ジョイスティックって設定項目あったっけ?
見当たらんのだけど
- 447 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 18:07:19 ID:4za16kRK]
- 以前ダンジョンゲームのターン制についての質問をした者です
ターン制に関してはぎこちないながらも何とか完成したのですが、 毎回周囲のマスが開いているか確認→空いているところにランダムに移動だと挙動不審というか妙な動きになってしまいます。 主人公が近くにいるときは追って動く、一本道では後戻りせずなるべくまっすぐ進む、といった動きをさせたいのですが どのようにアクションを組めばいいのでしょうか。
- 448 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 18:19:51 ID:ratnEFy2]
- >>446
設定項目? GMのヘルプの The Game Maker Language (GML) →User Interaction →The Joystick にあるやつじゃなくて? キーコンフィグしたいってことなら、 グローバル変数でも作ってjoystick_check_buttonを使うといいと思う。 >>447 ターン制の動きができた、と。 んで、状況に応じて動きを制限してやりたい、と? >主人公が近くにいるときは追って動く >一本道では後戻りせずなるべくまっすぐ進む やりたいことちゃんとわかってるじゃないか。 >主人公が近くにいるときは >>追って動く >一本道では >>後戻りせずなるべくまっすぐ進む こう分けて、もう少し考えてみ?
- 449 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 18:31:18 ID:ratnEFy2]
- 一本道のとき、そのキャラの周囲に通れるマスはいくつある?
後戻りってのは、前回いたマスに行くことだよね?
- 450 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 19:05:35 ID:9SobK3CI]
- >>446
ジョイスティックイベントを探してるんだったら、Mouseの中にある。
- 451 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 02:15:20 ID:oldAvKXc]
- 斜め入力できる???
例えば top right の順だと斜め入力にならない
- 452 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 02:43:38 ID:JLC+2EzT]
- キー操作で斜め移動する時と同じ原理で、たとえばupで y -= 4、
rightで x += 4 とすれば結果的に斜めに動くことになるけど。 speedとdirection使ってるとか、斜めの時だけ移動量変えたいとかだったら joystick系の関数を使って判定するコードを書く必要がある。
- 453 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 14:33:23 ID:xqi/6PvR]
- ある範囲(ゲーム中に移動する)以外を黒で塗りつぶしたいのですがどうすれば良いのでしょうか?
- 454 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 15:13:08 ID:gtPmWcjx]
- そこだけ抜いたスプライトをビューにくっつけたりすればいいんじゃないか?
- 455 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 18:09:38 ID:/1Y7KoVd]
- 原始的に、黒い長方形を4つ描くってのもある。
- 456 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 18:19:17 ID:fSCzA9A7]
- むしろ画面サイズの黒い長方形の上にすべてを描画する。
- 457 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 19:40:56 ID:xqi/6PvR]
- >>454
移動できません >>455 ありがとうございます。 それも考えたのですが記述が長くなりそうで・・・ 「その範囲以外」という指定は出来ないのでしょうか?
- 458 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 20:57:48 ID:JLC+2EzT]
- >>457
「その範囲外」というのなら、黒く塗り潰したサーフェイスの 真ん中をくり抜いてかぶせるという方法があるけど、 どう見ても>454-455の方が簡単だわな。 「移動できません」って意味がわからないけど、 画面の2倍サイズのスプライトの真ん中に穴あけて 穴がちょうどいい位置にくるように動かせばいい。 そんな大きいスプライト、リソースがもったいないというならその通りだが。 「記述が長くなりそう」ってのも、たった4行だべ? 四隅の座標を計算して変数に入れとけば何てことない。
- 459 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 21:35:24 ID:xqi/6PvR]
- >>458
ありがとうございます。 確かに見たところ>>455のが最も楽そうですので四つ四角形を作ってみます。 続けて質問で申し訳ありません。 sleepを使うと全てが停止してしまうのですが一つのオブジェクトのみを停止させるにはどうすれば良いのでしょうか?
- 460 名前:名前は開発中のものです。 mailto:sage [2008/11/21(金) 06:23:48 ID:8FHkjqBp]
- room
→backgroundsタブ にある、Draw background colorのチェックボックスをオンにして、 その下の Color: のボックスをクリックして黒を選択する。 こうすれば、背景色が黒になる。 チェックボックスをオフにすると黒く見えるが、 それは黒ではなく何も塗られていないという状態なので、 上のやり方でいいから一度でも何か色で塗っておくべき。 一つのオブジェクトのみを停止となると、 with (object) { } を使うといい。 移動を停止させたいとなると、 {}の間にspeed = 0;を入れればいいかな。 もしその後でまた動きを再開させたいのだったら、 deactiveやactiveを使うとか、その辺のアルゴリズムはまた考えなきゃいけない。
- 461 名前:459 mailto:sage [2008/11/21(金) 06:58:26 ID:sjxyegPf]
- >>460
ありがとうございます。 その方法は便利ですね。ですが>>459で言う停止、というのはそのオブジェクト自体の働きの事です。 Createで1120ms停止してから移動開始、等です
- 462 名前:名前は開発中のものです。 mailto:sage [2008/11/21(金) 09:04:25 ID:8FHkjqBp]
- だったら「停止」とは逆に、「動いていいときだけ動く」とすればいい。
例えばステップイベントで動かしているのなら、 if (ugoku == true) { // ここにアクション } として、動かしたくないときはugokuをfalseにする。 わかっていると思うけど、msはミリセカンド。 秒でやりたいのならdatetime関数を使うのも手だけど、 そこまで拘らないのなら、フレーム数を数えるという方法もある。 例えば、 <Create> ugoku = false; taiki = 0; <Step> if (ugoku == true) { //アクション } else { taiki += 1; if (taiki >= 300) {ugoku = true;} } と書くと、インスタンスが作られてから300フレーム(5秒後(60fps時))にアクションをするようになる。 原理が分かれば応用もできるはず。
- 463 名前:名前は開発中のものです。 mailto:sage [2008/11/21(金) 14:36:04 ID:sjxyegPf]
- >>462
ありがとうございます。 なるほど、それは応用性が高くて便利ですね。助かりました。
- 464 名前:名前は開発中のものです。 [2008/11/21(金) 20:07:21 ID:Aa2c/Y3P]
- >>Createで1120ms停止してから移動開始、等です
普通にアラームを使えばいいんじゃ…?
- 465 名前:名前は開発中のものです。 mailto:sage [2008/11/21(金) 22:09:17 ID:sjxyegPf]
- >>464
アラームってms単位なのでしょうか? 使ってみた所なんかちょっと違うような・・・
- 466 名前:名前は開発中のものです。 [2008/11/21(金) 22:25:03 ID:Aa2c/Y3P]
- >>465
アラームは指定のステップ数が来たらイベントを行うのでms単位ではなく ステップ単位です 何かmsにしなきゃいけない理由でもあったら別だけど基本的な時間をコントロールしたいなら アラームが一番簡単で分かりやすい方法だから…
- 467 名前:名前は開発中のものです。 mailto:sage [2008/11/22(土) 05:30:20 ID:ih+yuern]
- >>465
どうしても秒を使いたいのなら、 最初に一度current_timeを使って現在の時刻を取得しておいて、 毎回current_timeを使って、最初に取得しておいた時間から何ミリ秒経過したかを調べる方法がある。 秒単位に拘るのなら↑のやり方があるけど、どう考えてもアラームの方が楽。
- 468 名前:465 mailto:sage [2008/11/22(土) 14:23:55 ID:Lvyzb+s5]
- >>466
ありがとうございます。 説明しにくいのですがどうしても秒単位じゃないとダメなのです。 >>467 ありがとうございます。 試しに使ってみます。
- 469 名前:名前は開発中のものです。 mailto:sage [2008/11/22(土) 19:42:07 ID:q+lYsPmJ]
- 秒からステップ数への換算なんて 秒×room_speed だけで済むし
(1120msなら 1.12*room_speed) どちらにしても1ステップ未満の分解能は得られないけどね。 それとも、ゲームが処理落ちしてても実時間に 同期させて動かしたいってことなのかな?
- 470 名前:名前は開発中のものです。 mailto:sage [2008/11/22(土) 21:30:13 ID:clFoYfTe]
- >>469
本人ではないけど恐らく後者じゃないかな あえて実時間でフレーム非同期処理っていうとネットワーク関連かも 何れにせよ解決したっぽいので何よりだ
- 471 名前:名前は開発中のものです。 [2008/11/22(土) 21:53:58 ID:lm1qIDqX]
- spriteの矢印の絵をマウスの座標に向けたいんですが、
(イメージとしては見下ろし視点での戦車の砲台) やり方がわからないです。6.0のサンプルはあったのですが 低スペックなのでGameMaker6.0以降は起動できませんでした・・・。 なのでバージョンは5.3Aです。GMLはサンプルなどを参考にして使う程度で 多少は理解できるのですが書けません。 どなたかご教授お願いします。 お手数でなければ5.3AのサンプルをUPしていただきたいです。 よろしくお願いします
- 472 名前:名前は開発中のものです。 [2008/11/22(土) 22:10:27 ID:lm1qIDqX]
- ログちゃんと読めてなかった…
自己解決しました 失礼しました
- 473 名前:名前は開発中のものです。 mailto:sage [2008/11/24(月) 13:04:13 ID:xHi4CDCd]
- GMLでマウスポインタ自体を動かす事は出来ないのでしょうか?
よろしくお願いします。
- 474 名前:名前は開発中のものです。 mailto:sage [2008/11/24(月) 15:27:27 ID:oGsKQE88]
- window_mouse_setとかdisplay_mouse_setとか
- 475 名前:名前は開発中のものです。 mailto:sage [2008/11/24(月) 21:01:38 ID:xHi4CDCd]
- ありがとうございます
- 476 名前:名前は開発中のものです。 [2008/11/26(水) 22:59:16 ID:8dk2lxXH]
- 飛び道具を発射して壁以外の何かに当たった時アクションを起こすというふうにしたいのですが
コリジョンで特定のオブジェクトでなく「何かに当たった時」という設定はできますか? 今は敵一つ一つに「飛び道具に当たった時アクション」の設定をしているですがどうにも敵の種類が多いので…
- 477 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 00:33:24 ID:N2ZEFTBa]
- >>476
まさにそういう用途のためにあるのがParentと継承のシステム。 適当なオブジェクトを作ってobj_enemyとでも名付ける。 すべての敵オブジェクトでParentをobj_enemyに設定する。 (たしかAdvanced Modeを有効にしないとParentが出てこないので注意) 後はobj_enemyとのCollisionイベントを作れば終わり。
- 478 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 06:17:21 ID:98IVXa5Q]
- Parentは、オブジェクトをグループ化させることができる便利な継承システム。
例えばマ○オに出てくる亀。 緑の亀はひたすら歩く。崖で落ちる。 赤の亀は崖で引き返す。 羽の亀は飛び跳ねる。 全ての亀において、踏みつけると甲羅になる という共通点を持つ。このように何か共通点がある場合、parentが非常に役に立つ。 noko_green ├ noko_red └ noko_pata ↑のようにparent設定をして、(noko_redでparentをnoko_green、noko_pataでparentをnoko_greenに設定する) noko_redで崖判別を、noko_pataで飛び跳ねるように設定すればいい。 共通点の「踏みつけると甲羅になる」というアクションを親オブジェクトのnoko_greenから引き継がせることができるため、何度も同じ記述をする必要がなくなる。
- 479 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 06:18:17 ID:98IVXa5Q]
- また、ゲーム内で使用しないダミーオブジェクトを作るというのも効果的。
noko_dummy(踏みつけると甲羅になる ゲーム内では使わない) ├ noko_green(移動:遅) ├ noko_red(移動:速 崖で引き返す) └ noko_pata(跳ねる) このとき、踏みつけると甲羅になるアクションは、noko_green、noko_red、noko_pataの全てに引き継がせることができる。 このように、共通な部分は全てダミーに置いておき、それぞれのオブジェクトで何が違うのかということだけを考えていけばいい。
- 480 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 06:19:32 ID:98IVXa5Q]
- 親オブジェクトもまた親を持つことができる。
これを使って、 enemy ├ kuri ├ noko_dummy │ ├ noko_green │ ├ noko_red │ └ noko_pata └ bros_dummy ├ bros_hammer ├ bros_boomerang └ bros_fire として、enemyとのCollisionイベントを作ることで、 いちいち緑亀にぶつかったとき、赤亀にぶつかったとき……等と何度も同じ事を繰り返す必要がなくなり、 「敵に接触したとき」とまとめることができる。
- 481 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 06:26:01 ID:98IVXa5Q]
- Parent関連で必ずと言っていい程同じような質問が来るようだからざっとまとめてみた。
次スレ以降のテンプレにでも入れておくと便利かと思って。修正改変等あればどうぞ。
- 482 名前:名前は開発中のものです。 [2008/11/27(木) 07:58:38 ID:YVwu6GrP]
- なるほど、親はそういうときに使うのですか
ありがとうございました!
- 483 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 08:16:46 ID:98IVXa5Q]
- >>476
「敵が飛び道具に当たったとき」ではなく「飛び道具が壁以外の何かに当たったとき」らしいので この場合は>>477で書かれている通り、飛び道具のコリジョン相手を「敵」に一纏めにするだけで済む。 以下は「敵が飛び道具に当たったとき」の考え方。よければ参考に。 飛び道具が数種類(ブーメラン、矢、ナイフ)あるとして、敵も数種類あるとする。 このとき、>>480の考え方を2回使う。 enemy ├ enemy1 ├ enemy2 └ enemy3 として全ての敵を一纏めにして、さらに weapon ├ boomerang ├ arrow └ knife として、全ての飛び道具を一纏めにする。 enemyもweaponも、中身は空っぽのオブジェクトで構わない。 そしてオブジェクトenemyで、オブジェクトweaponとのCollisionイベントを作ればいい。 こうすることで、「全ての敵において、何か飛び道具に当たったとき」とすることができる。 基本的に、似たものは一纏めにすると便利&効率的&構造上スマート。
- 484 名前:名前は開発中のものです。 [2008/11/27(木) 21:51:29 ID:IFIhMc/y]
- ボスなどを作るときにパーツごとに分けてあるのですが、曲がる時とかパーツの動きを本体にあわせようと
例えば本体のステップで with (obj_boss1_part) { direction = other.direction; image_angle = direction; } などとするのですが、曲がるときにパーツの方がプルプルと震えるようになってしまいます。 多分角度がプラスマイナスしてるからだと思いますが何か解決策ありませんか?
- 485 名前:484 [2008/11/27(木) 22:01:43 ID:IFIhMc/y]
- 自己解決しました
本当失礼しました…
- 486 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 11:52:47 ID:PgkhIyzB]
- Parentの存在に目から鱗、今まで知らなかったわ
やってみて気付いたけど親と子で同じアクション入れると無視されるんだね 例えば、親:クリエイト時に変数aに1を代入、子:クリエイト時にbに2を代入とすると aが存在しないってエラーになる。
- 487 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 13:37:01 ID:rNzKqzWh]
- >>486
親クラスのアクションを丸ごと使いまわす場合でも明示的なオーバーライドが必要だったはず GMの場合はCallInheritedEventとかそんな名前のアクション(正式名称はヘルプで確認) 何も意識せずオブジェクト指向っぽくなるのがGMLの巧い所だけど 徹底してOOPL的な書き方しようとすると逆に分かりにくかったりしますね
- 488 名前:名前は開発中のものです。 mailto:sage [2008/11/28(金) 17:05:23 ID:23J9ij0M]
- ジャンプするボタン(ここではZキーとします)を押している時間の長さでジャンプする高さを変えたいのですがどうすれば良いのでしょう?
Zキーを押している間、変数「jmp」に1ずつ足していき・・・といった感じでやってみたのですが ジャンプする条件に地面の上にいる事が入っていて、ジャンプはZキーを押した瞬間に行われるので意味がありません。
- 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]ならまだ分かるが。
|

|