12. april 2001 - 13:17Der er
37 kommentarer og 2 løsninger
8-?
Hej,
Jeg vil prøve og lave en såkaldt \"Tank\" spil.
Jeg har en Button1, Image1, Edit1 og Edit2. Det er meningen at man skal kunne indtaste en vinkel fra 0-180 i Edit1, og indtaste \"styrke\" fra 1-1000 i Edit2 og til sidst skal man kunne klikke på Button1 som får Image1 til at skyde med den bestemte vinkel og styrke i Edit1 og Edit2.
Jeg tror, at du skal prøve noget andet end et Image object. Samtidig skal du have en timer inbygget. Da du sikkert også render ind i yderligere problemer senere i forløbet, vil jeg forslå dig at downloade DelphiX: prøv det her link: http://users.cybercity.dk/~bbl6194/delphi3dx.htm :-)
du skal bruge en teknik der hedder double-buffering. dvs. du har et offscreen bitmap, hvor du laver de ændringer der skal foretages til næste frame f.eks. flytte projektiler og tanks en smule, så du får noget bevægelse. Når du så har lavet de ændringer blitter du hele offscreenen over på skærmen. Til det kan du enten bruge bitblt funktionen eller canvas\' draw
Det kan jeg godt. Jeg ved ikke om jeg får tid i dag, men ellers i løbet af mandag. Det bliver være med beregningen af projektilets bane, det hedder vist nok en ballistisk kurve, men jeg kan ikke finde nogen formel
procedure TForm1.BFireClick(Sender: TObject); begin FPower := PowerSpinEdit.Value; FAngle := AngleSpinEdit.Value; Fire := True; FAngleX := FPower*(90-FAngle)/900; end;
procedure TForm1.FormCreate(Sender: TObject); begin BullitSprite := TImageSprite.Create(DXSpriteEngine.Engine); // Create en sprite with TImageSprite(BullitSprite) do begin Image := DXImageList.Items[0]; // få fat i billedet Height := Image.Height; // Sprite Højde Width := Image.Width; // Sprite Bredde X := 0; // Start X pladsering (venstre) Y := DXDraw.SurfaceHeight-Height; // Start Y placering (nederst) end; end;
procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer); begin if Fire then begin // Hvis der skydes if FAngle > -90 then FAngle := Fangle - 1; // Tyngdekraft effect with TImageSprite(BullitSprite) do begin if X < DXDraw.SurfaceWidth then // Hvis X ikke går ud af skærmen X := X + FAngleX // bevæg i X retning else Fire := False; // ellers stop if Y >0 then // Hvis Y ikke går ud af skærmen Y := Y - (FAngle/90)*(FPower/10) // bevæg i Y retning else Fire := False; // ellers stop end; end else with TImageSprite(BullitSprite) do begin // Ellers Reset X := 0; Y := DXDraw.SurfaceHeight-Height; end; DXSpriteEngine.Move(LagCount); // ingen aning men det skal stå der DXSpriteEngine.Dead; // ditto DXDraw.Surface.Fill(0); // farv hele skærmen sort
Subcover > Jeg har prøvet din eksempel, men den virker ikke! Jeg kan ikke se noget som helst andet end de komponenter der er. Håber du kan finde en bedre løsning.
Det var vist lige en UPS!. Der er lige nogle små ting jeg glemte at skrive. Du skal sætte et image ind i din DXImageList, og så skal du huske at DX komponenterne skal linkes, hvilket vil sige, at din DXSpriteEngine og din DXImageList skal referere til DXDraw. Alt sammen noget du sætte i din object inspector. Hvis du gerne vil have mig til at sende mit eksempel til dig, kan du bare sige til :-)
Subcover > Den virker! Men kan du ikke lave en \"grund\" som \"tank\"ene kan stå på? og kan du ikke lave 2 tanks som kan skyde til hinanden? og når man rammer hinanden skal modstanderen dø. Jeg afsætter gerne flere point.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.