トップページgamedev
996コメント482KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2008/05/11(日) 01:41:47ID: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【マンセー】
http://pc8.2ch.net/test/read.cgi/gamedev/1087068523/
0391名前は開発中のものです。2008/11/08(土) 22:52:26ID:tiFPEnIw
>>390
そっちのほうが楽ではあるけど、
処理の中に処理ってのは普通配置でもできるからガンバッ!

Control の Other にある、start/End block や else などをうまく組み合わせてみよう。
0392名前は開発中のものです。2008/11/09(日) 14:58:27ID:XXK2SOj2
>>387
上の凄いな。考えもしなかった
0393名前は開発中のものです。2008/11/09(日) 18:30:25ID:iQ0fQqMk
Access violation がでるなあ

execute piece of code だとエラー吐くのに
同じ内容をscripts に記述すると直るのは嫌らしい仕様だ
0394よこしま2008/11/09(日) 20:36:08ID:+tEv1BfM
>>379
レジスト版の場合、以下の方法でフェードインできます。

1. mbtext_drawスクリプトの中でdraw_sprite_part()を呼び出している所が2カ所あるので、それらをdraw_sprite_part_ext()に書き換えます。

draw_sprite_part(..., pos_x, pos_y);

draw_sprite_part_ext(..., pos_x, pos_y, 1, 1, -1, global.my_text_alpha);

2. mbtext_draw()を呼び出す前に、global.my_text_alphaに0〜1の値を代入します。
03953792008/11/09(日) 23:09:10ID:37vptB7Q
>>394
そうか…そこいじれば良かったのか…
ありがとうございます…
あと追加で質問なんですが…
文字を左から順番に出していくのに、いつもはstring_char_atなどを使っていたのですが、
mbtextの場合、文字列関数は使えないのでどうしたら良いでしょうか??
0396名前は開発中のものです。2008/11/09(日) 23:25:02ID:UpE3UCrs
>>393
そんな「仕様」はないと思うけど
GM7だと、たまに何の変哲もないコードでエラーが出て
同じコード打ち直すとかコピペすると直るという現象が報告されてます

>>395
2バイト文字ならstring_copyで2文字取り出すとか
string_char_atでもう1文字くっつけるとか
0397名前は開発中のものです。2008/11/10(月) 00:20:09ID:bX5vjmo9
>>396
そうなんですか・・・お騒がせしました
debuger が落ちる瞬間にアクセス違反が表示されていて
挿入方法で扱いが変わるみたいなのでそういうものかなと思ったんですけど違うみたいですね
0398名前は開発中のものです。2008/11/10(月) 01:53:38ID:hROa89TY
ヘルスや変数などの数値を用意した0〜9のスプライトで表示したいのですがどのようにすればいいんでしょうか
0399名前は開発中のものです。2008/11/10(月) 02:40:36ID:l3rRgQmH
GM5ならdraw_text_sprite
GM6ならfont_add_sprite(要レジスト)してdraw_set_fontしてdraw_text
コード書けるなら文字列に変換して1文字ずつ切り出してdraw_sprite
0400名前は開発中のものです。2008/11/10(月) 23:05:15ID:xqr6b0iA
>>398
まず数を文字列化して
for (i=1; i<=string_length(str); i+=1)
{

switch string_char_at(str, i)
{
case "0":
s = 0
break;
こんな感じで9まで行って、
draw_sprite_extとかでサブイメージをsに置き換えて表示する
*(1〜9全部1つのスプライトにサブイメージとして入れておく)
0401名前は開発中のものです。2008/11/10(月) 23:18:31ID:rXjUYemu
同じ敵がたくさん出てくるようにしたいのですが個別に体力を設定する方法はありますか?
ヘルスや変数を使うと敵全員共通のものとみなされてしまってどうも…
0402名前は開発中のものです。2008/11/10(月) 23:23:09ID:PA4xWfUd
x=rundm(10)+1
0403名前は開発中のものです。2008/11/11(火) 03:25:19ID:j6inckL9
>>401
例えばenemyってオブジェクトを作ったとして、
createイベントにhp = 100;ってコードを置いたとする。
drawイベント内で
health = hp;  ←ここ重要
そしてヘルスバーを描かせる。

こうすれば、個別にヘルスバーが減っていくはず。

healthってのは、全共通で使われる変数。ヘルスバーを描くためだけの仮の変数とでも意識しておくといいかも。
だからhealthって変数を、そのインスタンスが個別に持っている変数で上書きしてからバーを描く。

こんなイメージ
enemy (1匹目) // hpが50だとする
<draw event>
health = hp; // healthを50に設定
draw_healthbar (略) // ここでヘルスバーを描く(HP 50)

enemy (2匹目) // hpが30だとする
<draw event>
health = hp; // healthが50だったのが、30に上書きされる
draw_healthbar (略) // ここでヘルスバーを描く(HP 30)
0404名前は開発中のものです。2008/11/11(火) 07:21:02ID:gKnNaknY
ありがとうございます
特に敵のヘルスバーを表示する必要はないのですがその時はdrawの部分を省けばいいのでしょうか
0405名前は開発中のものです。2008/11/11(火) 08:14:23ID:eY/CDP8z
ならcreateでhp変数を設定すれば良いだけだと思う

globalじゃない限り普通の変数はそのオブジェクト内のみだから。
0406名前は開発中のものです。2008/11/11(火) 22:50:05ID:cbXen0Dw
なるほど
0407名前は開発中のものです。2008/11/12(水) 07:21:33ID:sHnxhObY
コリジョンで敵のhp減らすとかだとother.とか付けないと自分のhp減るから注意な
0408名前は開発中のものです。2008/11/12(水) 16:13:15ID:4hbBOuzF
>>407
それは書き方にもよるけど……。
主人公が敵に攻撃したときと、敵が主人公の攻撃に当たったとき。
状況は同じだけど、どっちのイベントでHPを減らすようにしているのかで変わる。
0409名前は開発中のものです。2008/11/14(金) 23:03:32ID:izAxC9WD
Scriptsで書いたコード中の変数も
呼び出したオブジェクトのローカル変数にされるのか・・・

ループ用変数が被りまくり\(^o^)/
0410名前は開発中のものです。2008/11/14(金) 23:20:13ID:Bs1pE8FJ
そのためのvar宣言ですよ
var i
とかやると、iはスクリプト内でのみ有効になる
0411名前は開発中のものです。2008/11/14(金) 23:40:22ID:izAxC9WD
うん、その作業をちまちまやってますw

この仕様ならargumentって要素があんまり意味ないような気がするんだけどなあ
せめてScriptsに隠蔽要素が欲しかった
0412名前は開発中のものです。2008/11/15(土) 00:09:50ID:HG68xRSC



メーカーに勤めてないとなかなかわかりづらい豆知識
リフレッシュレート

よい子のみなちゃんは、60Hzと設定したら
モニタもそのとおりに60Hzでリフレッシュしていると思っているかもしれないが





否!!!!!!!!!!!!!!!!!!



60Hzで設定していても、モニタ側は59.944Hzや58.989Hzなど、
とにかく中途半端な数値でしかリフレッシュしないものがある。
モニタが粗悪品だったり、グラフィックボード(特にRADEON)が悪さをしていることが多い。

そしてこの場合、滑らかに移動しているように見えず、かなりカクカクして見える。
これを直すには、ビデオBIOSの更新やモニタのファームウェア更新しかないので
相当面倒だ。個人で直すことはまず出来ない。
0413名前は開発中のものです。2008/11/15(土) 05:12:01ID:gZryKwbH
でも逆に言うと、Scriptsからローカル変数をいじれるんだよね。
今の仕様でいいと思うんだけどな。
0414名前は開発中のものです。2008/11/15(土) 12:32:10ID:cZlHfE8C
今GM5.3Aでアクションゲームを作ろうとしているのですが、キャラクターの移動が良いように行われません。
(移動させるキーを押す→キャラクター移動→キーを放してもその場で静止せず、ずっと移動し続ける)
どのように行えばキーを放す際に静止するようにできるのでしょうか?初歩的な質問ですいません;
0415名前は開発中のものです。2008/11/15(土) 13:05:07ID:cZlHfE8C
↑自己解決しました;

0416名前は開発中のものです。2008/11/15(土) 14:24:35ID:PB/Zmvn5
「変数が○になったとき」や「変数が○以上になった時」ではなく
「変数Aに数値が加算されたとき」という条件を作るにはどのようにすればいいのでしょうか?
0417名前は開発中のものです。2008/11/15(土) 15:00:10ID:gZryKwbH
加算されたとき
→1フレーム前の数値よりも今のフレームの数値が大きくなったとき
>>374-377と同じ考え方)

もしくは、その数値に加算したときに起こしたいアクションを置く(そのまんま)
(変数Aに加算した直後、起こしたいアクションを行う)
0418名前は開発中のものです。2008/11/15(土) 15:22:11ID:cZlHfE8C
どうも414です。
ジャンプをさせようとしてジャンプは出来るようになったのですが、今度はキャラクターが地上にいる状態で動けなくなってしまいました。
(正確にはジャンプは出来るが横移動が全くできない状態)
どの様にすれば解決できるでしょうか?
0419名前は開発中のものです。2008/11/15(土) 16:40:37ID:PB/Zmvn5
>>417
>>374〜的なやり方で行くと
stepに
difference=LEVEL
difference<prev_differenceのときやりたい処理を行う
End stepに
prev_difference=difference
とこんな風でいいのでしょうか?
0420名前は開発中のものです。2008/11/15(土) 18:04:15ID: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    // 「前のレベル」を今のレベルに更新する。
0421名前は開発中のものです。2008/11/15(土) 18:04:49ID:gZryKwbH
>>418
地上にいる間ずっと、地面との接触が起きているのかもしれない。
でも>>414のことも考えると、歩かせるアクションの方にも問題があるのかもしれない。
どこかで「止める」アクションを使っていてそれが影響しているとか。
サンプルが非公式情報サイトかどこかになかったかな……。
サンプルを探してみるのもいいし、GMにexampleとして最初から入っているものがあったらそれを見てみるのもいい。
0422名前は開発中のものです。2008/11/15(土) 18:08:02ID:PB/Zmvn5
>>420
なるほど…丁寧にありがとうございます
0423名前は開発中のものです。2008/11/15(土) 18:39:46ID:cZlHfE8C
>>421
了解しました。
返答ありがとうございます
0424名前は開発中のものです。2008/11/16(日) 10:34:59ID:aHkifR23
3桁の数値を獲得してそれぞれオリジナルのスプライトで表示したいのですが
百の位と十の位と一の位を獲得するにはどのようにしたらいいのでしょう。
0425名前は開発中のものです。2008/11/16(日) 12:24:09ID:uIhvcRmv
>>424
>400あたり参照
計算で出したいなら、一の位は10で割った余り、すなわち number mod 10
十の位は10で割ってから一の位をとればいいから (number div 10) mod 10
同じ考えで百の位は (number div 100) mod 10
0426名前は開発中のものです。2008/11/16(日) 14:19:08ID:aHkifR23
>>425
簡単に作ることができました!ありがとうございます
0427名前は開発中のものです。2008/11/16(日) 17:29:30ID:HhlndW4R
アクションゲームで、敵AのCreateに変数hp(体力)を設定して、主人公の攻撃が当たった時にhpを減らすよう設定しました。
その敵Aを数体設置してテストプレイを始め一体を倒したところちょっと経ってから「UNKNOWN variable hp」のようなエラーが出てしまうようになりました。
変数操作も消滅もモンスター内でselfで行っているのですが何か間違っているのでしょうか…
0428名前は開発中のものです。2008/11/16(日) 18:48:04ID:l0hPwkQ6
>>427
エラーメッセージでどのオブジェクトのどのイベントの
どのアクションってところまで教えてくれるんだから、まずはそこを見るべし。
そのエラーになる要因はいくつも考えられるけど、それだけの情報じゃ絞りこめん。

> 一体を倒したところちょっと経ってから
その倒したところで何をしてるの? 例えば他のオブジェクトにchangeしたりしてない?
0429名前は開発中のものです。2008/11/16(日) 18:56:22ID:HhlndW4R
>>428
ステップで「hpが0以下になったら消滅(死亡)」と言うのを設定しているんですがそれが変数を見失ってるみたいです。

倒したあとは自分がその辺を動き回っているだけでオブジェクト変更などは行っていないはずです
0430名前は開発中のものです。2008/11/16(日) 19:27:32ID:OWHuy+Yr
良ければうp
0431名前は開発中のものです。2008/11/17(月) 02:32:01ID:TD8Ccrf3
Createイベントで変数を初期化してるのにエラーが出るって場合は
イベント自体実行されていないことが考えられる。よくある例としては
・Parentのイベントで変数を定義してるけど、子オブジェクトで継承イベントを呼んでない
・change the instanceでインスタンスを変更するときにイベントを実行していない

また、instance.variable のようにドット付きで変数を参照している場合には
instanceの方が存在してないという可能性もある。
削除されたインスタンスを参照していたり、deactivateされていたりなど。

ただ、話を聞くかぎりではどちらにも当てはまらないみたいだから
原因は他のところにあると思う。
やっぱり実際のオブジェクト情報を見ないと特定は難しいかな。
0432名前は開発中のものです。2008/11/17(月) 05:45:22ID:GSdqregN
まあいいとこ、

それらのインスタンスで「共有」してる形になっているので
ある一体が消えると変数も消えてしまってる

ってとこじゃないの
インスタンスABCDEで一つの変数を見ていて
インスタンスAが消えたと同時に変数も消え
BCDEが参照できなくなっていると
0433名前は開発中のものです。2008/11/17(月) 10:24:12ID:JkLZj++k
>主人公の攻撃が当たった時にhpを減らすよう設定
>ステップで「hpが0以下になったら消滅(死亡)」

この辺の実行される順番に問題があると予想してみる。

もしそうだったら、「hpが0以下になったら消滅(死亡)」を、ステップじゃなくコリジョンイベントで実行したら直る、……かもしれない。
0434名前は開発中のものです。2008/11/17(月) 16:16:23ID:7QGWWpc1
マウスの動きに合わせて動くオブジェクトを作りたいのですがどうすれば良いでしょうか?
stepでマウスの座標に移動させてしまうと、
そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻ってしまいます。

説明が下手ですみませんが、よろしくお願いします。
0435名前は開発中のものです。2008/11/17(月) 18:01:40ID:JkLZj++k
>マウスの動きに合わせて動くオブジェクトを作りたい
これがやりたいことなら、
>そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻る
これは正しい動作ってことになるよね。マウスの動きに合わせて動いてるんだから。

どういうときにどういう動作をさせたいのか。
やりたいことをもう少し詳しく具体的に考えて。
0436名前は開発中のものです。2008/11/17(月) 20:03:59ID:qkRbLFEU
>>434
つまり一定速度でマウスに向かわせたいってこと??
もしそうならpoint_directionを使うといいと思う
0437名前は開発中のものです。2008/11/17(月) 21:34:27ID:7QGWWpc1
説明が下手で申し訳ありません。

>>435,>>436
そうです、それが正しい動作なのです。
ですが私が目指しているのは「マウスの座標に移動する」のではなく「マウスの動きにあわせる」なのです。
例えばマウスを右に動かしたらオブジェクトも右に、マウスの移動量だけ動く。という事がしたいのです。
0438名前は開発中のものです。2008/11/17(月) 22:07:33ID:PQNNdjbn
>>437
移動する前にマウス座標と移動したあとのマウス座標を比較するとかで対応とか無理ですか?
0439名前は開発中のものです。2008/11/17(月) 22:08:05ID:PQNNdjbn
移動する前と後の座標を比較 ですね。誤字申し訳ない。
0440名前は開発中のものです。2008/11/17(月) 22:38:22ID:7QGWWpc1
>>438,>>439
ありがとうございます。
何となくやり方は分かりましたがそれをコードで表すにはどうすべきか迷っております。
ちなみにGM6です。
0441名前は開発中のものです。2008/11/17(月) 23:26:43ID:qkRbLFEU
うーん、まだやりたいことがよく分からないけど…
つまり初めはマウスと同じ位置にインスタンスがあって、で何かによってズラされると
マウスに平行して動くってこと??
もしそうなら例えば
ステップイベントでx、y、をマウス座標+global.pos_x,global.pos_yてして
変数の値をコントロールするとか…
0442名前は開発中のものです。2008/11/17(月) 23:39:43ID:PQNNdjbn
>>440

>>441
のように、マウス座標取得してウンヌン。
>>420あたりの感じでできますか?

自分もいまいち理解しきれてませんが、
マウスを転がすところがした方向にインスタンスを移動させたいって事だと思います。
この場合、マウスポインタが画面外に出た場合や
さらに移動させようとしてマウスを元に戻した場合など変になりませんか?


純粋にマウスが移動したピクセス値だけを取得する関数ってありましたっけ?
0443名前は開発中のものです。2008/11/17(月) 23:46:34ID:TD8Ccrf3
考え方としては>374の方が近いんじゃないかな
毎回mouse_x, mouse_yの値を覚えといて
x += mouse_x - (前回の値) とかすればよろし
0444名前は開発中のものです。2008/11/18(火) 00:19:10ID:0wQt7vmy
基本的に、ピログラムってのは原始的なもの。

高度な、「以前の値から勝手に加減して現在位置を割り出す」なんてことはできない。


たいていが

まずマウスの位置をプログラマが取得
更にマウスの位置をプログラマで取得、
その差を自分ではじき出して移動量とする

そんな感じで書かないといけない

一個の関数でポンってできるようなものはあまりない。
04454402008/11/18(火) 06:04:44ID:MofBkydO
>>441-444
ありがとうございます。前回の値を覚えさせておく事で何とか私の思っている通りに出来ました。

マウス座標 - 前回のマウス座標 + 前回のオブジェクト座標 に移動させる事で出来ました。
本当にありがとうございました。
0446名前は開発中のものです。2008/11/19(水) 15:26:02ID:DeAHgIn+
ジョイスティックって設定項目あったっけ?

見当たらんのだけど
0447名前は開発中のものです。2008/11/19(水) 18:07:19ID:4za16kRK
以前ダンジョンゲームのターン制についての質問をした者です
ターン制に関してはぎこちないながらも何とか完成したのですが、
毎回周囲のマスが開いているか確認→空いているところにランダムに移動だと挙動不審というか妙な動きになってしまいます。
主人公が近くにいるときは追って動く、一本道では後戻りせずなるべくまっすぐ進む、といった動きをさせたいのですが
どのようにアクションを組めばいいのでしょうか。
0448名前は開発中のものです。2008/11/19(水) 18:19:51ID:ratnEFy2
>>446
設定項目?
GMのヘルプの
The Game Maker Language (GML)
→User Interaction
→The Joystick
にあるやつじゃなくて?

キーコンフィグしたいってことなら、
グローバル変数でも作ってjoystick_check_buttonを使うといいと思う。

>>447
ターン制の動きができた、と。
んで、状況に応じて動きを制限してやりたい、と?
>主人公が近くにいるときは追って動く
>一本道では後戻りせずなるべくまっすぐ進む
やりたいことちゃんとわかってるじゃないか。

>主人公が近くにいるときは
>>追って動く

>一本道では
>>後戻りせずなるべくまっすぐ進む

こう分けて、もう少し考えてみ?
0449名前は開発中のものです。2008/11/19(水) 18:31:18ID:ratnEFy2
一本道のとき、そのキャラの周囲に通れるマスはいくつある?
後戻りってのは、前回いたマスに行くことだよね?
0450名前は開発中のものです。2008/11/19(水) 19:05:35ID:9SobK3CI
>>446
ジョイスティックイベントを探してるんだったら、Mouseの中にある。
0451名前は開発中のものです。2008/11/20(木) 02:15:20ID:oldAvKXc
斜め入力できる???

例えば
top
right

の順だと斜め入力にならない
0452名前は開発中のものです。2008/11/20(木) 02:43:38ID:JLC+2EzT
キー操作で斜め移動する時と同じ原理で、たとえばupで y -= 4、
rightで x += 4 とすれば結果的に斜めに動くことになるけど。

speedとdirection使ってるとか、斜めの時だけ移動量変えたいとかだったら
joystick系の関数を使って判定するコードを書く必要がある。
0453名前は開発中のものです。2008/11/20(木) 14:33:23ID:xqi/6PvR
ある範囲(ゲーム中に移動する)以外を黒で塗りつぶしたいのですがどうすれば良いのでしょうか?
0454名前は開発中のものです。2008/11/20(木) 15:13:08ID:gtPmWcjx
そこだけ抜いたスプライトをビューにくっつけたりすればいいんじゃないか?
0455名前は開発中のものです。2008/11/20(木) 18:09:38ID:/1Y7KoVd
原始的に、黒い長方形を4つ描くってのもある。
0456名前は開発中のものです。2008/11/20(木) 18:19:17ID:fSCzA9A7
むしろ画面サイズの黒い長方形の上にすべてを描画する。
0457名前は開発中のものです。2008/11/20(木) 19:40:56ID:xqi/6PvR
>>454
移動できません

>>455
ありがとうございます。
それも考えたのですが記述が長くなりそうで・・・
「その範囲以外」という指定は出来ないのでしょうか?
0458名前は開発中のものです。2008/11/20(木) 20:57:48ID:JLC+2EzT
>>457
「その範囲外」というのなら、黒く塗り潰したサーフェイスの
真ん中をくり抜いてかぶせるという方法があるけど、
どう見ても>454-455の方が簡単だわな。

「移動できません」って意味がわからないけど、
画面の2倍サイズのスプライトの真ん中に穴あけて
穴がちょうどいい位置にくるように動かせばいい。
そんな大きいスプライト、リソースがもったいないというならその通りだが。
「記述が長くなりそう」ってのも、たった4行だべ?
四隅の座標を計算して変数に入れとけば何てことない。
0459名前は開発中のものです。2008/11/20(木) 21:35:24ID:xqi/6PvR
>>458
ありがとうございます。
確かに見たところ>>455のが最も楽そうですので四つ四角形を作ってみます。


続けて質問で申し訳ありません。
sleepを使うと全てが停止してしまうのですが一つのオブジェクトのみを停止させるにはどうすれば良いのでしょうか?
0460名前は開発中のものです。2008/11/21(金) 06:23:48ID:8FHkjqBp
room
→backgroundsタブ
にある、Draw background colorのチェックボックスをオンにして、
その下の Color: のボックスをクリックして黒を選択する。

こうすれば、背景色が黒になる。

チェックボックスをオフにすると黒く見えるが、
それは黒ではなく何も塗られていないという状態なので、
上のやり方でいいから一度でも何か色で塗っておくべき。

一つのオブジェクトのみを停止となると、
with (object)
{

}
を使うといい。
移動を停止させたいとなると、
{}の間にspeed = 0;を入れればいいかな。

もしその後でまた動きを再開させたいのだったら、
deactiveやactiveを使うとか、その辺のアルゴリズムはまた考えなきゃいけない。
04614592008/11/21(金) 06:58:26ID:sjxyegPf
>>460
ありがとうございます。
その方法は便利ですね。ですが>>459で言う停止、というのはそのオブジェクト自体の働きの事です。
Createで1120ms停止してから移動開始、等です
0462名前は開発中のものです。2008/11/21(金) 09:04:25ID: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時))にアクションをするようになる。
原理が分かれば応用もできるはず。
0463名前は開発中のものです。2008/11/21(金) 14:36:04ID:sjxyegPf
>>462
ありがとうございます。
なるほど、それは応用性が高くて便利ですね。助かりました。
0464名前は開発中のものです。2008/11/21(金) 20:07:21ID:Aa2c/Y3P
>>Createで1120ms停止してから移動開始、等です
普通にアラームを使えばいいんじゃ…?
0465名前は開発中のものです。2008/11/21(金) 22:09:17ID:sjxyegPf
>>464
アラームってms単位なのでしょうか?
使ってみた所なんかちょっと違うような・・・
0466名前は開発中のものです。2008/11/21(金) 22:25:03ID:Aa2c/Y3P
>>465
アラームは指定のステップ数が来たらイベントを行うのでms単位ではなく
ステップ単位です
何かmsにしなきゃいけない理由でもあったら別だけど基本的な時間をコントロールしたいなら
アラームが一番簡単で分かりやすい方法だから…
0467名前は開発中のものです。2008/11/22(土) 05:30:20ID:ih+yuern
>>465
どうしても秒を使いたいのなら、
最初に一度current_timeを使って現在の時刻を取得しておいて、
毎回current_timeを使って、最初に取得しておいた時間から何ミリ秒経過したかを調べる方法がある。

秒単位に拘るのなら↑のやり方があるけど、どう考えてもアラームの方が楽。
04684652008/11/22(土) 14:23:55ID:Lvyzb+s5
>>466
ありがとうございます。
説明しにくいのですがどうしても秒単位じゃないとダメなのです。

>>467
ありがとうございます。
試しに使ってみます。
0469名前は開発中のものです。2008/11/22(土) 19:42:07ID:q+lYsPmJ
秒からステップ数への換算なんて 秒×room_speed だけで済むし
(1120msなら 1.12*room_speed)
どちらにしても1ステップ未満の分解能は得られないけどね。
それとも、ゲームが処理落ちしてても実時間に
同期させて動かしたいってことなのかな?
0470名前は開発中のものです。2008/11/22(土) 21:30:13ID:clFoYfTe
>>469
本人ではないけど恐らく後者じゃないかな
あえて実時間でフレーム非同期処理っていうとネットワーク関連かも
何れにせよ解決したっぽいので何よりだ
0471名前は開発中のものです。2008/11/22(土) 21:53:58ID:lm1qIDqX
spriteの矢印の絵をマウスの座標に向けたいんですが、
(イメージとしては見下ろし視点での戦車の砲台)
やり方がわからないです。6.0のサンプルはあったのですが
低スペックなのでGameMaker6.0以降は起動できませんでした・・・。
なのでバージョンは5.3Aです。GMLはサンプルなどを参考にして使う程度で
多少は理解できるのですが書けません。
どなたかご教授お願いします。
お手数でなければ5.3AのサンプルをUPしていただきたいです。
よろしくお願いします
0472名前は開発中のものです。2008/11/22(土) 22:10:27ID:lm1qIDqX
ログちゃんと読めてなかった…
自己解決しました 失礼しました
0473名前は開発中のものです。2008/11/24(月) 13:04:13ID:xHi4CDCd
GMLでマウスポインタ自体を動かす事は出来ないのでしょうか?
よろしくお願いします。
0474名前は開発中のものです。2008/11/24(月) 15:27:27ID:oGsKQE88
window_mouse_setとかdisplay_mouse_setとか
0475名前は開発中のものです。2008/11/24(月) 21:01:38ID:xHi4CDCd
ありがとうございます
0476名前は開発中のものです。2008/11/26(水) 22:59:16ID:8dk2lxXH
飛び道具を発射して壁以外の何かに当たった時アクションを起こすというふうにしたいのですが
コリジョンで特定のオブジェクトでなく「何かに当たった時」という設定はできますか?
今は敵一つ一つに「飛び道具に当たった時アクション」の設定をしているですがどうにも敵の種類が多いので…
0477名前は開発中のものです。2008/11/27(木) 00:33:24ID:N2ZEFTBa
>>476
まさにそういう用途のためにあるのがParentと継承のシステム。

