なるほど.....やっぱり諸々を考えてDrawイベントの方に書いていこうと思います!ありがとうございました!
GameMakerのレンダリングパイプラインはこうなっていて(マニュアルURL参照) application_surfaceでGUI要素以外の全てが描画され、そのあとでGUI要素が描画されます。 https://manual.gamemaker.io/lts/en/index.htm?#t=The_Asset_Editors/Object_Properties/Draw_Events.htm
なのでGUI要素の前面に描画させたい場合はDrawGUIイベントで描画する必要があります。
仮に、HUD表示をDrawGUIで描画していてHUDよりも前面にキャラを表示させるとすると、 DrawGUIイベントで 1) HUDを描画 2) キャラ(のsprite)を描画 の順で描画します。
DrawGUIイベントを使わずに全部Drawイベントでやる方法もあると思います (その場合はHUDも一緒にスクロールとかしないよう制御する必要が出てきます)
ありがとうございます!そんな関数があるんですね~勉強になります
UI専用レイヤーというのは、UIを配置するためだけのレイヤーを作っているだけです、、分かりづらくてすみません!
ありがとうございます!試してみます!
違ったらすみません!
draw_text_transformed(x,y,string,x_scale,y_scale,angle)を使うことでできます!
//作成 xscale=0 yscale=0 x_coordinate=250 y_coordinate=250
//ステップ xscale+=0.01 yscale+=0.01 x_coordinate-=2//フォントのサイズとxscale+=に合わせて変えてください y_coordinate-=2//フォントのサイズとyscale+=に合わせて変えてください
//GUI描画 draw_set_font(Font1)//フォントの設定であらかじめ拡大させたい最大のサイズにしておくと解像度は悪くなりません! draw_text_transformed(x_coordinate,y_coordinate,"abcd",xscale,yscale,0)
補足を入れさせてもらうとただただx_scaleとy_scaleを拡大してしまうと、一文字目の左上を基準に拡大しているのでどんどん右下に行ってしまいます。なのでx,y座標もそれに合わせて変更するようにしています。自分もまだ初心者なのでもしかしたら中心を基準にx_scaleとy_scaleを拡大させる方法があるかもしれないです! それともし良かったらUIをUI専用レイヤーに設置する方法を教えてもらえないでしょうか?(そもそもUI専用レイヤーが存在することを知りませんでした)質問に質問で返してすみません!
GUI以外の要素をDrawイベントで描画する GUI要素をDrawGUIイベントで描画する
と分けるといけますよ
ありがとうございます!
ということですね。 カプセル化と言うんでしょうか、そういうコードを破綻させない設計が大事なんですね。ここらへんがまだ自分は弱いです。
複雑な場合は怪しいところの前にブレークポイントを置き、ウォッチウィンドウを開いて見たい値を監視するってことを自分はやっています。 ウォッチウィンドウは現在のブレークポイントのの箇所にある指定した変数の値を見ることができる機能で、ウィンドウに直接変数名を入力するとその値を見ることができます。(デバック実行中Debugger -> Watchからウィンドウを表示可能) 通常の変数だけでなく、配列、構造体などの変数も指定可能です。 基本ステップオーバー(関数飛ばし)で実行をチェックして、値が変化した関数があった場合ステップイン(関数の中に入る)して中身を確認しています。
ただ、そこまで複雑じゃない場合は自分もあさまどさんみたいなやり方もやってますw
また、設計の段階では他のインスタンスから直接変数の値を変化させないようにしていたりもします。 インスタンスの変更をする場合はできるだけ関数を介して変更します。 そうすればその関数の中に一つブレークポイントを入れるだけで、値の変化を監視することができます。 そうでない場合、変化のある箇所全部にブレークポイントを入れる必要がでてきてしまいます。
プロジェクトファイルのデフォルトディレクトの変更に伴って、テンプレートプロジェクトファイルも移動になりました。 前バージョンのテンプレートオブジェクトを読み込む場合はUser->GameMakerProjects->TemplateProjectsのフォルダに移動する必要があります。
ありがとうございます!!助かりました!!!
いけると思います!
以前にもあった致命的なバグですがまた再発したんでしょうか
動作確認すらしてないものですが、こういうのでチェックできますかね
// 重複するinstance idを見つける function dev_check_duplicate_instance_id() { var duplicate_str = ""; var id_ary = []; with (all) { if (array_get_index(id_ary, id) != -1) duplicate_str += $"{id}, "; array_push(id_ary, id); } if (duplicate_str == "") { show_message("重複idはありません"); } else { show_message($"重複id: {duplicate_str}"); } }
GameMakerでプロジェクトを開いた状態で、画面上部文字のFileやEditというメニューの下に、家のアイコン(プロジェクト閉じる)やセーブアイコンのある「Quickボタン」の後半に、歯車アイコン(Game Options)がありますのでクリックします。 プロジェクト(Game)のオプション設定画面が表示されます。
Platform Settingsの各Platformをクリックして、Windowsなら、Imagesのところでiconファイルを選択すると、実行ファイル作成時に指定したアイコンが使用されます。
それは大変だ……みんな普通に対処できてるのかな。 今の開発が終わるまでバージョンアップは無理かな。
念のためGITのバグ報告のソースを置いておきます。 https://github.com/YoYoGames/GameMaker-Bugs/issues/5762
1ピクセル横と縦の判定が増えるという感じなので全箇所チェックが必要になっちゃいます
自分のゲームでcollision関数群を使いまくってるから、影響があったら嫌だなぁ…
collision関数群に仕様変更があったみたいです。 spriteを使った当たり判定群と仕様を統一するためにcollision関数群でも当たり判定の丸めがなくなりました。 ですのでバージョンアップする際、collision関数群を利用している箇所にバグが起きる可能性があります
GMLにも拡張機能的なものがあるんですね.....!!ありがとうございます!!購入検討してみます!
一番有名なのはGMLiveというツールを使うことですかね。 実行中にコードを直接書き換えたり、roomのオブジェクトを移動させたりしたらそれが反映されるツールです。 ただし、有料であり資料もほとんど英語ですので使うときは公式ドキュメントとにらめっこが必要です。
一応数少ない日本語資料もあります。(古いバージョンですが) https://qiita.com/2dgames_jp/items/7e908ce8e4bf8a2f19f7
自前でやる場合はセーブファイルをつくって実行中にセーブとロードをして値を変更する方法もあります。 以前にそのような記事を書いたので参考にしてみてください。 https://zawazawa.jp/gamemaker_jp/topic/119
今のところ最新版は不具合が多く、新機能も使いににくい状態ですぐにアップデートするメリットは少ないです。 ですので安定したバージョンを使うことをおすすめします。
新しいバージョンが出たらすぐにアップデートする癖があるんですが、不具合のことも考慮するとすぐにアップデートしないほうがいいとかってありますか?
どうやらCompatibilityModeではなくcollision関数関連の挙動がおかしくなっているみたいです
GeneralGameOption->CollisionCompatibilityModeのチェックが外されました おそらくデフォルト値に更新されたのだと思います これによって当たり判定がおかしくなる不具合がおきました。
ただし、現在再定義する際どの項目を選択してるのかがわからない問題があります(バグ報告済み
ショートカットキーを自分で再定義できるみたいです
windows11 microsoftIME US配列キーボード環境下では日本語でテキスト入力ができませーん!
原因をいくつか考えてみました。
これはあさまどさんのコードのやつでチェックするとseqが存在しないとなってしまいます。 どこかのタイミングで以下のようなコードを使ってシーケンスのインスタンスをseqに入れてやる必要があります。
seq = layer_sequence_create("Assets1",0,0,Sequence1);//引数は適当です
どこかのコードでseq変数の中身を書き換えてしまっている場合は動きません。
移動より先に以下の削除のコードに到達している場合はインスタンスがないので動きません。
layer_sequence_destroy(seq);
カメラのx,yの値に変化がない場合は動作していないように見えるかもしれません。
シーケンスを使ったことがないので回答はできないのですが、このコードがどこに書かれているか知りたいところです。
あと、これを実行するとOutputにはなんと出力されますか?
if sequence_exists(seq) { show_debug_message($"camera.loc={oCamera.x}. {oCamera.y}"); layer_sequence_x(seq, oCamera.x); layer_sequence_x(seq, oCamera.y); } else { show_debug_message($"seqが存在しない"); }
ご回答ありがとうございます! すいません、記載ミスです。 layer_sequence_x(seq, oCamera.y); ↓ layer_sequence_y(seq, oCamera.y);
どちらもlayer_sequence_xになってるのが原因でしょうか?
その部分のコードと該当するオブジェクト名をここに貼ることはできるでしょうか あと、実行時エラーの内容をここにはることはできるでしょうか
place_meetingってスプライトがないと使えないんですね.......初めて知りました!!ありがとうございます!!!!
place_meetingはコリジョンマスクで当たり判定を行う関数なので、スプライトを持たない(コリジョンマスクを持たない)場合は使えません。 線で当たり判定をするにはcollision_lineかcollision_line_listを使ってください 矩形ならcollision_rectangle, collision_rectangle_list 円ならcollision_circle, collision_circle_list 楕円ならcollision_ellipse, collision_ellipse_list 点ならcollision_point, collision_point_list で当たり判定ができます
*_listは複数の対象との当たり判定をして、当たっている対象をlistで返すものです _listがついてないものは、最初に当たりを検出した対象を1つ返します(対象が1つだけと分かってるならこれで足ります)
生高橋さん、asaさんありがとうございます!その発想はなかったです!
一足先に生高橋さんが詳しく説明してくれてました!
同じStepイベント内でキー入力を2回拾っているのでそういう挙動になっています。 やりかたと書き方はいろいろありますが、例えば下記のような方法はどうでしょうか。
if(keyboard_check_pressed(vk_enter)) { if(a == 0) { a = 1; } else if (a == 1) { a = 2; } }
キーを押す条件を一つにして、その中に加算条件を入れてみました。 また、ifとelse ifでaの条件をまとめてみました。
//ステップ if(keyboard_check_pressed(vk_enter) { if(a == 0) { a = 1; } else if(a == 1) { a = 2; } }
ifとelse ifでまとめた条件は上からの順で条件を判定していき、合致したもののみを実行します。 if(a == 0)の条件が合致すればelse ifの条件は無視されます。 これで1フレーム内で特定の条件のみを実行することができます。 ifのみで構成すると、すべての条件をチェックしますので注意が必要です。 ifとelse ifなどの基本構文はどのプログラムでも使いますので覚えておくとよいと思います。
また、単純に数を加算するのであればエンターキーを押したら+1加算するというものにしてもいいかもしれません。
if(keyboard_check_pressed(vk_enter) { a++; }
す、すごい...。&&については初めて使いました...。 解決しました。ありがとうございます。
マニュアル(ver2~2.2.x) マニュアル(ver2.3~) YoYoGames YoYoGames 公式コミュニティ GM関連のYoutubeチャンネル集 解説・資料サイト集(日本語) 解説・資料サイト集(英語)
なるほど.....やっぱり諸々を考えてDrawイベントの方に書いていこうと思います!ありがとうございました!
GameMakerのレンダリングパイプラインはこうなっていて(マニュアルURL参照)
application_surfaceでGUI要素以外の全てが描画され、そのあとでGUI要素が描画されます。
https://manual.gamemaker.io/lts/en/index.htm?#t=The_Asset_Editors/Object_Properties/Draw_Events.htm
なのでGUI要素の前面に描画させたい場合はDrawGUIイベントで描画する必要があります。
仮に、HUD表示をDrawGUIで描画していてHUDよりも前面にキャラを表示させるとすると、
DrawGUIイベントで
1) HUDを描画
2) キャラ(のsprite)を描画
の順で描画します。
DrawGUIイベントを使わずに全部Drawイベントでやる方法もあると思います
(その場合はHUDも一緒にスクロールとかしないよう制御する必要が出てきます)
ありがとうございます!そんな関数があるんですね~勉強になります
UI専用レイヤーというのは、UIを配置するためだけのレイヤーを作っているだけです、、分かりづらくてすみません!
ありがとうございます!試してみます!
違ったらすみません!
draw_text_transformed(x,y,string,x_scale,y_scale,angle)を使うことでできます!
補足を入れさせてもらうとただただx_scaleとy_scaleを拡大してしまうと、一文字目の左上を基準に拡大しているのでどんどん右下に行ってしまいます。なのでx,y座標もそれに合わせて変更するようにしています。自分もまだ初心者なのでもしかしたら中心を基準にx_scaleとy_scaleを拡大させる方法があるかもしれないです!
それともし良かったらUIをUI専用レイヤーに設置する方法を教えてもらえないでしょうか?(そもそもUI専用レイヤーが存在することを知りませんでした)質問に質問で返してすみません!
GUI以外の要素をDrawイベントで描画する
GUI要素をDrawGUIイベントで描画する
と分けるといけますよ
ありがとうございます!
ということですね。
カプセル化と言うんでしょうか、そういうコードを破綻させない設計が大事なんですね。ここらへんがまだ自分は弱いです。
複雑な場合は怪しいところの前にブレークポイントを置き、ウォッチウィンドウを開いて見たい値を監視するってことを自分はやっています。
ウォッチウィンドウは現在のブレークポイントのの箇所にある指定した変数の値を見ることができる機能で、ウィンドウに直接変数名を入力するとその値を見ることができます。(デバック実行中Debugger -> Watchからウィンドウを表示可能)
通常の変数だけでなく、配列、構造体などの変数も指定可能です。
基本ステップオーバー(関数飛ばし)で実行をチェックして、値が変化した関数があった場合ステップイン(関数の中に入る)して中身を確認しています。
ただ、そこまで複雑じゃない場合は自分もあさまどさんみたいなやり方もやってますw
また、設計の段階では他のインスタンスから直接変数の値を変化させないようにしていたりもします。
インスタンスの変更をする場合はできるだけ関数を介して変更します。
そうすればその関数の中に一つブレークポイントを入れるだけで、値の変化を監視することができます。
そうでない場合、変化のある箇所全部にブレークポイントを入れる必要がでてきてしまいます。
プロジェクトファイルのデフォルトディレクトの変更に伴って、テンプレートプロジェクトファイルも移動になりました。
前バージョンのテンプレートオブジェクトを読み込む場合はUser->GameMakerProjects->TemplateProjectsのフォルダに移動する必要があります。
ありがとうございます!!助かりました!!!
いけると思います!
以前にもあった致命的なバグですがまた再発したんでしょうか
動作確認すらしてないものですが、こういうのでチェックできますかね
GameMakerでプロジェクトを開いた状態で、画面上部文字のFileやEditというメニューの下に、家のアイコン(プロジェクト閉じる)やセーブアイコンのある「Quickボタン」の後半に、歯車アイコン(Game Options)がありますのでクリックします。
プロジェクト(Game)のオプション設定画面が表示されます。
Platform Settingsの各Platformをクリックして、Windowsなら、Imagesのところでiconファイルを選択すると、実行ファイル作成時に指定したアイコンが使用されます。
それは大変だ……みんな普通に対処できてるのかな。
今の開発が終わるまでバージョンアップは無理かな。
念のためGITのバグ報告のソースを置いておきます。
https://github.com/YoYoGames/GameMaker-Bugs/issues/5762
1ピクセル横と縦の判定が増えるという感じなので全箇所チェックが必要になっちゃいます
自分のゲームでcollision関数群を使いまくってるから、影響があったら嫌だなぁ…
collision関数群に仕様変更があったみたいです。
spriteを使った当たり判定群と仕様を統一するためにcollision関数群でも当たり判定の丸めがなくなりました。
ですのでバージョンアップする際、collision関数群を利用している箇所にバグが起きる可能性があります
GMLにも拡張機能的なものがあるんですね.....!!ありがとうございます!!購入検討してみます!
一番有名なのはGMLiveというツールを使うことですかね。
実行中にコードを直接書き換えたり、roomのオブジェクトを移動させたりしたらそれが反映されるツールです。
ただし、有料であり資料もほとんど英語ですので使うときは公式ドキュメントとにらめっこが必要です。
一応数少ない日本語資料もあります。(古いバージョンですが)
https://qiita.com/2dgames_jp/items/7e908ce8e4bf8a2f19f7
自前でやる場合はセーブファイルをつくって実行中にセーブとロードをして値を変更する方法もあります。
以前にそのような記事を書いたので参考にしてみてください。
https://zawazawa.jp/gamemaker_jp/topic/119
今のところ最新版は不具合が多く、新機能も使いににくい状態ですぐにアップデートするメリットは少ないです。
ですので安定したバージョンを使うことをおすすめします。
新しいバージョンが出たらすぐにアップデートする癖があるんですが、不具合のことも考慮するとすぐにアップデートしないほうがいいとかってありますか?
どうやらCompatibilityModeではなくcollision関数関連の挙動がおかしくなっているみたいです
GeneralGameOption->CollisionCompatibilityModeのチェックが外されましたおそらくデフォルト値に更新されたのだと思いますこれによって当たり判定がおかしくなる不具合がおきました。
ただし、現在再定義する際どの項目を選択してるのかがわからない問題があります(バグ報告済み
ショートカットキーを自分で再定義できるみたいです
windows11 microsoftIME US配列キーボード環境下では日本語でテキスト入力ができませーん!
原因をいくつか考えてみました。
⓵seq変数にシーケンスのインスタンスが入ってない。
これはあさまどさんのコードのやつでチェックするとseqが存在しないとなってしまいます。
どこかのタイミングで以下のようなコードを使ってシーケンスのインスタンスをseqに入れてやる必要があります。
⓶seq変数の中身が削除、変更されている
どこかのコードでseq変数の中身を書き換えてしまっている場合は動きません。
⓷シーケンスを削除している。
移動より先に以下の削除のコードに到達している場合はインスタンスがないので動きません。
⓸カメラのx,yが動いていない
カメラのx,yの値に変化がない場合は動作していないように見えるかもしれません。
シーケンスを使ったことがないので回答はできないのですが、このコードがどこに書かれているか知りたいところです。
あと、これを実行するとOutputにはなんと出力されますか?
ご回答ありがとうございます!
すいません、記載ミスです。
layer_sequence_x(seq, oCamera.y);
↓
layer_sequence_y(seq, oCamera.y);
どちらもlayer_sequence_xになってるのが原因でしょうか?
その部分のコードと該当するオブジェクト名をここに貼ることはできるでしょうか
あと、実行時エラーの内容をここにはることはできるでしょうか
place_meetingってスプライトがないと使えないんですね.......初めて知りました!!ありがとうございます!!!!
place_meetingはコリジョンマスクで当たり判定を行う関数なので、スプライトを持たない(コリジョンマスクを持たない)場合は使えません。
線で当たり判定をするにはcollision_lineかcollision_line_listを使ってください
矩形ならcollision_rectangle, collision_rectangle_list
円ならcollision_circle, collision_circle_list
楕円ならcollision_ellipse, collision_ellipse_list
点ならcollision_point, collision_point_list
で当たり判定ができます
*_listは複数の対象との当たり判定をして、当たっている対象をlistで返すものです
_listがついてないものは、最初に当たりを検出した対象を1つ返します(対象が1つだけと分かってるならこれで足ります)
生高橋さん、asaさんありがとうございます!その発想はなかったです!
一足先に生高橋さんが詳しく説明してくれてました!
同じStepイベント内でキー入力を2回拾っているのでそういう挙動になっています。
やりかたと書き方はいろいろありますが、例えば下記のような方法はどうでしょうか。
キーを押す条件を一つにして、その中に加算条件を入れてみました。
また、ifとelse ifでaの条件をまとめてみました。
ifとelse ifでまとめた条件は上からの順で条件を判定していき、合致したもののみを実行します。
if(a == 0)の条件が合致すればelse ifの条件は無視されます。
これで1フレーム内で特定の条件のみを実行することができます。
ifのみで構成すると、すべての条件をチェックしますので注意が必要です。
ifとelse ifなどの基本構文はどのプログラムでも使いますので覚えておくとよいと思います。
また、単純に数を加算するのであればエンターキーを押したら+1加算するというものにしてもいいかもしれません。
す、すごい...。&&については初めて使いました...。
解決しました。ありがとうございます。