Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Objetos Drawningarea
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Objetos Drawningarea 
 
Hola a la lista, es la primera vez que escribo. Aún estoy aprendiendo a usar gambas

Construyendo clases en gambas, creé un pequeño programa con una clase heredada del objeto Drawningarea con un par de métodos y alguna propiedad que dibujaba un círculo. A esta clase la llamé DAPelota.

Después, en el formulario principal, instancié tres objetos de esta clase DApelota que, a su vez, dibujaba dentro de un DrawningArea padre. Y puse algunos controles de manera que llamaba al método de la pelota (DApelota) elegida. Incluso aprendí a manejar eventos ocurridos sobre esta clase DAPelota.

Todo funciona muy bien, pero, cuando pasa una pelota sobre otra, por mucho que las propiedades Backcolor o BackgroundColor estén a Transparent, se ve que el trozo no pintado de DAPelota se superpone a la inferior. ¿Cómo puedo evitar esta situación? Gracias.
 


La clase es:

' gambas class file

INHERITS DrawingArea 'hereda las propiedades, métodos y eventos del Drawning Area
EXPORT 'Esto significa que la clase será visible desde un programa principal cuando creemos un componente.

PRIVATE hradio AS Integer 'esta variable es privada, y se usa sólo dentro de la clase
PRIVATE hcolor1 AS Long 'esta variable es privada, y se usa sólo dentro de la clase
PUBLIC inflada AS Boolean 'variable pública, accesible desde fuera de la clase

PUBLIC SUB _new() 'constructor
  inflada = TRUE
  ME.Cached = TRUE 'propiedades ME, las del objeto padre: en este caso del Drawning Area
  ME.Border = Border.None
  ME.BackColor = Color.Transparent
  ME.Background = Color.Transparent
  ME.width = 100
  ME.height = 100
  ME.left = 80
  ME.top = 90
  hcolor1 = Color.Red
  hradio = 30
  dibujarpelota 'llama a la función dibujar pelota.
END

'métodos get
PUBLIC FUNCTION getRadio() AS Integer  
  RETURN hradio  
END

PUBLIC FUNCTION getColor() AS Long  
  RETURN hcolor1
END

'metodos set
PUBLIC SUB setRadio(num AS Integer)
  hradio = num
END

PUBLIC SUB setColor(num AS Long)
  hcolor1 = num  
END

'métodos
'dibujar pelota
PUBLIC SUB dibujarpelota()
  ME.width = hradio * 2 'radio de las pelotas convertido a tamaño del drawning area DApelota
  ME.height = hradio * 2
  ME.clear
  Draw.Begin(ME) 'empieza el dibujo
    Draw.Fillcolor = hcolor1
    Draw.FillStyle = Fill.Solid
    Draw.Circle(ME.width / 2, ME.Height / 2, hradio)
  Draw.End
END

'dar patada
PUBLIC SUB darpatada(minx AS Integer, maxx AS Integer, miny AS Integer, maxy AS Integer)
  DIM alex AS Integer
  DIM aley AS Integer
  RANDOMIZE
  alex = Int(Rnd(1) * (maxx - minx)) + minx
  aley = Int(Rnd(1) * (maxy - miny)) + miny
  ME.left = alex
  ME.top = aley
  dibujarpelota
END

'cambia la propiedad del color del objeto
PUBLIC SUB ponercolor(num AS Long)
  hcolor1 = num  
  dibujarpelota  
END


El código FMAIN

' gambas class file

PUBLIC pelota1 AS Object[3]
PRIVATE observador[3] AS Observer 'Importante: ponerlo como private y admite array de esta manera
PUBLIC etiqueta AS Label 'objeto etiqueta
PUBLIC quepelota AS Integer


PUBLIC SUB Form_Open()
  DIM i AS Integer
  'dibuja pelota
  FOR i = 0 TO 2
    'Instancio nuevos objetos y le asigno el nombre de pelotaX
    pelota1[i] = NEW DApelota(Canvas) AS "pelota" & (i + 1)
    pelota1[i].darpatada(0, Canvas.width - pelota1[i].width, 0, Canvas.Height - pelota1[i].height)
    'Instancio nuevos observadores y le asigno el nombre de observador.
    observador[i] = NEW Observer(pelota1[i]) AS "Observador" & (i + 1)
  NEXT  
  'valores de scroll
  scbx.MinValue = pelota1[0].width / 2
  scbx.MaxValue = Canvas.Width - pelota1[0].width / 2
  scbx.Step = 10
  scby.MinValue = pelota1[0].height / 2
  scby.MaxValue = Canvas.Height - pelota1[0].height / 2
  'etiqueta
  etiqueta = NEW Label(Canvas) AS "etiquetados"
  etiqueta.X = 0
  etiqueta.Y = 0  
  etiqueta.width = 10
  etiqueta.Height = 18
  etiqueta.BackColor = Color.Transparent
  etiqueta.Background = Color.Transparent
  etiqueta.Visible = FALSE
  etiqueta.Text = ""
END


PUBLIC SUB rbtn1_Click()
   IF rbtn1.Value = TRUE THEN quepelota = 0
END

PUBLIC SUB rbtn2_Click()
     IF rbtn2.Value = TRUE THEN quepelota = 1  
END


PUBLIC SUB rbtn3_Click()
     IF rbtn3.Value = TRUE THEN quepelota = 2
END

PUBLIC SUB btn1_Click()
     pelota1[quepelota].dibujarpelota
END

PUBLIC SUB scbx_Change()
     pelota1[quepelota].Left = scbx.Value - (pelota1[quepelota].width / 2)
END

PUBLIC SUB scby_Change()
     pelota1[quepelota].Top = scby.Value - (pelota1[quepelota].height / 2)
END

PUBLIC SUB btndarpatada_Click()
   pelota1[quepelota].darpatada(0, Canvas.width - pelota1[quepelota].width, 0, Canvas.Height - pelota1[quepelota].height)
END

PUBLIC SUB btncolor_Click()
  Dialog.Color = pelota1[quepelota].getColor()
  IF Dialog.SelectColor() THEN RETURN
  pelota1[quepelota].ponercolor(Dialog.Color)
END

'******************************************************
'Eventos, que tienen que ser heredados del DrawningArea
'******************************************************

PUBLIC SUB Observador1_DblClick()
  pelota1[0].ponercolor(Color.White)
END

PUBLIC SUB Observador2_DblClick()
  pelota1[1].ponercolor(Color.Blue)
END

PUBLIC SUB Observador3_DblClick()
  pelota1[2].ponercolor(Color.Yellow)
END

PUBLIC SUB Observador1_Enter()
  etiqueta.X = pelota1[0].left + pelota1[0].width / 2 - etiqueta.width / 2
  etiqueta.Y = pelota1[0].top + pelota1[0].height / 2 - etiqueta.height / 2
  etiqueta.Background = pelota1[0].getColor()
  etiqueta.Visible = TRUE
  etiqueta.Text = "1"
END

PUBLIC SUB Observador1_Leave()  
  etiqueta.Text = ""
  etiqueta.Visible = FALSE  
END

PUBLIC SUB Observador2_Enter()
  etiqueta.X = pelota1[1].left + pelota1[1].width / 2 - etiqueta.width / 2
  etiqueta.Y = pelota1[1].top + pelota1[1].height / 2 - etiqueta.height / 2
  etiqueta.Background = pelota1[1].getColor()
  etiqueta.Visible = TRUE
  etiqueta.Text = "2"
END

PUBLIC SUB Observador2_Leave()  
  etiqueta.Text = ""
  etiqueta.Visible = FALSE  
END

PUBLIC SUB Observador3_Enter()
  etiqueta.X = pelota1[2].left + pelota1[2].width / 2 - etiqueta.width / 2
  etiqueta.Y = pelota1[2].top + pelota1[2].height / 2 - etiqueta.height / 2
  etiqueta.Background = pelota1[2].getColor()
  etiqueta.Visible = TRUE
  etiqueta.Text = "3"
