Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   ayuda , que las imagenes no se superpongan ?? (https://www.clubdelphi.com/foros/showthread.php?t=64270)

Mindfield 25-03-2009 04:53:00

ayuda , que las imagenes no se superpongan ??
 
hola tengo este codigo
Código Delphi [-]
  if contador < 15 then
    begin
      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image2.Top := t;
        Image2.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image3.Top := t;
        Image3.Left:= l;
      end;

      begin
        Image4.Top := t;
        Image4.Left:= l;
      end;

como puedo hacer para que no se esconda una imagen con otra , oscea que las coordenadas no sean parecidas , porque aveces se superponen !

gracias

Neftali [Germán.Estévez] 25-03-2009 09:30:26

¿Puedes explicar unpoco más lo que estás haciendo? ¿Dar una visión más general del problema?

¿Estás moviendo imágenes?:confused::confused::confused:

Mindfield 26-03-2009 00:45:38

si Neftali ! perdòn si no se entendio ! , lo que estoy buscando es que una serie de imagenes aparezca en un form pero que estas imagenes aparezcan de forma indefinida ! o random ! , pero el problema surge que al hacer esto algunas imagenes quedan arriba de otras y no se ven !! como puedo hacer para usar un random y que las imagenes tengan una posicion en la pantalla de forma indefinida pero que ninguna tenga la misma posicion de otra ?? , si no se entiende lo vuelvo a explicar y mando todo el codigo !

Neftali [Germán.Estévez] 26-03-2009 10:40:32

Hola. Ahora ha quedado un poco más claro. Pues sólo se me ocurre que lo hagas de forma manual. Es decir, para cada imagen que creas, debes guardarte la posición X,Y y el tamaño (Hith y Height) y cuando calcules el Random de una nueva imagen compruebes si tienes colisiones con la que ya hay creadas (con esos 4 valores debería bastarte). Si te da colisiones, puedess descartar el valor y calcular uno nuevo.

Mindfield 27-03-2009 00:09:20

Bueno gracias Neftali voy a tenerlo en cuenta cuando este escribiendo el codigo ! pero soy nuevo en esto y no se como arrancar jeje si tengo complicaciones vuelvo a escribir !

Mindfield 27-03-2009 00:26:49

perdon este es el codigo
Código Delphi [-]
begin
  contador := contador + 1;
  t:= 0;
  l:= 0;
  if contador < 15 then
    begin
      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image2.Top := t;
        Image2.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image3.Top := t;
        Image3.Left:= l;
      end;

      begin
        Image4.Top := t;
        Image4.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image5.Top := t;
        Image5.Left:= l;
      end;

      begin
        Image6.Top := t;
        Image6.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image7.Top := t;
        Image7.Left:= l;
      end;

      begin
        Image8.Top := t;
        Image8.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image9.Top := t;
        Image9.Left:= l;
      end;

      begin
        Image10.Top := t;
        Image10.Left:= l;
      end;

      For t:= 0 to Random(372) do;     //top 0 a 372
      For l:= 0 to Random(575) do;    //left 0 a 575
      begin
        Image11.Top := t;
        Image11.Left:= l;
      end;
    end;

pero yo no quiero que una imagen este en la misma posicion que otra y si lo verifico las posiciones con un if es correcto ? , y tambien pedir perdón porque no estoy creando imagenes , las imagenes ya estan en el image ! , no se si sirve de algo lo que estoy diciendo ?

Caro 27-03-2009 01:54:24

Hola, como te ha indicado Neftali debes guardar los datos que obteniendo con el random, paar ello podrías crearte tu estructura y almacenarlo en un TObjectList, así cada ves que quieras ver si alguno de tus valores ya estuvieran recorres tu lista y verificas. Otra cosita nose porque estas utilizando dos for si al final le asignas a Top y Left el valor del Random, si objetivo es buscar un random en un rango entonces puedes utilizar RandomRange, mas o menos así quedaría tu codigo.

Código Delphi [-]
  TCoordenadas = class
  private
   Imagen  : String;
   X,
   Y,
   aWith,
   aHeigth : Integer;
  public
  end;

 ...................
 uses Contnrs;
 ...................................
    Coordenadas  : TCoordenadas;
    Lista        : TObjectList;
 ....................................
 
procedure Guardar(aImagen : TImage);
begin
 With Coordenadas Do
  begin
   Imagen := aImagen.Name;
   X := aImagen.Left;
   Y := aImagen.Top;
   aWith := aImagen.Width;
   aHeigth := aImagen.Height;
  end;
 Lista.Add(Coordenadas);
end;

procedure PosicionarImagen(aImagen : TImage);
var
 aTop, aLeft : Integer;
begin
 //esto reemplazaría a tus for
 aTop := RandomRange(0, 372);
 aLeft := RandomRange(0, 575);
 
 aImagen.Top := aTop;
 aImagen.Left:= aLeft;
end;

//teniendo el procedimiento de arriba solo llamas con los Image que tienes
procedure TForm1.Button1Click(Sender: TObject);
begin
 Lista.Clear; //Paar limpiar nuestra lista
 PosicionarImagen(Image1);
 PosicionarImagen(Image2);
 PosicionarImagen(Image3);
 PosicionarImagen(Image4);
end;

lo que faltaría es recorrer la lista cada ves que encuentre un random y verificar si hay colisiones, si lo hay calcular otro random.

Saluditos

Mindfield 27-03-2009 02:45:54

Hola caro ! dos cosas la primera Muchas gracias ! y la segunda que te acompaño en el sentimiento ! , cuando leo estas cosas me hace acordar a un ser muy querido que no tengo hace 22 años y que sufri mucho su perdida

Caro 27-03-2009 14:08:16

Cita:

Empezado por Mindfield (Mensaje 342890)
.... la segunda que te acompaño en el sentimiento ! , cuando leo estas cosas me hace acordar a un ser muy querido que no tengo hace 22 años y que sufri mucho su perdida

Muchas gracias Mindfield, cuando sientes mucho por uno de tus seres queridos y se te va, es muy dificil creer que lo has perdido, los recuerdos pasan muy seguido y la tristeza nuevamente, talvez porque solo han pasado 2 semanas. Pero debemos seguir adelante porque todavía nos quedan muchos otros seres queridos con los que debemos aprovechar cada minuto que estemos junto a ellos.

Saluditos y gracias de nuevo.

Davidcfres 27-03-2009 15:46:37

no entiendo bien el problema, pero has intentado eso ?

ImageX.transparent := TRUE;
ImageX.transparentColor := clWhite; // o otra...

David

Mindfield 28-03-2009 01:56:42

Hola caro ! , cuando necesites contencion o charlar sobre esas cosas que uno no quiere que pasen y nos hace mal , no dudes en escribir ! , este foro es como una gran familia ! y yo soy miembro de esta gran familia !

saludos !

con respecto a la respuesta de Davidcfres ,
ImageX.transparent := TRUE; // esto hace que la imagenx sea trasparente ya que esta en true o verdadero en español pero no encuentro ningun codigo en este momento como para darte un ejemplo , es mas no se si realmente tiene valides !

ImageX.transparentColor := clWhite; // y este codigo tal cual lo escribiste no se puede usar ! creo jeje , yo no conozco mucho del tema tampoco ! je

Davidcfres 01-04-2009 17:36:46

:)
 
