かゆいところに手が届いてないですが、一応使ってます
ありがとうございます! 無事実行できました!
了解です。
これを一つに関数にするのはとても難しいと思いますのでオブジェクトで一旦サンプルをつくってみました。 説明しやすいようかなり助長に書いたのでお好きに改善してもらえたらと思います。
CreateEvent
moveway = ["right","down","left","up"];//移動方向の指定 moveSpd = 1;//移動速度 moveDistance = 64;//移動距離 targetX = 0;//目的地のx座標 targetY = 0;//目的のy座標 isMove = 0;//移動中かどうか
StepEvent
//停止中の状態 if(isMove == false) { //配列の中身があるか if(array_length(moveway) > 0) { //配列の先頭を取得 var dir = array_first(moveway); //方向によって目的の座標を決定 if(dir == "right") { targetX = x + moveDistance; targetY = y; } else if(dir == "left") { targetX = x - moveDistance; targetY = y; } else if(dir == "down") { targetX = x; targetY = y + moveDistance; } else if(dir == "up") { targetX = x; targetY = y - moveDistance; } //先頭の配列を削除 array_delete(moveway,0,1); //移動中に設定 isMove = true; } } //移動中の状態 if(isMove == true) { //指定した位置まで移動 x = approach(x, targetX, moveSpd); y = approach(y, targetY, moveSpd); //到着したら移動停止 if(x == targetX && y == targetY) { isMove = false; } }
まず移動中と停止中で状態を分けました。 ・停止中は配列に値があるか確認して、ある場合はその値を確認して目的座標を決定、移動中にします。 ・移動中は目的座標まで移動し、到着したら停止中にします。 以上を配列がなくなるまで繰り返すことで実現しています。 移動させたい場合は配列に方向の文字列を入れればいつでも先頭の順番で移動します。
ここではapproachという目的の数値まで一定の値で加算させるGameMakerではかなり有名な自作関数を使っています。 中身は次の通りです。
function approach(a,b,c) { return a < b ? min(a + c,b) : max(a - c,b); }
わからないことがあれば聞いてください。
説明を全くしておらず申し訳ないです。
objが64移動するのをmovewayの配列によって方向を決める関数なのですが,例えばmoveway=["left","left","down"]だった際,左に128,下に64行った地点に瞬間的に移動してしまいます。 そうではなく,左に64,少しの空き時間,左に64,少しの空き時間...というように,for文が繰り返されるたびに若干の空き時間をつくり、段階的に移動している様に見せたいです。
ありがとうございます!!!
この関数だとどんな問題があるのですか?
Webページ上で遊べる形にしたいということでしたら、 HTML5でエクスポートする形になります
彩度とは少し違いますが、以下のコードで修正することが出来ました。
if (active == false) { if (sprite_index != -1) { image_blend = c_gray; // グレースケールにする色調 } } else { if (sprite_index != -1) { image_blend = c_white; // 元の色調に戻す } }
ありがとうございます!
複数のオブジェクトから利用するなら一般的にScriptsに定義するのがいいと思います。 scriptsアセットで定義するとゲーム起動と同時に読み込まれスコープはグローバルになります(つまりどこからでも使えるようになります)。 scriptsには関数、構造体を1つだけ書いてもいいし複数書いてもいいです。
参考 https://manual.gamemaker.io/beta/en/GameMaker_Language/GML_Overview/Script_Functions.htm
分かりやすい説明ありがとうございます!! 無事に動くことが出来ました!!
//Create Event //表示する文章 text = ["Hellooooooooooo","Godnightttttttttt"]; //配列にしないと少し面倒なため([]内は一つだけでも大丈夫です) //配列番号(初期値が0だと一つ目の会話がスキップされてしまうため) array_index = -1; //表示可能な文字数 index = 0; //表示速度(フレーム) textSpeed = 5; //文字がすべて表示されたか(初期値が1でないと最初が再生できないため) next = 1;
//Step Event //Enterを押したら再生 if(keyboard_check_pressed(vk_enter)) { if(next == 1){ //表示可能文字を0に設定 index = 0; //文字数が最大でないので0に設定 next = 0; //次の会話へ array_index ++; //アラームイベントをtextSpeedフレーム後に起動 alarm[0] = textSpeed; }else if(next == 0){ //index(文字表示数)にテキストの最大文字数を入れる index = string_length(text[array_index]); //文字数が最大になったので1に設定 next=1 } } if(array_index!=-1){//array_indexが-1の状態でtext[array_index]を参照させるとエラーが起こるため if(index == string_length(text[array_index])){ //文字数が最大になったので1に設定 next = 1; } }
//Alarm[0] Event //表示可能文字数を増やす index++; //表示可能文字数がテキストの文字数未満なら if(index < string_length(text[array_index])) { //再度アラームイベントをtextSpeedフレーム後に起動 alarm[0] = textSpeed; }
//Draw Event if(array_index>=0){//array_indexが-1の状態でtext[array_index]を参照させるとエラーが起こるため //テキストの1番目から表示可能文字数までの数を取得 var str = string_copy(text[array_index],1,index); //それを表示 draw_text(x,y,str); }
回答者様のコードをベースに色々加えました。元々textは配列ではなかったのですが、配列の方がコードをシンプルにしやすいのと会話イベントなので配列にしても問題ないと思い配列にしています。今回の主な変更としてstepイベント内のEnterを押したときの処理を文字数が最大表示であるかどうかで、「indexにstring_length(text[array_index])、つまり会話の最大文字数を入れる」か、「次の会話に行く」になるようにしました。次の会話がない状態で次の会話へ行こうとするとエラーが起こってしまうので、「次の会話がない時、会話を終了する」等の処理を施してください。
if(a==1),if(a==2).......ってやるよりもswitch(a)でやった方がいいのと同じってことですね!!ありがとうございました!!
なるほど.....既存のゲームで考えると結構納得できます!!ありがとうございました!!
グリッドでデータを管理するインベントリとか、 縦横軸がある表のような形でデータを持たせたい場面があったらそこで使います。 でもそれも一次元配列で作ることはできますので、多次元配列が絶対不可欠というわけではないです。
極論をいうと変数をいっぱい使えば一次元配列すらいらない場面はたくさんあると思います。 でも配列を使うと何かと便利だし分かりやすくなるので使います。
配列、多次元配列を使うと分かりやすくて扱いやすい、便利だから使ういうことじゃないでしょうか。 今現在一次元配列で足りてるのであればそれでいいと思いますよ。
ぷよぷよや不思議のダンジョンなどの格子状形式のシステムでは2次元配列を使います。 3次元、4次元などは使ったことないです。
_retを構造体の配列にすることで解決しました!
なるほど.....やっぱり諸々を考えて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
今のところ最新版は不具合が多く、新機能も使いににくい状態ですぐにアップデートするメリットは少ないです。 ですので安定したバージョンを使うことをおすすめします。
新しいバージョンが出たらすぐにアップデートする癖があるんですが、不具合のことも考慮するとすぐにアップデートしないほうがいいとかってありますか?
マニュアル(ver2~2.2.x) マニュアル(ver2.3~) YoYoGames YoYoGames 公式コミュニティ GM関連のYoutubeチャンネル集 解説・資料サイト集(日本語) 解説・資料サイト集(英語)
かゆいところに手が届いてないですが、一応使ってます
ありがとうございます!
無事実行できました!
了解です。
これを一つに関数にするのはとても難しいと思いますのでオブジェクトで一旦サンプルをつくってみました。
説明しやすいようかなり助長に書いたのでお好きに改善してもらえたらと思います。
CreateEvent
StepEvent
まず移動中と停止中で状態を分けました。
・停止中は配列に値があるか確認して、ある場合はその値を確認して目的座標を決定、移動中にします。
・移動中は目的座標まで移動し、到着したら停止中にします。
以上を配列がなくなるまで繰り返すことで実現しています。
移動させたい場合は配列に方向の文字列を入れればいつでも先頭の順番で移動します。
ここではapproachという目的の数値まで一定の値で加算させるGameMakerではかなり有名な自作関数を使っています。
中身は次の通りです。
わからないことがあれば聞いてください。
説明を全くしておらず申し訳ないです。
objが64移動するのをmovewayの配列によって方向を決める関数なのですが,例えばmoveway=["left","left","down"]だった際,左に128,下に64行った地点に瞬間的に移動してしまいます。
そうではなく,左に64,少しの空き時間,左に64,少しの空き時間...というように,for文が繰り返されるたびに若干の空き時間をつくり、段階的に移動している様に見せたいです。
ありがとうございます!!!
この関数だとどんな問題があるのですか?
Webページ上で遊べる形にしたいということでしたら、
HTML5でエクスポートする形になります
彩度とは少し違いますが、以下のコードで修正することが出来ました。
if (active == false) {
if (sprite_index != -1) {
image_blend = c_gray; // グレースケールにする色調
}
} else {
if (sprite_index != -1) {
image_blend = c_white; // 元の色調に戻す
}
}
ありがとうございます!
複数のオブジェクトから利用するなら一般的にScriptsに定義するのがいいと思います。
scriptsアセットで定義するとゲーム起動と同時に読み込まれスコープはグローバルになります(つまりどこからでも使えるようになります)。
scriptsには関数、構造体を1つだけ書いてもいいし複数書いてもいいです。
参考 https://manual.gamemaker.io/beta/en/GameMaker_Language/GML_Overview/Script_Functions.htm
分かりやすい説明ありがとうございます!!
無事に動くことが出来ました!!
回答者様のコードをベースに色々加えました。元々textは配列ではなかったのですが、配列の方がコードをシンプルにしやすいのと会話イベントなので配列にしても問題ないと思い配列にしています。今回の主な変更としてstepイベント内のEnterを押したときの処理を文字数が最大表示であるかどうかで、「indexにstring_length(text[array_index])、つまり会話の最大文字数を入れる」か、「次の会話に行く」になるようにしました。次の会話がない状態で次の会話へ行こうとするとエラーが起こってしまうので、「次の会話がない時、会話を終了する」等の処理を施してください。
if(a==1),if(a==2).......ってやるよりもswitch(a)でやった方がいいのと同じってことですね!!ありがとうございました!!
なるほど.....既存のゲームで考えると結構納得できます!!ありがとうございました!!
グリッドでデータを管理するインベントリとか、
縦横軸がある表のような形でデータを持たせたい場面があったらそこで使います。
でもそれも一次元配列で作ることはできますので、多次元配列が絶対不可欠というわけではないです。
極論をいうと変数をいっぱい使えば一次元配列すらいらない場面はたくさんあると思います。
でも配列を使うと何かと便利だし分かりやすくなるので使います。
配列、多次元配列を使うと分かりやすくて扱いやすい、便利だから使ういうことじゃないでしょうか。
今現在一次元配列で足りてるのであればそれでいいと思いますよ。
ぷよぷよや不思議のダンジョンなどの格子状形式のシステムでは2次元配列を使います。
3次元、4次元などは使ったことないです。
_retを構造体の配列にすることで解決しました!
なるほど.....やっぱり諸々を考えて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
今のところ最新版は不具合が多く、新機能も使いににくい状態ですぐにアップデートするメリットは少ないです。
ですので安定したバージョンを使うことをおすすめします。
新しいバージョンが出たらすぐにアップデートする癖があるんですが、不具合のことも考慮するとすぐにアップデートしないほうがいいとかってありますか?