delphi morhuhn

Programovacie jazyky, rady, poradňa...
nitr0
Medium Expert
Medium Expert
Príspevky: 123
Registrovaný: 08 sep 2007, 21:17
Bydlisko: BA

delphi morhuhn

Príspevok od používateľa nitr0 »

zdravim, chcel by som urobit morhuhna v delphi ale nejako mi to nefici, zacal som robit animaciu ale nejako mi to nechce ist, pomozte pls

Kód: Vybrať všetko

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Formdestroy(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseDown2(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TObrazok = class
    PoleBmp: array of TBitmap;
    X, Y, Faza: Integer;
    C: TCanvas;
    constructor Create(CC: TCanvas; Meno: string;
      PocetFaz, XX, YY: Integer);
    constructor Create1(CC: TCanvas; Meno: string;
      PocetFaz, XX, YY: Integer);
    destructor Destroy; override;
    procedure Kresli; virtual;
    procedure Krok; virtual;
   end;

constructor TObrazok.Create(CC: TCanvas; Meno: string;
  PocetFaz, XX, YY: Integer);
var
  I: Integer;
begin
  SetLength(PoleBmp, PocetFaz);
  for I := 0 to High(PoleBmp) do
  begin
    PoleBmp[I] := TBitmap.Create;
    PoleBmp[I].LoadFromResourceName(HInstance, Meno + IntToStr(I));
    PoleBmp[I].Transparent := True;
  end;
  X := XX;
  Y := YY;
  Faza := 0;
  C := CC;           
end;

destructor TObrazok.Destroy;
var
  I: Integer;
begin
  for I := 0 to High(PoleBmp) do
    PoleBmp[I].Free;
end;

procedure TObrazok.Kresli;
begin
  C.Draw(X - PoleBmp[Faza].Width div 2, Y - PoleBmp[Faza].Height div 2, PoleBmp[Faza]);
end;

procedure TObrazok.Krok;
begin
  Faza := (Faza+1) mod Length(PoleBmp);
end;
  var
  PoleObr: array of TObrazok;
  Pozadie: TBitmap;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
  Pozadie := TBitmap.Create;
   Pozadie.LoadFromResourceName(HInstance, 'forest');
  Image1.Canvas.Draw(0, 0, Pozadie);
  DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  Pozadie.Free;
  for I := 0 to High(PoleObr) do
    PoleObr[I].Free;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
begin
  SetLength(PoleObr, Length(PoleObr)+1);
  PoleObr[High(PoleObr)] := TObrazok.Create(Image1.Canvas, 'vtak', 8, X, Y);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  I: Integer;
begin
  if PoleObr = nil then
    Exit;
  Image1.Canvas.Draw(0, 0, Pozadie);
  for I := 0 to High(PoleObr) do
  begin
    PoleObr[I].Krok;
    PoleObr[I].Kresli;
  end;
end;

constructor TObrazok.Create1(CC: TCanvas; Meno: string;
  PocetFaz, XX, YY: Integer);
var
  I, Sirka, Vyska: Integer;
  PomBmp: TBitmap;
begin
  SetLength(PoleBmp, PocetFaz);
  PomBmp := TBitmap.Create;
  try
    PomBmp.LoadFromResourceName(HInstance, Meno);
    Sirka := PomBmp.Width div PocetFaz;
    Vyska := PomBmp.Height;
    for I := 0 to High(PoleBmp) do
    begin
      PoleBmp[I] := TBitmap.Create;
      with PoleBmp[I] do
      begin
        Width := Sirka;
        Height := Vyska;
        Canvas.Draw(-I*Sirka, 0, PomBmp);
        Transparent := True;
      end;
    end;
  finally
    PomBmp.Free;
  end;
  X := XX;
  Y := YY;
  Faza := 0;
  C := CC;
end ;

procedure TForm1.Image1MouseDown2(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
var
  Obr: TObrazok;
begin
  case Random(2) of
    0: Obr := TObrazok.Create(Image1.Canvas, 'vtak', 8, X, Y);
    1: Obr := TObrazok.Create1(Image1.Canvas, 'zajo', 8, X, Y);
  end;
  SetLength(PoleObr, Length(PoleObr)+1);
  PoleObr[High(PoleObr)] := Obr;
end;
  end.
takto to mam
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

máš tam niekolko chýb, napríklad neviem prečo tam máš dva konštruktory. Jeden pre zajaca, jeden pre vtaka. Zajaca si mal spraviť ako nový objekt odvodený od vtáka, kde by bol nový konštruktor a ostatné metody by boli zdedené.
Ďalej tam vidím overridnutý deštruktor (neviem prečo) čo je zbytočné keďže ten objekt nemá predka, a neviem teda čo chceš overridovať. Takisto kresli a krok sú virtuálne napriek tomu že nemáš potomka. Vypadá to ako keby si to robil takým štýlom že si to naučený všade dávať, ale nevieš prečo to tam dávaš.
Používanie dynamického pola sa v takýchto veciach nahrádza listom (neviem či má význam teraz vysvetlovať prečo)
K tvojmu hlavnému problému prečo ti nejde "animácia": nechce sa mi to celé pozerať, lahšie by bolo keby si sem dal do prílohy komplet zdroják nech to skúsim v delphi. Ale ak sa to nehýbe, zrejme bude chyba v timeri :)
nitr0
Medium Expert
Medium Expert
Príspevky: 123
Registrovaný: 08 sep 2007, 21:17
Bydlisko: BA

Príspevok od používateľa nitr0 »

tu je ten zdrojak..a dik ze si sa na to pozrel
Prílohy
project2.rar
(973.84 KiB) 37 stiahnutí
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

.. i keď od morhuhnu to má ďaleko, lebo ty ich klikanim vytváraš a nezabíjaš :)
Prílohy
hlavny project.rar
(1.54 MiB) 41 stiahnutí
nitr0
Medium Expert
Medium Expert
Príspevky: 123
Registrovaný: 08 sep 2007, 21:17
Bydlisko: BA

Príspevok od používateľa nitr0 »

diki..no ved este hey..najpr chcem aby sa vobec hybali a vytvarali nahodne obrazky a potom budem riesit tu strelbu a score..
a co tam bolo? bolo to az take zle?

//autoeditácia príspevku ( 19 Jan 2009, 20:48 )
teraz mam taky problem ze neviem ako spravit pohyb tych obrazkov z prava do lava..kedze su v poli tak si s tym neviem rady, skusal som snat vsetko ale nic..nejako zmenit tu suradnicu x..

Kód: Vybrať všetko

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,unit2;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure Formdestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TObrazok = class
    PoleBmp: array of TBitmap;
    X, Y, Faza: Integer;
    C: TCanvas;
    constructor Create(CC: TCanvas; Meno: string;
      PocetFaz, XX, YY: Integer);
    constructor Create1(CC: TCanvas; Meno: string;
      PocetFaz, XX, YY: Integer);
    destructor Destroy;
    destructor Destroy1;
    procedure Kresli;
    procedure Kresli1;
    procedure Krok;
    procedure Krok1;
   end;


var
  Form1: TForm1;
  PoleObr: array of TObrazok;
  Pozadie: TBitmap;
  n:integer;

implementation

{$R *.dfm}


constructor TObrazok.Create(CC: TCanvas; Meno: string;
  PocetFaz, XX, YY: Integer);
var
  I: Integer;
begin
  SetLength(PoleBmp, PocetFaz);
  for I := 0 to High(PoleBmp) do
  begin
    PoleBmp[I] := TBitmap.Create;
    PoleBmp[I].LoadFromResourceName(HInstance, Meno + IntToStr(I));
    PoleBmp[I].Transparent := True;
  end;
  X := XX;
  Y := YY;
  Faza := 0;
  C := CC;
end;

destructor TObrazok.Destroy;
var
  I: Integer;
begin
  for I := 0 to High(PoleBmp) do
    PoleBmp[I].Free;
end;

procedure TObrazok.Kresli;
begin
  C.Draw(X - PoleBmp[Faza].Width div 2, Y - PoleBmp[Faza].Height div 2, PoleBmp[Faza]);
end;

procedure TObrazok.Krok;
begin
  Faza := (Faza+1) mod Length(PoleBmp);
end;
 //vtak sa vytvori
constructor TObrazok.Create1(CC: TCanvas; Meno: string;
  PocetFaz, XX, YY: Integer);
var
  I: Integer;
begin
  SetLength(PoleBmp, PocetFaz);
  for I := 0 to High(PoleBmp) do
  begin
    PoleBmp[I] := TBitmap.Create;
    PoleBmp[I].LoadFromResourceName(HInstance, Meno + IntToStr(I));
    PoleBmp[I].Transparent := True;
  end;
  X := XX;
  Y := YY;
  Faza := 0;
  C := CC;
end;

destructor TObrazok.Destroy1;
var
  I: Integer;
begin
  for I := 0 to High(PoleBmp) do
    PoleBmp[I].Free;
end;

procedure TObrazok.Kresli1;
begin
  C.Draw(X - PoleBmp[Faza].Width div 2, Y - PoleBmp[Faza].Height div 2, PoleBmp[Faza]);
end;

procedure TObrazok.Krok1;
begin
  Faza := (Faza+1) mod Length(PoleBmp);
end;

 //vlk sa vztvori

procedure TForm1.FormShow(Sender: TObject);
begin
  Pozadie := TBitmap.Create;
  Pozadie.LoadFromResourceName(HInstance, 'forest');
  Image1.Canvas.Draw(0, 0, Pozadie);
  DoubleBuffered := True;
  end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  Pozadie.Free;
  for I := 0 to High(PoleObr) do
    PoleObr[I].Free;
end;

  procedure TForm1.Timer2Timer(Sender: TObject);
  var
  obraz:string;
  obr:Tobrazok;
  pom:integer;
  z,v,x,y1,y2:integer;
  begin
  x:=600;
  y1:=100+random(100);
  y2:=500-random(100);
  randomize();
  doublebuffered:=true;
  case random(2) of
    0:Obr := TObrazok.Create(Image1.Canvas, 'vtak', 8, X, Y1);
    1:Obr := TObrazok.Create1(Image1.Canvas, 'vlk', 8, X, Y2);
    end;
   SetLength(PoleObr, Length(PoleObr)+1);
   PoleObr[High(PoleObr)] := Obr;
    end;
   procedure TForm1.Timer1Timer(Sender: TObject);
var
  I: Integer;
begin
  if PoleObr = nil then
    Exit;
  Image1.Canvas.Draw(0, 0, Pozadie);
  for I := 0 to High(PoleObr) do
  begin
    PoleObr[I].Krok;
    PoleObr[I].Kresli;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer2.enabled:=true;
end;

end.
Prílohy
hlavny project.rar
(2.57 MiB) 37 stiahnutí
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

nikde tam nemeníš súradnice obrázku. Do kroku pridaj x:=x-5; a bude to takto:

Kód: Vybrať všetko

procedure TObrazok.Krok;
begin
  Faza := (Faza+1) mod Length(PoleBmp);
  x:=x-5;
end;
s tým, že by si mal overiť či nie je objekt mimo formuláru a ak už áno, tak zavolať deštruktor ale v tom tvojom sa nevyznám a hádže mi to chybu. Nechce sa mi hladať prečo. Bolo by to nejak takto:

Kód: Vybrať všetko

procedure TObrazok.Krok;
begin
  Faza := (Faza+1) mod Length(PoleBmp);
  if x+PoleObr[1].width < 0 then destroy else x:=x-5;
end;
ale ty tam máš destroy aj destroy1 a strašne neprehladné to máš
nitr0
Medium Expert
Medium Expert
Príspevky: 123
Registrovaný: 08 sep 2007, 21:17
Bydlisko: BA

Príspevok od používateľa nitr0 »

neveriiiiim ze to bolo taketo lahke..strasne diki..co som tam ja daval dalsie proceduri a neviem co.. :roll:

//autoeditácia príspevku ( 22 Jan 2009, 0:52 )
este poslednu vec by som potreboval..co jako sa ma zabit vlk alebo vtak ked na nich kliknem..? kliknutie mam riesene cez.. class(TControl), a to ze sa mi prirata score za nic to ide ale ze sa znicia to nejde ani za nic..ked dam napr. poleobr.free hodi error alebo aj tvtak.free tiez error..hocico som skusal ale toto fakt nejde :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

metodu onclick (prípadne onmouseup) by si mal spraviť pre jednotlivé objekty. Potom sa pre túto udalosť zavolá príslušna metoda, ktorá zavolá okrem zvýšenia skore aj deštruktor cez self.destroy; O vyprázdnenie poľa s obrázkami sa už postará deštruktor
Nemôžeš to volať pre TVtak, lebo neničíš celú triedu. Ničíš len jeden z jej objektov.
Napísať odpoveď