Programación General > Delphi
Matriz De Imágenes
Amilius:
--- Cita de: "Danielo" --- ...Luego me dices que coloque un Tpaintbox en el formulario y en la propiedad OnPaint pinte los bitmas en la posición que quiera (¿?), esto último no tengo idea de como hay que hacerlo. Además no entiendo como con un solo Tpaintbox puedo mostrar todas las imágenes bmp.
...
--- Fin de la cita ---
Para pintar:
miTpaintBox.canvas.draw();
En delphi existe un tab de properties para asignar a un evento como onPaint la función que quieras que se ejecute para responder al evento.
Un evento como "OnPaint" es similar a una variable, pero del tipo función de objeto que recibe ciertos tipos de parámetros.
Danielo:
Gracias Amilius...
Finalmente logré cargar un bmp en un TPaintBox!! :rolleyes:
--- Citar ---En delphi existe un tab de properties para asignar a un evento como onPaint la función que quieras que se ejecute para responder al evento.
--- Fin de la cita ---
En Lazarus también está el tab de propiedades, eso es lo que me faltaba para cargar el bmp.
Lo que veo es que al igual que con los TImage, con los TBitmap no escapo de asignarlos uno por uno a la matriz que contendrá las fichas :(
:hola: Salu2...
Enko:
La cosa es que no necesitas una matriz de imagenes para tu juego.
Primero que tu matriz debería ser de byte o algo así:
--- Código: Text --- Matriz: array[0..3,0..3] of Byte;
Luego necesitarias un procedimieto que te inicialize la matriz, digamos, ponga todas las cadenas de las imagenes de a pares ordenadas de alguna forma, todavia sin mezclar.
--- Código: Text --- procedure InicializarMatriz;begin Matriz[0,0] := 1; Matriz[0,1] := 1; Matriz[0,2] := 2; Matriz[0,3] := 2;end; Por supuesto que es mejor que lo hagas con un ciclo :rolleyes:
Luego necesitarias un procedimiento simple que te mezcle la matriz.
Tambien necesitar'ias un procedimiento que te cargue todas las imagenes
Pero para eso necesitar'ias un arreglo con todas las imagenes
--- Código: Text --- Imagenes: array[1..MAX_IMG] of TBitmap;
--- Código: Text --- procedure cargarImagenes;var iCount : integer;begin for i:=1 to MAX_IMG do begin Imagenes[iCount] := TBitmap.Create; Imagenes[iCount].LoadFromFile('NombreImagen' + IntegerToString(i) + '.bmp'); end;end; Tus imagenes deber'ian llamarse NombreImagen1.bmp, NOmbreImagen2.bmp, etc....
Supondr'e que las imagenes son cuadradas...
Y finalmente, uno quien te la imprima que ser'ia algo asi:
--- Código: Text --- procedure ImprimirMatriz;var iCount, jCount: integer;begin for jCount := 1 to MAX_CELL do for iCount := 1 to MAX_CELL do PaintBox.Canvas.Draw(iCount*IMG_WIDTH, jCount*IMG_WIDTH, Imagenes[Matriz[iCount, jCount]]);end;
Por supuesto que te har'ia falta todo lo que es la jugada pero no necesariamente necesitas matriz de imagenes.
Enko:
Lastima que Lazarus no posee el TDrawgrid ya que este posee un metodo que te devuelve en que celda el usuario hizo clic, algo indispensable para vos.
Igualmente ese procedimiento lo podr'ias hacer vos mismo, es tan solo recalcular segun la X,Y del raton, en que imagen se hizo clic.
Esto es proque en realidad la imagen es una sola compuesta de muchas imagenes.
Deberia ser algo asi:
--- Código: Text --- procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin CeldaX := X div IMG_WIDTH; CeldaY : Y div IMG_WIDTH;end; ahora que lo veo, no hay problema con eso.
Danielo:
:good: Muchas Gracias, Enko!!
Muy buena la explicación, gracias al código que escribiste ahora entiendo y de hecho he logrado cargar en un TBitmap varias imágenes, o sea las fichas de colores... por supuesto despliego la matriz de fichas teniendo en cuenta los valores numericos previamente cargados en otra matriz cuyos elementos son enteros (de tipo byte).
En el procedimiento de cargar imágenes me queda una pequeña duda :blink: y es sobre la ruta desde la cual se cargarán las imágenes. Recuerdo que en visual basic existe el app.path que retorna un string con la ruta en que se encuentra el programa, en Delphi existe algo parecido???
Continuando con el procedimiento de cargar imágenes, otra alternativa que encontré fue cargarlas todas en un TImageList (en lugar de utilizar un array de TBitmaps), que es una especie de arreglo dinámico de imágenes en el que a cada una se le asigna un índice, de esa forma no es necesario cargarlas de un directorio y ademas luego de compilado el programa las imágenes quedan embutidas en el ejecutable. Otra ventaja es que en el TImageList (de Lazarus) puedo cargar imagenes de varios tipos (ico, ppm, pgm, pbm, png, xpm, bmp).
Entonces, con lo anterior el procedimiento de Imprimir la matriz quedaría así:
--- Código: Text --- procedure ImprimirMatriz;var iCount, jCount: integer;begin for jCount := 1 to MAX_CELL do for iCount := 1 to MAX_CELL do imagelist.Draw(PaintBox.Canvas,iCount*IMG_WIDTH,jCount*IMG_WIDTH,Matriz[iCount,jCount]); end;
Buenísimo el procedimiento para calcular las coordenadas de la imágen en que se hizo clic!! funciona fenomenál!!... ignoraba que se pudiese hacer algo así.
En cuanto al TDrawgrid... :brickwall: al final descubrí que existe en Lazarus :( (más vale tarde que nunca) está en la Ficha Additional, no lo he probado aún pero imagino que habrá alguna manera quitarle la apariencia de tabla.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa