Crear objeto que pueda tratarse como sprite

Te mando una consulta que intentaré explicarte lo mejor que pueda.
Estoy haciendo una presentación multimedia donde se muestran los datos genealógicos de una familia.
En una de las opciones selecciono una persona en la base de datos y voy localizando y colocando en una lista de propiedades sus correspondientes antepasados hasta el final.
Una vez tenido esto, clasifico de forma ascendente por año y quiero mostrar sucesivamente encima de una mapa cada una de las localidades donde, en el año en curso, exista algún antepasado y por supuesto desaparezca esta localidad una vez quede sin antepasados.
Una posible solución sería colocar en la línea de tiempos un "sprite" por cada una de las localidades que tenga y usar los eventos específicos del "mouse" para mostrar en una pantalla anexa información complementaria del "sprite" interesado, como por ejemplo:"que localidades" "que antepasados están en ese momento", etc.
Sin embargo, esta solución más simple no me interesa puesto que quisiera que la presentación pudiera valer para otras familias genealógicas y no colocar cada vez nuevos "sprites" a mano.
Se me ocurrió utilizar el comando "image" y dibujar un círculo de color amarillo sobre un mapa que está de fondo, cada vez que una localidad dispone de antepasados, pero me surgen problemas que no se solucionar, como por ejemplo: "como borrar ese círculo sin que afecte al mapa sobre el que lo he dibujado (no se puede hacer transparente el círculo, puesto que no es un "sprite") y esto nos lleva a otro problema.
No puedo preguntar si el ratón está encima de un punto, puesto que no es un "sprite". Este último problema- el saber si está sobre una coordenada donde hay un circulo amarillo - lo puedo solucionar preguntando por la coordenada en la que estoy en cada momento y si esa coordenada coincide con las coordenadas que deben estar activas en un momento determinado que previamente he guardado en una lista de propiedades. En fin, un verdadero rollo.
He intentado hacerlo con Programación Orientada a Objetos- idea que se me ocurrió viendo alguna de tus respuestas- y creo que sería la solución más acertada, sin embargo, no consigo dar con ello. Entiendo que las fases serían las siguientes:
1-Crear un objeto padre mínimo con la forma de un círculo amarillo. (¿Cómo se crea el círculo para no recurrir a un mapa de bits con esa figura?)
2- Crear dos propiedades que correspondan a las coordenadas por é y.
3- Leer la lista de propiedades donde he guardado los años y las localidades que deben estar activadas en cada año.
Por cada elemento de la lista añadir un nuevo objeto hijo con sus coordenadas correspondientes en otra lista de propiedades.
4- Cuando termine de leer la lista de propiedades donde están los años y las localidades activadas vuelvo a leer ahora la lista de propiedades donde se indican cada uno de los objetos hijos que he creado y en que coordenadas se deben ubicar.
En este último punto tengo problemas porque no puedo preguntar por un elemento de la lista como si fuera un "sprite" al modo de "sprite(1).loc=point(x, y), para posicionarlo en el escenario.
Lo único que he conseguido hacer es "sprite(1).loc=point(x, y)" donde "sprite(1) corresponde a un mapa de bit que representa un circulo amarillo, y claro, el círculo se va dibujando cada vez en una coordenada diferente pero porque es el mismo objeto.
Espero que hayas entendido algo y me puedas aclarar que código sería necesario para resolver la duda.

2 Respuestas

