[SOLUCIONADO] Duda GML Con Variables heredadas

Iniciado por karurosu, Febrero 16, 2024, 03:25:27 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 16, 2024, 03:25:27 PM Ultima modificación: Marzo 22, 2024, 03:11:28 AM por DtxdF
Hola buen día amigos.

Estoy desarrollando un tutorial de la página de Game Maker y para hacerlo más detallado se me ocurrió la idea de darle una posición específica a cada objeto que puede recoger el player en el videojuego desarrollado y que dé la impresión de que sostiene cada objeto correctamente según su tamaño.

Para ello mi idea es hacer tres arreglos que le den la posición al objeto en X, Y y la profundidad, sin embargo estos objetos aparecen en el mapa del juego y heredan sus variables de un objeto padre (obj_par_item), así que se me hizo fácil añadir solamente un switch con la variable obj_par_item.itemName (variable heredada por todos los objetos que cambia de nombre según el objeto) para extraer el nombre de cada objeto recogido por el player (solamente puede cargar un objeto a la vez) y así dar la posición específica para cada objeto.

Mi sorpresa es que al mostrar en consola el valor del itemName siempre sale el mismo valor (que es el nombre del primer objeto hijo Rolling Pin) independientemente del objeto que tome, puede ser el primer elemento, el segundo, tercero, etc. ¿alguien sabe a qué se debe esto?

¡Muchas gracias!

Adjunto imágenes del ejercicio

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Adjunto el código de mi script:
Código: php
// script de objeto
function scr_itemPosition(){
    var _x, _y, _depth;
    var _x_object = array_create(4), _y_object = array_create(4), _depth_object = array_create(4);
    
    show_debug_message(obj_par_item.itemName);
    
    switch(obj_par_item.itemName){
        case "Rolling Pin":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 104;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 2;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 106;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 95;
            _depth_object[3] = 2;
        break;
        case "Apple":
            //derecha
            _x_object[0] = 10;
            _y_object[0] = 104;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 2;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 106;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 95;
            _depth_object[3] = 2;
        break;
    }
    
    if(instance_exists(obj_player)){
        switch obj_player.dir{
            case 0://derecha
                _x = obj_player.x + _x_object[0];
                _y = obj_player.y - _y_object[0];
                _depth = obj_player.depth - _depth_object[0];
            break;
            case 1://arriba
                _x = obj_player.x + _x_object[1];
                _y = obj_player.y - _y_object[1];
                _depth = obj_player.depth + _depth_object[1];
            break;
            case 2://izquierda
                _x = obj_player.x - _x_object[2];
                _y = obj_player.y - _y_object[2];
                _depth = obj_player.depth - _depth_object[2];
            break;
            case 3://abajo
                _x = obj_player.x + _x_object[3];
                _y = obj_player.y - _y_object[3];
                _depth = obj_player.depth - _depth_object[3];
            break;
        }
    
        return [_x, _y, _depth];
    }
}


Hola.

Duda resuelta, estaba tomando mal el valor ya que yo lo intentaba tomar desde el objeto padre directamente en el script y en lugar de eso envié la variable itemName como parámetro a la función cuando esta es llamada por cada hijo que hereda dicha función, así los hijos envían correctamente su itemName y en el switch evalúo dicho parámetro, en este caso como solo hay una instancia de ese mismo objeto en el nivel entonces no hay ningún problema.

Código corregido
Evento Paso del objeto Padre:
Código: php
/// @description paso del objeto
//profundidad, animación
switch myState {
    //si el objeto está fijo en el suelo
    case itemState.idle:
        depth = -y;        
    break;
    //si el objeto fue tomado
    case itemState.taken:
        //realiza un seguimiento de la posición del jugador
        var _result = scr_itemPosition(object_index.itemName);
        x = _result[0];
        y = _result[1];
        depth = _result[2];
    break;
    case itemState.puttingBack: //si el objeto comienza a bajarse
        y = putDownY;
        myState = itemState.idle;
    break;
}

Función scr_itemPosition:
Código: php
// script de objeto
function scr_itemPosition(_obj_name){
    var _x, _y, _depth;
    var _x_object = array_create(4), _y_object = array_create(4), _depth_object = array_create(4);
    
    switch(_obj_name){
        case "Rolling Pin":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 2;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 106;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 95;
            _depth_object[3] = 2;
        break;
        case "Apple":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 2;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 90;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 88;
            _depth_object[3] = 2;
        break;
        case "Head of Cabbage":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 100;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 90;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 80;
            _depth_object[3] = 100;
        break;
        case "Kitchen Scale":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 100;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 90;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 80;
            _depth_object[3] = 100;
        break;
        case "Lesson Book":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 100;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 90;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 80;
            _depth_object[3] = 100;
        break;
        case "Watering Can":
            //derecha
            _x_object[0] = 65;
            _y_object[0] = 90;
            _depth_object[0] = 2;
            //arriba
            _x_object[1] = 0;
            _y_object[1] = 95;
            _depth_object[1] = 100;
            //izquierda
            _x_object[2] = 65;
            _y_object[2] = 90;
            _depth_object[2] = 2;
            //abajo
            _x_object[3] = 0;
            _y_object[3] = 80;
            _depth_object[3] = 100;
        break;
    }
    
    if(instance_exists(obj_player)){
        switch obj_player.dir{
            case 0://derecha
                _x = obj_player.x + _x_object[0];
                _y = obj_player.y - _y_object[0];
                _depth = obj_player.depth - _depth_object[0];
            break;
            case 1://arriba
                _x = obj_player.x + _x_object[1];
                _y = obj_player.y - _y_object[1];
                _depth = obj_player.depth + _depth_object[1];
            break;
            case 2://izquierda
                _x = obj_player.x - _x_object[2];
                _y = obj_player.y - _y_object[2];
                _depth = obj_player.depth - _depth_object[2];
            break;
            case 3://abajo
                _x = obj_player.x + _x_object[3];
                _y = obj_player.y - _y_object[3];
                _depth = obj_player.depth - _depth_object[3];
            break;
        }
    
        return [_x, _y, _depth];
    }
}