GameMaker 日本語掲示板

views
17 フォロー
1,131 件中 201 から 240 までを表示しています。
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に渡して利用するコードになってます。
少々流れが複雑ですがわからないことがあれば聞いてください。

3

なるほど、移動する仕組み自体を作るわけですね。
参考になります、ありがとうございます。

2

ブートroom(orタイトル画面room)
 room_goto(room名)
  ↓
最初のroom

という作りにしていて、room名を書き換えてやってます。

1

安直な考えかもしれませんが一時的に新しいオブジェクトを作って、そこに
if(keyboard_check_pressed(vk_enter)){
room=ルーム名
}
をstepに書いて、毎回確認したいルーム名に変更する......とかはどうでしょうか.....?

2

そうでしたか、とりあえずチュートリアルには従っておきます。
回答ありがとうございました!

1
asa 2024/03/08 (金) 11:07:34 修正

避けられてるんですか。なんかあるんですかね?

わたしの場合特に理由もなくそのイベントは使ってないです。
ほぼ、Create、Step、Draw、たまにAlarmくらいしか使わないので。

1
名前なし 2024/03/06 (水) 15:44:56 修正

エンターキーを押したときに、配列の変数「inv」内、現在のアイテム欄のカーソル位置ID(順番)を参照しようとしているが、配列が空だと参照しようがないのでエラーになっている状態です。

配列の範囲外を参照しないようにチェックするとエラーが出ないようにできます。

//もしアイテムを使用したら///////////////////////////////////////////////////////////////////////////

