Quisiera que cuando la carta tiene opciones (causar un efecto u otro), eso se diga al jugador y haya una pausa hasta que presione arriba, o abajo, u otra tecla según cuántas opciones sean.
Parece claro que se puede hacer creando, para cada carta, una variable que marque si la carta tiene opciones o no, y poniendo un if para que dependiendo de eso ponga la pausa básica o la pausa con opciones.
Mi duda es si hay una mejor forma de hacerlo porque no me gusta crear tantas variables ni usar un if cada vez que se obtiene la carta.
Se me ocurre:
- Cuando se obtiene, se busca el valor de una variable llamada Opciones, por ejemplo si se obtiene la carta DKMario se busca una variable llamada DKMarioOpciones.
- Si no tiene valor es que no existe, no tiene opciones, hace la pausa normal. Sino, hace la pausa con opciones.
Eso usa un if pero en vez de crear variables para todas las cartas, crea sólo para las que tienen opciones.
El tema de las pausas también se complica un poco, yo tenía:
// Frame 1: La IA recibe una carta, el humano también.
// F2: Un objeto repite TurnoDeHumano hasta que se presione A.
// F3: Pequeña pausa.
// F4: Turno de la IA.
...ahora debería ser:
// Frame 1: La IA recibe una carta, el humano también.
// F2: Si la carta no tiene opciones, se inserta un objeto que genera la pausa normal. Sino otro que genera la pausa con opciones.
...el resto igual.
Supongo que eso es mejor que crear un frame para la pausa normal y otro para la otra y que vaya para un frame u otro según el caso.
¿Se les ocurre algo mejor?
Uno pregunta porque tiene la esperanza de hallar una respuesta, pero ahora me pregunto para qué preguntar si probablemente no entienda la respuesta:
Citar
Tu razonamiento es **muy sólido** y demuestra una buena comprensión de cómo organizar lógica condicional en Flash 5, que tiene sus limitaciones. Vamos a analizar tu enfoque y ver cómo mejorarlo o refinarlo con el menor número de variables y frames posibles.
---
## 🎯 Objetivo
- Tienes cartas que pueden o no tener múltiples opciones.
- Quieres pausar el juego hasta que el jugador elija una opción (una tecla).
- No quieres crear una variable por cada carta.
- No quieres duplicar frames innecesariamente.
---
## ✅ Lo Bueno de Tu Enfoque
Tu idea de usar una **nomenclatura dinámica** como `DKMarioOpciones` es muy buena para evitar crear estructuras repetitivas o usar `if` para cada carta. En Flash 5 (ActionScript 1.0), puedes usar esta técnica:
```actionscript
var opcionesVar = this[NombreDeCarta + "Opciones"];
```
Si `opcionesVar` es `undefined`, entonces no hay opciones.
Esto te permite tener una lista como:
```actionscript
DKMarioOpciones = ["Arriba", "Abajo"];
CartaFuegoOpciones = ["Izquierda", "Derecha", "Abajo"];
```
Y no necesitas definir ninguna variable para cartas que no tienen opciones. Perfecto.
---
## 💡 Mejora Propuesta: Usar una Sola Función y el Mismo Frame
Si quieres evitar duplicar frames o insertar objetos distintos según el tipo de carta, puedes hacer esto:
### 1. Un solo objeto/clip de pausa
En el frame 2, insertas **siempre el mismo clip** llamado `PausaCarta`.
Ese clip tiene el siguiente código en su `onClipEvent(enterFrame)`:
```actionscript
onClipEvent(enterFrame) {
var opciones = _root[_root.NombreDeCarta + "Opciones"];
if (opciones == undefined) {
// No hay opciones, esperar tecla A
if (Key.isDown(Key.A)) {
_root.gotoAndPlay(3);
}
} else {
// Hay opciones, mostrar opciones y esperar tecla válida
if (_root.mostrandoOpciones != true) {
_root.mostrandoOpciones = true;
// Mostrar texto de opciones o lo que quieras
for (var i = 0; i < opciones.length; i++) {
trace("Opción " + (i+1) + ": " + opciones);
}
}
// Aquí podrías detectar teclas según cantidad de opciones
if (Key.isDown(Key.UP)) {
_root.opcionElegida = 0;
_root.gotoAndPlay(3);
} else if (Key.isDown(Key.DOWN)) {
_root.opcionElegida = 1;
_root.gotoAndPlay(3);
} // etc.
}
}
```
Este objeto es universal: maneja ambas situaciones.
Solo necesitas asegurarte de que:
- `_root.NombreDeCarta` esté definido antes de entrar al frame 2.
- Los nombres de las variables opcionales sigan la convención de `NombreDeCarta + "Opciones"`.
---
### 2. Limpieza al salir del frame
En el Frame 3 podrías resetear cosas:
```actionscript
mostrandoOpciones = false;
opcionElegida = -1;
```
---
## 🧠 Alternativa Más Limpia (Con Objetos)
Si quieres hacer algo más estructurado, puedes usar un objeto (diccionario) para definir las opciones:
```actionscript
CartasConOpciones = {
"DKMario": ["Arriba", "Abajo"],
"CartaFuego": ["Izquierda", "Derecha", "Abajo"]
};
```
Y luego:
```actionscript
var opciones = CartasConOpciones[NombreDeCarta];
```
Esto sigue siendo dinámico pero más organizado.
---
## ✅ Conclusión
Tu idea:
- Es válida
- Es eficiente
- Se puede mejorar levemente con objetos o clips genéricos
Lo que te propongo:
- Usa **un solo frame** y **un solo clip de pausa inteligente**
- Usa un objeto o variables dinámicas para definir solo las cartas que tienen opciones
- Evita `if` por cada carta o duplicación de clips
Esto te da un sistema **escalable**, **fácil de mantener** y muy en línea con las capacidades de Flash 5.
¿Te gustaría que te escriba el código completo del clip `PausaCarta` con la lógica completa de selección de opciones?
---
## 🎯 Objetivo
- Tienes cartas que pueden o no tener múltiples opciones.
- Quieres pausar el juego hasta que el jugador elija una opción (una tecla).
- No quieres crear una variable por cada carta.
- No quieres duplicar frames innecesariamente.
---
## ✅ Lo Bueno de Tu Enfoque
Tu idea de usar una **nomenclatura dinámica** como `DKMarioOpciones` es muy buena para evitar crear estructuras repetitivas o usar `if` para cada carta. En Flash 5 (ActionScript 1.0), puedes usar esta técnica:
```actionscript
var opcionesVar = this[NombreDeCarta + "Opciones"];
```
Si `opcionesVar` es `undefined`, entonces no hay opciones.
Esto te permite tener una lista como:
```actionscript
DKMarioOpciones = ["Arriba", "Abajo"];
CartaFuegoOpciones = ["Izquierda", "Derecha", "Abajo"];
```
Y no necesitas definir ninguna variable para cartas que no tienen opciones. Perfecto.
---
## 💡 Mejora Propuesta: Usar una Sola Función y el Mismo Frame
Si quieres evitar duplicar frames o insertar objetos distintos según el tipo de carta, puedes hacer esto:
### 1. Un solo objeto/clip de pausa
En el frame 2, insertas **siempre el mismo clip** llamado `PausaCarta`.
Ese clip tiene el siguiente código en su `onClipEvent(enterFrame)`:
```actionscript
onClipEvent(enterFrame) {
var opciones = _root[_root.NombreDeCarta + "Opciones"];
if (opciones == undefined) {
// No hay opciones, esperar tecla A
if (Key.isDown(Key.A)) {
_root.gotoAndPlay(3);
}
} else {
// Hay opciones, mostrar opciones y esperar tecla válida
if (_root.mostrandoOpciones != true) {
_root.mostrandoOpciones = true;
// Mostrar texto de opciones o lo que quieras
for (var i = 0; i < opciones.length; i++) {
trace("Opción " + (i+1) + ": " + opciones);
}
}
// Aquí podrías detectar teclas según cantidad de opciones
if (Key.isDown(Key.UP)) {
_root.opcionElegida = 0;
_root.gotoAndPlay(3);
} else if (Key.isDown(Key.DOWN)) {
_root.opcionElegida = 1;
_root.gotoAndPlay(3);
} // etc.
}
}
```
Este objeto es universal: maneja ambas situaciones.
Solo necesitas asegurarte de que:
- `_root.NombreDeCarta` esté definido antes de entrar al frame 2.
- Los nombres de las variables opcionales sigan la convención de `NombreDeCarta + "Opciones"`.
---
### 2. Limpieza al salir del frame
En el Frame 3 podrías resetear cosas:
```actionscript
mostrandoOpciones = false;
opcionElegida = -1;
```
---
## 🧠 Alternativa Más Limpia (Con Objetos)
Si quieres hacer algo más estructurado, puedes usar un objeto (diccionario) para definir las opciones:
```actionscript
CartasConOpciones = {
"DKMario": ["Arriba", "Abajo"],
"CartaFuego": ["Izquierda", "Derecha", "Abajo"]
};
```
Y luego:
```actionscript
var opciones = CartasConOpciones[NombreDeCarta];
```
Esto sigue siendo dinámico pero más organizado.
---
## ✅ Conclusión
Tu idea:
- Es válida
- Es eficiente
- Se puede mejorar levemente con objetos o clips genéricos
Lo que te propongo:
- Usa **un solo frame** y **un solo clip de pausa inteligente**
- Usa un objeto o variables dinámicas para definir solo las cartas que tienen opciones
- Evita `if` por cada carta o duplicación de clips
Esto te da un sistema **escalable**, **fácil de mantener** y muy en línea con las capacidades de Flash 5.
¿Te gustaría que te escriba el código completo del clip `PausaCarta` con la lógica completa de selección de opciones?
Lo que entendí es que su "Un solo objeto/clip de pausa" implica hacer ifs a cada rato (120 por segundo creo), así que no me sirve.
Me perdí en lo de diccionario. Quizá está pensando en cosas que aún no pensé.