適当なオブジェクトを作ってobj_enemyとでも名付ける。
すべての敵オブジェクトでParentをobj_enemyに設定する。
(たしかAdvanced Modeを有効にしないとParentが出てこないので注意)
後はobj_enemyとのCollisionイベントを作れば終わり。
0478名前は開発中のものです。2008/11/27(木) 06:17:21ID: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から引き継がせることができるため、何度も同じ記述をする必要がなくなる。
0479名前は開発中のものです。2008/11/27(木) 06:18:17ID:98IVXa5Q
また、ゲーム内で使用しないダミーオブジェクトを作るというのも効果的。

noko_dummy(踏みつけると甲羅になる ゲーム内では使わない)
├ noko_green(移動:遅)
├ noko_red(移動:速 崖で引き返す)
└ noko_pata(跳ねる)

このとき、踏みつけると甲羅になるアクションは、noko_green、noko_red、noko_pataの全てに引き継がせることができる。
このように、共通な部分は全てダミーに置いておき、それぞれのオブジェクトで何が違うのかということだけを考えていけばいい。
0480名前は開発中のものです。2008/11/27(木) 06:19:32ID:98IVXa5Q
親オブジェクトもまた親を持つことができる。
これを使って、

enemy
├ kuri
├ noko_dummy
│ ├ noko_green
│ ├ noko_red
│ └ noko_pata
└ bros_dummy
  ├ bros_hammer
  ├ bros_boomerang
  └ bros_fire