END

PUBLIC SUB Observador3_Leave()  
  etiqueta.Text = ""
  etiqueta.Visible = FALSE  
END


Imagen del diseño de FMain. El Drawningarea principal se llama canvas

fmain_pelotas2 pelotas_superpuestas  


clasepelotas2.zip
Descripción: programa de ejemplo  
Descargar
Nombre del archivo: clasepelotas2.zip
Tamaño: 16.04 KB
Descargado: 47 veces
clasepelotas2.zip
Descripción: programa de ejemplo  
Descargar
Nombre del archivo: clasepelotas2.zip
Tamaño: 16.04 KB
Descargado: 47 veces
clasepelotas2.zip
Descripción: programa de ejemplo  
Descargar
Nombre del archivo: clasepelotas2.zip
Tamaño: 16.04 KB
Descargado: 47 veces

 



 
última edición por agrgal el Martes, 25 Octobre 2011, 20:38; editado 1 vez 
agrgal - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Objetos Drawningarea 
 
Hola

El problema es que estás usando un drawingarea con la pelota dibujada dentro como si fuera otro control cualquiera. Estás instanciando drawingareas realmente, no dibujos.  El fondo del drawingarea no es transparente, por eso ves el borde.

Lo que deberías hacer es pintar todo sobre el mismo drawing area y mover lo que pintas, es decir el dibujo en sí mismo, y no crear un nuevo control para cada dibujo.
Te recomiendo que pongas la propiedad cached=false y que pintes dentro del evento Draw() del drawingarea.

Si quieres ver un ejemplo sencillo, aunque no dibuja pelotas, sino una escala de frecuencias, te dejo el enlace al código:

http://www.assembla.com/code/dfhlog.../FBandMap.class

Puede que así veas cómo de usa el evento draw, aunque no uso clases para crear objetos...

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Objetos Drawningarea 
 
Esto te puede servir,  Juan Luis Lopez, creo esto una libreria de funciones que te pueden servir o que puedes tu ampliar:

Citar:
"Se trata de un conjunto de clases y modulos con funciones para crear juegos 2D con gambas."


Enlace del foro: http://foro.gambas-es.org/viewtopic.php?f=5&t=1904

Tu uso de la clase observer es muy interesante, me lo apunto..      
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Martes, 25 Octobre 2011, 23:55; editado 1 vez 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Objetos Drawningarea 
 
He mejorado un poquito tu clase, le he añadido un observador a la clase DApelota, asi se reduce el codigo en el formulario principal, quedando todas las propiedades, metodos y eventos dentro de la propia clase.

La clase pelota queda:
' gambas class file

INHERITS DrawingArea 'hereda las propiedades, métodos y eventos del Drawning Area
EXPORT 'Esto significa que la clase será visible desde un programa principal cuando creemos un componente.

PRIVATE hradio AS Integer 'esta variable es privada, y se usa sólo dentro de la clase
PRIVATE hcolor1 AS Long 'esta variable es privada, y se usa sólo dentro de la clase
PUBLIC inflada AS Boolean 'variable pública, accesible desde fuera de la clase

PUBLIC numero AS String
 
'aqui es donde añado el observador
PUBLIC observador AS NEW Observer(ME) AS "Observador1"



PUBLIC SUB observador1_DblClick()
  IF ME.numero = 1 THEN
     ME.ponercolor(Color.White)
     ELSE
     IF ME.numero = 2 THEN
     ME.ponercolor(Color.blue)
     ELSE
     IF ME.numero = 3 THEN
     ME.ponercolor(Color.Yellow)
     ENDIF
     ENDIF
     ENDIF
    
  
END

PUBLIC SUB observador1_Enter()
 Draw.Begin(ME)
 Draw.Text(ME.numero, ME.width / 2, ME.height / 2)
 Draw.End
 
END

