GameMaker 日本語掲示板

views
17 フォロー
1,148 件中 161 から 200 までを表示しています。
1
生高橋 2024/06/20 (木) 20:57:58

かゆいところに手が届いてないですが、一応使ってます

4
program_suck 2024/06/18 (火) 09:12:28

ありがとうございます!
無事実行できました!

3
生高橋 2024/06/17 (月) 22:23:03 >> 2

了解です。

これを一つに関数にするのはとても難しいと思いますのでオブジェクトで一旦サンプルをつくってみました。
説明しやすいようかなり助長に書いたのでお好きに改善してもらえたらと思います。

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);
}

わからないことがあれば聞いてください。

2
program_suck 2024/06/16 (日) 22:22:29 >> 1

説明を全くしておらず申し訳ないです。

objが64移動するのをmovewayの配列によって方向を決める関数なのですが,例えばmoveway=["left","left","down"]だった際,左に128,下に64行った地点に瞬間的に移動してしまいます。
そうではなく,左に64,少しの空き時間,左に64,少しの空き時間...というように,for文が繰り返されるたびに若干の空き時間をつくり、段階的に移動している様に見せたいです。

1
生高橋 2024/06/16 (日) 18:38:48

この関数だとどんな問題があるのですか?

1

Webページ上で遊べる形にしたいということでしたら、
HTML5でエクスポートする形になります

1
program_suck 2024/06/16 (日) 10:16:35

彩度とは少し違いますが、以下のコードで修正することが出来ました。

if (active == false) {
    if (sprite_index != -1) {
        image_blend = c_gray; // グレースケールにする色調
    }
} else {
    if (sprite_index != -1) {
        image_blend = c_white; // 元の色調に戻す
    }
}

2
program_suck 2024/06/14 (金) 23:56:56

ありがとうございます!

1
asa 2024/06/14 (金) 23:07:02 修正

複数のオブジェクトから利用するなら一般的にScriptsに定義するのがいいと思います。
scriptsアセットで定義するとゲーム起動と同時に読み込まれスコープはグローバルになります(つまりどこからでも使えるようになります)。
scriptsには関数、構造体を1つだけ書いてもいいし複数書いてもいいです。

画像1

参考 https://manual.gamemaker.io/beta/en/GameMaker_Language/GML_Overview/Script_Functions.htm

2
ZUN is my dream(19) 2024/06/14 (金) 02:54:51

分かりやすい説明ありがとうございます!!
無事に動くことが出来ました!!

1
//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])、つまり会話の最大文字数を入れる」か、「次の会話に行く」になるようにしました。次の会話がない状態で次の会話へ行こうとするとエラーが起こってしまうので、「次の会話がない時、会話を終了する」等の処理を施してください。

4

if(a==1),if(a==2).......ってやるよりもswitch(a)でやった方がいいのと同じってことですね!!ありがとうございました!!

3

なるほど.....既存のゲームで考えると結構納得できます!!ありがとうございました!!

2

グリッドでデータを管理するインベントリとか、
縦横軸がある表のような形でデータを持たせたい場面があったらそこで使います。
でもそれも一次元配列で作ることはできますので、多次元配列が絶対不可欠というわけではないです。

極論をいうと変数をいっぱい使えば一次元配列すらいらない場面はたくさんあると思います。
でも配列を使うと何かと便利だし分かりやすくなるので使います。

配列、多次元配列を使うと分かりやすくて扱いやすい、便利だから使ういうことじゃないでしょうか。
今現在一次元配列で足りてるのであればそれでいいと思いますよ。

1
生高橋 2024/06/10 (月) 21:34:04

ぷよぷよや不思議のダンジョンなどの格子状形式のシステムでは2次元配列を使います。
3次元、4次元などは使ったことないです。

1
すいか 2024/06/07 (金) 07:53:07

_retを構造体の配列にすることで解決しました!

2

なるほど.....やっぱり諸々を考えてDrawイベントの方に書いていこうと思います!ありがとうございました!

1
asa 2024/06/05 (水) 19:33:32 修正

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も一緒にスクロールとかしないよう制御する必要が出てきます)

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

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