|
Post by roolandoo on Nov 26, 2020 9:55:05 GMT
Hi,
Is it possible to create different types of "Collectable blocks" and have a different code executed in the "Collect Block" Event depending on the collectable block got?
If I create multiple collectable blocks and use Getblocks, the code in the "Collect Block" event runs on all of them. I would like to be able to differentiate them.
Note: I can't use sprites or objects due to high memory consumption
|
|
|
Post by ramon on Nov 26, 2020 14:34:36 GMT
GETBLOCKS Este comando devuelve el tipo de bloque con el que colisiona el Sprite y lo reserva en la variable BLOCK. GETBLOCK nos proporciona el mecanismo para detectar EMPTYBLOCK, PLATFORMBLOCK, WALLBLOCK, LADDERBLOCK, FODDERBLOCK, DEADLYBLOCK y CUSTOMBLOCK. Podemos editar algo así: GETBLOCKS ; COME COCOS IF BLOCK = CUSTOMBLOCK ; EAT ENERGY BALL ENDIF IF BLOCK = EMPTYBLOCK ; SPEND ENERGY ENDIF IF BLOCK = FODDERBLOCK ; YOU NEED. ENDIF ... Tienes que borrar el bloque tú mismo. Yo lo he descartado por comodidad. En Pac-man uso COLLECTABLE BLOCK para los puntos de luz y DETECTOBJ para las "bolas energizantes" precisamente para evitar tener que borrar bloque a mano. Pero se puede hacer. Prueba GETBLOCKS tú y después me dices si funciona. Yo no lo he probado. Reflexiono sobre esto en este artículo Pac-man ZX Spectrum-"El bloque (8x8, tinta y papel) es un adorno, es el fondo de escena. Hay bloques especiales (LADDERBLOCK, FODDERBLOCK, DEADLYBLOCK, CUSTOMBLOCK, COLLECTABLE) que disparan sus propios eventos pero siempre los usaremos como elementos de escenario. Para juegos como el Pac-man y juegos de plataformas, de niveles o vertical, en los que el escenario define la lógica y mecánica, la elección es contar con ellos".
|
|
|
Post by roolandoo on Nov 26, 2020 15:17:56 GMT
Gracias ramon, pero igual no me he explicado bien (mi inglés es muuu malo, jejeje). Lo que necesito es usar varios bloques de tipo Collectable (exclusivamente), los otros tipos de bloque no me interesan pues ya los estoy usando para otras funciones. La idea es tener, por ejemplo, 3 bloques de tipo Collectable diferentes (cada uno con su dibujo distinto). Y cuando el personaje coge uno de ellos, se ejecute un código diferente de cuando coja el segundo bloque o el tercero. No se si me explico. Me parece que no se va a poder hacer, pero ahorraría decenas de bytes en mi nuevo proyecto. ------------------------------------------------------------------------------- Thanks ramon, but I think I have not explained it well (my English is sooo bad, hehehe). What I need is to use several Collectable blocks (exclusively), the other types of blocks do not interest me as I am already using them for other purposes The idea is to have, for example, 3 different Collectable blocks (each with its own different drawing). And when the player takes one of them, a different code is executed than when he takes the 2nd block or the third. It seems to me that it will not be possible to do, but it would save tens of bytes in my new project.
|
|
|
Post by ramon on Nov 26, 2020 16:08:17 GMT
Vale. Te entiendo. Quieres tres colecciones. Lo que sabemos es que para coleccionar tienes que detectar, borrar y lanzar un evento donde intervenir. Tienes un recurso para eso por cada bloque especializado de los que estamos hablando. Escoger tres tipos de estos bloques sería mi mejor opción. Pero ya los estás usando. No puedes distinguir bloques del mismo tipo collectable, que para el AGD son todos iguales.
Solo se me ocurre crear una tabla con las posiciones de los bloques ordenadas por tipos y por pantallas, las consultas cada vez que se lance el evento y ya.
|
|
|
Post by roolandoo on Nov 26, 2020 16:24:03 GMT
ramon, ese es el problema precisamente: "No puedes distinguir bloques del mismo tipo collectable". Pensaré lo de la tabla, pero no lo veo muy manejable porque serán muchos bloques distintos en casi todas las pantallas.
|
|
|
Post by ramon on Nov 26, 2020 16:50:49 GMT
Intento algo y te digo. Suerte.
|
|
|
Post by ramon on Nov 26, 2020 18:03:41 GMT
Imposible.
La única forma de distinguirlos es la posición.
Haz una tabla para todas las posiciones tipo 1, otra para todas las posiciones tipo 2 y otra para las tipo 3. las tablas no deberán tener elementos comunes. Coloca los bloques en tus pantallas en las posiciones fijadas correspondientes a cada tipo y siempre acertarás. Tienes aproximadamente 145 posiciones fijas por cada tipo para repartir. Creas la ilusión diseñando el decorado de forma diferente.
No veo otra manera. A no ser que desistas de tu idea o la adaptes. Repartir bloques por pantalla: la habitación de las monedas, la habitación de los diamantes, etc.
|
|
|
Post by roolandoo on Nov 26, 2020 18:44:39 GMT
Muchas gracias por la idea ramon , lo intentaré como comentas, aunque no me encaja del todo con otras cosas que tengo pensadas... Y sí, igual tendré que darle otra vuelta de tuerca al concepto.
|
|
|
Post by ramon on Nov 26, 2020 19:22:22 GMT
Última. Si obligas al jugador a coleccionar todos los bloques para pasar de pantalla. Codifica todas las pantallas con el número de bloques de cada tipo que van a contener. Te olvidas de comprobar el tipo de bloques por que ya lo sabes.
AGD es versátil. También hay que pensar que los juegos Arcade usan elementos y mecanismos simples en oposición a los juegos de simulación. La diversión es lo que cuenta.
|
|
|
Post by Jonathan Cauldwell on Nov 26, 2020 19:57:15 GMT
The only way would be to check the screen number and coordinates to give you an idea of where the block is. The collect block event has access to the parameters of the sprite that is collecting the block, so you can check if X and Y are within a range. If you have a lot of checks to make I'd suggest writing a REPEAT or WHILE loop then using READ and DATA with a list of screen numbers and X and Y ranges to check
Sorry I can't think of a simpler solution
|
|
|
Post by ramon on Nov 26, 2020 21:37:18 GMT
Very good news that the collect block event has access to the parameters of the sprite that is collecting the block. I totally agree with this solution.
|
|