Regresar a la página www.ComoCrearTuWeb.com
Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 25

Tema: Error "Uncaught TypeError: object is not a function"

  1. #1
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17

    Error "Uncaught TypeError: object is not a function"

    Hola!!

    Veréis, estoy desarrollando una especie de minijuego por mi cuenta para ir practicando esto del canvas y tal, es un buscaminas (no vi ninguno por la red open source así que decidí desarrollarlo por mi cuenta para ver qué tal voy) pero me encuentro con un pequeño error, tengo este código:
    Código HTML:
      var minas = new Array();
      function minas(numero){
        for(i=0; i<numero; i++){
          minas[i] = Math.floor(Math.random()*100) + 1;
          console.log('Mina en el siguiente área: ' + minas[i]);
        }
      }
    Con esa función quiero generar un array con el número de "minas" que se indique en la función. El juego tiene 100 "áreas" (que son cuadrados de 50x50px) y cada área tiene su "id" por decirlo de alguna forma (el primer cuadrado es el área 1, el siguiente el área 2... en realidad esto aún no lo he conseguido lograr, pero paso por paso XD).
    El problema es que al invocar la función minas(10) para generar 10 minas me da el siguiente error:
    Cita Iniciado por Error JavaScript al que le debo de caer mal que siempre me sale:(
    Uncaught TypeError: object is not a function
    ¿Cuál es el fallo? Gracias!!

  2. #2
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Hmmmm, que interesante tu desarrollo :) (algo nuevo), suerte :).

    En cuanto al problema, ¿te dice en que línea se genera el error? Lo que pasa es que el error dice que estas intentando usar un objeto como una función, pero no veo eso en el código que muestras, o sea, en ese trozo, no hay error. Según el error, estás haciendo algo así en algún lugar:

    Código:
    var obj = new Object();
    
    obj(parametro); // obj es un objeto y no una función.
    Editado: que manera de repetir la palabra error en el segundo párrafo XD.

  3. #3
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Gracias por los ánimos!! Probablemente ponga alguna que otra duda aquí, como dije simplemente estoy practicando :)

    Me vino una luz de inspiración revisando el código y lo he conseguido solucionar :D No llamo a ningún objeto, no entiendo por qué daba ese error.
    El problema era que el array donde guardo las posiciones de las minas se llamas minas, que es también el nombre de la función para generarlas. Cambie el nombre de la función por mina (o por cualquier otro serviría) y ya funciona :)

  4. #4
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Aaaaah, jajajaja, esas cosas suelen pasar.

    No llamo a ningún objeto, no entiendo por qué daba ese error
    El error esta bien, pues el script no sabía si usar la función o el objeto y, en este caso, usó el objeto y por ende object is not a function / el objeto no es una función.
    Última edición por skaparate; 26/07/2013 a las 17:05

  5. #5
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Aaah perfecto, ahora sí lo entiendo, gracias!!
    Ahora me toca pensar cómo hacer para saber qué cuadrado pulsó el jugador y comprobar si tiene una mina o no (esa función ya la he hecho, me queda lo de saber que área pulsó... le daré al coco un poco y si no puedo volveré por aquí... XD

  6. #6
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Calcula el clic en base a la posición de la cuadrícula añadiendo un listener cuando el usuario haga clic en el canvas (o en un área dentro del mismo - creo que esta explicación esta algo compleja, pero es más una pista que otra cosa :P).

  7. #7
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Sí, si la base creo que ya la tengo más o menos montada... tengo esto:
    Código:
    function juego(ev){
      ...código...
      var x = ev.clientX - canvas.offsetLeft;
      var y = ev.clientY - canvas.offsetTop;
    
      for(a=0; a<area.length; a++){
        ...aquí tengo que comprobar qué área pulsó y convertirla en la variable "areapulsada"...
      }
    
      check(areapulsada); // Esta función la tengo definida después y comprueba si "areapulsada" coincide con algun del array de minas, entonces da la partida por perdida
    }
    
    ...código...
    
    canvas.addEventListener('click', juego, false);
    Pero me falta lo que puse entre el for... cree otro archivo que contiene un array con las áreas, es algo así:
    Código:
    var area = [
      {
        id: '1',
        x: '50',
        y: '50'
      },
      {
        id: '2',
        x: '100',
        y: '50'
      },
    ...así hasta llegar al 100...
    id: ID del área
    x: ancho del canvas en el que termina el área
    y: alto del canvas en el que termina el área

    No sé si es el método más apropiado pero fue el que se me ocurrió... ahora me quedaría hacer una condicional para comprobar el ancho y el alto para saber a qué área pertenece supongo...?

    EDIT:
    Según mi extremadamente poca lógica, no debería funcionar así?
    Código:
    	for(a=0; a<area.length; a++){
    	  if(y<=area[a]['y'] && x<=area[a]['x']){
    	    areapulsada = area[a]['id']
    	  } else {
    	    areapulsada = undefined;
    	  }
    	}
    Recorremos todo el array, y cada vez vamos comparando que si la posición de "y" es igual o menor que el máximo "y" de esa área, y además la posición de "x" es igual o menor que el máximo "x" de esa area, areapulsada tenga como valor el ID del área que pulsó, no? El problema es que siempre le asigna el valor de 100 a areapulsada
    Última edición por Doodleo; 26/07/2013 a las 21:18

  8. #8
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Hmmm debería funcionar, no veo lo malo :P.

    Hay una forma de automatizar el proceso (no tener que crear las áreas a mano).

    Crea una grilla con cuadrados de igual tamaño y después utiliza la posición top|left del contenedor para averiguar dónde se hizo clic (necesitas obtener una columna y una fila, en lugar de un área). Imagina algo como esto:

    Código:
      1 2
    1 - -
    2 - -
    donde cada guión es un cuadrado. Ahora, el clic se podría calcular así:

    Código:
    var tamanoCuadrado = 10; // Supongamos que cada cuadrado medirá 10 pixeles.
    var clicX = evento.left - left,
         clicY = evento.top - top,
         row   = Math.floor(clicX / tamanoCuadrado) + 1,
         col    = Math.floor(clicY / tamanoCuadrado) + 1;
    Para graficar un poco... imagina que la grilla es de 20 x 20 pixeles; cada cuadrado será de 10 x 10 (habrían 4 cuadros); la posición top,left de la grilla será 0,0. Imagina que se hace clic en la posición 5,8 (top,left). Nosotros sabemos que eso significa que se clickeo en la columna 1, fila 1 (coordenada 1,1), pero en el computador no es tan simple. Esto, traducido con el código anterior, quedaría así:

    Código:
    var clicX = 5 - 0,
         clicY = 8 - 0,
         row  = Math.floor(5 / 10) + 1; // Math.floor(5 dividido en 10) = 0
         col   = Math.floor(8 / 10) + 1; // Math.floor(8 divido en 10) = 0 - sin floor da un número decimal, que no me sirve.
    
    console.log("Coordenada clickeada: " + [row,col]); // Coordenada clickeada: 1,1.
    El + 1 en row y col es para que te coordenadas comenzando en 1 y no desde 0. Si no te importa eso, entonces no le agregues 1. También te sirve para generar las minas al azar y asignarles una posición a cada una :).

    Teóricamente, debería funcionar con cualquier grilla, siempre y cuando sea cuadrada XD.

    En el fondo, intenta imaginar que es el juego de "hundir los barcos" (batalla naval).
    Última edición por skaparate; 27/07/2013 a las 00:59

  9. #9
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    ¡Muchas gracias! Desde el principio busqué la forma de automatizar el proceso pero no lo conseguía... de todos modos, he conseguido arreglarlo!! (Me daba pena tener que borrar todo el esfuerzo de haber creado el archivo con las áreas XD). Al final dejé la parte del código así:
    Código:
      for(a=0; a<area.length; a++){
        if(y <= area[a]['y'] && x <= area[a]['x']){
          areapulsada = area[a]['id'];
          check(areapulsada);
          console.log('Área pulsada: ' + areapulsada); // Info consola
          return false;
        }
      }
    Tenía que hacer la comprobación dentro del for Y si no añadía return false; a parte de la área que pulsó mostraba en la consola tooodas las siguientes áreas del archivo XD
    Gracias por todo!! Me queda añadirle unos cuántos estilos para que no se vea tan simplón y añadir los números esos que aparecen cuando clickeas y no es una bomba... (mira qué bien, NUNCA supe para que eran hasta que miré la wikipedia para informarme XD). Tendrá también un sistema de puntuaciones (el primero será el que haya acabado el juego en menos tiempo, etc...)

    EDIT: Al parecer hay algún error en mi código La primera fila funciona bien (áreas 1,2,3,4,5,6,7,8,9,10), pero la segunda/tercera/cuarta definen la misma área (1,2,3,4,5,6,7,8,9,10) en vez de seguir sumando... Además la línea 6 da igual donde clickees, siempre define el área 20 (cuando debería ser 51,52,53,54,55,56,57,58,59,60)... el resto de líneas funcionan bien (va de 1 en 1) pero claro al estar el resto de línea mal la última cuadrícula cuadra en 70 y no en 100

    EDIT2: Le he cambiado los valores de X e Y para que los mire correctamente y dejé el código así: (cambié client por page)
    Código:
      var x = ev.pageX - canvas.offsetLeft;
      var y = ev.pageY - canvas.offsetTop;
    
      for(a=0; a<area.length; a++){
        if(y <= area[a]['y'] && x <= area[a]['x']){
          areapulsada = area[a]['id'];
          check(areapulsada);
          console.log('Área pulsada: ' + areapulsada); // Info consola
          return false;
        }
      }
    Y todas las casillas funcionan bien menos las de la línea 3 que siempre marca 20 (y es la correspondiente a que de 21,22,23,24,25,26,27,28,29,30)... no entiendo cuál puede ser el fallo si el resto funciona bien
    Solucionado lo anterior, tenía definido mal el 'y' del área 20 y ya funciona perfectamente
    Última edición por Doodleo; 27/07/2013 a las 13:16

  10. #10
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Que bueno, me alegro que lo hayas solucionado (y por tu cuenta) :).

    (Me daba pena tener que borrar todo el esfuerzo de haber creado el archivo con las áreas XD)
    Claro! Es de suponer :). El script que te mostré lo tuve que hacer para un juego en AS3 y la base es similar :P, así que quise mostrarte una forma de automatizarlo (igualmente faltaba la parte de añadir las minas).

    Bueno, suerte con tu juego (esperamos poder jugar pronto, jejejeje).

  11. #11
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Muchas gracias!!
    También desarrollas juegos en AS3? Qué genio, sabes de todo jajaja

    Gracias de nuevo y yo también lo espero!! A ver si mejoro algo en diseño que nunca se me dió bien y creo algo medianamente aceptable a la vista...jajajaja

  12. #12
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    También desarrollas juegos en AS3? Qué genio, sabes de todo jajaja
    Jejeje, sí. Fueron unos juegos educativos (nada complicado en cuanto a gráficos). También he hecho algo en 3D AS3 -> http://nicomv.com/WORDPRESS/demo/.

    No es que sepa de todo, si no que, teniendo una base en programación, cualquier lenguaje es fácil (todos tienen una base similar). Después de tener la base, basta con leer la documentación y puedes programar en cualquiera :P.

    Hay muy pocos programadores que hacen un diseño agradable a la vista, así que no te aflijas por eso (yo aprendí que es mejor trabajar con alguien XD), así que sigue adelante :).

  13. #13
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    La verdad es que hace poco me planteé o aprender AS3 o Canvas, y me acabé decidiendo por este último jajaja. Qué bueno lo del 3D, al principio no pillaba de qué iba la cosa pero luego ya me enteré XD Está genial!!

    Gracias por los ánimos!! Pronto me tenéis dando la vara por aquí otra vez XD

  14. #14
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,044
    Poder de Reputación
    21
    Aaaaah... en realidad a mi no me gusta AS3, pero el cliente quería que el código fuente estuviera oculto de alguna forma, así que me pidió hacerlo en Flash... claro que después le hice ver que no sacaba nada con intentar proteger el código, puesto que todo se debe descargar al computador del cliente e igualmente queda expuesto XD.

    En fin... yo hubiera preferido aprender a usar Canvas XD.

  15. #15
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Sí, con eso no protege mucho la verdad jajajaja. Nunca es tarde para aprender!! No?
    Mi objetivo a largo plazo era aprender a manejar Canvas con node.js + socket.io y crear una especie de mundo virtual online, pero la cosa es más complicada de lo que parece... no doy hecho ni un buscaminas XD
    A ver cómo hago para hacer lo de los numeritos esos que aparecen al clickar sobre una casilla...si no lo dejaré como un buscaminas "al azar" (Nueva edición del buscaminas XDDD)

Temas Similares

  1. TypeError: this.object.sendEvent is not a function
    Por Foxwan en el foro Foro General
    Respuestas: 5
    Último Mensaje: 06/05/2012, 21:43
  2. Error: "curso paso a paso">"Lección tercer
    Por Kiwi en el foro Curso Paso a Paso con Html-Kit.
    Respuestas: 0
    Último Mensaje: 22/08/2010, 21:11
  3. ERROR "Object expected" en el HTML
    Por zurel Rivera en el foro Curso Paso a Paso con Html-Kit.
    Respuestas: 7
    Último Mensaje: 26/01/2009, 01:14

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •