Hola gente, nuevamente pido ayuda con mi proyecto. Bueno como dice el titulo necesito terminar este objeto que creeria que ya esta casi terminado.
Mi problema es que e creado el objeto ladrillo que contiene monedas (El maximo que conte son 10 las que puedes sacar en x tiempo, segun el juego original) no logro hacer el sistema de conteo de monedas..(o sea entiendo como hacer que al golpear el ladrillo salgan monedas, pero no se como hacer que paren de salir).
Y el otro drama que no puedo terminar, es que, cuando Mario toca el ladrillo tiene un tiempo que le puse para poder sacar monedas y despues de ese tiempo el ladrillo se transforma en otro bloque de acero al cual no se le pueden sacar mas monedas.. es decir lo que me sucede es que cada vez que Mario toca el ladrillo el conteo del reloj se vuelve activar con el tiempo que le configure, no se que accion hace que esa alarma que se activa por primera vez al tocar el ladrillo, no se vuelva activar por mas que siga golpeandolo o sea que se reinicie la accion.
Bueno abajo les dejo un grafico de como lo voy haciendo con Drag & Drop , ya que codificacion no entiendo, solo me defiendo con D&D. Saludos!.
(http://i1073.photobucket.com/albums/w398/betoxr1/01_zps51dc491d.png~original)
Eso se hace con variables. Cada objeto puede "acordarse" de un número gracias a las variables.
En lo que pedís vos podés hacer que el objeto se acuerde de la cantidad de monedas que dió, y si se da cuenta que ya dió 10 monedas se convierte en un bloque de acero
Entonces en el Create ponés un "Set variable", ahí tenes que poner el nombre de la variable (por ejemplo monedas_dadas) y ponés el valor inicial de monedas, en tu caso 0
Después cuando uno da una moneda tenemos que sumar 1 al numero de monedas_dadas. Eso se hace poniendo un "Set Variable" después de crear la moneda, escribís monedas_dads de nuevo y en el valor ponés monedas_dadas + 1
Por último hay que fijarse si ya dió 10 monedas, entonces después de actualizar el número de monedas_dadas hay que pone una condición. Las condiciones se hacen con "Test Variable". En ese "Test Variable" vamos a fijarnos si el valor de monedas_dadas es mayor a 10, entonces en variable ponemos monedas_dadas, en value ponemos 9 y en operation "larger than"
Inmediatamente después de el "Test variable" hay que poner la acción a realizar si se cumple la condición que acabamos de crear, en nuestro caso si se cumple la condición hay que hacer "Change instance into obj_acero_azul"
Resumiendo:
Ponemos un "Set Variable" en Create
Luego de lo que hay en el evento colisión con mario agregamos un "Set variable", un "Test variable" y un "Change instance" en ese orden
Salio perfecto, mejor imposible lo de las monedas, muchas gracias ... lo unico que sigo probando y no sale , es que cuando golpeo el ladrillo se activa un tiempo estimado en el cual, si no saque las 10 monedas, el ladrillo igual se convierte en otro bloque que no se va a mover mas.. el tema es que cada vez que golpeo el bloque se reactivan los segundos.. No se que otra accion le falta a la alarma para que se active una sola vez y por mas que siga golpeando no se vuelva reiniciar nuevamente la alarma.. ¿se entiende?
Dejo la imagen de como quedo todo.
(http://i1073.photobucket.com/albums/w398/betoxr1/02_zps103e5d27.png~original)
Lo que podés hacer es activar la alarma sólo cuando el ladrillo ha sido golpeado por primera vez
Lo de dar monedas está todo bien, pero ahora que veo el tema de las alarmas está un poco mal
Porque lo que estás haciendo es que en el Create estás poniendo la alarma a 0. Entonces el evento Alarm se activa inmediatamente, porque hiciste que se active en 0 steps, que es inmediatamente
Bueno, entonces apenas se crea el objeto se activa la alarma por lo que expliqué antes. La alarma lo que hace es activarse a si misma dentro de 90 steps y convertir el bloque en un obj_acero_azul. Como la alarma se ejecuta instanteaneamente es lo mismo que si hubieramos puesto lo que está en el evento Alarm 0 en el Create
Un problema es que si no me equivoco estás convirtiendo el bloque en un obj_acero_azul instantáneamente, incluso antes de ser golpeado por Mario, ya que el evento alarm se ejecuta apenas se crea el objeto
Y lo que vos decís de que se reactivan los segundos ocurre porque estás poniendo la alarma a 90 steps cada vez de que es golpeado por Mario
Entonces creo que la mejor forma de hacerlo es que borres el "Set Alarm" del evento Create y del evento Alarm, y sólo poner "Set Alarm" cuando el ladrillo es golpeado por primera vez
Para hacer eso ponemos una condición como hicimos antes, en vez de fijarnos si monedas_ganadas es mayor a 20 vamos a fijarnos si monedas_ganadas es igual a 0, ya que eso indica que es la primera vez que golpeamos el ladrillo. Si se cumple la condición ponemos un "Set Alarm" al tiempo que queramos
Te adjunto la foto de como quedaría
Si, funciono perfecto, sos un capo. Gracias por la ayuda ahora, le entiendo mas como usar las variables para hacer este tipo de conteos. XD XD XD
Que bueno que te haya servido, acordate de subir el juego después :D
Cita de: Mgbu en Diciembre 19, 2013, 12:58:22 AM
Que bueno que te haya servido, acordate de subir el juego después :D
Si, quizas en 1 o 2 días lo subo nuevamente..
http://www.comunidadgm.org/index.php?topic=19314.0
Quiero terminar de pulir algunos detalles para que se vea un poquito mas profecional .
Gracias por tu ayuda, sobre todo que a mucha gente le debe interesar este tema , el cual sirve para cualquier proyecto que use este tipo de mecanica. Si tuviera para poner manito arriba estaria bieno . :P :P :P
Te mande un MP con detalles, porque me surgio un pequeño problemilla.Cuando tengas tiempo miralo. Saludos.
No te preocupes, no me molesta responder
Contesto por acá y pego tu pregunta para que quede disponible a los otros que tengan el mismo problema
Cita de: Betox en Diciembre 19, 2013, 09:52:46 PM
Cuando Mario salta encima del ladrillo el reloj se activa y el ladrillo se vuelve otro bloque; entonces probe si pasaba lo mismo si ponia un ladrillo y colisionar con él de costado , por suerte en esto no hay drama, la alarma no se activa . otra cosa que note, es que, si pongo supongamos tres ladrillos seguidos y Mario salta encima de uno (este ladrillo se activa) y sigo caminando los demas ladrillos no se activan. En conclusion el problema es cuando mario cae encima del ladrillo y este se activa. Trate de desactivar la alarma del ladrillo para que cuando Mario al hacer contacto pór encima, pero no da pelota,se activa igual.
Te paso el grafico para que veas que es lo que hice.. y disculpa q te siga molestando por este tema. Gracias y saludos.
(http://i1073.photobucket.com/albums/w398/betoxr1/00_zps70e570f2.png~original)
Es normal que pase que las colisiones sólo ocurran desde algunos lados. Creo que colisiona a veces por esto: las direcciones en las que colisiona con el ladrillo depende de la forma que muevas el presonaje. Por ejemplo si vos el el código de mover a Mario hacia el costado antes de mover te fijás si va a colisionar con el ladrillo y te movés sólo si está el espacio libre Mario nunca va a colisionar con el ladrillo porque si Mario fuera a colisionar no se hubiera movido. No se si se entiende
Lo mismo pasa con eso de que a veces colisiona con el ladrillo de arriba, creo que pasa porque normalmente en los juegos de plataformas al caer sobre un bloque (hay colision) ponemos la gravedad a 0, haciendo que Mario "levite" bien bajito sobre los ladrillos, entonces no hay colisión sobre los otros ladrillos
Igual
creo que es por eso
Yo lo arreglaría haciendo que Mario saque monedas sólo si está colisionando desde abajo, total hacia el costado no hay problema. Para saberlo se pueden comparar la altitud en la que está Mario y la altitud en la que está el ladrillo. Acordate que la altitud se mide en la coordenada Y
No es difícil de arreglar, simplemente hay que fijarse si la coordenada Y de Mario es
mayor que la del ladrillo (acordate que Y aumenta de arriba a abajo), eso se hace con un "Test Expression". Con "Test Expression" podés hacer una condición de cualquier tipo, podés preguntar cualquier cosa.
Nosotros vamos a preguntar si Mario está abajo mío (con mío me refiero al bloque). A eso hay que traducirlo a preguntar si la Y de mario es mayor que mi Y, que se escribe "obj_mario_n.y > y"
"obj_mario_n.y" significa "La Y de mario", el símbolo ">" significa "mayor" y "y" significa nuestra Y
Escribir así en código te puede parecer difícil, eso es porque "Test Expression" necesita que le escriban en GML
Con eso ya hiciste la condición, ahora tenés que ponerle "Start of block" y "End of block" para encerrar a todo lo que hay en el evento colisión y hacer que ocurra sólo cuando Mario está abajo
El problema que puede ocurrir es que la coordenada Y está medida en el punto de origen del sprite. Por ejemplo si el origen del sprite de Mario es en los pies, cuando vos te fijes cual es la posición Y de Mario lo que vas a saber es la posición de los pies, y si el punto de origen del bloque es bien arriba y Mario "entierra" un poquito el pie desde arriba el juego creerá que mario está debajo del bloque, porque se está fijando sólo en los pies. Podes ver un ejemplo en la imagen adjunta, en donde la compu va a creeer que mario está debajo del bloque cuando en realidad está encima
No se si vas a tener ese problema, ya que depende del código de movimiento que uses, puede ser que ocurra (las cruces verdes son los puntos de origen). Si ocurre se puede arregar fijandosé que mario esté
muy por debajo agregando una cosita al código del "Test Expression"
Si, seguro no hay drama que muestres el dibujo, de hecho creo que es un tema que les puede servir a muchos que se inicien o tengas estas dudas.. :D :D :D :D
UFFFFFFF!.. que quilombete . Voy a leerlo un par de veces . Te dejo las imagenes de como estan las cajas de colisiones y el tamaño de los sprites. Pense que poniendoles los mismo margenes de colision y mismo puntos de origenes no habria problema. Es todo un tema esto de las colisiones. :(
(http://i1073.photobucket.com/albums/w398/betoxr1/12_zps53219af6.png~original)
Como están los orígenes está perfecto, yo te dije eso por las dudas. Yo te di un caso extremo en donde un punto de origen está bien arriba y el otro bien abajo. Pero si están al medio no hay problema
Por querer explicarlo bien a lo mejor te compliqué, lo único que tenés que hacer es encerrar lo que está en el evento colisión con Mario en una condición. La condición se hace con "Test Expression" y lo que tenés que escribirle es "obj_mario_n.y > y". Todo lo otro es explicación sobre qué significa eso
Cualquier duda pregunta, si logras entender lo que pusimos en el "Test Expression" ya sabés el 30% de lo que es escribir en código!
Saludos
Ahhhhhhhhhhh!! jajaja.... pero vos re capo.... Esto va "Como piña en el ojo".. funciona de maravillas. Ya está!!. quedo todo "pipi cucu" .Así quedo aclarado todo.. espero que esto ayude a los demas . Saludos y gracias amigo!.