- 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/
- 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]ならまだ分かるが。
- 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
ありがとう、助かりました。
|

|