Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2004
astur_racing astur_racing is offline
Miembro
 
Registrado: ago 2004
Posts: 12
Poder: 0
astur_racing Va por buen camino
¿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.
Responder Con Cita
  #2  
Antiguo 12-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 12-08-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.265
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 12-08-2004
astur_racing astur_racing is offline
Miembro
 
Registrado: ago 2004
Posts: 12
Poder: 0
astur_racing Va por buen camino
Muchas gracias a los dos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:49:34.


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
Copyright 1996-2007 Club Delphi