Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   ¿Como colocar una imagen dentro de otra? (https://www.clubdelphi.com/foros/showthread.php?t=13264)

astur_racing 12-08-2004 00:54:47

¿Como colocar una imagen dentro de otra?
 
Hola, soy un poco nuevo con el Delphi y necesito un poco de ayuda. Estoy haciendo el juego de undir la flota con el Delphi 5, tengo un Timage para representar el mar y 2 TShape, uno para cuando el usuario acierte en el barco y otro para cuando falle, mi pregunta es: ¿Como puedo hacer para que encima del timage aparezca un dibujo (el Timage que representa el mar es un dibujo azul que tiene dibujadas unas celdas, lo que quiero es poner una X en cada celda donde pinche el usuario y no haya un barco y un O donde si exista el barco). Espero haberme explicado bien.
Si es posible ponerme un codigo mas o menos para guiarme un poco.

Muchas gracias a todos.

roman 12-08-2004 02:56:54

A mi de gráficos se me da poco pero si estuviera haciendo algo como lo que explicas comenzaría así:

Para empezar me olvidaría de los TShape y usaría: un TPaintBox para presentar la imagen al jugador y tres TBitmap, uno para guardar la imagen original del mar y otros dos para las figuras de aciertos y fallos y una matriz (un array cuadrado) de enteros para representar en código las celdas de la imagen.

Cada celda de la matriz podría tener uno de tres valores:

0 - Nada (no se ha 'tirado' ahí)
1 - Acierto
2 - Fallo

En el evento OnPaint del TPaintBox copias el bitmap del mar primero y luego los bitmaps de aciertos y fallos sobre las celdas adecuadas según indique la matriz. Algo así como:

Código Delphi [-]
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  I, J: Integer;

begin
  CopiaFondo;
  
  for I := 1 to NumFilas do
    for J := 1 to NumColumnas do
      case Matriz[I, J] of
        1: CopiaCuadro(bmpAcierto, I, J);
        2: CopiaCuadro(bmpFallo, I, J);
      end;  
end;

Claro que la parte difícil es la de las rutinas CopiaFondo y CopiaCuadro. En ambos casos podrías usar el método CopyRect del Canvas del PaintBox que copia parte de otro canvas en él mismo. Este método tiene estos parámetros:

Dest: TRect;
Canvas: TCanvas;
Source: TRect

Dest es la porción sobre la que vas a copiar el otro canvas. En el caso de CopiaFondo abarcaría todo el PaintBox y en el caso de CopiaCuadro abarcaría sólo el rectángulo en tu imagen que corresponda a las coordenadas I, J. Tendrás que calcularlo a partir de las medidas de cada celda.

Canvas es el canvas que contiene la imagen que vas a copiar. En este caso sería el canvas de los TBitmap.

Source es el rectángulo del canvas origen que vas a copiar. En este caso sería un rectángulo que abarque todo el bitmap.

No sé que tan buena o mala sea esta técnica pero es una idea para empezar.

// Saludos

Neftali [Germán.Estévez] 12-08-2004 09:49:32

Cita:

Empezado por astur_racing
Estoy haciendo el juego de undir la flota con el Delphi 5, tengo un Timage para representar el mar y 2 TShape, uno para cuando el usuario acierte en el barco y otro para cuando falle, mi pregunta es: ¿Como puedo hacer para que encima del timage aparezca un dibujo (el Timage que representa el mar es un dibujo azul que tiene dibujadas unas celdas, lo que quiero es poner una X en cada celda donde pinche el usuario y no haya un barco y un O donde si exista el barco).

Hay una forma muy sencilla, y sólo tienes que hacer unos pequeños cambios.
Ya tienes un TImage con el mar, OK.
En lugar de dos TShape, coloca otros dos TImage uno con la X y otro con la O. Los colocas transparentes. TImage2=X TImage3=O
Con éstas tres imágenes ya lo tienes todo.

Para colocar la X sobre el tablero sólo debes hacer lo siguiente:
Código Delphi [-]
  Image1.Canvas.Draw(100, 100, Image2.Picture.Bitmap);
y para colocar la 0, pues algo similar.
Código Delphi [-]
  Image1.Canvas.Draw(100, 100, Image3.Picture.Bitmap);

Lo único que te queda es calcular correctamente las posiciones de visualización, en lugar de 100,100 como está en el ejemplo, tu deberás poner las coordenadas de tu casilla; No debe ser muy difícil.
Una vez que sepas en qué casilla el usuario ha pulsado, debes hacer la llamada con esas coordenadas.

Espero haberme explicado bien.

astur_racing 12-08-2004 20:26:56

Muchas gracias a los dos.


La franja horaria es GMT +2. Ahora son las 19:29:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi