GameMaker 日本語掲示板

views
16 フォロー
969 件中 1 から 40 までを表示しています。
5

ありがとうございます!そんな関数があるんですね~勉強になります

UI専用レイヤーというのは、UIを配置するためだけのレイヤーを作っているだけです、、分かりづらくてすみません!

4

ありがとうございます!試してみます!

2

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専用レイヤーが存在することを知りませんでした)質問に質問で返してすみません!

1

GUI以外の要素をDrawイベントで描画する
GUI要素をDrawGUIイベントで描画する

と分けるといけますよ

2
asa 2024/05/31 (金) 23:45:14 修正

ありがとうございます!

  1. 変数をウォッチウィンドウで変数を監視
  2. 怪しい箇所をブレークポイントで止める
  3. ステップオーバーで進める。値が変化したらその関数で値が変えられてると考えて、関数の中身を調べる

ということですね。
カプセル化と言うんでしょうか、そういうコードを破綻させない設計が大事なんですね。ここらへんがまだ自分は弱いです。

1
生高橋 2024/05/31 (金) 01:41:15

複雑な場合は怪しいところの前にブレークポイントを置き、ウォッチウィンドウを開いて見たい値を監視するってことを自分はやっています。
ウォッチウィンドウは現在のブレークポイントのの箇所にある指定した変数の値を見ることができる機能で、ウィンドウに直接変数名を入力するとその値を見ることができます。(デバック実行中Debugger -> Watchからウィンドウを表示可能)
通常の変数だけでなく、配列、構造体などの変数も指定可能です。
基本ステップオーバー(関数飛ばし)で実行をチェックして、値が変化した関数があった場合ステップイン(関数の中に入る)して中身を確認しています。

ただ、そこまで複雑じゃない場合は自分もあさまどさんみたいなやり方もやってますw

また、設計の段階では他のインスタンスから直接変数の値を変化させないようにしていたりもします。
インスタンスの変更をする場合はできるだけ関数を介して変更します。
そうすればその関数の中に一つブレークポイントを入れるだけで、値の変化を監視することができます。
そうでない場合、変化のある箇所全部にブレークポイントを入れる必要がでてきてしまいます。

14
生高橋 2024/05/22 (水) 13:52:56

プロジェクトファイルのデフォルトディレクトの変更に伴って、テンプレートプロジェクトファイルも移動になりました。
前バージョンのテンプレートオブジェクトを読み込む場合はUser->GameMakerProjects->TemplateProjectsのフォルダに移動する必要があります。

1

以前にもあった致命的なバグですがまた再発したんでしょうか

動作確認すらしてないものですが、こういうのでチェックできますかね

// 重複する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}");
	}
}
1

GameMakerでプロジェクトを開いた状態で、画面上部文字のFileやEditというメニューの下に、家のアイコン(プロジェクト閉じる)やセーブアイコンのある「Quickボタン」の後半に、歯車アイコン(Game Options)がありますのでクリックします。
プロジェクト(Game)のオプション設定画面が表示されます。

Platform Settingsの各Platformをクリックして、Windowsなら、Imagesのところでiconファイルを選択すると、実行ファイル作成時に指定したアイコンが使用されます。

13

それは大変だ……みんな普通に対処できてるのかな。
今の開発が終わるまでバージョンアップは無理かな。

12
生高橋 2024/05/14 (火) 02:08:38 >> 10

念のためGITのバグ報告のソースを置いておきます。
https://github.com/YoYoGames/GameMaker-Bugs/issues/5762

11
生高橋 2024/05/14 (火) 02:07:20 >> 10

1ピクセル横と縦の判定が増えるという感じなので全箇所チェックが必要になっちゃいます

10

自分のゲームでcollision関数群を使いまくってるから、影響があったら嫌だなぁ…

9
生高橋 2024/05/13 (月) 17:25:50 >> 6

collision関数群に仕様変更があったみたいです。
spriteを使った当たり判定群と仕様を統一するためにcollision関数群でも当たり判定の丸めがなくなりました。
ですのでバージョンアップする際、collision関数群を利用している箇所にバグが起きる可能性があります

2

GMLにも拡張機能的なものがあるんですね.....!!ありがとうございます!!購入検討してみます!

1
生高橋 2024/05/06 (月) 16:56:03

一番有名なのはGMLiveというツールを使うことですかね。
実行中にコードを直接書き換えたり、roomのオブジェクトを移動させたりしたらそれが反映されるツールです。
ただし、有料であり資料もほとんど英語ですので使うときは公式ドキュメントとにらめっこが必要です。

一応数少ない日本語資料もあります。(古いバージョンですが)
https://qiita.com/2dgames_jp/items/7e908ce8e4bf8a2f19f7

自前でやる場合はセーブファイルをつくって実行中にセーブとロードをして値を変更する方法もあります。
以前にそのような記事を書いたので参考にしてみてください。
https://zawazawa.jp/gamemaker_jp/topic/119

8
生高橋 2024/05/06 (月) 16:49:30 >> 7

今のところ最新版は不具合が多く、新機能も使いににくい状態ですぐにアップデートするメリットは少ないです。
ですので安定したバージョンを使うことをおすすめします。

7

新しいバージョンが出たらすぐにアップデートする癖があるんですが、不具合のことも考慮するとすぐにアップデートしないほうがいいとかってありますか?

6
生高橋 2024/05/05 (日) 19:08:38 >> 5

どうやらCompatibilityModeではなくcollision関数関連の挙動がおかしくなっているみたいです

5
生高橋 2024/05/05 (日) 18:21:18 修正

GeneralGameOption->CollisionCompatibilityModeのチェックが外されました
おそらくデフォルト値に更新されたのだと思います
これによって当たり判定がおかしくなる不具合がおきました。

4
生高橋 2024/05/04 (土) 04:15:25 >> 2

ただし、現在再定義する際どの項目を選択してるのかがわからない問題があります(バグ報告済み

2
生高橋 2024/05/04 (土) 03:37:07

ショートカットキーを自分で再定義できるみたいです

1
サトヤガンジ 2024/05/03 (金) 19:29:31

windows11 microsoftIME US配列キーボード環境下では日本語でテキスト入力ができませーん!

4
生高橋 2024/04/17 (水) 12:43:32

原因をいくつか考えてみました。

⓵seq変数にシーケンスのインスタンスが入ってない。

これはあさまどさんのコードのやつでチェックするとseqが存在しないとなってしまいます。
どこかのタイミングで以下のようなコードを使ってシーケンスのインスタンスをseqに入れてやる必要があります。

seq = layer_sequence_create("Assets1",0,0,Sequence1);//引数は適当です

⓶seq変数の中身が削除、変更されている

どこかのコードでseq変数の中身を書き換えてしまっている場合は動きません。

⓷シーケンスを削除している。

移動より先に以下の削除のコードに到達している場合はインスタンスがないので動きません。

layer_sequence_destroy(seq);

⓸カメラのx,yが動いていない

カメラのx,yの値に変化がない場合は動作していないように見えるかもしれません。

3

シーケンスを使ったことがないので回答はできないのですが、このコードがどこに書かれているか知りたいところです。

あと、これを実行すると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が存在しない");
}
2

ご回答ありがとうございます!
すいません、記載ミスです。
layer_sequence_x(seq, oCamera.y);

layer_sequence_y(seq, oCamera.y);

1
生高橋 2024/04/15 (月) 18:32:48

どちらもlayer_sequence_xになってるのが原因でしょうか?

1
asa 2024/04/07 (日) 23:42:16 修正

その部分のコードと該当するオブジェクト名をここに貼ることはできるでしょうか
あと、実行時エラーの内容をここにはることはできるでしょうか

2

place_meetingってスプライトがないと使えないんですね.......初めて知りました!!ありがとうございます!!!!

1
asa 2024/03/29 (金) 20:47:27 修正

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つだけと分かってるならこれで足ります)

4

生高橋さん、asaさんありがとうございます!その発想はなかったです!

3

一足先に生高橋さんが詳しく説明してくれてました!

2

同じStepイベント内でキー入力を2回拾っているのでそういう挙動になっています。
やりかたと書き方はいろいろありますが、例えば下記のような方法はどうでしょうか。

if(keyboard_check_pressed(vk_enter))
{
	if(a == 0) {
		a = 1;
	} else if (a == 1) {
		a = 2;
	}
}
1
生高橋 2024/03/26 (火) 13:35:28

キーを押す条件を一つにして、その中に加算条件を入れてみました。
また、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++;
}
2
ZUN is my dream(19) 2024/03/22 (金) 03:30:36 >> 1

す、すごい...。&&については初めて使いました...。
解決しました。ありがとうございます。

2

分かりやすい解説ありがとうございます!!!!!!!初めて重力系(?)のプログラムをやるので助かりました!!!!

1
生高橋 2024/03/21 (木) 11:17:02

ジャンプアクションの移動と当たり判定のテンプレートを一旦置いておきます。
細かく解説すると長くなってしまうので一部のみ抜粋して解説します。

//横方向の速度の計算
hsp = oInput.inputHsp * moveSpd;

//着地判定
var isGround = place_meeting(x,y + 1,oBaseWall);
if(!isGround)
{
	vsp += grav;
}

//ジャンプ
if(isGround && oInput.keyJump)
{
	vsp = -jumpSpd;
}

//横方向の当たり判定
if(place_meeting(x+hsp,y,oBaseWall))
{

	while(!place_meeting(x+sign(hsp),y,oBaseWall)) 
	{
		x += sign(hsp);
	}
	hsp = 0;
}
x += hsp;

//縦方向の当たり判定
if(place_meeting(x,y+vsp,oBaseWall))
{
	while(!place_meeting(x,y+sign(vsp),oBaseWall)) 
	{
		y += sign(vsp);
	}
	vsp = 0;
}
y += vsp;

自分で精密な当たり判定をする場合組み込みの変数vspeedやgravityなどは使わないほうがやりやすいです。
vspeedやgravityなどはstepイベントが終わった後自動で位置に加算されてしまい、細かく制御がしずらくなります。
ですので自分でvspやgravなどの変数を用意してやると良いでしょう。
xzyさんが挙げて頂いたサンプルだとy+=vspeedの箇所で位置を加算していますがこれだと2重に加算されますので速度がものすごいことになっています。

次に当たり判定がめり込む原因として、移動先で当たり判定をしていないことにあります。
ですので先に移動速度を計算してその速度を加味した位置で当たり判定を行います。
サンプルだとif(place_meeting(x,y+vsp,oBaseWall))の箇所です。
これで移動先で当たり判定することになります。
これで当たっていなければy+=vspと位置を計算するようにします。

ものすごく難しいかもしれませんが参考になればと思います。
念のため、Youtubeのチュートリアルもここに置いておきます。
英語ですがジャンプアクションシューティングの基礎的なことを学ぶことができます。(ここでめり込まない当たり判定も解説されています。)
https://www.youtube.com/watch?v=izNXbMdu348&list=PLPRT_JORnIupqWsjRpJZjG07N01Wsw_GJ