として、enemyとのCollisionイベントを作ることで、
いちいち緑亀にぶつかったとき、赤亀にぶつかったとき……等と何度も同じ事を繰り返す必要がなくなり、
「敵に接触したとき」とまとめることができる。
0481名前は開発中のものです。2008/11/27(木) 06:26:01ID:98IVXa5Q
Parent関連で必ずと言っていい程同じような質問が来るようだからざっとまとめてみた。
次スレ以降のテンプレにでも入れておくと便利かと思って。修正改変等あればどうぞ。
0482名前は開発中のものです。2008/11/27(木) 07:58:38ID:YVwu6GrP
なるほど、親はそういうときに使うのですか
ありがとうございました!
0483名前は開発中のものです。2008/11/27(木) 08:16:46ID:98IVXa5Q
>>476
「敵が飛び道具に当たったとき」ではなく「飛び道具が壁以外の何かに当たったとき」らしいので
この場合は>>477で書かれている通り、飛び道具のコリジョン相手を「敵」に一纏めにするだけで済む。

以下は「敵が飛び道具に当たったとき」の考え方。よければ参考に。


飛び道具が数種類(ブーメラン、矢、ナイフ)あるとして、敵も数種類あるとする。
このとき、>>480の考え方を2回使う。

enemy
├ enemy1
├ enemy2
└ enemy3