Respuesta
1
TTe refieres a un script padre como este:
Property destino, ratón, fondo
on new me
--Creo la imagen temporal
destino= member("gh").image.duplicate()
raton = member("raton").image.duplicate()
fondo = member("fondo").image.duplicate()
return me
end
on actualizar me
h= the mouseloc.loch-50
v= the mouseloc.locv-60
--Voy a colocar el fondo y la imagen que se mueve con el movimiento del ratón en destino
Destino.copyPixels(fondo, fondo.rect, fondo.rect)
destino.copyPixels(raton,rect(h,v,h+100,v+100),raton.rect,[#useFastQuads:1,#blendLevel:100])
--Coloco la imagen temporal destino en el miembro "gh"
member("gh").image.copyPixels(destino,member("gh").image.rect,destino.rect,[#useFastQuads:1,#blendLevel:50])
end
He estado probando tu solución, por si me pudiera servir pero no consigo entender el código. Me explico.
En mi presentación multimedia cuento con 2 elementos:
-Punto amarillo que presenta a la localidad.
-Mapa donde quiero colocar un punto amarillo por localidad.
El proceso es:
-Por cada año consulto en una lista de propiedades y localizo las localidades que deben estar marcadas en el mapa con un punto amarillo.
-Dibujo/coloco el punto amarillo en la coordenada que corresponde a la localidad.
Problemas que surgen:
-No puedo utilizar los eventos que me posibilitan descubrir si el ratón está por encima de los puntos amarillos, si he pulsado esos puntos amarillos, etc. Para luego mostrar información sobre esas localidades en una ventana adjunta.
-No puedo hacer desaparecer un punto amarillo en el mapa cuando ya no debe estar ahí.
En el código que me has mandado aparece un objeto padre con 3 propiedades.
Una es -destino-, otra es -ratón- y otra es - fondo
No consigo ver la utilidad de cada una de ellas. Además, ¿qué es -gh-?
El -fondo- entiendo que correspondería a lo que yo llamo -mapa.
De todas formas después de probar con el comando copyPixels he conseguido dentro de un bucle llamar a actualizar (dentro del código que me mandaste) y dibujar los puntos amarillos. Pero es lo mismo que hacía antes con DRAW y luego sigo sin poder utilizar ONMOUSEOVER, etc.
Espero habértelo aclarado algo más y perdona por la paliza
Quizàs yo te recomendarìa grabaciòn de guiones y que uses instancias de comportamientos.
Vamos a ver para colocar los símbolos en los mapas debes iniciar una sesión para grabar un guion en la que colocas los símbolos en el escenario en tiempo real y según los leas de tu base de datos. Después añades el comportamiento que desees a ese símbolo así:
Sprite(5). ScriptInstanceList. Add(script("valor"). New("parametro1"))
Valor debe ser un comportamiento que funciona como guion padre. Es decir en el cast lo tienes como behaviour pero en realidad es un script padre:
El script sería así:
Property p
On new me, para1
p=para1
return (me)
end
On mouseup me
Put p
end
No se si me has entendido lo que te quiero decir.
Hola bedelludrica:
He estado probando e inspeccionando por los foros de internet para no molestarte otra vez pero al final tengo que recurrir a ti. Es en relación a la duda que te envié hace días.
Te mando parte del código por si se te ocurre algo.
Esta es la parte del código que llama a colocarlocalidad, que es donde pongo un punto por localidad que tiene antepasado. ("l" Sirve para ir diferenciando los sprites a medida que se van grabando)
...
if grabar then
addProp locmapa, "x",coorx
addProp locmapa, "y",coory
addProp locmapa, "numero frame",l
add gpuntoloc, locmapa
colocarlocalidad (coorx,coory,l)
--
go to frame "mapagrande"
l=l+1
end if
Parada
...
Este es código donde coloco el punto y le digo que le añada un comportamiento?
movie script 28: COLOCARLOCALIDAD
on colocarlocalidad h, v, nu
beginrecording
go to frame 95
--elegir el miembro
sprite(10+nu).member = member "punto"
sprite(10+nu).rect = rect(10,10,20,20)
-- colocar el comportamiento
sprite(10+nu).scriptInstanceList.add(script("puntolocalidad").new("parametro1"))
--colocar el miembro
sprite(10+nu).locH = h
sprite(10+nu).locV = v
Updateframe
endrecording
end
Con este trozo de código me dibuja en el mapa (frame "mapagrande") por cada año el punto de la localidad correspondiente.
Sin embargo, a pesar de confirmar que en un "breakpoint" a la altura de endrecording me dice que el sprite recién creado guarda un contenido del estilo:<offspring"puntolocalidad"1 1bce460>, no encuentro en ningún lugar que me guarde el valor parametro1 que se debe cargar cuando pincho en el miembro punto, como debería hacer si no estoy equivocado, pues así se le manda en el script padre que sigue:
puntolocalidad
property p
on new me , para1
p=para1
return (me)
end
on mouseup me
put p
end
Es más, cuando paso a grabar el siguiente sprite, veo que el sprite grabado anteriormente no tiene nada dentro en su scriptinstancelist.
En algunos foros parece que han tenido el mismo problema pero no he conseguido descubrir como lo han resuelto.
Un saludo
La grabación de guion no puede asignar objetos ni comportamientos. Debes hacerlo fuera.
Ejemplo:
On colocarlocalidad h, v, nu
Beginrecording
go to frame 95
--elegir el miembro
sprite(10+nu).member = member "punto"
sprite(10+nu).rect = rect(10,10,20,20)
-- colocar el comportamiento
sprite
--colocar el miembro
sprite(10+nu).locH = h
sprite(10+nu).locV = v
Updateframe
Endrecording
(10+nu). ScriptInstanceList. Add(script("puntolocalidad"). New("parametro1"))
end
Respuesta

Thanks for sharing. I found a lot of interesting information here. A really good post, very thankful and hopeful th https://mxplayer.pro/ at you will write many more posts like this one.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas