|
|
March 28 Las clases y las estructuras aparentemente son iguales, ambas pueden contener miembros los cuales son campos y métodos, ambos requieren de un constructor para crear una instancia de ellos mismos y como todo en .NET, heredan de la clase Object. La principal diferencia entre las clases y estructuras es que las clases son del tipo referencia y las estructuras del tipo valor. En un nivel más bajo, las clases son alojadas en el heap, mientras que las estructuras en el stack. El stack fue diseñado para tener un acceso ligero y rápido a la información, sin embargo, el amontonamiento de datos en el stack puede reducir el rendimiento de la aplicación considerablemente. Quieres ver el artículo completo visita: --> Mi Página <-- March 15 Para ver este artículo haz click aqui Gracias a Todos los que han visitado este espacio... Tú formas parte de los: Visitantes...Gracias. (No olvides dejar tus comentarios)
March 10 Hola de nuevo, en esta sección se finalizará Region "Métodos para fragmentar imagen", Iniciemos. e) Método Cerrar() Éste método lo menciono rápido pues no es muy relevante; al llamarlo finalizará el programa | Sub Cerrar() 'Es importante mencionar que no podemos llamarlo de esta forma: form1.Close(), debido a la POO Me.Close() End Sub | f) Método Revolver() Este código nos permitirá pasar las imágenes que tenemos en el rompecabezas a los pictures partes y revolverlos, de manera que se hará un revolvedero de imágenes. jeje | Nota: A lo que me refiero cuando digo rompecabezas es a los pictures donde esta la imagen completa, es decir, los 16 pictures Pos | El algoritmo es sencillo: - 1.- Cambiamos imágenes de pos0 a parte0, pos1 a parte1....etc
- 2.- Almacenamos las coordenadas de parte0, parte1, ...
- 3.- Utilizamos random para intercambiar las coordenadas de parte0, parte1...etc
| Nota: La palabra Handler indica a qué control se le asigna el evento (en palabras sencillas), es como un acceso directo al control para que ejecute "x" evento y addressof le da la dirección. ejemplo: La instrucción: AddHandler Posiciones(i).DragDrop, AddressOf Pos0_DragDrop Indica que el control posiciones(i) puede ejecutar DragDrop, y AddressOf le dice donde está ese evento, es decir, lo tiene Pos0. Sin embargo, esto no permite saber que control de los 16 posibles (16 pictures), ejecutó tal evento, para eso veremos más adelante la instrucción DirectCast | El Código | Sub Revolver() 'Creamos una matriz de los pictures donde colocaremos las imágenes fraccionadas para revolver Dim Partes() As PictureBox = {Parte0, Parte1, Parte2, Parte3, Parte4, _ Parte5, Parte6, Parte7, Parte8, Parte9, _ Parte10, Parte11, Parte12, Parte13, Parte14, Parte15} 'Creamos una matriz de los pictures donde están y donde colocaremos las partes de la imagen 'que forman el rompecabezas Dim Posiciones() As PictureBox = {Pos0, Pos1, Pos2, Pos3, Pos4, Pos5, _ Pos6, Pos7, Pos8, Pos9, Pos10, Pos11, _ Pos12, Pos13, Pos14, Pos15} Dim px(15) As Integer 'Para almacenar left Dim py(15) As Integer 'Para almacenar top Dim l(15) As Boolean 'Para saber cuantas imagenes hemos revuelto For i As Byte = 0 To 15 'Para mostrar los 16 pictures Posiciones(i).BorderStyle = BorderStyle.FixedSingle 'intercambiar imagenes Partes(i).Image = Posiciones(i).Image 'Quitar la imagen del rompecabezas Posiciones(i).Image = Nothing 'Permitir el arrastre Posiciones(i).AllowDrop = True 'Almacenamos datos: left y top px(i) = Partes(i).Left py(i) = Partes(i).Top 'Ponemos todos en Falso l(i) = False 'Debido a que el usuario puede revolver imagenes a pesar de haber iniciado el juego, 'se tiene que verificar cuales están fuera del rompecabezas para... If i > 0 And nUndo = 0 Then '...indicarle que posicion(x) debe hacer lo mismo que pos0_dragdrop AddHandler Posiciones(i).DragDrop, AddressOf Pos0_DragDrop '...indicarle que posicion(x) debe hacer lo mismo que pos0_dragenter AddHandler Posiciones(i).DragEnter, AddressOf Pos0_DragEnter '...indicarle que partes(x) debe hacer lo mismo que parte0_mousedown AddHandler Partes(i).MouseDown, AddressOf Parte0_MouseDown '...indicarle que partes(x) debe hacer lo mismo que parte0_mousemove AddHandler Partes(i).MouseMove, AddressOf Parte0_MouseMove 'de lo contrario tendríamos que hacer un código para cada picture End If Next Dim indice As Integer Dim j As Integer = 0 Dim Listos As Integer = 0 While Listos < 16 'Para revolver los 16 pictures Do indice = rand.Next(0, 15) Loop While l(indice) 'No permite que se repita un random l(indice) = True 'Pone en True para que no repita el mismo picture Listos += 1 '16?, finaliza While Partes(j).Top = py(indice) '16 posiciones posibles Partes(j).Left = px(indice) '16 posiciones posibles j += 1 End While End Sub #End Region 'Por fin finaliza este Region | Bien, Nos vemos en la cuarta Sección de Roompecabezas, veremos Region "Roompecabezas", donde tenemos los métodos para arrastrar las imagenes, calcular la posición, entre otrs. C IU March 07 Region: Métodos para agregar la imagen y fragmentarla Realmente esto es muy sencillo, este programa lo realicé con las bases de programación y no con las bases de conocimiento de VB 2005, por ejemplo: el método setpixel es conocida desde el famoso lenguaje estructurado C, seguramente existirá alguien que conozca un método en VB mejor que este, sin embargo, para cuestiones educativas, este programa me parece excelente. a) El Método Abrir() Utiliza un OpenFileDialog para abrir una imagen, sin embargo, el control es agregado en tiempo de ejecución, quizá esto nos ahorre un poco de memoria. El código: #Region "Métodos para agregar imagen y fragmentarla" Sub Abrir() 'No es necesario agregar el Control, podemos declararlo desde aqui Dim Abrir As New OpenFileDialog With Abrir 'Titulo del Cuadro de dialogo .Title = "Buscar Imagen" 'Filtro para el tipo de imágenes que se muestran .Filter = "Archivos de Imagen|*.bmp;*.jpg;*.gif" 'Esto es importante, para controlar el botón Cancelar If .ShowDialog = Windows.Forms.DialogResult.OK Then Pinta_Cuadro(.FileName) 'Se verá más adelante Fraccionar_Imagen() 'Se verá más adelante End If End With End Sub | b) El Método Pinta_Cuadro() Genera un nuevo bmp con la imagen que seleccionó el usuario, lo guarda con un tamaño de 400x400 en un archivo temporal llamado: bmptemporal.bmp El código: Private Sub Pinta_Cuadro(ByVal filename As String) 'Creamos el Objeto Gráfico, la variable g ya la declaramos en region Variables If g Is Nothing Then g = ObjetoGrafico()'Este método viene más abajo 'En el método DrawImage almacenamos la imagen y le damos el tamaño utilizando el picture: Picimagen g.DrawImage(New Bitmap(filename), New Rectangle(0, 0, picImagen.Width, picImagen.Height)) 'Se salva la imagen en el archivo temporal picImagen.Image.Save(Application.StartupPath & "\bmptemporal.bmp") 'Se guarda la dirección de la imagen seleccionada en el Tag picImagen.Tag = filename 'Sino se invalida el grafico del picture no se dibujará la nueva imagen picImagen.Invalidate() End Sub | c) El Método ObjetoGrafico() En este método creamos el bmp, el cual ponemos al picImagen, creamos un grafico del nuevo bmp y lo retornamos a la variable g del método anterior, por eso podemos manipular la imagen que seleccionó el usuario, y guardar el archivo temporal con extensión .bmp El código: | Private Function ObjetoGrafico() As Graphics 'Creamos un mapa de bits con las dimensiones del picture PicImagen Dim bmp As Bitmap = New Bitmap(picImagen.Width, picImagen.Height) 'Colocamos el nuevo mapa de bits en PicImagen picImagen.Image = bmp 'creamos el objeto gráfico utilizando el bmp, esto permite convertir la imagen a un bmp Dim dibujo As Graphics = Graphics.FromImage(bmp) Return dibujo End Function | d) El Método Fraccionar_Imagen() Ésta, es quizá, la parte más importante de este programa, ya que permite dividir la imagen en partes, en este caso: 16 partes de 100x100. El algoritmo es sencillo, primero se lee la imagen que guardamos con el nombre de "bmptemporal.bmp" y lo almacenamos en un bitmap, enseguida, recorremos con un foreach los pictures que están dentro de Panel1, leemos lo que tienen en propiedad Tag y utilizamos Split para separar las cadenas y saber en qué picture estamos, enseguida, de acuerdo al número obtenido le damos la dimensiones o las coordenadas para obtener la fraccion adecuada. Una vez obtenidas las coordenadas, recorremos esa parte de la imagen temporal con GetPixel, y al mismo tiempo lo guardamos en el picture adecuado con SetPixel. Eso es todo, realmente sencillo. El código: | Sub Fraccionar_Imagen() 'Disimulamos el algoritmo, no queremos que el usuario vea una imagen sin sentido picImagen.Visible = False 'leemos el archivo temporal Dim bmp As New Bitmap(Application.StartupPath & "\bmptemporal.bmp") Dim i As Long, iIn As Long 'Coordenadas Dim j As Long, jIn As Long 'Coordenadas Dim Control As PictureBox ' Para recorrer los controles con el foreach Dim nombre As String 'Se almacena el nombre Dim pos As Integer ' Dim color As Color 'Para almacenar el color del Pixel al usar GetPixel Panel1.Cursor = Cursors.AppStarting 'Ponemos el cursor en estado de Loading... Me.Cursor = Cursors.AppStarting 'Ponemos el cursor en estado de loanding... 'Este label coloca un texto para indicarle al usuario que estamos fragmentando la imagen Label2.Visible = True 'Inicia el Foreach For Each Control In Panel1.Controls 'Es importante indicarle que se trata de los controles de Panel1 'Separamos la cadena que almacenamos en la porpiedad Tag, regresen al primer artículo en la parte 'de introducción para que lo chequen, si quieren claro nombre = Control.Tag.ToString.Split(":".ToCharArray)(0) 'Esto es importante, aqui sabemos que picture tenemos, y tambien que parte de la imagen 'se colocará en este picture pos = Convert.ToUInt32(Control.Tag.ToString.Split(":".ToCharArray)(1)) 'Esto es para que no se muestre como se va colocando la imagen Control.Visible = False 'Una vez que sabemos que picture tenemos, damos las coordenadas adecuadas Select Case pos Case e 0 : iIn = 0 : jIn = 0 Case 1 : iIn = 0 : jIn = 100 Case 2 : iIn = 0 : jIn = 200 Case 3 : iIn = 0 : jIn = 300 Case 4 : iIn = 100 : jIn = 0 Case 5 : iIn = 100 : jIn = 100 Case 6 : iIn = 100 : jIn = 200 Case 7 : iIn = 100 : jIn = 300 Case 8 : iIn = 200 : jIn = 0 Case 9 : iIn = 200 : jIn = 100 Case 10 : iIn = 200 : jIn = 200 Case 11 : iIn = 200 : jIn = 300 Case 12 : iIn = 300 : jIn = 0 Case 13 : iIn = 300 : jIn = 100 Case 14 : iIn = 300 : jIn = 200 Case 15 : iIn = 300 : jIn = 300 Case Else Exit Sub End Select 'Un bmp auxiliar Dim bmpP As New Bitmap(Control.Width, Control.Height) 'Inicia el recorrido de la imagen en las coordenadas adecuadas For i = iIn To iIn + 99 My.Application.DoEvents() 'Indispensable, de lo contrario se quedará "bloqueado" el programa For j = jIn To jIn + 99 My.Application.DoEvents() 'Indispensable, de lo contrario se quedará "bloqueado" el programa color = bmp.GetPixel(j, i) 'Obtenemos el pixel bmpP.SetPixel(j - jIn, i - iIn, color) 'Colocamos el pixel en el bmp auxiliar Next Next Control.Image = bmpP 'Ahora colocamos la imagen en el picture Next Panel1.Cursor = Cursors.Default 'Finalizando la fragmentación, colocamos el cursor en estado normal Me.Cursor = Cursors.Default 'Finalizando la fragmentación, colocamos el cursor en estado normal Label2.Visible = False 'quitamos el mensaje de fragmentando imagen For Each Control In Panel1.Controls 'Recorremos una vez mas los pictures para hacerlos visibles Control.Visible = True Next End Sub | | NOTA: Aquí finaliza la 2da parte, en la tercera finalizaremos este Region, con los métodos cerrar() y Revolver(), hasta aquí ya puedes correr el programa, recuerda entonces colocar el #End Region, pues yo lo tengo hasta finalizar los 2 métodos que acabo de mencionar. Los errores que encontrarás son de sintaxis, quisiera decir que los coloqué a propósito, pero no es así, de por sí ya es difícil colocar el código con todo y colores, revisar si lo escribí bien, te toca a ti. | March 04 ¿Cómo hacer un rompecabezas con conocimientos básicos?
OJO -> Consulta éste ártículo en: http://emanuelliralozada.googlepages.com/home
Ok. Esta vez les presento un programa para todos aquellos amantes de la programación y para los que no, también.
|
Nota:
- Este artículo estará dividido en por lo menos 5 partes
- Está desarrollado en Visual Basic 2005
- Por supuesto que debes tener en caso de XP el SP2, si tienes Windows Vista, no hay problema.
- No sólo aprenderás a realizar un sencillo rompecabezas, este programa contiene código que tiene un nivel, digamos: Intermedio avanzado. Cuando el subtitulo dice "conocimientos básicos", me refiero a manejo de imágenes.
|
Introducción:
A continuación explico brevemente lo que realiza este programa y al mismo tiempo lo que vamos a necesitar:
- Le da al usuario la opción de elegir una imagen utilizando el control OpenFileDialog y la coloca dentro de un picture con las siguientes propiedades:
- name: PicImagen
- size: 400, 400
- location: donde quieras
- Sizemode: StretchImage
- La imagen se redimenciona a un tamaño "standard" de 400x400
- La nueva imagen (de 400x400), se fracciona en 16 partes de 100x100
- Cada fracción es redibujada en un picture, por lo tanto debes colocar un control panel en tu form y dentro del panel 16 pictures con las siguientes propiedades:
- Panel:
- name: panel1
- size: 434, 434
- location: "la que quieras" yo coloque, 10, 30
- Pictures:
- name: pos0, pos1,..., pos15 (recuerda que son 16 pictures, de 0 a 15)
- size: 100, 100 (para los 16)
- location: 8,8 (solo para el picture Pos0, los demás los colocaremos con código, de lo contrario puedes colocarlos de tal forma que formen una matriz de 4x4)
- tag: pos:0, pos:1,..., pos15(para el picture Pos0, pos:0; para el Pos1, pos:1; etc)
- Revuelve aleatoreamente los 16 pictures y los coloca en "otros" pictures, con las siguientes propiedades:
- name: Parte0, Parte1, ..., Parte15 (recuerda que son 16 pictures, de 0 a 15)
- size: 100, 100 (para los 16)
- location: donde quieras (Yo forme otra matriz de 4x4)
- tag: parte:0, parte:1,..., parte:15(para el picture Parte0, parte:0; para el Parte1, parte:1; etc)
- Ofrece la opción de Deshacer Movimiento, para que el usuario regrese la última imagen colocada
- Finalmente, cuando finaliza los 16 movimientos posibles, le muestra al usuario como fue colocando las imágenes, y también si lo hizo de la forma correcta
- El programa lo he dividido en 5 Regiones:
- Region: Variables
- Region: Inicio
- Region: Métodos para agregar y fragmentar la imagen
- Region: Rompecabezas
- Region: Menú y form (Esta parte es donde tu decides la forma de tu presentación, en mi caso utilicé Menús que se encargan de llamar a los métodos).
Region 1: Variables
Esta parte contiene la declaración de variables, no hay mucho que explicar así que sin ningún obstáculo les muestro el código:
|
Nota: Recuerda que las variables deben ir después del: Class Form1 |
El código:
#Region "Variables" 'Para controlar los gráficos Dim g As Graphics 'Para revolver las imagenes Dim rand As New Random 'Para verificar si el usuario está arrastrando la imagen Dim Arrastra As Boolean = False 'Para saber cual imagen está moviendo, dónde la coloca y para hacer el método Deshacer Dim miSender(15) As Objects, miOtroSender(15) As Object 'Saber cuantos movimientos a realizado, para saber cuantos undo puede hacer Dim nUndo As Byte = 0 'Para verificar si ya realizó los 16 movimientos posibles Dim Ver As Atring #End Region
Region 2: Inicio
Aquí vamos a colocar los Pictures (Pos0, Pos1,...Pos15) en una matriz de 4x4, podemos aprovechar que lo colocamos dentro del panel para usar un foreach, sin embargo, un foreach no necesariamente los va a colocar en el siguiente orden:
[Pos0 ] [Pos1 ] [Pos2 ] [Pos3 ]
[Pos4 ] [Pos5 ] [Pos6 ] [Pos7 ]
[Pos8 ] [Pos9 ] [Pos10] [Pos11]
[Pos12] {Pos13] [Pos14] [Pos15]
Pues bien, al no usar el foreach, simularemos una matriz de controles como en VB 6.0 (aunque es la primera vez que colaboro, no significa que no tenga tiempo en esto, de echo VB 6.0 ha sido de mis favoritos)
|
Nota: Es recomendable que bajes el exe [click -> Roompecabezas] para que le des una checada de como funciona, y aunque aquí no coloco los comentarios tipo xml, también te recomiendo que los coloques, es muy sencillo pones 3 veces el comentario normal: ''' e inmediatamente, VB te coloca en posición para comentar, además, cuando codificas, esos comentarios los utiliza el intellisense. |
El código:
Método Inicio
#Region "Inicio" Sub Inicio() 'Aqui creamos la matriz de controles Picture Dim Posiciones() As PictureBox = {Pos0, Pos1, Pos2, Pos3, Pos4, Pos5, _ Pos6, Pos7, Pos8, Pos9, Pos19, Pos11, Pos12, Pos13, Pos14, Pos15} 'Colocamos el primer Picture -Posiciones(Pos0)- con borderstyle = none 'Tambien se puede cambiar la propiedad location desde aqui Posiciones(0).BorderStyle = BorderStyle.None 'Este código es clásico desde que aprendes a programar Matrices en lenguajes como c, 'varía un poco, pero sigue siendo el mismo problema Dim j As Integer = 4 'He aqui el código para colocar la matriz de 4x4 For i As Integer = 1 To 15 If i = j Then Posiciones(j).BorderStyle = BorderStyle.None Posiciones(j).Top = Posiciones(j - 4).Top + Posiciones(j - 4).Height j += 4 Else Posiciones(i).BorderStyle = BorderStyle.None Posiciones(i).Left = Posiciones(i - 1).left + Posiciones(i - 1).Width Posiciones(i).Top = Posiciones(i - 1).Top End If Next End Sub #End Region Bien, aquí finaliza esta primera parte, en la segunda veremos la parte de Región 3: "Fragmentar Imagen".
March 02 Hola a mis compañeros, hola a mis amigos, hola reverendos,
a mis profesores y lectores, camaradas y a mis valedores;
en este momento, como todo gran evento les presento:
"¡¡¡Explosión!!!, aquí empiezan las crónicas del blog de Emanuel"
La Graduación, mucha emoción y satisfacción al saber
que esta generación, tenía como misión el crecer,
inicia, participación en el conscurso nacional de ingenio y creatividad,
Primero el Local, se logró ganar, en el regional, el 3er lugar.
Investigación, de tecnología, muchas cosas nuevas que aprender
un soñador, lleno de ilusión es José Miguel,
pasión, esfuerzo y anhelo puso al traer
a microsoft, su tecnología y la academic cell, ITESA.net
Discusión, crap, c sharp vs visual basic,
solo por saber quien es el rey, accept it
todo cae por su propia gravity, como un spaghetti
lineas grandes que te enredan, oh reality
ok, give me a new opportunity
y confesaré, who is the only one king
no jokin, pero dame un breve interludio,
el verdadero rey es visual studio.
A mis compañeros los sinceros, a todos mis amigos y enemigos
a mis profesores y lectores, camaradas y a todos mis amores;
en este momento, como aquel que actúa continúa:
"¡¡¡Explosión!!!, las crónicas del blog de Emanuel"
Se pasó rápido el año y el segundo concurso inició
Todo se hiba al caño, para mi el proyecto se acabó
pero como dice Eminem: "do not miss your chance to blow"
y nos fuimos de volón el Wedo, el Rafa y yo
Penalización, directivos del ITESA corrieron a Nayiv
por lo tanto al concurso no pudo acudir
aún así, mis agradecimientos por apoyar a Encrypt
y Thank you for believing all this time, en mí.
too my family, too my aunt efi, too my friend lili
Norma, Wedo, Rafa, Migue, adolfix y también a G
y a todos los que no menciono aquí, sorry to forget y
i am sorry for This whole rap shit.
A mis compañeros los sinceros, a todos mis amigos y enemigos
a mis profesores y lectores, camaradas y a mis nuevos patrones;
en este momento, como buena taquiza finaliza:
"¡¡¡Explosión!!!, las crónicas del blog de Emanuel"...This tale has no end.
|