として全ての敵を一纏めにして、さらに

weapon
├ boomerang
├ arrow
└ knife

として、全ての飛び道具を一纏めにする。
enemyもweaponも、中身は空っぽのオブジェクトで構わない。

そしてオブジェクトenemyで、オブジェクトweaponとのCollisionイベントを作ればいい。
こうすることで、「全ての敵において、何か飛び道具に当たったとき」とすることができる。


基本的に、似たものは一纏めにすると便利&効率的&構造上スマート。
0484名前は開発中のものです。2008/11/27(木) 21:51:29ID:IFIhMc/y
ボスなどを作るときにパーツごとに分けてあるのですが、曲がる時とかパーツの動きを本体にあわせようと
例えば本体のステップで
with (obj_boss1_part)
{
direction = other.direction;
image_angle = direction;
}
などとするのですが、曲がるときにパーツの方がプルプルと震えるようになってしまいます。
多分角度がプラスマイナスしてるからだと思いますが何か解決策ありませんか?
04854842008/11/27(木) 22:01:43ID:IFIhMc/y
自己解決しました
本当失礼しました…
0486名前は開発中のものです。2008/11/28(金) 11:52:47ID:PgkhIyzB
Parentの存在に目から鱗、今まで知らなかったわ

やってみて気付いたけど親と子で同じアクション入れると無視されるんだね

