[表示 : 全て 最新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/

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
ありがとう、助かりました。

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つとも例文付きで載ってます
徐々にアニメーションを早くしたり、特定のコマで停止したり
状況に応じて動的にアニメーション速度を変更できます






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

前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