すみません訂正させてください 2023.200.0.281にロールバック関連のバグが無いとは言い切れないと思います 2022年7月ごろのベータIDEであれば、多分バグが無いです (その頃にロールバックゲームのコンテストが開催されていて、個々の開発者たちがロールバック機能を使っていたので) それでもよく分からないバグが出た場合は色々IDEのバージョンを変えて試してみてください
❤
a.xが見つからないというエラーが起こってしまったので、代用でobjectAを作成のaの値に入れ、おかしな挙動にならないよう、b.a = aの後にアクティブになるようにしたところ上手くいきました!!今まで何となくで使ってきたので細かい説明助かりました、ありがとうございます!!
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に渡して利用するコードになってます。 少々流れが複雑ですがわからないことがあれば聞いてください。
なるほど、移動する仕組み自体を作るわけですね。 参考になります、ありがとうございます。
ブートroom(orタイトル画面room) room_goto(room名) ↓ 最初のroom
という作りにしていて、room名を書き換えてやってます。
安直な考えかもしれませんが一時的に新しいオブジェクトを作って、そこに if(keyboard_check_pressed(vk_enter)){ room=ルーム名 } をstepに書いて、毎回確認したいルーム名に変更する......とかはどうでしょうか.....?
そうでしたか、とりあえずチュートリアルには従っておきます。 回答ありがとうございました!
避けられてるんですか。なんかあるんですかね?
わたしの場合特に理由もなくそのイベントは使ってないです。 ほぼ、Create、Step、Draw、たまにAlarmくらいしか使わないので。
エンターキーを押したときに、配列の変数「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になります。
試してみてください。
GMEditも機能しなくなってます。僕の環境だけかもしれませんが。
GMLiveの2024.2フィクスが出たのでライブコーディング機能するようになったようです。
GMLiveがエラーで使用できません。現在開発者がアップデート中とのこと。 それまではライブコーディングできないと思います。
毎度のことながら説明が下手ですみません!!!!ありがとうございます!!これがやりたかったことです!!
やりたい動きと現状の無駄な動きがわからないので、こちらで推測して書きます。 オブジェクトの位置によってどっち回りに回転させるかという話で、角度が近い方に回転させたいのだと推測します。
angle_difference(角度1, 角度2);
で2つの角度の差を求めることができます。この値は正負の符号を持ちます。 この符号を利用すればどっち回りに回転させるかを制御できます。
diff = angle_difference(向きたい角度, 今の自分の角度);
image_angle += sign(diff);で符号によって回転の方向が変わります。
image_angle += sign(diff);
もし的外れだったらまた質問してください。
こんな感じで値で削除できる関数を自作するといいですよ
array_delete_value(ary, "dog");
なるほど......!!要素を直接消去するのではなく、indexを取得して消去する.........とてもためになりました!!ありがとうございます!!!!!!!!!!
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);
という感じです
ロールバックマルチプレイはgamemakerのbeta版の機能ですが バージョンによってうまく動く、動かないがあります
2023.200.0.281は大きなバグが無く 自分のロールバックゲームはこれで作ってます チュートリアルだったらクリアできるはずです
全体を見直して、ご自分で原因にたどり着いたと。最高ですね!
私がよくやることですが、
今回は新しいroomで動かしたのが原因究明につながったようですね 原因がわかってよかったです!
こんばんは 新しいルームでもう一度動かしたところ正常に動作しました。😅 何が悪かったのか原因を探ってみたところ、別のオブジェクトの
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のコードです)
(確かに、これはやってることおかしいですわ…)
教えてくれたおかげで、なんとか問題に辿り着けたので助かりました! 分からないままだったら、ずっと同じコード直してました😅
とりあえず他のroomは考えなくていいです このコードが書かれているオブジェクトがroom内に1つだけある形であれば正常に動くはずです
ですがインスタンスidが操作をするたびに変わっています プロジェクトの作りがどうなっているのか不明なので私にはその理由までは分かりません どういう作りになっているか一度見直してみてはどうでしょうか
追記 roomがpersistentになってる場合はそのroomにこのオブジェクトがあると競合すると思います (操作を複数のインスタンスが拾うので)
なるほど… とすると、他のルームにもそのオブジェクトがあるとダメって感じですか…?
id値はそのコードを実行してるインスタンスを示しますが、 それが全部違っているのはなぜだか分かりますか? (本来1つだけのはずだと思うのです)
他の部分がどうなっているのか分からないので、なぜそうなるのか推測するしかありませんが、 そのオブジェクトが複数存在しているとか動的に作成されているということはありませんか?
ありがとうございます。
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 . . .
のようになりました🤔
やはりこちらでは正常に動作しました。
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; } }
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; } }
ありがとうございます。 とりあえず今の選択肢三つあるコードを貼っておきます。
Createイベント↓
op_border = 300; op_space = 65; erabu = 0; option[0] = "FIGHT"; option[1] = "AITEM"; option[2] = "test"; sentaku = array_length(option);
それは不思議ですね 一度ここにコードを貼ってもらえますか?(CreateイベントとStepイベント) コードの投稿の仕方はここを御覧ください https://zawazawa.jp/official/topic/53
コメントありがとうございます。 出力の所を見てみると、
選択肢①を決定した時 "selected 0" 選択肢②を選んだ時 "erabu=1,sentaku=2" 選択肢②を決定した時 "selected 0""selected 1"
とやはり…同時に表示されてます。
ここで試しに選択肢③を作ったところ、
選択肢③を選んだ時
"erabu=2,sentaku=3" "erabu=1,sentaku=3"
と表示され、
選択肢③を決定した時
"selected 2""selected 1""selected 0"
と、やはり他の選択肢も同時に表示されてしまいます…😭
今同じ方法で試してみたら正常に動作しました。 投稿した内容以外に関係してる箇所があって、そこが悪さしてる可能性はないでしょうか? 下記のようにして変数の値を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; } }
その通りです!!なるほど......確かに便利ですね!!使ってみます!!! 分かりやすい説明ありがとうございました!!
オブジェクトに処理を書けば済むからスクリプト(自作関数)は要らないのでは?という疑問でしょうか
スクリプトにするといろんなオブジェクトから利用することができますので便利です 例えばキャラが10種類あって全部がジャンプするとしたら、 10個全てにジャンプの処理を書くのではなくjump()というスクリプトを作ればそれを皆が共用で使えます。
あと、一連の処理を関数にすることでロジックの見通しが良くなります
Preference → Languages→ GML Code → "Enable variable reference warnings" をオフ でなおるみたいです!?
”この変数は使われていません”的な警告はでなくなってしまいますが
すでにいろいろ確認されたんですね。 これから何か知ってる人が返信してくれるかもしれないのでこのまま待つとして、 ご存知かもですが一応紹介しておくと
公式のチュートリアルが動かないということなので、もし解決できない場合は 公式サポートに聞くのが一番速い気がします。
不具合が疑われる場合はバグ報告するといいと思います。(英語)
asaさんご回答ありがとうございます。 そちらのサイトは確認済で、ChromeとOperaGxブラウザでそれぞれ試してみたのですが変化はありませんでした。
マルチプレイについては知識ゼロなので解決方法を示せないのですが、 ここで指摘されている事項についてはもう確認されましたか? https://forums.opera.com/topic/53053/exception-throw-see-javascript-console-error-on-opera-gx-gxc https://www.reddit.com/r/gamemaker/comments/q358mk/trouble_compiling_with_opera_gx_as_target/
何度も説明不足ですみませんでした!!!!めっちゃ助かりました!!!!!!!!!!!!!!!!!!
画面をスクロールさせる(カメラを動かす)には、 view_portではなくcamera viewの位置を動かします。
// Stepイベント viewx += 1; camera_set_view_pos(view_camera[0], viewx, viewy);
こんな感じです。
playerが所定の位置まで行ったら操作受付を止めて自動スクロールするには例えば下記のようになります ロジックは一例ですのでご自分のやり方で書いてください (roomのカメラのObject Followingがセットされているとカメラを自前で制御できないので"No Object"にしてください) playerオブジェクト
// Createイベント view_x = 0; view_y = 0; state = "walk"; view_w = camera_get_view_width(view_camera[0]); // Stepイベント if (state == "walk") { if (keyboard_check(vk_right)) x += 5; if (keyboard_check(vk_left)) x -= 5; camera_set_view_pos(view_camera[0], x-view_w/2, 0); if (x >= 500) { view_x = camera_get_view_x(view_camera[0]); state = "auto_scroll"; } } else if (state == "auto_scroll") { if (view_x < 400) { view_x++; camera_set_view_pos(view_camera[0], view_x, view_y); } }
リンク 操作しているキャラクターが所定の位置に行ったら、プレイヤーの追従&操作を止めて、view_portを動かす.....的な動きをさせたいです!分かりにくかったら、貼らせていただいたアンダーテールというゲームの動画の0:07~0:13の動きが正にやりたかった動きです!!何回もすみません!!
マニュアル(ver2~2.2.x) マニュアル(ver2.3~) YoYoGames YoYoGames 公式コミュニティ GM関連のYoutubeチャンネル集 解説・資料サイト集(日本語) 解説・資料サイト集(英語)
すみません訂正させてください
2023.200.0.281にロールバック関連のバグが無いとは言い切れないと思います
2022年7月ごろのベータIDEであれば、多分バグが無いです
(その頃にロールバックゲームのコンテストが開催されていて、個々の開発者たちがロールバック機能を使っていたので)
それでもよく分からないバグが出た場合は色々IDEのバージョンを変えて試してみてください
❤
a.xが見つからないというエラーが起こってしまったので、代用でobjectAを作成のaの値に入れ、おかしな挙動にならないよう、b.a = aの後にアクティブになるようにしたところ上手くいきました!!今まで何となくで使ってきたので細かい説明助かりました、ありがとうございます!!
BとCのコードを変更をしてみました。
これで動作すると思われます。
objectB
objectC
【細かい説明】
インスタンスとは生成されたオブジェクトのコピーことを言います(たぶん)
以下のソースコードだと、固有のインスタンスではなくおそらく最初に生成されたオブジェクトAの座標を取得することになります。
objectAが一つしかない場合はこれで問題ないですが複数ある場合はどのobjectAを取得できるのか明確ではありません。
ですのでinstance_create_layerで変数を受け取ってそれを用いて変数を変更したり受け取ったりします。
今回変更したコードはCで生成されたobjectAのインスタンスをobjectBに渡して利用するコードになってます。
少々流れが複雑ですがわからないことがあれば聞いてください。
なるほど、移動する仕組み自体を作るわけですね。
参考になります、ありがとうございます。
ブートroom(orタイトル画面room)
room_goto(room名)
↓
最初のroom
という作りにしていて、room名を書き換えてやってます。
安直な考えかもしれませんが一時的に新しいオブジェクトを作って、そこに
if(keyboard_check_pressed(vk_enter)){
room=ルーム名
}
をstepに書いて、毎回確認したいルーム名に変更する......とかはどうでしょうか.....?
そうでしたか、とりあえずチュートリアルには従っておきます。
回答ありがとうございました!
避けられてるんですか。なんかあるんですかね?
わたしの場合特に理由もなくそのイベントは使ってないです。
ほぼ、Create、Step、Draw、たまにAlarmくらいしか使わないので。
エンターキーを押したときに、配列の変数「inv」内、現在のアイテム欄のカーソル位置ID(順番)を参照しようとしているが、配列が空だと参照しようがないのでエラーになっている状態です。
配列の範囲外を参照しないようにチェックするとエラーが出ないようにできます。
「inv[selected_item]」で配列の値を参照しているので、その前のif文で、配列が空だったら処理しないように条件文を追加します。
配列変数invの配列要素数が0(アイテムがない状態)より大きい かつ キーボードのエンターキーが押されたら
という条件にすれば配列要素数1以上の時に、エンターキーの処理を実行する状態になります。
「&&」は&&で両方の条件を満たしたときにtrueになります。
試してみてください。
GMEditも機能しなくなってます。僕の環境だけかもしれませんが。
GMLiveの2024.2フィクスが出たのでライブコーディング機能するようになったようです。
GMLiveがエラーで使用できません。現在開発者がアップデート中とのこと。
それまではライブコーディングできないと思います。
毎度のことながら説明が下手ですみません!!!!ありがとうございます!!これがやりたかったことです!!
やりたい動きと現状の無駄な動きがわからないので、こちらで推測して書きます。
オブジェクトの位置によってどっち回りに回転させるかという話で、角度が近い方に回転させたいのだと推測します。
で2つの角度の差を求めることができます。この値は正負の符号を持ちます。
この符号を利用すればどっち回りに回転させるかを制御できます。
image_angle += sign(diff);で符号によって回転の方向が変わります。もし的外れだったらまた質問してください。
こんな感じで値で削除できる関数を自作するといいですよ
なるほど......!!要素を直接消去するのではなく、indexを取得して消去する.........とてもためになりました!!ありがとうございます!!!!!!!!!!
ary = ["dog", "cat", "fish"]があるとして、
要素の値"dog"を指定して削除したいということでしょうか?
私が知る限り、配列でそれをやる方法は無くindexを指定する形しか無いと思います。
"dog"のindexが分かっているなら
わからないなら
という感じです
ロールバックマルチプレイはgamemakerのbeta版の機能ですが
バージョンによってうまく動く、動かないがあります
2023.200.0.281は大きなバグが無く
自分のロールバックゲームはこれで作ってます
チュートリアルだったらクリアできるはずです
全体を見直して、ご自分で原因にたどり着いたと。最高ですね!
私がよくやることですが、
今回は新しいroomで動かしたのが原因究明につながったようですね
原因がわかってよかったです!
こんばんは
新しいルームでもう一度動かしたところ正常に動作しました。😅
何が悪かったのか原因を探ってみたところ、別のオブジェクトの
のinstance_create_layer(x,y,layer,obj_battle)が問題だったようです😅
(今までのコードがobj_battleのコードです)
(確かに、これはやってることおかしいですわ…)
教えてくれたおかげで、なんとか問題に辿り着けたので助かりました!
分からないままだったら、ずっと同じコード直してました😅
とりあえず他のroomは考えなくていいです
このコードが書かれているオブジェクトがroom内に1つだけある形であれば正常に動くはずです
ですがインスタンスidが操作をするたびに変わっています
プロジェクトの作りがどうなっているのか不明なので私にはその理由までは分かりません
どういう作りになっているか一度見直してみてはどうでしょうか
追記
roomがpersistentになってる場合はそのroomにこのオブジェクトがあると競合すると思います
(操作を複数のインスタンスが拾うので)
なるほど…
とすると、他のルームにもそのオブジェクトがあるとダメって感じですか…?
id値はそのコードを実行してるインスタンスを示しますが、
それが全部違っているのはなぜだか分かりますか?
(本来1つだけのはずだと思うのです)
他の部分がどうなっているのか分からないので、なぜそうなるのか推測するしかありませんが、
そのオブジェクトが複数存在しているとか動的に作成されているということはありませんか?
ありがとうございます。
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
.
.
.
のようになりました🤔
やはりこちらでは正常に動作しました。
Stepイベントのspaceを押した時の処理部分にこれをコピペして試してもらえますか?
0を選択してspaceを押す
1を選択してspaceを押す
2を選択してspaceを押す
それぞれOutputに出力された内容を確認してください
Stepイベント↓
ありがとうございます。
とりあえず今の選択肢三つあるコードを貼っておきます。
Createイベント↓
それは不思議ですね
一度ここにコードを貼ってもらえますか?(CreateイベントとStepイベント)
コードの投稿の仕方はここを御覧ください
https://zawazawa.jp/official/topic/53
コメントありがとうございます。
出力の所を見てみると、
選択肢①を決定した時 "selected 0"
選択肢②を選んだ時 "erabu=1,sentaku=2"
選択肢②を決定した時 "selected 0""selected 1"
とやはり…同時に表示されてます。
ここで試しに選択肢③を作ったところ、
選択肢③を選んだ時
"erabu=2,sentaku=3"
"erabu=1,sentaku=3"
と表示され、
選択肢③を決定した時
"selected 2""selected 1""selected 0"
と、やはり他の選択肢も同時に表示されてしまいます…😭
今同じ方法で試してみたら正常に動作しました。
投稿した内容以外に関係してる箇所があって、そこが悪さしてる可能性はないでしょうか?
下記のようにして変数の値をoutputさせて、Outputに出力される値を見て期待通りに動いてるか確認してみてください
その通りです!!なるほど......確かに便利ですね!!使ってみます!!!
分かりやすい説明ありがとうございました!!
オブジェクトに処理を書けば済むからスクリプト(自作関数)は要らないのでは?という疑問でしょうか
スクリプトにするといろんなオブジェクトから利用することができますので便利です
例えばキャラが10種類あって全部がジャンプするとしたら、
10個全てにジャンプの処理を書くのではなくjump()というスクリプトを作ればそれを皆が共用で使えます。
あと、一連の処理を関数にすることでロジックの見通しが良くなります
Preference → Languages→ GML Code → "Enable variable reference warnings" をオフ
でなおるみたいです!?
”この変数は使われていません”的な警告はでなくなってしまいますが
すでにいろいろ確認されたんですね。
これから何か知ってる人が返信してくれるかもしれないのでこのまま待つとして、
ご存知かもですが一応紹介しておくと
こちらに質問してみるのもありです。
公式のチュートリアルが動かないということなので、もし解決できない場合は
公式サポートに聞くのが一番速い気がします。
不具合が疑われる場合はバグ報告するといいと思います。(英語)
asaさんご回答ありがとうございます。
そちらのサイトは確認済で、ChromeとOperaGxブラウザでそれぞれ試してみたのですが変化はありませんでした。
マルチプレイについては知識ゼロなので解決方法を示せないのですが、
ここで指摘されている事項についてはもう確認されましたか?
https://forums.opera.com/topic/53053/exception-throw-see-javascript-console-error-on-opera-gx-gxc
https://www.reddit.com/r/gamemaker/comments/q358mk/trouble_compiling_with_opera_gx_as_target/
何度も説明不足ですみませんでした!!!!めっちゃ助かりました!!!!!!!!!!!!!!!!!!
画面をスクロールさせる(カメラを動かす)には、
view_portではなくcamera viewの位置を動かします。
こんな感じです。
playerが所定の位置まで行ったら操作受付を止めて自動スクロールするには例えば下記のようになります
ロジックは一例ですのでご自分のやり方で書いてください
(roomのカメラのObject Followingがセットされているとカメラを自前で制御できないので"No Object"にしてください)
playerオブジェクト
リンク
操作しているキャラクターが所定の位置に行ったら、プレイヤーの追従&操作を止めて、view_portを動かす.....的な動きをさせたいです!分かりにくかったら、貼らせていただいたアンダーテールというゲームの動画の0:07~0:13の動きが正にやりたかった動きです!!何回もすみません!!