elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Cuando las cartas tienen opciones.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cuando las cartas tienen opciones.  (Leído 265 veces)
Tachikomaia


Conectado Conectado

Mensajes: 1.574


Hackentifiko!


Ver Perfil
Cuando las cartas tienen opciones.
« en: 1 Julio 2025, 04:49 am »

En mi proyecto de juego en Macromedia Flash 5, se le daba una carta al jugador, se le decía cual, y había una pausa hasta que presionara A. Sólo tiene 1 carta.

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?

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é.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines