GameMaker 日本語掲示板

views
16 フォロー
1,003 件中 41 から 80 までを表示しています。
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

3

\nを+=で追加する.......その発想はありませんでした!!ありがとうございます!!

2
asa 2024/03/14 (木) 20:02:39 修正

方法論としては、
配列の要素数だけForなどでループして、
要素毎に変数(例:str)に、 要素の値と\n(改行) を追加します

str += $"{array[i]}\n";

最後にstrをdraw_text(x, y, str)で描画します

または、
配列の要素数だけForなどでループして、
要素毎に

draw_text(x, y+10*i, array[i]);

という感じで縦に並べて描画するのもありです

範囲を制限するには、For文のループ範囲で制限するかif文で制限すればOKです

5
nakamoooooo 2024/03/11 (月) 16:33:01

すみません訂正させてください
2023.200.0.281にロールバック関連のバグが無いとは言い切れないと思います
2022年7月ごろのベータIDEであれば、多分バグが無いです
(その頃にロールバックゲームのコンテストが開催されていて、個々の開発者たちがロールバック機能を使っていたので)
それでもよく分からないバグが出た場合は色々IDEのバージョンを変えて試してみてください

2

a.xが見つからないというエラーが起こってしまったので、代用でobjectAを作成のaの値に入れ、おかしな挙動にならないよう、b.a = aの後にアクティブになるようにしたところ上手くいきました!!今まで何となくで使ってきたので細かい説明助かりました、ありがとうございます!!

1
生高橋 2024/03/09 (土) 22:25:09

BとCのコードを変更をしてみました。
これで動作すると思われます。

objectB

//create
a = noone;//aのインスタンスを保持する変数
visible=false

//step
x=a.x//cで受け取ったaの座標と同期
y=a.y

objectC

//create
alarm[0]=1
a=0
//alarm[0]
var a= instance_create_ layer(x,y,layer,objectA)
var b= instance_create_ layer(x,y,layer,objectB)

b.a = a;//bにaのインスタンスを渡す

a.visible=true
b.visible=true

a++
if(a!=5){
alarm[0]=1
}

【細かい説明】
インスタンスとは生成されたオブジェクトのコピーことを言います(たぶん)
以下のソースコードだと、固有のインスタンスではなくおそらく最初に生成されたオブジェクトAの座標を取得することになります。

x=objectA.x 
y=objectA.y

objectAが一つしかない場合はこれで問題ないですが複数ある場合はどのobjectAを取得できるのか明確ではありません。
ですのでinstance_create_layerで変数を受け取ってそれを用いて変数を変更したり受け取ったりします。
今回変更したコードはCで生成されたobjectAのインスタンスをobjectBに渡して利用するコードになってます。
少々流れが複雑ですがわからないことがあれば聞いてください。