HumanoObtieneCarta agrega un objeto (invisible) u otro según si la carta da opciones o no:
Código
function HumanoObtieneCarta () { (...) // Si la carta no da opciones: if (eval(Cartas[NroDeCartaDeHumano]+"Op") == 1) { // Se agrega un objeto que la ejecuta al presionar A: attachMovie("sParaCartaSimple", "Ventana", 4); } else { // Se agrega un objeto que la ejecuta de un modo u otro según qué tecla se presione: attachMovie("sParaCartaOpcional", "Ventana", 4); } }
Esto es el código en sParaCartaSimple:
Código
onClipEvent (enterFrame) { // Si se presiona A: if (Key.isDown(65)) { _level0.UsarCartaSimple(); removeMovieClip (_parent); } }
Este es en sParaCartaOpcional:
Código
onClipEvent (enterFrame) { // Si se presiona izquierda: if (Key.isDown(37)) { // Humano eligió opción 1: _level0.CartaUsada = _level0.Cartas[_level0.NroDeCartaDeHumano]+"1"; _level0.UsarCartaOpcional(); removeMovieClip (_parent); } else if (Key.isDown(39)) { // Humano eligió opción 2: _level0.CartaUsada = _level0.Cartas[_level0.NroDeCartaDeHumano]+"2"; _level0.UsarCartaOpcional(); removeMovieClip (_parent); } }
Código
function UsarCartaSimple () { // CartaUsada es para resumir: CartaUsada = Cartas[NroDeCartaDeHumano]; User = "Humano"; Ataque = eval(CartaUsada+"At"); eval(CartaUsada)(); }
Código
function UsarCartaOpcional () { // CartaUsada es para resumir, definida en el objeto sParaCartaOpcional: User = "Humano"; eval(CartaUsada)(); }
Ejemplo de carta con opciones (el único que tengo por ahora):
Código
function MarioDK1 () { Ataque = MarioDKAt; Mensaje = "¡Mario de Donkey Kong dañó al rival!"; MarioDK(); } function MarioDK2 () { HumanoHP--; if (HumanoHP > 0) { Ataque = MarioDKAt+1; Mensaje = "¡Perdiste 1HP pero Mario de Donkey Kong consiguió un martillo y dañó al rival!"; MarioDK(); } else { Mensaje = "¡Mario de Donkey Kong consiguió un martillo pero ya no tienes HP!"; HumanoPierde(); } } function MarioDK () { if (User == "Humano") { IAHP = IAHP-Ataque; if (IAHP > 0) { TerminandoTurnoHumano(); } else { HumanoGana(); } } else { // Aquí la IA debería poder elegir otra opción, pero es otro tema. HumanoHP = HumanoHP-Ataque; Mensaje = Mensaje+"\n¡Donkey Kong rival te dañó!"; if (HumanoHP > 0) { TerminandoTurnoDeIA(); } else { HumanoPierde(); } } }
1era cuestión:
¿Es buena idea agregar un objeto invisible para que se capten unas teclas u otras según si la carta da opciones o no?
Creo que sí, una alternativa sería que fuese un único objeto y que esté haciendo un if constantemente de "si no tiene opciones, ver si se presiona A, sino ver si se presiona <- o ->", lo cual para mí es peor.
Lo malo en mi método es que el objeto se autoremueve luego de haber ejecutado funciones que llaman a otras así que no sé realmente cuando se remueve xP Aunque por ahora no noté errores. Además, un objeto con igual nombre es agregado cuando se recibe una carta, así que se sustituye al que hubiera si no se removió.
Otra opción es poner el código en frames y que haya goto al anterior, pero eso parece peor, es el mismo código en 2 frames (excepto por el goto) o se ejecuta cada 2 frames.
¿Se les ocurre algo mejor?
2nda cuestión:
Los objetos sParaCartaSimple y sParaCartaOpcional usan a funciones de la zona raíz, pero sólo los usan ellos, diferente cada uno, es decir las funciones podrían ser código en ellos ¿no sería mejor así?
El problema es que esos códigos deben hacer cambios en la raíz, entonces si estuvieran directamente en los objetos habría que poner _root. delante de varias variables, por eso a pesar del lío me parece mejor así como está (al llamar a la función de root, sólo habría que poner un solo _root delante) ¿pero no hay alguna forma mejor?
¿A mi Flash (Macromedia 5) le enlentece referencias como
_root.CartaUsada = _root.Cartas[_root.NroDeCartaDeHumano];
comparado con sin _root, o al compilarse el código da igual?
Pregunté a GPT sobre esto e interpretó que puede haber 2 movieclips a la vez chequeando teclas. No, es uno u otro. Sobre otras cosas quedé algo saturado, lo pensaré otro día.
https://poe.com/s/82EsYOmKzQuiyy9noUYz




