したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

アイワナ作成に役立つテクニック紹介スレ

1名無しさん:2016/06/16(木) 19:40:32 ID:bp5PiC0g
アイワナを制作する上で役に立つテクニックを紹介していくスレです。
コード以外にもスプライトに関することやexeの容量を減らす方法などを
みんなで共有してより質の良いアイワナを目指しましょう。
他のスレでこのようなテクニックを書くのはスレチだよなと思い
建ててみました。
(アイワナボスコードのスレと少し被っているかとは思いますが)
初めにいくつか紹介をします。

2名無しさん:2016/06/16(木) 19:51:19 ID:bp5PiC0g
「Execute Codeのテクニック 名前を付ける」

Execute Code(皆さんがいつもコードを打っているやつです)に名前を付けることができます
通常何もしなければ「Execute a piece of code」と表示されますが

コードの1行目に
///name
と「///」の後に(必ず3本打ってください)
付けたい名前を入力すると名前が変更します

中身の処理が分かるように名前を付けてあげましょう
(8.0では出来るかわかりません)

3名無しさん:2016/06/16(木) 19:58:37 ID:bp5PiC0g
「スプライトの設定でexeの容量を減らす」

スプライトのBounding Boxの設定をPreciseにするとexeの容量が増えます
複雑な形状なものほどexeの最終的な容量が増えていくみたいです

これは事前にあたり判定を計算して
ゲームの処理を軽くするためにしているようです(あくまで予想)

あたり判定を使わないスプライト 厳密なあたり判定をしなくてもいいスプライトは
Precise以外のものにするとよいでしょう
(セーブのスプライトのあたり判定も四角にすることをおすすめします)

4名無しさん:2016/06/19(日) 00:22:34 ID:bp5PiC0g
「Proでしか使えないclampとlerpをliteで使えるようにする」

何故かliteで使えないlerpとclampですが
liteでも使えるようにしてみましょう

lite_lerpとlite_clampのScriptを作成します

lite_lerpの中身
return argument0 * (1 - argument2) + argument1 * argument2;

lite_clampの中身
return min(argument2, max(argument0,argument1));

また0から1の間にしたいということが多々あると思いますので
clamp01というのも作っておくと便利です

lite_clamp01の中身
return min(1, max(argument0, 0));

(ここでlite_clamp(argument0, 0, 1)にしないのは処理速度を速めるため)

引数の順番も同じのはずなのでこれで同じように使えます

因みに検証はしていませんが、自作したlite_clampなどより
proのclampのほうが処理は速くなると思います
(因みに計算方法は全く変わらないはず)

5名無しさん:2016/06/20(月) 03:21:44 ID:Shy6TwL6
>>4
clamp()、lerp()とは一体どんなものなのでしょう?

6名無しさん:2016/06/20(月) 23:42:01 ID:bp5PiC0g
>>5
正直人によってはif文でいいじゃんって思うかもしれませんが
clampは第一引数の値を 第二引数 第三引数 の値の間に丸めます

clamp(20, 5, 10)と指定した場合

もし20が5未満だと5になり
20が10より大きいと10になります

よって今回帰ってくる値は10になります

if文に置き換えると

_val = 20;

if(_val > 10)
{
_val = 10;
}

if(_val < 5)
{
_val = 5;
}

と同等の処理をやっています

※因みに・・・
GMSのシェーダーはシェーダーのバージョンが低いためにif文が使えません(正直使えないと厳しい)
なのでGMSでシェーダーを将来使いたいと思っている人はclmapを使えるようにしてください


lerpは第一引数 第二引数の値を 第三引数の値によって線形補間をします

例えば

lerp(0, 10, t)

tが0だった場合 0が帰ってきます
tが1だった場合 10が帰ってきます
tが0.5だった場合 5が帰ってきます
tが0.2だった場合 2が帰ってきます

このように0と10の間の値をとってこれるわけです

で わかりますか?

7名無しさん:2016/06/21(火) 05:12:30 ID:Shy6TwL6
>>6
なるほど…?

clampは最大値と最小値に収めることが出来る…
速度補正とかに応用できそうな気がします
使い方によってはとても便利そうですね…!

そしてlerpは…線形補間…
線分を内分、外分するようなものでしょうか
lerp(5,10,t)でt = 2だった場合、15が返ってくる…そんな感じですかね?

なんだか微妙な理解でスミマセン…w

8名無しさん:2016/06/21(火) 07:05:24 ID:bp5PiC0g
>>7
lerpに関してはその理解で問題ないはずです

9名無しさん:2016/06/26(日) 23:27:35 ID:bp5PiC0g
加減速について
まぁ調べれば式については出てくるのですが一応

lerpをつかって加速 減速 又はその両方をオブジェクトの動きにつける方法を今回は教えます

まずは加速も減速もついていないパターンをlerpを使って作ってみます

[Create Event]
_t = 0;

x = 100;
y = room_height/2;

_from = 100;
_to = room_height - 100;


[Step Event]
_t += 1 / room_speed * 3; //studioならdeltaTimeでもok
_t =clamp(0, 1, _t);
x = lerp(_from, _to, _t);

これで加減も減速も無い 言わば「基本形」が出来ました
ここに加速や減速を付けていきます
基本的にはlerpの中のtの形を変えるだけでいろんな動きをさせることが可能になります



下の式は 2次関数や3次関数のグラフを使えば出てきます
正直のところなんでこんな式になるのか解説するのが面倒なので省略します

加速:x = lerp(_from, _to, _t * _t); //_t * _t * _t * _tにすると加速の付き方が変わります
減速:x = lerp(_from, _to, _t * (2 - _t));
加減速:x = lerp(_from, _to, _t * _t * (3 - 2 * _t));

109:2016/06/29(水) 00:57:34 ID:bp5PiC0g
訂正します

_to = room_height - 100;



_to = room_width - 100;

すみません

11名無しさん:2016/07/02(土) 11:22:06 ID:bp5PiC0g
「意図的にliteに戻す」

エンジンなどを作る際
lite版では使えない機能をつけないようにしたり

作成に関する質問スレ の質問者がlite版だった場合
liteでも動くようなコードを書くようにしたり

とlite版に一端戻したい場合があるかもしれないので
gamemaker8.1以前でproからliteに戻す方法を教えます

C:\Users\ユーザー名\AppData\Local\GameMaker8.1

にある「license.plist」の名前を変えるか場所を移すだけで
lite版にダウングレードします

(間違えて消したりしますともう一度ライセンスコードを
入れなければなりませんので注意してください)

12名無しさん:2016/07/14(木) 18:51:53 ID:bp5PiC0g
テクニックではないと思います が 
アイワナ全体を良くしていくためにこれだけは書くべきではないか? と思ったので書きます

アイワナを作ったことのない人・作り始めた初心者に対してです

個人的に処女作の自作アイワナの印象を良くしたいのであれば
まず最初に作ったアイワナは出さないほうがいいのかなと思います

自分がそうだったのですが最初の頃に作った作品というのは制作自体が楽しくなってしまい
ゲームをやる相手のことを考えずに制作してしまう為です

じゃあ最初から人のことを考えながら制作すればいいのでは?
と思うかもしれませんが 個人的には最初は何も考えずに「これやってみよ」「あんなことしたい」と思ったことを
試行錯誤しながらやったほうが制作スキルの向上に繋がると思います

あとは既存のゲームからギミックを持ってくるのもありかもしれません
マネすることでも制作スキルの向上に繋がっていきます

こんな感じでやっていくといいのかなと

13名無しさん:2016/07/15(金) 20:35:44 ID:Shy6TwL6
>>12
個人的な意見ですが、「最初に作ったアイワナは出さない」それはどうかと…