PUBLIC SUB observador1_Leave()  
 ' etiqueta.Text = ""
 ' etiqueta.Visible = FALSE  
   ME.ponercolor(Color.Red)
END


PUBLIC SUB _new() 'constructor
  inflada = TRUE
  ME.Cached = TRUE 'propiedades ME, las del objeto padre: en este caso del Drawning Area
  ME.Border = Border.None
  ME.BackColor = Color.Transparent
  ME.Background = Color.Transparent
  ME.width = 100
  ME.height = 100
  ME.left = 80
  ME.top = 90
  hcolor1 = Color.Red
  hradio = 30
  dibujarpelota 'llama a la función dibujar pelota.

END

'métodos get
PUBLIC FUNCTION getRadio() AS Integer  
  RETURN hradio  
END

PUBLIC FUNCTION getColor() AS Long  
  RETURN hcolor1
END

'metodos set
PUBLIC SUB setRadio(num AS Integer)
  hradio = num
END

PUBLIC SUB setColor(num AS Long)
  hcolor1 = num  
END

'métodos
'dibujar pelota
PUBLIC SUB dibujarpelota()
  ME.width = hradio * 2 'radio de las pelotas convertido a tamaño del drawning area DApelota
  ME.height = hradio * 2
  ME.clear
  Draw.Begin(ME) 'empieza el dibujo
    Draw.Fillcolor = hcolor1
    Draw.FillStyle = Fill.Solid
    Draw.Circle(ME.width / 2, ME.Height / 2, hradio)
  Draw.End
END

'dar patada
PUBLIC SUB darpatada(minx AS Integer, maxx AS Integer, miny AS Integer, maxy AS Integer)
  DIM alex AS Integer
  DIM aley AS Integer
  RANDOMIZE
  alex = Int(Rnd(1) * (maxx - minx)) + minx
  aley = Int(Rnd(1) * (maxy - miny)) + miny
  ME.left = alex
  ME.top = aley
  dibujarpelota
END

'cambia la propiedad del color del objeto
PUBLIC SUB ponercolor(num AS Long)
  hcolor1 = num  
  dibujarpelota  
END
 


Y el código del Fmain, queda:

' gambas class file

PUBLIC pelota1 AS Object[3]
'PRIVATE observador[3] AS Observer 'Importante: ponerlo como private y admite array de esta manera
PUBLIC etiqueta AS Label 'objeto etiqueta
PUBLIC quepelota AS Integer


PUBLIC SUB Form_Open()
  DIM i AS Integer
  'dibuja pelota
  FOR i = 0 TO 2
    'Instancio nuevos objetos y le asigno el nombre de pelotaX
    pelota1[i] = NEW DApelota(Canvas) AS "pelota" & (i + 1)
    pelota1[i].darpatada(0, Canvas.width - pelota1[i].width, 0, Canvas.Height - pelota1[i].height)
    'Instancio nuevos observadores y le asigno el nombre de observador.
'    observador[i] = NEW Observer(pelota1[i]) AS "Observador" & (i + 1)
    pelota1[i].numero = Str$(i + 1)
  NEXT  
  
 
  
 
  'valores de scroll
  scbx.MinValue = pelota1[0].width / 2
  scbx.MaxValue = Canvas.Width - pelota1[0].width / 2
  scbx.Step = 10
  scby.MinValue = pelota1[0].height / 2
  scby.MaxValue = Canvas.Height - pelota1[0].height / 2
  'etiqueta
  etiqueta = NEW Label(Canvas) AS "etiquetados"
  etiqueta.X = 0
  etiqueta.Y = 0  
  etiqueta.width = 10
  etiqueta.Height = 18
  etiqueta.BackColor = Color.Transparent
  etiqueta.Background = Color.Transparent
  etiqueta.Visible = FALSE
  etiqueta.Text = ""
END


PUBLIC SUB rbtn1_Click()
   IF rbtn1.Value = TRUE THEN quepelota = 0
END

PUBLIC SUB rbtn2_Click()
     IF rbtn2.Value = TRUE THEN quepelota = 1  
END