例えば、親:クリエイト時に変数aに1を代入、子:クリエイト時にbに2を代入とすると
aが存在しないってエラーになる。
0487名前は開発中のものです。2008/11/28(金) 13:37:01ID:rNzKqzWh
>>486
親クラスのアクションを丸ごと使いまわす場合でも明示的なオーバーライドが必要だったはず
GMの場合はCallInheritedEventとかそんな名前のアクション(正式名称はヘルプで確認)
何も意識せずオブジェクト指向っぽくなるのがGMLの巧い所だけど
徹底してOOPL的な書き方しようとすると逆に分かりにくかったりしますね
0488名前は開発中のものです。2008/11/28(金) 17:05:23ID:23J9ij0M
ジャンプするボタン(ここではZキーとします)を押している時間の長さでジャンプする高さを変えたいのですがどうすれば良いのでしょう?

Zキーを押している間、変数「jmp」に1ずつ足していき・・・といった感じでやってみたのですが
ジャンプする条件に地面の上にいる事が入っていて、ジャンプはZキーを押した瞬間に行われるので意味がありません。
0489名前は開発中のものです。2008/11/28(金) 21:07:21ID:bzoft8au
>>488
押す(pressKeyDown)とパワーを貯めて(経過時間で数値を増加)
離す(pressKeyUp)とジャンプ処理

でどうですか?
0490名前は開発中のものです。2008/11/28(金) 22:28:28ID:8vGbtbAk


スープーメイリオブロ(英語は発音大事)みたいにしたいなら、
単純に押してる間だけスプライトを移動させていけばいいだろ
0491名前は開発中のものです。2008/11/28(金) 22:38:55ID:Ib5prIDh
>>486
親のイベントにあって子のイベントに無い物は、自動で子に引き継がれる。
子と同じイベントにある親のアクションを引き継がせる場合、
その起こしたいイベントの中でCall Parent Eventアクション(GML: event_inherited())を使う。

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


>>488
ボタンを押した時にジャンプの高さを全て決めるのではなく、
ボタンを押してジャンプさせ、ボタンを離した時に、押してからの長さによって「ジャンプの上昇を止めて落下させる」という考え方がどっかで使われていたと思う。
■ このスレッドは過去ログ倉庫に格納されています