ワタクシは1作目、長編を作りました。プログラムやGameMakerの知識が全くない状態からのスタート。
確かにクオリティは酷かったですが、それでもかなり(自分の中では)必死に作った覚えがあります。
オブジェクトの考え方、コードの考え方、応用の仕方、roomやviewの考え方、レベルデザインの大切さ、グラフィックの重要さ、
そして必死でラスボスとエンディングを作り終え、作品を世に出した時の達成感は、これを味わった人にしか分からないのではないでしょうか。
知らない人に遊んで貰えた時、とても嬉しかったですね。
そして遊んでもらって、意見や感想を聞いて、ようやく見えてくるものもあります。
これを味わわないと、モチベーションだって続かない気もしますし…。
…それもこれも全部1作目の製作で分かったというものです。

ですから私は、製作初心者の方には是非最初の作品を世に送り出してほしいと思います。(もっとも、私もまだ4作程しか作っていないひよっこですが…)
ただし、頑張って欲しいです。
自分ができるところまで頑張って、そのうえで作品を出してほしいです。
そうしたらなんとなく「次はこんな風にしたらいいかな」って見えてくるものがあると思います。

14名無しさん:2017/04/06(木) 17:17:18 ID:ZtJ/cC0M
フラストレーションを溜めないようにする

みなさんはこんな経験ありませんか?

・今の弾は避けたのになぜか当たった判定になった
・今のアイテムは取ったはずなのに取れてない判定になった

こういったことをできる限り無くし 「今のは完全に自分のせいだな・・・」と思わせられれば
プレイヤーのフラストレーションを溜まりにくくすることができます
(まぁ他にも溜まる要因はたくさんありますが とりあえず触れないでおきます)

フラストレーションを溜まりにくくすると
作品を最後まで遊んでもらえる可能性が高くなります


ではどうすればいいのか
以下の2つをやるだけでも大分変わると思います

プレイヤーにとって不利なオブジェクト(針や敵の弾)の当たり判定を小さくする
プレイヤーにとって有利なオブジェクト(パワーアップ系や鍵といったアイテム)の当たり判定を大きくする

これが基本です


既存のゲームで分かりやすそうなものとして
ディディーコングレーシングのシルバーコインチャレンジなどを見てもらうとわかる通り
めちゃくちゃコインの当たり判定がでかいです
なのでなんでもかんでも当たり判定のタイプをPreciseにすべきじゃないということです
(特にセーブをなんとかしてくれ)


このように当たり判定を変えてそのオブジェクトにあったものをチョイスしてみてください
決して当たり判定を軽くみてはいけません

15名無しさん:2017/06/17(土) 14:18:12 ID:Aln3yfBg
>>6 GM:Sのシェーダーのどれのこと言ってるのか知らんがデフォのGLSL ESでは使えるから

16名無しさん:2017/06/17(土) 14:46:07 ID:bp5PiC0g
>>15
ああ なんか当時は「if文書いたらコンパイル通らないぞ?」って勘違いをしてしまったらしいんだ
恐らくそのときにでたエラーはシンタックスエラーだと思うんだけど
なんで勘違いしたんだっけかな・・・・・

とにかく修正ありがとうございます

17名無しさん:2017/09/26(火) 21:33:18 ID:bp5PiC0g
デコンパイルをされてもクイズの答えを分からないようにする
(GameMaker Studio以降限定)


例えばゲーム内にクイズを出す場合
クイズの答えを知られたくないとします

以下のコードの場合デコンパイルされれば簡単に答えがばれます
_str = get_string("Answer?", "");
if(_str == "apple")
{
show_message("correct!");
}
else
{
show_message("incorrect");
}

答えは見ての通りappleですね
なのでappleとダイアログボックスに入力すれば正解になることがわかります


では下のコードはどうでしょう?

_str = md5_string_unicode(get_string("password?", ""));
if(_str == "db8623fa0fb443e5e5725ca13cf958f8")
{
show_message("correct!");
}
else
{
show_message("incorrect");
}

見ての通り全く分かりません
因みにこれは上と同様appleと入力すれば正解になります

このmd5_string_unicodeという関数を使いますと
でたらめな文字が帰ってきます
この文字のことをハッシュ値といいます(ただこういう使い方はよくないらしい?)


このハッシュ値と呼ばれるものの特徴としまして

1.同じ文字列であれば必ず同じ値として帰ってくる
2.ハッシュ値からは元の文字「apple」と読めない

となっています

因みにハッシュ値の計算にはいろいろと方法があります
今回gamemakerが用意しているmd5と呼ばれる計算方法では

340282366920938463463374607431768211456通り(2^128通り)

のハッシュ値を作ってくれます

因みにこれはセーブデータ改ざんを防ぐことにも使えます
例えばセーブデータにセーブした値を合計したハッシュ値を作って埋め込み
ゲーム再開時に改ざんチェックをするなどできます
余力があったらやってみてください

18名無しさん:2017/09/30(土) 23:17:29 ID:bp5PiC0g
>>17 の改訂版

例えばクイズの答えをばれないようにしたいとします
以下のコードの場合デコンパイルされれば簡単に答えがばれます

_str = get_string("答えは?", "");
if(_str == "リンゴ")
{
show_message("正解");
}
else
{
show_message("不正解");
}
この場合「リンゴ」と打てば「正解」と出ることが分かります


以下のコードの場合はどうでしょう
_str = sha1_string_unicode(get_string("答えは?", ""));

if(_str == "4b0f5b962e74db04cd9dea32193de12f2fdd0191")
{
show_message("正解");
}
else
{
show_message("不正解");
}

4b0f5b962e74db04cd9dea32193de12f2fdd0191とあったのでこれを回答欄に打ってみますと「不正解」と出てしまいます
1つ目のコードのように「リンゴ」と打つと「正解」と出てきます

このようにデコンパイルされても2つ目のコードだと答えが分からないようになります

この4b0f5b962e74db04cd9dea32193de12f2fdd0191のようなデタラメな文字を作るには
sha1_string_unicodeという関数を使います

このsha1_string_unicodeという関数はハッシュ値というものを作る関数です
因みにハッシュ値を作る関数をハッシュ関数といいます

同じような関数としてmd5_string_unicodeという関数がありますが
sha1よりもセキュリティとして弱いです
(実際今年になってsha1も穴が見つかってしまいましたが)


このハッシュ関数・ハッシュ値にはいくつかの特徴があります

1.同じ文字からは必ず同じハッシュ値が出てくる
計算によってハッシュ値を求めているので当然同じハッシュ値が出てきます

2.たまに違う文字から同じハッシュ値が出てくることもある
どうしても出てくるパターンに限りがあるため
違う文字列から同じハッシュ値が出てしまいます
これを衝突といいます

3.ハッシュ値の長さが変わらない
例えば長さが10文字としたら
「a」だとしても10文字になり
「skljflsdjfklsas」と11文字以上でも10文字で出てきます

4.似たような文字でもハッシュ値にすると大きく違う
「あいうえお」と「あいうええ」は似た文字列ですが
似たようなハッシュ値がでることはないです

5.ハッシュ値から元の文字を復元できない
例えば
5÷3の余りは2ですが
この余り2から5を復元することは出来ません
このような感じでハッシュ値から元の文字を復元できません

このハッシュ値を用いることでセーブデータの改ざんを阻止することもできます
・全ての値を足した値を使う
・タイムからデス数を割った数を使う
などハッシュ関数に渡す数字を工夫する必要がありますが
ハッシュ値をセーブデータに埋め込めば
ロードするときにハッシュ値とデータの値が合っているか確認することができます

ハッシュ値とデータの値が合っていれば正常なデータ
ハッシュ値とデータの値が違っていれば改ざんされたデータ

このように確認できるのでみなさんもやってみてください

19名無しさん:2017/10/22(日) 11:49:45 ID:bp5PiC0g
少しだけでも処理を軽くする

恐らく利用する人が多いであろうdegtorad()ですが
これを使わずにできるだけ速くする方法を考えてみます

1.予め計算をする
基本はこんな感じです

r = degtorad(60);

r = 1.047197;


乱数使っていて さらに円状に出すのであれば

r = random_range(0, 6.283185);
var i;
for(i = 1; i < 6; i += 1)
{
var hoge;
hoge = r + 1.047197 * i
/*略*/
}

みたいな感じになります
一番速いです

弱点としましては値を変えたい場合に再度計算をしないといけないので面倒というくらいです



2.掛け算でラジアンに変換する
恐らくですがdegtorad関数の中身の計算はこのようになっています

return argument0 / 180 * 3.141592;

よく見てください
これは3.141592 / 180で予め計算できることがわかります
これを計算すると
0.0174533
という値が出てきます

これをlite版であれば
global.deg2rad = 0.0174533; //toの部分を2で置き換えている

pro版であれば
Define Constantsで登録


そして使い方は
r = degtorad(60);

//lite版
r = 60 * global.deg2rad;

//pro版
r = 60 * deg2rad;

こうするとそこまででもないですが
degtoradよりも処理が速いです

まぁ耐久とかですと結構使うと思うのでそれなりに
軽くなるのかもしれないですね

ただし Scriptで作ると逆に遅いです
なので 掛け算で変換をすることが重要です

1番のやり方よりは処理が遅いですがその分角度が分かりやすく
簡単に値を変えられるのでこちらをおすすめします

20名無しさん:2018/07/11(水) 01:23:54 ID:bp5PiC0g
playerの中にkeyboard_check関連を入れるべきではない



基本的にアイワナエンジンはplayerの中に(あるいはplayer関連のscriptに)
keyboard_check(vk_right)や
keyboard_check(ord("Z"))などが
書いてあると思いますが、

playerの中にそれを書くべきではありません
playerとは別のオブジェクトに書いたほうが融通が利きやすくなるからです

では実際にやってみましょう


とりあえずplayerを適当に作ります
今回は簡潔に書いたほうが伝わると思うので左右の移動だけを書いてみます

オブジェクト:controller_base
<create Event>
m_hspeed = 0.0;


オブジェクト:controller_keyboard
(controller_baseを親にする)
<begin Event>
//リセット
m_hspeed = 0.0

m_hspeed += keyboard_check(vk_right);
m_hspeed -= keyboard_check(vk_left);


オブジェクト:controller_event
(controller_baseを親にする)
<create Event>
event_inherited();
alarm[0] = 1;

<alarm0 Event>
m_hspeed = 1.0;
alarm[1] = 40;

<alarm1 Event>
m_hspeed = 0.0:
alarm[2] = 25;

<alarm2 Event>
m_hspeed = -1.0;
alarm[3] = 40;

<alarm3 Event>
m_hspeed = 0.0;
alarm[0] = 25;


オブジェクト:player
<step Event>
x += controller_base.m_speed * 3;


さてこれで準備が整いました
ルームに

player, controller_keyboardの2つを置くと
キーボードで左右に動かせるようになり、

player, controller_eventの2つを置くと
自動で行ったり来たりし、キーボードが一切反応しない


このようにcontrollerのオブジェクトを差し替えるだけで自由にplayerを操れるようになるのです
しかも工夫すれば敵にもこのコントローラは使えるようになるのです

なのでplayerの中にはkeyboard_check関連を直接書いてはいけません

2120:2018/07/11(水) 08:36:25 ID:bp5PiC0g
訂正です
begin Event→begin step Event

22つっぱり:2019/02/10(日) 17:44:29 ID:cgFEPnCA
アイテムをとったらセーブする方法を教えてください

23名無しさん:2019/02/11(月) 02:05:59 ID:Nz0fTvbA
すこしは自分でやってみような^^

24名無しさん:2019/02/11(月) 21:07:52 ID:YgjmsVYg
↑黙れ、死ね