Vale, lo siento por mi ultima repuesta...

eso es una solucion



Código Delphi [-]
uses types;
procedure TForm4.Button1Click(Sender: TObject);
  function PositionValide(ImageRect:TRect; Liste:TObjectList):boolean;
  var
    i : integer;
    tmpRect : TRect;
    Unused : TRect;
  begin
    result := true;
    i := 0 ;
    while ( i < Liste.count ) and result do
    begin
      tmpRect := TImage(Liste[i]).BoundsRect;
      result := not(IntersectRect(Unused, tmpRect, ImageRect));
      inc(i);
    end
  end;
var
  nbImage : integer;
  tmpImage : TImage;
  ImageListe : TObjectList;
  i : integer;
begin
  nbImage := 20;
  ImageListe := TObjectList.Create(false);
  For i := 0 to nbImage-1 do
  begin
    tmpImage := TImage.Create(self);
    tmpImage.Picture.LoadFromFile('C:\Documents and Settings\David\Mes documents\Mes images\erreur.bmp');
    repeat
      tmpImage.Left := random(self.ClientWidth - tmpImage.Width);
      tmpImage.Top := random(self.ClientHeight - tmpImage.Height);
    until PositionValide(tmpImage.BoundsRect , ImageListe);
    tmpImage.Parent := self;
    ImageListe.Add(tmpImage);
    application.ProcessMessages;
  end;
 
  freeAndNil(ImageListe);
end;


La franja horaria es GMT +2. Ahora son las 02:36:20.

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