GameMaker 日本語掲示板

【解決済】YoutubeでARPG制作チュートリアルに出てきたnot set before reading it.のエラー解消について / 3

13 コメント
views
16 フォロー
3

Variable.direction(8,-2147483648)not set before reading it.

これは変数が定義されてないというエラー内容です。
「directionという変数が定義されてないのに使おうとしてるよ」というエラーです。しかし変数directionはビルトイン変数なので定義しなくても使えるものです。

1つ確認したいのですが、このコードが実行されている(書かれている)のはどこでしょうか。
オブジェクトのイベントの中で、あるいはscriptファイルの中でしょうか?

通報 ...
  • 4
    asa 2021/10/09 (土) 01:04:31 修正 >> 3

    これは当てずっぽうな推測ですが、このコードはscriptファイルに書かれていてobjectから呼び出していないでしょうか。
    v2.3.3以降はfunctionの扱いが変わっています。この仕様変更によって古い記述のままだとエラーになることがあります。

    具体的には、今の仕様だとスクリプト my_functions (←名前は適当)に、以下のように関数定義します。

    function abc() {
       val = direction div 45;
    }
    

    これを

    val = direction div 45;
    

    と書いてないでしょうか?
    そうするとRunするとスコープがglobalでこれが実行されるので、directionが定義されてないよとエラーが出るかもしれません。

    関係しそうなスレッドを探しました。
    https://forum.yoyogames.com/index.php?threads/important-gm-2-3-users-please-read-improper-script-usage-generates-undefined-variable-errors.79907/

    一度ご確認ください。

  • 5

    asaさんコメントありがとうございます。
    direction自体はそのままでも使えるのですね。今後の制作時の参考にします。ありがとうございます。

    コードが書かれているのはscriptファイルの中です。

    またこれとは別のscriptファイルにmacroでフレームレートの数値を設定しています。
    さらにエラーの指示を受けてないオブジェクト内のファイルを書いている状態です。
    Objectに対してEvents>Createイベントが下記のとおりです。

    image_speed = 0;
    hSpeed = 0;
    vSpeed = 0;
    speedWalk = 2.0;
    
    spriteRun = sPlayerRun;
    spriteIdle = sPlayer;
    localFrame = 0;
    

    またステップイベントが下記のとおりです。

    //Get Player Input
    keyLeft = keyboard_check(vk_left)  || keyboard_check(ord("A"));
    keyRight = keyboard_check(vk_right) || keyboard_check(ord("D"));
    keyUp = keyboard_check(vk_up) || keyboard_check(ord("W"));
    keyDown = keyboard_check(vk_down) || keyboard_check(ord("S"));
    keyActivate = keyboard_check_pressed(vk_space);
    keyAttack = keyboard_check_pressed(vk_shift);
    keyItem = keyboard_check_pressed(vk_control);
    
    inputDirection = point_direction(0,0,keyRight-keyLeft,keyDown-keyUp);
    inputMagnitude = (keyRight - keyLeft != 0)||(keyDown - keyUp != 0);
    
    
    //Movement
    hSpeed = lengthdir_x(inputMagnitude * speedWalk, inputDirection);
    vSpeed = lengthdir_y(inputMagnitude * speedWalk, inputDirection);
    
    x += hSpeed;
    y += vSpeed;
    
    //Updete Sprite Index
    var _oldSprite = sprite_index;
    if (inputMagnitude != 0)
    {
    	direction = inputDirection
    	sprite_index = spriteRun;
    } else sprite_index = spriteIdle;
    if (_oldSprite != sprite_index) localFrame = 0;
    
    //Update Image Index
    PlayerAnimateSprite();
    

    情報量が多くなり、またエラー該当箇所ではないため記載を割愛しましたがなにか解決のご参考にしていただきたく思います。
    お忙しいところ本当にありがとうございます。

    6

    コードが書かれているのはscriptファイルの中ということですね。

    関数を呼び出してる部分を探しますと、PlayerAnimateSprite(); があります。
    PlayerAnimateSprite がスクリプトファイルの名前でしょうか?
    その前提で以下に説明しますと、このスクリプトを開いて、

    function PlayerAnimateSprite() {
     code
    }
    

    という形になっていなければ、この形にしてください。コードを全部コピペして

    function PlayerAnimateSprite() {
     
    }
    

    の中に入れるだけでOKです。

    そしてRunするとどうなるでしょうか?

    7

    asaさんありがとうございます!できました!

    どのようにお伝えしていいかわかりませんが、本当に嬉しいです!
    1週間近くいろいろ変化させてみたり、全て打ち直したりしてだめだったので、本当に助かりました!
    夜遅くにありがとうございます!