PUBLIC SUB rbtn3_Click()
     IF rbtn3.Value = TRUE THEN quepelota = 2
END

PUBLIC SUB btn1_Click()
     pelota1[quepelota].dibujarpelota
END

PUBLIC SUB scbx_Change()
     pelota1[quepelota].Left = scbx.Value - (pelota1[quepelota].width / 2)
END

PUBLIC SUB scby_Change()
     pelota1[quepelota].Top = scby.Value - (pelota1[quepelota].height / 2)
END

PUBLIC SUB btndarpatada_Click()
   pelota1[quepelota].darpatada(0, Canvas.width - pelota1[quepelota].width, 0, Canvas.Height - pelota1[quepelota].height)
END

PUBLIC SUB btncolor_Click()
  Dialog.Color = pelota1[quepelota].getColor()
  IF Dialog.SelectColor() THEN RETURN
  pelota1[quepelota].ponercolor(Dialog.Color)
END



Añadir un observador dentro una clase, no sabia como hacerlo , pero tu código me ha servido mucho...    

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Objetos Drawningarea 
 
Hola chicos,

Gracias por vuestras respuestas. Jsban, me anoto tu modificación, que es más elegante, sin duda.  La librería de Juan Luis López tendría que analizarla más despacio y ahora no tengo mucho tiempo. Sólo puedo dedicarme a esto ocasionalmente.

Sobre lo que dice jguardon...

Citar:
Lo que deberías hacer es pintar todo sobre el mismo drawing area y mover lo que pintas, es decir el dibujo en sí mismo, y no crear un nuevo control para cada dibujo.


Reitero de que aun estoy aprendiendo cosas pero lo que pretendía no es dibujar objetos, sino dibujarlos y controlarlos (actuar sobre ellos). De hecho, si ejecutas el ejemplo que envío, verás como un doble click en una de las pelotas le cambia el color y ponerse sobre cada pelota hace aparecer una etiqueta que dice qué pelota es.

Si sólo dibujo en un Drawningarea... ¿cómo puedo interactuar con lo que dibujo? ¿Puedes ponerme un ejemplo sencillo o unas instrucciones de cómo hacerlo? La verdad es que no he tenido tiempo de comprender bien tu código. No sé si sólo dibujas y borras constantemente según los datos que envíes o calcules o de hecho interactúas con ellos. Me parece que es eso lo que haces ¿me equivoco?

Pero muchas gracias, de verdad. Saludos.
 



 
agrgal - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Objetos Drawningarea 
 
agrgal

Creo que para poder ayudarte mejor es necesario saber el propósito de tu aplicación, para elegir el mejor método de dibujo. Me explico: si lo que quieres es simplemente hacer un nuevo control con determinadas características o para implementar alguna utilidad, en fin, cosas que no requieran gran velocidad de dibujado, el camino correcto es usar drawingarea.

Si por el contrario lo que pretendes es crear juegos, interactuar con los objetos que dibujas, usar sprites, etc, el acercamiento correcto sería OpenGL. En ese caso, el enlace que proporcionó jsbsan es válido, pero además deberías profundizar en ello, por ejemplo estudiando los ejemplos que trae gambas y buscando en Internet.

Lamentablemente no puedo ayudarte con OpenGL porque no lo he usado nunca hasta ahora.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Objetos Animados En Gambas h4k Aplicaciones/Fragmentos de Código 3 Domingo, 25 Abril 2010, 22:35 Ver último mensaje
spheris
No hay nuevos mensajes Observador De Objetos aristicol Controles/Librerías/Componentes 4 Domingo, 21 Noviembre 2010, 03:25 Ver último mensaje
aristicol
No hay nuevos mensajes Consulta Acerca De Una Matriz De Objetos: ... santijav General 6 Jueves, 21 Abril 2011, 05:14 Ver último mensaje
soplo
No hay nuevos mensajes Cursor Sobre Dos Objetos A La Vez Shell General 1 Jueves, 15 Diciembre 2016, 09:17 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron