Bueno pués vista la demanda de botones y demás para dx_lib32 voy a preparar un par de clases bases para su utilización.
*No he probado la clase 100% (la he probado en el ejemplo del MataMarcianos y funciona) xD
*Para que se vean tienen que meterse en el bucle principal
'lógica
objeto.update
'dibujo
objeto.draw
CLase C_COMMAND (clase botón)
Descargar Clase (http://www.badongo.com/file/4193695)
'////////////////////////////////////////////////////////////////
'/ /
'/ Proyecto dx_lib32 2.0 - Clase botón para dx_lib32 /
'/ ºººººººººººººººººººººººººººººººººººººººº /
'/ Autor dx_lib32 : José Miguel Sánchez Fernández /
'/ ºººººººººººººººººººººººººººººººººººººººº /
'/ Autor clase c_command: Roberto H /
'/ Versión: 1.0 /
'/ /
'////////////////////////////////////////////////////////////////
'REQUISITOS
'Necesario tener objeto/s:
'm_Input - dx_Input_Class
'm_System - dx_System_Class
'm_gfx - dx_GFX_Class
'fnt_System - contiene identificar de fuente cargada en memoria
'
'USO
''se crea la clase
'Dim boton1 as c_command
''se inicializa
'Set boton1 = New c_command
''se le da un gráfico
'boton1.grafico=m_gfx.MAP_Load(App.Path & "\images\boton1.png", 0)
''se posiciona
'boton1.posicionar 100,200
''se da un tamaño
'boton1.dar_tamaño 64,64
''se le da un tooltiptext
'boton1.tooltiptext="Ejemplo de uso c_command"
''se activa
'boton1.activar_boton
'
'
Option Explicit
Private Const CONS_MOUSE_SOBRE = 1000 'milisegundos que el ratón debe estar para activarse el tooltiptext
Private top As Long, left As Long 'coordenada x e y
Private width As Long, height As Long 'ancho y largo
Private rec_zona_impacto As GFX_Rect 'zona de impacto del botón
Private visible As Boolean 'indica si se encuentra visible o no
Public grafico As Long 'el gráfico utilizado para el botón
Public tooltiptext As String 'permite un mensaje al tener el mouse sobre el ratón
Private contador As Long 'contador del tooltiptext
Private m_encima As Boolean 'indica si ya estaba el ratón encima o no
'posiciona el botón
Public Sub posicionar(x As Long, y As Long)
top = x: left = y
nueva_zona_impacto
End Sub
'da un tamaño al botón
Public Sub dar_tamaño(ancho As Long, largo As Long)
width = ancho: height = largo
nueva_zona_impacto
End Sub
'ejecuta actualización/acciones
Public Sub update()
'comprobamos si el botón es visible
If visible Then
'comprobamos si se encuentra en el área de cliqueo
If m_System.MATH_PointInRect(m_Input.Mouse.x, m_Input.Mouse.y, rec_zona_impacto) Then
'comprobamos si se ha clicado el ratón (click izquierdo/derecho)
'ésto puede dar problemas mirar el siguiente post en el foro dx_lib32
'http://www.stratos-ad.com/forums3/viewtopic.php?t=9312
'izquierdo
If m_Input.Mouse_Hit(Left_Button) Then
'se ha clicado ejecutamos las acciones derivadas del click
'USER 'aqui código a ejecutar
Call m_Gfx.DRAW_Text(fnt_System, "Click izquierdo", left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
m_encima = False
'derecho
ElseIf m_Input.Mouse_Hit(Left_Button) Then
'se ha clicado ejecutamos las acciones derivadas del click
'USER 'aqui código a ejecutar
Call m_Gfx.DRAW_Text(fnt_System, "Click derec", left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
m_encima = False
Else
'comprobamos si se encontraba ya encima
If m_encima Then
'se encontraba ya encima con anterioridad
'comprobamos cuanto tiempo se encuentra el cursor sobre el ratón
If (m_System.TIMER_GetValue(contador) >= CONS_MOUSE_SOBRE) Then
'si es mayor a un segundo mostramos tooltiptext
Call m_Gfx.DRAW_Text(fnt_System, tooltiptext, left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
End If
Else
m_encima = True
m_System.TIMER_Reset (contador)
End If
End If
Else
'paramos el timer del tooltiptext
m_encima = False
End If
End If
End Sub
'dibuja el botón
Public Sub draw()
'si el botón se encuentra visible
If visible Then
'lo dibujamos
Call m_Gfx.DRAW_MapEx(grafico, left, top, -3, width, height, 0, Blendop_Color, &HFFFFFFFF, Mirror_None, Blit_Filter.Filter_Bilinear, False)
End If
End Sub
'crea la zona de impacto
Public Sub nueva_zona_impacto()
rec_zona_impacto.x = left: rec_zona_impacto.y = top
rec_zona_impacto.width = width: rec_zona_impacto.height = height
End Sub
'acciones al crearlo
Public Sub activar_boton()
'creamos un cronómetro para el tooltiptext
contador = m_System.TIMER_Create()
visible = True 'lo mostramos visible
End Sub
'se destruye el objeto
Private Sub Class_Terminate()
m_System.TIMER_Kill (contador)
End Sub
CLase C_TEXTBOX (clase caja de texto)
Descargar Clase (http://www.badongo.com/file/4193694)
'////////////////////////////////////////////////////////////////
'/ /
'/ Proyecto dx_lib32 2.0 - Clase cajatexto para dx_lib32 /
'/ ºººººººººººººººººººººººººººººººººººººººº /
'/ Autor dx_lib32 : José Miguel Sánchez Fernández /
'/ ºººººººººººººººººººººººººººººººººººººººº /
'/ Autor clase c_textbox: Roberto H /
'/ Versión: 1.0 /
'/ /
'////////////////////////////////////////////////////////////////
'NOTAS
'No he añadido la posibilidad de cambiar color, os insto a que lo hagáis vosotros xD
'La clase es bastante básica
'REQUISITOS
'Necesario tener objeto/s:
'm_Input - dx_Input_Class
'm_System - dx_System_Class
'm_gfx - dx_GFX_Class
'fnt_System - contiene identificar de fuente cargada en memoria
'
'USO
''se crea la clase
'dim caja as c_textbox
''se inicializa
'Set caja = New c_textbox
''se le da un gráfico si tiene
'caja.da_grafico m_gfx.MAP_Load(App.Path & "\images\caja1.png", 0)
''se posiciona
'caja.posicionar 100,200
''se da un tamaño
'caja.dar_tamaño 64,64
''se le da un tooltiptext
'caja.tooltiptext="Ejemplo de uso c_command"
''se le da un texto
'caja.escribe "[EXE3] es un fenómeno."
''se le da una longitud max (sino por defecto tendrá 0)
'caja.max_longitud 10
''se activa
'caja.activar_caja
'
'
Option Explicit
Private Const CONS_MOUSE_SOBRE = 1000 'milisegundos que el ratón debe estar para activarse el tooltiptext
Private top As Long, left As Long 'coordenada x e y
Private width As Long, height As Long 'ancho y largo
Private rec_zona_impacto As GFX_Rect 'zona de impacto del textbox
Private texto As String 'texto que contiene el text
Private l_texto As Long 'longitud de texto permitida
Private visible As Boolean 'indica si se encuentra visible o no
Private enabled As Boolean 'indica si se encuentra activo y se puede escribir
Private foco As Boolean 'indica si tiene el foco (necesario para poder escribir)
Private egrafico As Boolean 'indica si tiene gráfico
Private grafico As Long 'el gráfico utilizado para el textbox
Public tooltiptext As String 'permite un mensaje al tener el mouse sobre el ratón
Private contador As Long 'contador del tooltiptext
Private m_encima As Boolean 'indica si ya estaba el ratón encima o no
'posiciona el textbox
Public Sub posicionar(x As Long, y As Long)
top = x: left = y
nueva_zona_impacto
End Sub
'da un tamaño al textbox
Public Sub dar_tamaño(ancho As Long, largo As Long)
width = ancho: height = largo
nueva_zona_impacto
End Sub
'ejecuta actualización/acciones
Public Sub update()
'comprobamos si el textbox es visible
If visible Then
'comprobamos si el textbox se encuentra en enable true y tiene el foco
If enabled And foco Then
'comprobamos si teclea
'guardamos sin más ya que tenemos las acciones configuradas en tecla_valida
tecla_valida
End If
'comprobamos si se encuentra en el área de cliqueo
If m_System.MATH_PointInRect(m_Input.Mouse.x, m_Input.Mouse.y, rec_zona_impacto) Then
'comprobamos si se ha clicado el ratón (click izquierdo/derecho)
'ésto puede dar problemas mirar el siguiente post en el foro dx_lib32
'http://www.stratos-ad.com/forums3/viewtopic.php?t=9312
'izquierdo
If m_Input.Mouse_Hit(Left_Button) Then
'se ha clicado ejecutamos las acciones derivadas del click
'obtiene el foco (necesario para poder escribir)
SetFocus
'USER 'aqui código a ejecutar
Call m_Gfx.DRAW_Text(fnt_System, "Click izquierdo", left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
m_encima = False
'derecho
ElseIf m_Input.Mouse_Hit(Left_Button) Then
'se ha clicado ejecutamos las acciones derivadas del click
'USER 'aqui código a ejecutar
Call m_Gfx.DRAW_Text(fnt_System, "Click derec", left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
m_encima = False
Else
'comprobamos si se encontraba ya encima
If m_encima Then
'se encontraba ya encima con anterioridad
'comprobamos cuanto tiempo se encuentra el cursor sobre el ratón
If (m_System.TIMER_GetValue(contador) >= CONS_MOUSE_SOBRE) Then
'si es mayor a un segundo mostramos tooltiptext
Call m_Gfx.DRAW_Text(fnt_System, tooltiptext, left, top - 10, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
End If
Else
m_encima = True
m_System.TIMER_Reset (contador)
End If
End If
ElseIf m_Input.Mouse_Hit(Left_Button) Or m_Input.Mouse_Hit(Left_Button) Then
LostFocus
'paramos el timer del tooltiptext
m_encima = False
Else
'paramos el timer del tooltiptext
m_encima = False
End If
End If
End Sub
'dibuja el textbox
Public Sub draw()
'si el textbox se encuentra visible
If visible Then
'lo escribimos
Call m_Gfx.DRAW_Text(fnt_System, texto, left, top, -4, m_Gfx.ARGB_Set(255, 0, 0, 0), Align_Left)
'comprobamos si tiene dibujo
If egrafico Then
Call m_Gfx.DRAW_MapEx(grafico, left, top, -3, width, height, 0, Blendop_Color, &HFFFFFFFF, Mirror_None, Blit_Filter.Filter_Bilinear, False)
End If
End If
End Sub
'da un gráfico
Public Sub da_grafico(graident As Long)
grafico = graident
egrafico = Not IsNull(grafico)
End Sub
'texto
Public Function getTexto()
getTexto = texto
End Function
'max longitud
Public Sub max_longitud(num As Long)
l_texto = num
corta_text
End Sub
'cambia el texto por el texto enviado, también cambia el max textto al texto introducido
Public Sub escribe(cadena As String)
l_texto = Len(cadena)
texto = cadena
End Sub
'corta el texto al l_texto especificado
Private Sub corta_text()
texto = Mid(texto, 1, l_texto)
End Sub
'crea la zona de impacto
Public Sub nueva_zona_impacto()
rec_zona_impacto.x = left: rec_zona_impacto.y = top
rec_zona_impacto.width = width: rec_zona_impacto.height = height
End Sub
'gana foco
Public Sub SetFocus()
foco = True
End Sub
'pierde foco
Public Sub LostFocus()
foco = False
End Sub
'acciones de activación
Public Sub activar_caja()
'creamos un cronómetro para el tooltiptext
contador = m_System.TIMER_Create()
visible = True 'lo mostramos visible
enabled = True
End Sub
'se destruye el objeto
Private Sub Class_Terminate()
m_System.TIMER_Kill (contador)
End Sub
Private Sub tecla_valida()
On Error Resume Next
Dim tecla As String
tecla = ""
With m_Input
'Teclas numericas del teclado:
If .Key_Hit(Key_Escape) Then
LostFocus
ElseIf .Key_Hit(Key_BackSlash) Then
tecla = "}"
ElseIf .Key_Hit(Key_1) Then
tecla = "1"
ElseIf .Key_Hit(Key_2) Then
tecla = "2"
ElseIf .Key_Hit(Key_3) Then
tecla = "3"
ElseIf .Key_Hit(Key_4) Then
tecla = "4"
ElseIf .Key_Hit(Key_5) Then
tecla = "5"
ElseIf .Key_Hit(Key_6) Then
tecla = "6"
ElseIf .Key_Hit(Key_7) Then
tecla = "7"
ElseIf .Key_Hit(Key_8) Then
tecla = "8"
ElseIf .Key_Hit(Key_9) Then
tecla = "9"
ElseIf .Key_Hit(Key_0) Then
tecla = "0"
ElseIf .Key_Hit(Key_Equals) Then
tecla = "¿"
ElseIf .Key_Hit(Key_Apostrophe) Then
tecla = "{"
ElseIf .Key_Hit(Key_Slash) Then
tecla = "-"
ElseIf .Key_Hit(Key_Back) Then
texto = Mid(texto, 1)
'Teclas Alfabeticas:
ElseIf .Key_Hit(Key_Tab) Then
LostFocus
ElseIf .Key_Hit(Key_Q) Then
tecla = "Q"
ElseIf .Key_Hit(Key_W) Then
tecla = "W"
ElseIf .Key_Hit(Key_E) Then
tecla = "E"
ElseIf .Key_Hit(Key_R) Then
tecla = "R"
ElseIf .Key_Hit(Key_T) Then
tecla = "T"
ElseIf .Key_Hit(Key_Y) Then
tecla = "Y"
ElseIf .Key_Hit(Key_U) Then
tecla = "U"
ElseIf .Key_Hit(Key_I) Then
tecla = "I"
ElseIf .Key_Hit(Key_O) Then
tecla = "O"
ElseIf .Key_Hit(Key_P) Then
tecla = "P"
ElseIf .Key_Hit(Key_Enter) Then
texto = texto & vbNewLine
'USER 'lo que quieras hacer al pulsar enter
ElseIf .Key_Hit(Key_LBracket) Then
tecla = "["
ElseIf .Key_Hit(Key_RBracket) Then
tecla = "]"
ElseIf .Key_Hit(Key_A) Then
tecla = "A"
ElseIf .Key_Hit(Key_S) Then
tecla = "S"
ElseIf .Key_Hit(Key_D) Then
tecla = "D"
ElseIf .Key_Hit(Key_F) Then
tecla = "F"
ElseIf .Key_Hit(Key_G) Then
tecla = "G"
ElseIf .Key_Hit(Key_H) Then
tecla = "H"
ElseIf .Key_Hit(Key_J) Then
tecla = "J"
ElseIf .Key_Hit(Key_K) Then
tecla = "K"
ElseIf .Key_Hit(Key_L) Then
tecla = "L"
ElseIf .Key_Hit(Key_Grave) Then
tecla = "ª"
ElseIf .Key_Hit(Key_SemiColon) Then
tecla = "Ñ"
ElseIf .Key_Hit(Key_LShift) Then
'
ElseIf .Key_Hit(Key_MinorMajor) Then
tecla = "<"
ElseIf .Key_Hit(Key_Minus) Then
tecla = "?"
ElseIf .Key_Hit(Key_Z) Then
tecla = "Z"
ElseIf .Key_Hit(Key_X) Then
tecla = "X"
ElseIf .Key_Hit(Key_C) Then
tecla = "C"
ElseIf .Key_Hit(Key_V) Then
tecla = "V"
ElseIf .Key_Hit(Key_B) Then
tecla = "B"
ElseIf .Key_Hit(Key_N) Then
tecla = "N"
ElseIf .Key_Hit(Key_M) Then
tecla = "M"
ElseIf .Key_Hit(Key_Comma) Then
tecla = ","
ElseIf .Key_Hit(Key_Period) Then
tecla = "."
ElseIf .Key_Hit(Key_SysRQ) Then
' tecla= "Impr pant/Pet Sis"
ElseIf .Key_Hit(Key_Space) Then
tecla = " "
ElseIf .Key_Hit(Key_Delete) Then
'suprimir
texto = Mid(texto, 1, Len(texto) - 1)
ElseIf .Key_Hit(Key_Back) Then
'retroceso
texto = Mid(texto, 1, Len(texto) - 1)
End If
End With
'guardamos el resultado
texto = Mid(texto + tecla, 1, l_texto)
End Sub
Yo esperaria a la nueva version de la libreria por la incursion de una funcion que te devuelve el ASCII de la ultima tecla presionada, lo que te ahorrara el tocho de codigo mediante Key_Hit que he visto arriba en el textBox xDDD
Cuando tenga un ratejo esta tarde si me es posible los pruebo y si me lo permites les hare un par de modificaciones ;)
Salu2...
Cita de: "[EX3"]Yo esperaria a la nueva version de la libreria por la incursion de una funcion que te devuelve el ASCII de la ultima tecla presionada, lo que te ahorrara el tocho de codigo mediante Key_Hit que he visto arriba en el textBox xDDD
Cuando tenga un ratejo esta tarde si me es posible los pruebo y si me lo permites les hare un par de modificaciones ;)
Salu2...
lo de las teclas lo pillé del ejemplo1 del input (una tanda seguidita de replaces y medio trabajo exo xD), la verdad que es un coñazo que no exista la función para el cambio a ascii ... xD
las modificaciones serán de agradecer xD
los controles son muy básicos pero ya sirven de base para ir añadiendo cosillas,
el verdadero problema esta en que VB6 no tiene herencia y por cada botón que queramos que haga una cosa diferente habrá que tener una clase diferente (o una muy tocha y con un switch enorme xD)
Cita de: "RobiHm"las modificaciones serán de agradecer xD
los controles son muy básicos pero ya sirven de base para ir añadiendo cosillas
ferPecto pues :) La verdad al menos como base me vendran de lujo ya que mas adelante (dentro de eones me temo :P) tendre que implementar algo similar para los menus del juego.
Cita de: "RobiHm"el verdadero problema esta en que VB6 no tiene herencia y por cada botón que queramos que haga una cosa diferente habrá que tener una clase diferente (o una muy tocha y con un switch enorme xD)
Una y no mas :P Yo en la campus ya sufri (no mas que SiPoX y Shephiroth xDD) la falta de herencia y la flexibilidad que brinda la orientacion a objetos (hasta que programas en serio y de forma compleja no lo hechas en falta) cuando la compo 72h que se hizo y en algunas ocasiones desarrollando algun modulo concreto de mi juego. Por ello finalmente lo estoy desarrollando en Visual Basic .NET (me hubiera gustado C# pero dx_lib32 no se lleva bien con el :?).
Salu2...
yo de momento no tengo grandes problemas con la librería y poco a poco voy tomandole el pulso, el proyecto que ando haciendo es ya bastante decentillo y aunque tiene sus limitaciones va dando sus frutos xD
uno de los problemas que más quebraderos de cabeza me ha dado dx_lib32 es el tema de que los gráficos deban de ser potencias de a 2 o se ven borrosos, he estado pensando en hacer un módulo que filtre los gráficos a cargar y según sus dimensiones lo divida en gráficos más pequeños (potencias de 2) y subirlos por separado, no se si tenías pensado solventarlo en la próxima versión me gustaría saberlo para hacer o no hacer el módulo
Cita de: "RobiHm"uno de los problemas que más quebraderos de cabeza me ha dado dx_lib32 es el tema de que los gráficos deban de ser potencias de a 2 o se ven borrosos, he estado pensando en hacer un módulo que filtre los gráficos a cargar y según sus dimensiones lo divida en gráficos más pequeños (potencias de 2) y subirlos por separado
A mi me viene de lujo que haga suavizados ya que es algo que buscaba en su dia hacer desde DirectDraw y que aparte yo suelo trabajar con graficos de tamaño regular a excepciones de fondos y poco mas, generalmente si uso tiles estos son de potencia de 2 al igual que los sprites.
La idea o metodo que propones es justo el que
Loover sabiamente implemento en su libreria, que solventa a la perfeccion este tema de los tamaños irregulares (esta hecho un crack :)). La verdad es que si te acabas haciendo un modulo para esto seria interesante como plugin o añadido para trabajar la libreria, todo lo que sean mejoras aunque sean externas son siempre bienvenidas.
Cita de: "RobiHm"no se si tenías pensado solventarlo en la próxima versión me gustaría saberlo para hacer o no hacer el módulo
Va a ser que no :P La proxima release, la 2.2.0, es final de trayecto del proyecto y solo se limita a dejar resuelto los pequeños bugs que quedan y optimizando dentro lo posible lo ya implementado (de ahi que lleve un año de demora en sacar esta version, no quiero dejar bugs sueltos). Practicamente desde que salio la version 2.0 no se han desarrollado grandes implementaciones en la libreria, mas bien pulir lo existente con pequeños añadidos para dejarla lo mas funcional posible (sinceramente, llevo cerca de 5 años dedicados exclusivamente a la libreria cuando en verdad yo que pretendo desde hace 7 es hacer un juego, no mas motores ni librerias por hoy, gracias xD)
Salu2...
Hola, el segundo elnace, el de los textbox no esta disponible, es decir dice que el servidor a donde lo has subido lo ha borrado por inactividad.
Lo que subistes, el el codigo exactamente puesto en el segundo post?
Muchas gracias por el trabajo que has hecho