25名無しさん:2019/02/12(火) 09:50:39 ID:CIexsElc
>>22
ここは質問スレではなく知識やアイデアを共有するスレですので相応の場所に投稿してください。
そして質問する前に最低限「gamemaker アイテムとったらセーブ」とでもぐぐってみてください

26名無しさん:2019/03/01(金) 22:13:00 ID:pspNTmgE
ボス演出を Sキーでスキップする方法を教えてください
*検索しても出てきませんでしたので。

2767557857597:2019/03/01(金) 22:27:28 ID:pspNTmgE
best guy 2見たいに背景を回す方法教えて

28名無しさん:2019/03/01(金) 22:29:58 ID:Aln3yfBg
>>26
sonicゆっくり さん「アイワナ ボス演出 スキップ」で検索しても出るわけないですよ。なんでもやり方を聞くのではなく、アイデアや考え方をまず自分で練ってから実現するための方法を調べましょう。
そしてどうしても無理な時に聞いてくださいね。

2967557857597:2019/03/02(土) 14:26:05 ID:pspNTmgE
>>28
「質問する前に最低限〜とでもググってみて」っていってるけど?()

30>>28:2019/03/02(土) 14:28:46 ID:pspNTmgE
sonic ゆっくり さんはどこから...?‘―`

31名無しさん:2019/03/02(土) 15:15:34 ID:Aln3yfBg
>>26,27,29,30
情報リテラシーが低いからなのか、なぜか名前や口調をたびたび変えて投稿してらっしゃいますが、全て同一人物かつあなたが sonicゆっくり さんであることはIDから特定できます。

そもそもこのスレッドはあなたの質問のようにゲーム等のアルゴリズムを質問する場でなく、コーディングの際の効率等のテクニックの共有の場です。あなたが行っていることは故意ではなくとも荒らしなので「製作に関する質問スレ」でお願いしますね。

29の発言から25の発言は読んでいるはずなのになぜ同じ過ちを犯してしまうんでしょうね。自分の都合のいい文章だけ切り取って「〜っていってるけど?()」とかいう謎の煽りしてらっしゃるのとても滑稽ですよ。今後もこのような対応を続けるのであれば、少なくとも私はあなたに自分の知識を一切教えたいと思いません。

sonicゆっくり さんだけではないですが、ここでのググるっていうのは単に検索して終わりではないので、検索して見つからなかったからといって安易に質問しないでくださいね。その結果同じ質問が複数あがるという事態になってるので。他者の言葉は直訳するのではなく本当は何を言いたいのかを考えましょう。

32sonicゆっくり:2019/03/22(金) 17:51:26 ID:mmOofaho
>>31その人はわたしじゃありません。
ここで質問したことありません。

33sonicゆっくり:2019/03/22(金) 17:54:16 ID:mmOofaho
>>30
っていうかもともとその人はなりすましですね。

34sonicゆっくり:2019/03/22(金) 17:55:08 ID:mmOofaho
わたしのIDはmmOofahoです。
本物ですよ?

35sonicゆっくり:2019/03/22(金) 17:58:36 ID:mmOofaho
>>27
スプライト作ってオブジェクト作ってステップにif d {
image_angle -= 1.9;
if e < 1 {
image_xscale += 0.02;
image_yscale += 0.02;
e += 0.02;
}
}
if c == 0 {
if !b {
if a < 1 {
image_xscale += 0.0005;
image_yscale += 0.0005;
a += 0.01;
} else {
b = 1;
c = 300;
}
} else {
if a > 0 {
image_xscale -= 0.0005;
image_yscale -= 0.0005;
a -= 0.01;
} else {
b = 0;
c = 300;
}
}
}
if c > 0 {c -= 1;}

image_angle -= 0.1;
でクリエイトに
d = 0;
で できますよ?
私のなりすましをしてたんだろうけどそういうので私が荒れているみたいになってます。
最初からそういうのはやめてくださいね。

36名無しさん:2019/03/22(金) 22:40:50 ID:jC2eCTVk
>>35
インデントや改行に工夫が見られず、変数の命名がいい加減でコメントや解説も無いので非常に読みづらいです。クソです。

そもそも>>31にあるようにその書き込みはスレの主旨と異なるものであり、あなたがやっていることは故意でなくても荒らしです。4連投も普通に迷惑なので1つか2つにまとめて下さい。

なりすましに腹が立つ気持ちもわかりますが適切な対応をしてほしいです。

37名無しさん:2019/03/23(土) 00:40:16 ID:l7edCUV6
image_angleってプロ専用だよね

38sonicゆっくり:2019/03/23(土) 10:19:40 ID:mmOofaho
↑8.1だと使えますよ

39名無しさん:2019/03/23(土) 10:47:23 ID:l7edCUV6
失礼しました

40sonicゆっくり(本物):2019/03/23(土) 10:54:35 ID:mmOofaho
>>36
...そ...そうか。

41名無しさん:2019/04/10(水) 21:34:02 ID:v/HvJKlU
そもそも今ならStudio使うだけで出来ること広がるよ。
キャプション弄れないぐらいしかデメリット無いし。

それだけで投稿するのもあれなので、ちょっと便利なコードでも
move_contactはsolidかallしか用意されておらず、特定のオブジェクトにぶつかるまでー
って思った時に作ったものです。

#define move_contact_object
//move_contact_object(dir,maxdist,obj)
//move_contact系のobject版
with(all){_tsol=solid;solid=0}
with(argument2){solid=1;}
move_contact_solid(argument0,argument1);
with(all){solid=_tsol;}

42名無しさん:2019/04/12(金) 10:17:36 ID:bp5PiC0g
>>41
window_set_caption("これでキャプションを設定する");

43名無しさん:2019/08/28(水) 10:33:09 ID:v/HvJKlU
>>42
今更返信しますがwindow_set_captionはStandard(無料版)では使えませんよ

44名無しさん:2019/08/29(木) 07:45:10 ID:bp5PiC0g
>>43
あれ?こっちの環境だとStandard Edition (v1.4.9999)で使えてるのだがどういうことだ?
「This function is for the Pro version of GameMaker: Studio only..」
と関数説明に書かれているのは見たが

exeでも正しく動いている……

45名無しさん:2021/04/16(金) 20:25:47 ID:FIh5NQIE
手軽に四角形弾幕を出す

手っ取り早く四角形を出したいのであれば
このようなスクリプトを作るだけでいけます

triangle_x スクリプト
return arcsin(cos(argument0)) * 2 / pi
// (arcsinにしとくと何かと便利)

triangle_y スクリプト
return arcsin(sin(argument0)) * 2 / pi

後は円弾幕ではcosとsinを使うと思いますが
それぞれtriangle_xとtriangle_y(名前が良くない気がする)に置き換えるだけでOKです

var num; num = 32;
var i
for(i = 0; i < num; i += 1)
{
var dir; dir = pi * 2 * i / num // 誤差が少なくなるように計算の順番を入れ替えている
var px; px = cos(dir) * 100 + x
var py; py = sin(dir) * 100 + y

draw_sprite(sprite0, -1, px, py)
}

これを

var num; num = 32
var i
for(i = 0; i < num; i += 1)
{
var dir; dir = pi * 2 * i / num
var px; px = triangle_x(dir) * 100 + x
var py; py = triangle_y(dir) * 100 + y

draw_sprite(sprite0, -1, px, py)
}

こうするだけ
後は2次元の回転行列で回せば任意の四角形弾幕ができる

46名無しさん:2021/05/07(金) 11:47:24 ID:FIh5NQIE
個人的便利なスクリプト集
★execute_event_user - 指定したオブジェクトのUser Eventを実行
・Studio2.3より前
/// execute_event_user(inst, numb)
with(argument0) { event_user(argument1) }

・Studio2.3以降
function execute_event_user(inst, numb)
{
with(inst) { event_user(numb) }
}

・使い方
execute_event_user(objPlayer, 0)


★instance_destroy_select - 任意のインスタンス(オブジェクト)を削除
・Studio以前
/// instance_destroy_select(inst)
with(argument0) { instance_destroy() }

・Studio2以降
標準で実装済み
(instance_destroyに消したいインスタンスIDを渡す)

・使い方
instance_destroy_select(objPlayer)


★move_towards1d - 現在の値から任意の値に向けて加減します。任意の値で止まります
・Studio2.3より前
/// move_towards1d(current, target, max_delta)
if(abs(argument1 - argument0) <= argument2) { return argument1 }
return argument0 + sign(argument1 - argument0) * argument2

・Studio2.3以降
function move_towards1d(current, target, max_delta)
{
if (abs(target - current) <= max_delta) { return target }
return current + sign(target - current) * max_delta
}

・使い方 - (100, 100)の座標に向かう
x = move_towards1d(x, 100, cos(_dir)*m_speed)
y = move_towards1d(y, 100, sin(_dir)*m_speed)

47名無しさん:2021/05/07(金) 11:48:25 ID:FIh5NQIE
続き(改行が多すぎとエラーが出たので分割)

★value_wave 値を揺らす時に使う
・Studio2.3より前
/// value_wave(center, wave_speed, width)
return argument0 + sin(current_time * 0.00628319 * argument1) * argument2

・Studio2.3以降
function value_wave(center, wave_speed, width)
{
return center + sin(current_time * 0.00628319 * wave_speed) * width
}

・使い方
// Stepイベント - タイトルのロゴを揺らすのに使える
// 上下に揺らす
y = value_wave(room_height / 2, 5, 10)
// 回転させて揺らす
image_angle = value_wave(0, 2, 4)


★wrap ラップアラウンド関数(下限値から上限値の間でループさせる)
・8.1以前
if(argument1 >= argument2) { show_error("The value of arugment1 is greater than argument2.", true) }
var n; n = (argument0 - argument1) mod (argument2 - argument1)
if(n >= 0) { return n + argument1 } else { return n + argument2 }

・Studio
/// wrap(x, low, high)
if(argument1 >= argument2) { show_error("The value of low is greater than high.", true) }
var n = (argument0 - argument1) % (argument2 - argument1)
if(n >= 0) { return n + argument1 } else { return n + argument2 }

・Studio2以降 Studio2.3より前
/// wrap(x, low, high)
if(argument1 >= argument2) { show_error("lowの値がhighよりも大きいです。", true) }
var n = (argument0 - argument1) % (argument2 - argument1)
return (n >= 0) ? (n + argument1) : (n + argument2)

・Studio2.3以降
function wrap(x, low, high)
{
if(argument1 >= argument2) { show_error("lowの値がhighよりも大きいです。", true) }
var n = (x - low) % (high - low)
return (n >= 0) ? (n + low) : (n + high)
}

・使い方 - セーブデータを選ぶ画面で使える
if(keyboard_check_pressed(vk_left)) { m_save -= 1 }
if(keyboard_check_pressed(vk_right)) { m_save += 1 }

m_save = wrap(m_save, 0, 3) // 0, 1, 2の間でループ(3は含まれない)

// 回転にも使える
image_angle = wrap(image_angle+0.1, 0, 360)
// 360以上になったら0にループ(小数を使う場合は演算誤差に注意)

4847:2021/05/07(金) 13:30:42 ID:FIh5NQIE
訂正
function wrap(x, low, high)
{
if(argument1 >= argument2) { show_error("lowの値がhighよりも大きいです。", true) }
var n = (x - low) % (high - low)
return (n >= 0) ? (n + low) : (n + high)
}



function wrap(x, low, high)
{
if(low>= high) { show_error("lowの値がhighよりも大きいです。", true) }
var n = (x - low) % (high - low)
return (n >= 0) ? (n + low) : (n + high)
}


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板