【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/
0429名前は開発中のものです。
2008/11/16(日) 18:56:22ID:HhlndW4Rステップで「hpが0以下になったら消滅(死亡)」と言うのを設定しているんですがそれが変数を見失ってるみたいです。
倒したあとは自分がその辺を動き回っているだけでオブジェクト変更などは行っていないはずです
0430名前は開発中のものです。
2008/11/16(日) 19:27:32ID:OWHuy+Yr0431名前は開発中のものです。
2008/11/17(月) 02:32:01ID:TD8Ccrf3イベント自体実行されていないことが考えられる。よくある例としては
・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が0以下になったら消滅(死亡)」
この辺の実行される順番に問題があると予想してみる。
もしそうだったら、「hpが0以下になったら消滅(死亡)」を、ステップじゃなくコリジョンイベントで実行したら直る、……かもしれない。
0434名前は開発中のものです。
2008/11/17(月) 16:16:23ID:7QGWWpc1stepでマウスの座標に移動させてしまうと、
そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻ってしまいます。
説明が下手ですみませんが、よろしくお願いします。
0435名前は開発中のものです。
2008/11/17(月) 18:01:40ID:JkLZj++kこれがやりたいことなら、
>そのオブジェクトがマウス以外の要因(敵との接触など)で移動した場合も、すぐにマウスの座標に戻る
これは正しい動作ってことになるよね。マウスの動きに合わせて動いてるんだから。
どういうときにどういう動作をさせたいのか。
やりたいことをもう少し詳しく具体的に考えて。
0436名前は開発中のものです。
2008/11/17(月) 20:03:59ID:qkRbLFEUつまり一定速度でマウスに向かわせたいってこと??
もしそうならpoint_directionを使うといいと思う
0437名前は開発中のものです。
2008/11/17(月) 21:34:27ID:7QGWWpc1>>435,>>436
そうです、それが正しい動作なのです。
ですが私が目指しているのは「マウスの座標に移動する」のではなく「マウスの動きにあわせる」なのです。
例えばマウスを右に動かしたらオブジェクトも右に、マウスの移動量だけ動く。という事がしたいのです。
0438名前は開発中のものです。
2008/11/17(月) 22:07:33ID:PQNNdjbn移動する前にマウス座標と移動したあとのマウス座標を比較するとかで対応とか無理ですか?
0439名前は開発中のものです。
2008/11/17(月) 22:08:05ID:PQNNdjbn0440名前は開発中のものです。
2008/11/17(月) 22:38:22ID:7QGWWpc1ありがとうございます。
何となくやり方は分かりましたがそれをコードで表すにはどうすべきか迷っております。
ちなみに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>>441
のように、マウス座標取得してウンヌン。
>>420あたりの感じでできますか?
自分もいまいち理解しきれてませんが、
マウスを転がすところがした方向にインスタンスを移動させたいって事だと思います。
この場合、マウスポインタが画面外に出た場合や
さらに移動させようとしてマウスを元に戻した場合など変になりませんか?
純粋にマウスが移動したピクセス値だけを取得する関数ってありましたっけ?
0443名前は開発中のものです。
2008/11/17(月) 23:46:34ID:TD8Ccrf3毎回mouse_x, mouse_yの値を覚えといて
x += mouse_x - (前回の値) とかすればよろし
0444名前は開発中のものです。
2008/11/18(火) 00:19:10ID:0wQt7vmy高度な、「以前の値から勝手に加減して現在位置を割り出す」なんてことはできない。
たいていが
まずマウスの位置をプログラマが取得
更にマウスの位置をプログラマで取得、
その差を自分ではじき出して移動量とする
そんな感じで書かないといけない
一個の関数でポンってできるようなものはあまりない。
0445440
2008/11/18(火) 06:04:44ID:MofBkydOありがとうございます。前回の値を覚えさせておく事で何とか私の思っている通りに出来ました。
マウス座標 - 前回のマウス座標 + 前回のオブジェクト座標 に移動させる事で出来ました。
本当にありがとうございました。
0446名前は開発中のものです。
2008/11/19(水) 15:26:02ID:DeAHgIn+見当たらんのだけど
0447名前は開発中のものです。
2008/11/19(水) 18:07:19ID:4za16kRKターン制に関してはぎこちないながらも何とか完成したのですが、
毎回周囲のマスが開いているか確認→空いているところにランダムに移動だと挙動不審というか妙な動きになってしまいます。
主人公が近くにいるときは追って動く、一本道では後戻りせずなるべくまっすぐ進む、といった動きをさせたいのですが
どのようにアクションを組めばいいのでしょうか。
0448名前は開発中のものです。
2008/11/19(水) 18:19:51ID:ratnEFy2設定項目?
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ジョイスティックイベントを探してるんだったら、Mouseの中にある。
0451名前は開発中のものです。
2008/11/20(木) 02:15:20ID:oldAvKXc例えば
top
right
の順だと斜め入力にならない
0452名前は開発中のものです。
2008/11/20(木) 02:43:38ID:JLC+2EzTrightで x += 4 とすれば結果的に斜めに動くことになるけど。
speedとdirection使ってるとか、斜めの時だけ移動量変えたいとかだったら
joystick系の関数を使って判定するコードを書く必要がある。
0453名前は開発中のものです。
2008/11/20(木) 14:33:23ID:xqi/6PvR0454名前は開発中のものです。
2008/11/20(木) 15:13:08ID:gtPmWcjx0455名前は開発中のものです。
2008/11/20(木) 18:09:38ID:/1Y7KoVd0456名前は開発中のものです。
2008/11/20(木) 18:19:17ID:fSCzA9A70457名前は開発中のものです。
2008/11/20(木) 19:40:56ID:xqi/6PvR移動できません
>>455
ありがとうございます。
それも考えたのですが記述が長くなりそうで・・・
「その範囲以外」という指定は出来ないのでしょうか?
0458名前は開発中のものです。
2008/11/20(木) 20:57:48ID:JLC+2EzT「その範囲外」というのなら、黒く塗り潰したサーフェイスの
真ん中をくり抜いてかぶせるという方法があるけど、
どう見ても>454-455の方が簡単だわな。
「移動できません」って意味がわからないけど、
画面の2倍サイズのスプライトの真ん中に穴あけて
穴がちょうどいい位置にくるように動かせばいい。
そんな大きいスプライト、リソースがもったいないというならその通りだが。
「記述が長くなりそう」ってのも、たった4行だべ?
四隅の座標を計算して変数に入れとけば何てことない。
0459名前は開発中のものです。
2008/11/20(木) 21:35:24ID:xqi/6PvRありがとうございます。
確かに見たところ>>455のが最も楽そうですので四つ四角形を作ってみます。
続けて質問で申し訳ありません。
sleepを使うと全てが停止してしまうのですが一つのオブジェクトのみを停止させるにはどうすれば良いのでしょうか?
0460名前は開発中のものです。
2008/11/21(金) 06:23:48ID:8FHkjqBp→backgroundsタブ
にある、Draw background colorのチェックボックスをオンにして、
その下の Color: のボックスをクリックして黒を選択する。
こうすれば、背景色が黒になる。
チェックボックスをオフにすると黒く見えるが、
それは黒ではなく何も塗られていないという状態なので、
上のやり方でいいから一度でも何か色で塗っておくべき。
一つのオブジェクトのみを停止となると、
with (object)
{
}
を使うといい。
移動を停止させたいとなると、
{}の間にspeed = 0;を入れればいいかな。
もしその後でまた動きを再開させたいのだったら、
deactiveやactiveを使うとか、その辺のアルゴリズムはまた考えなきゃいけない。
0461459
2008/11/21(金) 06:58:26ID:sjxyegPfありがとうございます。
その方法は便利ですね。ですが>>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ありがとうございます。
なるほど、それは応用性が高くて便利ですね。助かりました。
0464名前は開発中のものです。
2008/11/21(金) 20:07:21ID:Aa2c/Y3P普通にアラームを使えばいいんじゃ…?
0465名前は開発中のものです。
2008/11/21(金) 22:09:17ID:sjxyegPfアラームってms単位なのでしょうか?
使ってみた所なんかちょっと違うような・・・
0466名前は開発中のものです。
2008/11/21(金) 22:25:03ID:Aa2c/Y3Pアラームは指定のステップ数が来たらイベントを行うのでms単位ではなく
ステップ単位です
何かmsにしなきゃいけない理由でもあったら別だけど基本的な時間をコントロールしたいなら
アラームが一番簡単で分かりやすい方法だから…
0467名前は開発中のものです。
2008/11/22(土) 05:30:20ID:ih+yuernどうしても秒を使いたいのなら、
最初に一度current_timeを使って現在の時刻を取得しておいて、
毎回current_timeを使って、最初に取得しておいた時間から何ミリ秒経過したかを調べる方法がある。
秒単位に拘るのなら↑のやり方があるけど、どう考えてもアラームの方が楽。
0468465
2008/11/22(土) 14:23:55ID:Lvyzb+s5ありがとうございます。
説明しにくいのですがどうしても秒単位じゃないとダメなのです。
>>467
ありがとうございます。
試しに使ってみます。
0469名前は開発中のものです。
2008/11/22(土) 19:42:07ID:q+lYsPmJ(1120msなら 1.12*room_speed)
どちらにしても1ステップ未満の分解能は得られないけどね。
それとも、ゲームが処理落ちしてても実時間に
同期させて動かしたいってことなのかな?
0470名前は開発中のものです。
2008/11/22(土) 21:30:13ID:clFoYfTe本人ではないけど恐らく後者じゃないかな
あえて実時間でフレーム非同期処理っていうとネットワーク関連かも
何れにせよ解決したっぽいので何よりだ
0471名前は開発中のものです。
2008/11/22(土) 21:53:58ID:lm1qIDqX(イメージとしては見下ろし視点での戦車の砲台)
やり方がわからないです。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よろしくお願いします。
0474名前は開発中のものです。
2008/11/24(月) 15:27:27ID:oGsKQE880475名前は開発中のものです。
2008/11/24(月) 21:01:38ID:xHi4CDCd0476名前は開発中のものです。
2008/11/26(水) 22:59:16ID:8dk2lxXHコリジョンで特定のオブジェクトでなく「何かに当たった時」という設定はできますか?
今は敵一つ一つに「飛び道具に当たった時アクション」の設定をしているですがどうにも敵の種類が多いので…
0477名前は開発中のものです。
2008/11/27(木) 00:33:24ID:N2ZEFTBaまさにそういう用途のためにあるのがParentと継承のシステム。
適当なオブジェクトを作ってobj_enemyとでも名付ける。
すべての敵オブジェクトでParentをobj_enemyに設定する。
(たしかAdvanced Modeを有効にしないとParentが出てこないので注意)
後はobj_enemyとのCollisionイベントを作れば終わり。
0478名前は開発中のものです。
2008/11/27(木) 06:17:21ID:98IVXa5Q例えばマ○オに出てくる亀。
緑の亀はひたすら歩く。崖で落ちる。
赤の亀は崖で引き返す。
羽の亀は飛び跳ねる。
全ての亀において、踏みつけると甲羅になる
という共通点を持つ。このように何か共通点がある場合、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:98IVXa5Qnoko_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次スレ以降のテンプレにでも入れておくと便利かと思って。修正改変等あればどうぞ。
0482名前は開発中のものです。
2008/11/27(木) 07:58:38ID:YVwu6GrPありがとうございました!
0483名前は開発中のものです。
2008/11/27(木) 08:16:46ID:98IVXa5Q「敵が飛び道具に当たったとき」ではなく「飛び道具が壁以外の何かに当たったとき」らしいので
この場合は>>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;
}
などとするのですが、曲がるときにパーツの方がプルプルと震えるようになってしまいます。
多分角度がプラスマイナスしてるからだと思いますが何か解決策ありませんか?
0485484
2008/11/27(木) 22:01:43ID:IFIhMc/y本当失礼しました…
0486名前は開発中のものです。
2008/11/28(金) 11:52:47ID:PgkhIyzBやってみて気付いたけど親と子で同じアクション入れると無視されるんだね
例えば、親:クリエイト時に変数aに1を代入、子:クリエイト時にbに2を代入とすると
aが存在しないってエラーになる。
0487名前は開発中のものです。
2008/11/28(金) 13:37:01ID:rNzKqzWh親クラスのアクションを丸ごと使いまわす場合でも明示的なオーバーライドが必要だったはず
GMの場合はCallInheritedEventとかそんな名前のアクション(正式名称はヘルプで確認)
何も意識せずオブジェクト指向っぽくなるのがGMLの巧い所だけど
徹底してOOPL的な書き方しようとすると逆に分かりにくかったりしますね
0488名前は開発中のものです。
2008/11/28(金) 17:05:23ID:23J9ij0MZキーを押している間、変数「jmp」に1ずつ足していき・・・といった感じでやってみたのですが
ジャンプする条件に地面の上にいる事が入っていて、ジャンプはZキーを押した瞬間に行われるので意味がありません。
0489名前は開発中のものです。
2008/11/28(金) 21:07:21ID:bzoft8au押す(pressKeyDown)とパワーを貯めて(経過時間で数値を増加)
離す(pressKeyUp)とジャンプ処理
でどうですか?
0490名前は開発中のものです。
2008/11/28(金) 22:28:28ID:8vGbtbAkスープーメイリオブロ(英語は発音大事)みたいにしたいなら、
単純に押してる間だけスプライトを移動させていけばいいだろ
0491名前は開発中のものです。
2008/11/28(金) 22:38:55ID:Ib5prIDh親のイベントにあって子のイベントに無い物は、自動で子に引き継がれる。
子と同じイベントにある親のアクションを引き継がせる場合、
その起こしたいイベントの中でCall Parent Eventアクション(GML: event_inherited())を使う。
というわけで、>>486の例だと子のクリエイトのbに2を代入した前でも後でもいいから
親のイベントを呼んでやると、子もa=1を持つようになる。
>>488
ボタンを押した時にジャンプの高さを全て決めるのではなく、
ボタンを押してジャンプさせ、ボタンを離した時に、押してからの長さによって「ジャンプの上昇を止めて落下させる」という考え方がどっかで使われていたと思う。
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)
これ以降じゃないと値が保障されないのか。ぬかったわ
■ このスレッドは過去ログ倉庫に格納されています