Hola gente, hace mil años que no entro y antes lo hacia con otra cuenta pero olvide la contraseña :-[
La pregunta es simple:
Quiero hacer una torreta que cuando un enemigo este a X distancia dispare bolas a una velocidad X.
Seria algo casi identico al juego plant vs zombies, solo quiero que dispare a los enemigos que se acerquen de frente y no a los que se acercan un poco mas abajo. Uso el comando player distance pero dispara a todo lo que se acerca en un area circular, quiero que solo dispare al frente. Ademas dispara muy seguido.
Agradeceria respuesta sin demasiado codigo pues no tengo ni idea de usarlo, hago juegos muy completos sin una sola linea de codigo.
No se me ocurre nada sin codigo, pero si con poquito
Me parece que lo mas facil es chequear dos condiciones basicas, el enemigo debe estar a la derecha y debe estar a la misma altura si no me equivoco
Entonces son dos condiciones, para ver si el enemigo esta a la derecha la variable x del enemigo tiene que ser mayor a la del objeto que dispara, y para chequear si estan a la misma altura uno puede ver si la variable y de los dos tienen el mismo valor. El problema con ver si la variable y es la misma para los dos es que la altura tiene que ser perfectamente igual, a lo mejor vos querés un margen de error de 5 pixeles para arriba y 5 para abajo, eso se hace sacando la diferencia de las dos variables y viendo si es menor a 5, encierro la diferencia en abs() porque quiero que el valor de esta sea simpre positiva (o si no cuando la y del enemig es mayor daria un numero negativo). Entonces queda así:
if (xEnemigo > x and abs(y - yEnemigo) < 5) {
// Accion
}
Obviamente cambia la variable xEnemigo y yEnemigo por las que uses
Ok. El problema es que como te he dicho de codigo se 0. Por lo tanto las explicaciones me suenan a chino :'(
Igualemte imagino que:
Todo eso ira en Steep/VAR.
Lo malo es que al final me has puesto //Accion, y no se que poner para decirle que dispare a X velocidad.
Ah, bien. En código lo que está escrito luego de // es un comentario, o sea que no se ejecuta, era para indicar que ahí uno debe poner el codigo de disparar.
La otra es que arrastres una acción que creo que se llamaba "Test expression", y adentro escribas
xEnemigo > x and abs(y - yEnemigo) < 5
Luego uno deberia arrastrar las acciones del disparo.
Como ves el codigo es lo mismo que D&D, por eso dar el salto no es muy dificil, por eso vale la pena.
Solamente te enseñe a chequear si el enemigo está al frente, para disparar es otra cosa, yo crearia un obj_bala y en el create del obj_bala uno le escribe su hspeed. Pero hay mas formas de hacerlo
marcotemplario lee el reglamento de la sección y repara el post por favor
Y Mgbu, -50 mensajes por responder a un tema que no cumple las reglas en reiteradas ocasiones
Por mas que leo las normas lo unico que veo es que me falta lo del icono de GM... solo eso?
Cita de: marcotemplario en Mayo 26, 2013, 01:56:29 PM
Por mas que leo las normas lo unico que veo es que me falta lo del icono de GM... solo eso?
Solo eso es
MUY importante, ya que si el usuario que te desea colaborar no sabe que versión de GM estas usando, difícilmente podría saber como ayudarte, por ejemplo: Mgbu te da un código de :GMS: ya que digamos que es la que él usa, pero resulta que tu usas digamos :GM5: entonces lo que dijo Mgbu puede que no te sirva.
Que raro yo contestando sin mirar :-[
Pudiste hacer la torreta?
Que va... pongo el codigo pero me da error. Igualmente como ya dije no se ni papa de codigo y me gustaria entender lo que hago.
He conseguido algo parecido sin codigo, pero tengo mas problemas ;)
Quiero que vengan enemigos del mismo modo que plants vs zombies. Al principio pocos de poco nivel por sitios aleatorios y mas adelante salgan mas cantidad y distintos. Pero como ya he dicho no quiero usar codigo y veo que en esta comunidad se hace todo 99% con codigo... en fin.
Lo siento por lo de tu perdida de mensajes :(
La perdida de mensajes no afecta mucho, no te sientas mal :P
Te di una forma de hacerlo sin codigo
Cita de: Mgbu en Mayo 25, 2013, 06:47:31 PM
La otra es que arrastres una acción que creo que se llamaba "Test expression", y adentro escribas
xEnemigo > x and abs(y - yEnemigo) < 5
Luego uno deberia arrastrar las acciones del disparo.
Pero como ves es una forma de hacerlo con codigo pero disimulado. Por ahora importa que entiendas lo que hace lo que dije aca arriba.
La acción "Test expression" es como lotras acciones de la pestaña control (http://www.comunidadgm.org/manual_GM/Acciones_de_control.htm), como "If a position is collision free", "Test variable", etc. Si no las usaste nunca lo que hacen es chequear si su condicion es verdadera o falsa, "If a position is collision free" se fijará si tal posición esta libre por ejemplo, si es así la proxima acción se ejecutará, si en cambio esa posición está ocupada la proxima acción no se ejecutará.
En nuestro caso la acción "Test Expression" se fijará si el enemigo está a la derecha, si es así se ejecutará la siguiente accion (en tu caso disparar) de lo contrario no hará nada
Si no funciona acordate de cambiar las variables "xEnemigo" y "yEnemigo" del código que te pasé. Probablemente vos deberías poner ahi "obj_enemigo.x" o "obj_enemigo.y". Por si no sabes de que se trata "obj_enemigo.x" te cuento que eso sería traducible a "la variable x del objeto obj_enemigo"
Si te sigue sin salir te hago un ejemplo
Nada que no hay manera... claramente pongo algo mal o directamente no pongo lo que toca... si pusieras un ejemplo seria la repera 8) Que dios te lo pague con una mujer rubia y muchos hijos negros XD
Aca esta, ahora me tengo que ir, si necesitas explicaciones avisame, vas a ver que hice una variable "recarga" para que no dispare tan seguido
Perfecto! Justo lo que queria! Lo miro y no entiendo nada de lo que has puesto en el objeto pero me vale.
Ahora solo me queda el que aparezcan enemigos aleatorios desde el lado derecho de la pantalla y que a medida que pasa el tiempo suban en nivel y de numero. A lo plants vs zombies.
Muchas gracias por el ejemplo! 8)
Acabo de volver, te traduzco lo que puse en el objeto
Lo que ves en el step es lo que se ejecuta 30 veces por segundo. Ahí dentro dice:
- Si la coordenada x del obj_jugador es mayor a la coordenada x mía (o sea esta a la derecha) y si la coordenada y menos la coordenada y del jugador en menor a 16 (o sea esta mas o menos a la misma altura), hacer lo que sigue:
- Triangulo de comienzo del bloque, eso significa que si se cumple la condicion anterior se ejecute todo lo que esta dentro del bloque
- Si la variable "recarga" es mayor a 0 (o sea el arma esta recargada) hacer lo siguiente:
- Otro triangulo de comienzo de bloque
- Crear un "obj_bala" en mi posicion moviendose a velocidad 10 en direccion 0 (o sea crear una bala en mi posicion moviendose hacia la derecha)
- Setear alarma 0 a 30 steps (o sea hacer lo que esta en alarm0 dentro de un segundo)
- Setear variable "recarga" a 0 (porque el arma se ha descargado)
- Triangulo de fin de bloque
- Triangulo de fin de bloque
Luego en el evento alarm0 lo unico que hacemos es cargar el arma, para que la torreta pueda volver a disparar
Espero que se entienda, o si no que otro me de una mano, no soy muy bueno para explicar :-[
Gracias ya me queda mas claro :D
Como me gustaria aprender codigo... pero no se como hacerlo facilmente.