Bueno, estoy intentando aplicar unas lights y shawdors, pero en el scripts me sale este error a la hora de cargar el juego, por lo visto dice que no existe dicho array, pero el array claro que existe en el objecto. Bueno os paso las lineas por si dais con el error.

ERROR;

FATAL ERROR in
action number 1
of Create Event
for object obj_control:

trying to index a variable which is not an array
at gml_Script_light_update (line 11) -   minx = px[0];
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_light_update (line 11)
called from - gml_Object_obj_control_CreateEvent_1 (line 9) -   light_update();


SCRIPT;

var xp, yp, lw, lh, imin, imax, i, pdmin, pdmax, minx, miny, maxx, maxy, a_min, a_max, a_test;

lw = sprite_width;
lh = sprite_height;

surface_set_target(sur);
draw_clear(c_black);
draw_sprite_ext(sprite_index, image_index, lw / 2, lh / 2, image_xscale, image_yscale, image_angle, c_white, 1);   

with (obj_wall_2) {
  minx = px[0];
  miny = py[0];
  maxx = px[0];
  maxy = py[0];
 
  imin = -1;
  imax = -1;
  a_test = point_direction(other.x, other.y, x, y);
  a_min = -1;
  a_max = -1;
 
  for (i = 0; i < points; i++) {
    if (px[i] < minx)
      minx = px[i];
    if (px[i] > maxx)
      maxx = px[i];
    if (py[i] < miny)
      miny = py[i];
    if (py[i] > maxy)
      maxy = py[i];
     
    pdmin = (point_direction(other.x, other.y, x + px[i], y + py[i]) - a_test + 360) mod 360;
    pdmax = (a_test - point_direction(other.x, other.y, x + px[i], y + py[i]) + 360) mod 360;
    if (pdmin > a_min && pdmin <= 180) {
      a_min = pdmin;
      imin = i;
    }
    if (pdmax > a_max && pdmax <= 180) {
      a_max = pdmax;
      imax = i;
    }
  }
 
  if (rectangle_in_rectangle(x + minx, y + miny, x + maxx, y + maxy, other.x - lw / 2, other.y - lh / 2, other.x + lw / 2, other.y + lw / 2)) {   
    i = imin;
    draw_primitive_begin(pr_trianglestrip);
    do {
      pd = point_direction(other.x, other.y, x + px[i], y + py[i]);
      draw_vertex_color(x + px[i] - other.x + other.sprite_width / 2, y + py[i] - other.y + other.sprite_height / 2, c_black, 1);
      draw_vertex_color(x + px[i] + lengthdir_x(height, pd) - other.x + other.sprite_width / 2, y + py[i] + lengthdir_y(height, pd) - other.y + other.sprite_height / 2, c_black, 1 - fade);
      i += 1;
      i = i mod points;
    } until (i == (imax + 1) mod points)
    draw_primitive_end();
  }
}

surface_reset_target();


OBJECT CONTROL;

Create Event:

execute code:

// MUST HAVE: Create a surface for drawing all the lights
sur = surface_create(room_width, room_height);

// Create a light
m = instance_create(0, 0, obj_light_2);
with (m) {
  light_change_scale(3, 3);
  // Update the light, so it's surface is drawn correctly
  light_update();
}



OBJECT WALL;

Create Event:

execute code:

// How far to draw the shadow
height = 2048;
// Fade the shadow
fade = false;


// Define the points of the shadow caster
points = 4;

px[0] = lengthdir_x(sprite_xoffset, image_angle + 180) + lengthdir_x(sprite_yoffset, image_angle + 90);
py[0] = lengthdir_y(sprite_xoffset, image_angle + 180) + lengthdir_y(sprite_yoffset, image_angle + 90);

px[1] = lengthdir_x(sprite_width - sprite_xoffset, image_angle) + lengthdir_x(sprite_yoffset, image_angle + 90);
py[1] = lengthdir_y(sprite_width - sprite_xoffset, image_angle) + lengthdir_y(sprite_yoffset, image_angle + 90);

px[2] = lengthdir_x(sprite_width - sprite_xoffset, image_angle) + lengthdir_x(sprite_height - sprite_yoffset, image_angle - 90);
py[2] = lengthdir_y(sprite_width - sprite_xoffset, image_angle) + lengthdir_y(sprite_height - sprite_yoffset, image_angle - 90);

px[3] = lengthdir_x(sprite_xoffset, image_angle + 180) + lengthdir_x(sprite_height - sprite_yoffset, image_angle - 90);
py[3] = lengthdir_y(sprite_xoffset, image_angle + 180) + lengthdir_y(sprite_height - sprite_yoffset, image_angle - 90);




Bueno si alguien sabe donde esta el error que comente, porque a mi ya se me escapa.  ???
PCNONOGames  www.pcnono.es

Prueba a poner en el objeto control un depth de -100. Abre las propiedades del objeto Control para cambiar el Depth.
¿ te ha funcionado ?

#2 Agosto 22, 2017, 07:17:32 PM Ultima modificación: Agosto 22, 2017, 07:26:25 PM por nonoroman
Bueno Zapdos, te explico lo que he hecho y lo que ha pasado.

Y creado una habitacion nueva, con solo los 3 objetos a tratar, para descartar otros problemas.

entonces, funcionaba perfecto, con un depth de -1. al cambiarlo a -100, ha salido el error, y al volver a ponerlo a -1, ahora sigue fallando.

Y a 1, vuelve a funcionar, pero claro, el surface esta por debajo de algunas cosas, asi que no entiendo porque si pongo el depht en negativo, este deja de funcionar el array.  :P

Asi que no entiendo nada, que tiene que ver el array con la profundida. Me lo explicas please???

Cita de: Zapdos43 en Agosto 22, 2017, 01:17:22 PM
Prueba a poner en el objeto control un depth de -100. Abre las propiedades del objeto Control para cambiar el Depth.
¿ te ha funcionado ?
PCNONOGames  www.pcnono.es

también puede ser que GMS haya jodido el proyecto, porque en menos de un mes a mi me han saltado tres errores que no existían y que no se podían arreglar y tuve que crear el proyecto desde cero otra vez con cada uno  >:(

Te lo explico a mi manera porque no soy un técnico.  :D

Los objetos en la capa más profunda se ejecutan primero y los objetos en la capa superior son los últimos en ejecutar su código.

En tu caso, el objeto control necesita leer el array que se crea en otros objetos. Entonces, primero debe ejecutarse el array y luego leer el array. De lo contrario, si primero lee el array que no ha sido creado entonces dará error.

Asegúrate de poner al objeto wall una profundidad de más positiva que la del objeto control. Puedes usar los números que quieras.

#5 Agosto 22, 2017, 07:40:41 PM Ultima modificación: Agosto 22, 2017, 07:42:31 PM por nonoroman
Hostias, pues no sabia esto, que habia una prioridad de ejecucion dependiendo de la profundidad.

Entonces, profundos, te refieres que estan mas abajo, y superiores mas a la vista. Noo??

es decir, mas abajo son negativos y mas arriba positivos.

Cita de: Zapdos43 en Agosto 22, 2017, 07:34:18 PM
Te lo explico a mi manera porque no soy un técnico.  :D

Los objetos en la capa más profunda se ejecutan primero y los objetos en la capa superior son los últimos en ejecutar su código.

En tu caso, el objeto control necesita leer el array que se crea en otros objetos. Entonces, primero debe ejecutarse el array y luego leer el array. De lo contrario, si primero lee el array que no ha sido creado entonces dará error.

Asegúrate de poner al objeto wall una profundidad de más positiva que la del objeto control. Puedes usar los números que quieras.
PCNONOGames  www.pcnono.es

Al revés, GM entiende que:
más negativo = capa superior
más positivo = capa inferior
XD

ok, muchas gracias. la verdad es que sabia esto de la profundiad, pero a veces me lio, pero que se ejecutaba por orden de profundidad si que no lo sabia.

Te comento, en la habitacion nueva, si que funciona, pero cuando lo pongo con el player y todo lo demas, falla tio.

Y en teoria esta todo bien!!!  :'(

Cita de: Zapdos43 en Agosto 22, 2017, 07:46:56 PM
Al revés, GM entiende que:
más negativo = capa superior
más positivo = capa inferior
XD
PCNONOGames  www.pcnono.es

Puedes probar por usar la variable depth:

En el create event de cada objeto puedes declarar el depth:
[gml]
depth = -100;
[/gml]

También puedes escribirlo en un evento Step pero creo que un evento create es suficiente.
No te aseguro que funcione pero puedes probarlo.

Y el surface a que profundidad esta?? a la que el objecto que lo crea??

Cita de: Zapdos43 en Agosto 22, 2017, 08:00:16 PM
Puedes probar por usar la variable depth:

En el create event de cada objeto puedes declarar el depth:
[gml]
depth = -100;
[/gml]

También puedes escribirlo en un evento Step pero creo que un evento create es suficiente.
No te aseguro que funcione pero puedes probarlo.
PCNONOGames  www.pcnono.es


las arrays dónde están declaradas como arrays? yo no veo ningún for para darle un valor inicial a cada índice del array... solo veo que declaraste variables normales, además de que creo que confundiste "xp" con "px"

Las arrays se declaran con fors normalmente no?
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Efectivamente parece que era lo que decia Zapdos43

Pero aun asi, me da error, porque ya tengo el motor del juego desarrollado y me va costar mucho meterlo ahora en el codigo.

Voy a utilizar otro metodo que creo que me puede valer.

;)
PCNONOGames  www.pcnono.es