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
Imágenes (https://imgur.com/a/ETQDZIy)
Adjunto el código de mi script:
// 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:
/// @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:
// 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];
}
}