if keyboard_check_pressed(vk_enter){

	 inv[selected_item].siyou();

「inv[selected_item]」で配列の値を参照しているので、その前のif文で、配列が空だったら処理しないように条件文を追加します。

//もしアイテムを使用したら///////////////////////////////////////////////////////////////////////////

if( array_length(inv) > 0 && keyboard_check_pressed(vk_enter) ) {

配列変数invの配列要素数が0(アイテムがない状態)より大きい かつ キーボードのエンターキーが押されたら
という条件にすれば配列要素数1以上の時に、エンターキーの処理を実行する状態になります。

「&&」は&&で両方の条件を満たしたときにtrueになります。

試してみてください。

3
サトヤガンジ 2024/03/06 (水) 12:34:11

GMEditも機能しなくなってます。僕の環境だけかもしれませんが。

2
サトヤガンジ 2024/03/06 (水) 12:32:44 >> 1

GMLiveの2024.2フィクスが出たのでライブコーディング機能するようになったようです。

1
サトヤガンジ 2024/03/05 (火) 19:12:49

GMLiveがエラーで使用できません。現在開発者がアップデート中とのこと。
それまではライブコーディングできないと思います。

2

毎度のことながら説明が下手ですみません!!!!ありがとうございます!!これがやりたかったことです!!

1
asa 2024/03/03 (日) 11:20:25 修正

やりたい動きと現状の無駄な動きがわからないので、こちらで推測して書きます。
オブジェクトの位置によってどっち回りに回転させるかという話で、角度が近い方に回転させたいのだと推測します。

angle_difference(角度1, 角度2);

で2つの角度の差を求めることができます。この値は正負の符号を持ちます。
この符号を利用すればどっち回りに回転させるかを制御できます。

diff = angle_difference(向きたい角度, 今の自分の角度);

image_angle += sign(diff);で符号によって回転の方向が変わります。

もし的外れだったらまた質問してください。

3

こんな感じで値で削除できる関数を自作するといいですよ

array_delete_value(ary, "dog");
2

なるほど......!!要素を直接消去するのではなく、indexを取得して消去する.........とてもためになりました!!ありがとうございます!!!!!!!!!!

1
asa 2024/02/20 (火) 09:37:54 修正

ary = ["dog", "cat", "fish"]があるとして、
要素の値"dog"を指定して削除したいということでしょうか?

私が知る限り、配列でそれをやる方法は無くindexを指定する形しか無いと思います。
"dog"のindexが分かっているなら

array_delete(ary, 0, 1);

わからないなら

var index = array_get_index(ary, "dog");
aray_delete(ary, index, 1);

という感じです

4
nakamoooooo 2024/02/18 (日) 03:39:26

ロールバックマルチプレイはgamemakerのbeta版の機能ですが
バージョンによってうまく動く、動かないがあります

2023.200.0.281は大きなバグが無く
自分のロールバックゲームはこれで作ってます
チュートリアルだったらクリアできるはずです

12

全体を見直して、ご自分で原因にたどり着いたと。最高ですね!

私がよくやることですが、

  1. とにかくshow_debug_message()を多用して何がどう動いてるのか視認します(デバッガをうまく使えこなせないので)
  2. 問題をできるだけ小さく切り分けて新しいプロジェクトに最小限の要素だけで問題を再現させます

今回は新しいroomで動かしたのが原因究明につながったようですね
原因がわかってよかったです!

11
ZUN is my dream(19) 2024/02/16 (金) 00:19:18

こんばんは
新しいルームでもう一度動かしたところ正常に動作しました。😅
何が悪かったのか原因を探ってみたところ、別のオブジェクトの


switch(_start){
case BATTLE.BATTLE_MODE_1:

instance_create_layer(x,y,layer,obj_battle)

case BATTLE.BATTLE_MODE_2:

のinstance_create_layer(x,y,layer,obj_battle)が問題だったようです😅
(今までのコードがobj_battleのコードです)

(確かに、これはやってることおかしいですわ…)

教えてくれたおかげで、なんとか問題に辿り着けたので助かりました!
分からないままだったら、ずっと同じコード直してました😅

10
asa 2024/02/15 (木) 22:12:02 修正

とりあえず他のroomは考えなくていいです
このコードが書かれているオブジェクトがroom内に1つだけある形であれば正常に動くはずです

ですがインスタンスidが操作をするたびに変わっています
プロジェクトの作りがどうなっているのか不明なので私にはその理由までは分かりません
どういう作りになっているか一度見直してみてはどうでしょうか

追記
roomがpersistentになってる場合はそのroomにこのオブジェクトがあると競合すると思います
(操作を複数のインスタンスが拾うので)

9
ZUN is my dream(19) 2024/02/15 (木) 20:42:02

なるほど…
とすると、他のルームにもそのオブジェクトがあるとダメって感じですか…?

8
asa 2024/02/15 (木) 19:41:38 修正

id値はそのコードを実行してるインスタンスを示しますが、
それが全部違っているのはなぜだか分かりますか?
(本来1つだけのはずだと思うのです)

他の部分がどうなっているのか分からないので、なぜそうなるのか推測するしかありませんが、
そのオブジェクトが複数存在しているとか動的に作成されているということはありませんか?

7
ZUN is my dream(19) 2024/02/15 (木) 18:52:32

ありがとうございます。

0を選択しspaceを押すと、

erabu=0 (id=ref instance 107860)
selected 0
erabu=0 (id=ref instance 107861)
selected 0
.
.
.

1を選択しspaceを押すと、

erabu=1 (id=ref instance 111334)
selected 1
erabu=0 (id=ref instance 111335)
selected 0
.
.
.

2を選択しspaceを押すと

erabu=2 (id=ref instance 100261)
selected 2
erabu=1 (id=ref instance 100262)
selected 1
erabu=0 (id=ref instance 100349)
selected 0
.
.
.

のようになりました🤔

6
asa 2024/02/15 (木) 16:52:47 修正

やはりこちらでは正常に動作しました。

Stepイベントのspaceを押した時の処理部分にこれをコピペして試してもらえますか?
0を選択してspaceを押す
1を選択してspaceを押す
2を選択してspaceを押す
それぞれOutputに出力された内容を確認してください

//それぞれの選択肢結果
if(keyboard_check_pressed(vk_space)) {
	show_debug_message($"erabu={erabu} (id={id})");
	switch(erabu){
		case 0:
		show_debug_message($"selected 0");
		break;

		case 1:
		show_debug_message($"selected 1");
		break;
			
		case 2:
		show_debug_message($"selected 2");
		break;
	}	
}
5
ZUN is my dream(19) 2024/02/15 (木) 16:12:51 >> 4

Stepイベント↓


if(keyboard_check_pressed(vk_up)) {
	erabu--;
  if(erabu < 0) {erabu = 0}
  show_debug_message($"erabu={erabu},sentaku={sentaku}");
}

//下ボタン
if(keyboard_check_pressed(vk_down)) {
    erabu++;
  if(erabu >= sentaku) {erabu = 2;}
  show_debug_message($"erabu={erabu},sentaku={sentaku}");
}


//それぞれの選択肢結果
if(keyboard_check_pressed(vk_space)) {
switch(erabu){
			
			case 0:
			show_debug_message($"selected 0");
            instance_create_layer(100, 300, layer, obj_sakuya_hutuu);
            break;

            case 1:
			show_debug_message($"selected 1");
            instance_create_layer(300, 300, layer, obj_sakuya_naku);
            break;
			
			case 2:
			show_debug_message($"selected 2");
            instance_create_layer(500, 300, layer, obj_sakuya_warau);
            break;
}	
}

4
ZUN is my dream(19) 2024/02/15 (木) 16:12:24

ありがとうございます。
とりあえず今の選択肢三つあるコードを貼っておきます。

Createイベント↓


op_border = 300;
op_space = 65;

erabu = 0;

option[0] = "FIGHT";
option[1] = "AITEM";
option[2] = "test";

sentaku = array_length(option);

3

それは不思議ですね
一度ここにコードを貼ってもらえますか?(CreateイベントとStepイベント)
コードの投稿の仕方はここを御覧ください
https://zawazawa.jp/official/topic/53

2
ZUN is my dream(19) 2024/02/15 (木) 15:35:51

コメントありがとうございます。
出力の所を見てみると、

選択肢①を決定した時 "selected 0"
選択肢②を選んだ時 "erabu=1,sentaku=2"
選択肢②を決定した時 "selected 0""selected 1"

とやはり…同時に表示されてます。

ここで試しに選択肢③を作ったところ、

選択肢③を選んだ時

"erabu=2,sentaku=3"
"erabu=1,sentaku=3"

と表示され、

選択肢③を決定した時

"selected 2""selected 1""selected 0"

と、やはり他の選択肢も同時に表示されてしまいます…😭

1

今同じ方法で試してみたら正常に動作しました。
投稿した内容以外に関係してる箇所があって、そこが悪さしてる可能性はないでしょうか?
下記のようにして変数の値をoutputさせて、Outputに出力される値を見て期待通りに動いてるか確認してみてください

if (keyboard_check_pressed(vk_up))
{
	erabu--;
	if (erabu < 0) { erabu = sentaku-1; }
	show_debug_message($"erabu={erabu}, sentaku={sentaku}");
}

if (keyboard_check_pressed(vk_down))
{
	erabu++;
	if (erabu >= sentaku) { erabu = 0; }
	show_debug_message($"erabu={erabu}, sentaku={sentaku}");
}

if (keyboard_check_pressed(vk_space))
{
	switch (erabu)
	{
		case 0: 
			show_debug_message($"selected 0");
			instance_create_layer(100, 300, layer, obj_sakuya_hutuu);
			break;

		case 1: 
			show_debug_message($"selected 1");
			instance_create_layer(300, 300, layer, obj_sakuya_naku);
			break;
	}
}

2

その通りです!!なるほど......確かに便利ですね!!使ってみます!!!
分かりやすい説明ありがとうございました!!

1

オブジェクトに処理を書けば済むからスクリプト(自作関数)は要らないのでは?という疑問でしょうか

スクリプトにするといろんなオブジェクトから利用することができますので便利です
例えばキャラが10種類あって全部がジャンプするとしたら、
10個全てにジャンプの処理を書くのではなくjump()というスクリプトを作ればそれを皆が共用で使えます。

あと、一連の処理を関数にすることでロジックの見通しが良くなります

10
生高橋 2024/01/28 (日) 17:55:34 >> 5

Preference → Languages→ GML Code → "Enable variable reference warnings" をオフ
でなおるみたいです!?

”この変数は使われていません”的な警告はでなくなってしまいますが

3

すでにいろいろ確認されたんですね。
これから何か知ってる人が返信してくれるかもしれないのでこのまま待つとして、
ご存知かもですが一応紹介しておくと

  • GameMaker日本語コミュニティーDiscordサーバー(日本語)
  • GameMaker公式フォーラム(英語)
  • GameMakerのサポート(英語)
    こちらに質問してみるのもありです。

公式のチュートリアルが動かないということなので、もし解決できない場合は
公式サポートに聞くのが一番速い気がします。

不具合が疑われる場合はバグ報告するといいと思います。(英語)

2
tatta_chotdog 2024/01/25 (木) 09:14:21

asaさんご回答ありがとうございます。
そちらのサイトは確認済で、ChromeとOperaGxブラウザでそれぞれ試してみたのですが変化はありませんでした。