procedure selbst erstellen

Für Fragen von Einsteigern und Programmieranfängern...
scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: procedure selbst erstellen

Beitrag von scihbam37 »

dankeschön für diese ausführliche darstellungen,
sorry aber mein problem ist immer noch die verknüpfung von deinem code mit canvas function
wie füge ich das zusammen?


noch was anderes:

Code: Alles auswählen

if button1.click(.......) then
.
.
.
was muss ich in die klammern schreiben damit ich dies benutzten kann

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure selbst erstellen

Beitrag von pluto »

Also hier noch ein Link: http://www.delphipraxis.net/" onclick="window.open(this.href);return false; Gibt dort Snake in die Such-Maske ein. Außerdem kannst du auch noch als Forum Tutorials auswählen.
Hier ein Link: http://www.delphipraxis.net/22871-snake-das-spiel.html" onclick="window.open(this.href);return false;

Wenn du mit der Such Funktion in http://www.delphiforum.de" onclick="window.open(this.href);return false; klar kommst, dort findest du auch genügend Sachen über Snake. Sogar mit Code.

Aber wenn du unbedingt bei deinen Timage Komponenten bleiben möchtest:
1. Du brauchst eine Funktion, die entscheidet ob Verlängert oder Verkürzt werden soll. D.H. Ob du eine neue TImage Komponente erstellen möchtest, oder eine frei geben möchtest.
Erstellen:

Code: Alles auswählen

Image:=TImage.Create(Form1);
Image.Parent:=Self
Position bekommt die TImage woanders. Beim Verschieben Die Größe könntest du auch beim erstellen festlegen.
Außerdem brauchen alle Image-Komponenten einen Namen. Z:B. S+Zahl. Die Zahl ist die Länge der Schlange. Dazu könntest du einfach eine Zähler Variable nehmen.
(z.b. S+IntTostr(CountVar)); Z.B. bei einer Kolisions Funktion. Du verwendest ein 2D Array um Wände abzubilden. jede Wand könnte 20X20 Pixel groß sein. Dann kannst du einfach Prüfen ob eine Kolision statt gefunden hat. Aber auch um Futter unterzubringen. Also sollte der 2D Array verschieden Typen aufnehmen können. Sammelt die Schlange Futter auf: Verlängern. Stößt die Schlange an eine Wand: Verkürzen.

2. Jetzt brauchst du eine Move Methode um die Schlange zu bewegen. Schau dir dazu einfach mal mein Code an. Geheimtipp: Such mal nach Move oder so ähnlich(Habe mir den Code schon lange nicht mehr angesehen).Beim verschieben passt du einfach nur noch left und top an.

Um Tasten Code abzufangen folgende schritte:
1: Füge LCLType in deine Uses-Liste ein
2: Stelle KeyPreview auf True
3: Klicke im OI auf Events und wähle dort onKeyDown aus
4: in einer case Anweisung:

Code: Alles auswählen

case key of
    VK_LEFT: begin end; // Für linken Tastendruck(-1)
    VK_RIGHT: begin end; //Für Rechten Tastendruck(+1)
    VK_DOWN: begin end; // Für nach Unten(+1)
    VK_UP: begin end; // Für nach Oben(-1)
  end;
Das sind jetzt nur Hinweise. Den Fertigen Code möchte ich nicht noch mal schreiben. vier mal reichen oder? *G*.
Ich müsste noch einen einfachen Snake Clone haben. Wenn ich den Finde, kann ich den ja hoch laden.

Hinweis: für die Richtungs Steuerung brauchst du auf jedenfall ein Timer, der die Schlange "antreibt". Du hast zwei Richtungs Variablen: DirX und DirY. Die könnten vom Typ Boolean sein.
Vielleicht hilft dir das ja weiter. Du solltest aber deine Image Komponenten in einem Panel erstellen. Dann musst du nur im TImage.Create nicht Form1 verwenden sondern das Panel und auch den Parent anpassen.

ps: Das habe ich alles aus den "Kopf" geschrieben. Daher können es Fehler geben. Aber das soll auch nur als Anregungen dienen. Um dir auf die Sprünge zu helfen.

@Mac
Konntest du den Code bei dir noch Kompilieren? Ich muss es auch noch mal testen. Vielleicht kann ich ihn auf das notwendigste kürzen. Eigentlich sollte das ein einfaches Beispiel werden.
Vielleicht wäre aber ein Sokubahn einfacher?
MFG
Michael Springwald

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: procedure selbst erstellen

Beitrag von scihbam37 »

dankeschön :wink:

ich hätte noch eine andere frage

kann man einen if process auch nur einmal abfragen?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure selbst erstellen

Beitrag von pluto »

kann man einen if process auch nur einmal abfragen?
Woher kommt das?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure selbst erstellen

Beitrag von pluto »

So, um dir mein Code Schmackhaft zu machen habe ich ihn mir noch mal angesehen und gesehen, dass er sogar noch läuft.

Einige Level scheinen nicht mehr zu gehen. Grund ist noch unbekannt. Ob Level10 geht es wieder. Da ist sogar eine Menü Steuerung dabei und ein Level-Editor.
TGameSnake ist die Haupt Klasse. Mit der Arbeitest du nur. Diese Klasse stellt verschiedene Möglichkeiten bereit. Z.B. um Levels zu Laden, zu speichern. Die Menü Steuerung. Auch die Snake-Steuerung und die Karte wird hier bereit gestellt.

Die Paint Methode wird nur aufgerufen, wenn Notwendig. Beim Verschieben wird noch anders gezeichnet. Um CPU-Last zu sparen.

Für dich dürfte erst einmal die Klasse "TGameSnake" von Bedeutung sein.
Dort findest du diese Methoden:

Code: Alles auswählen

constructor Create(const aOutCavnas:TCanvas; const aW, aH:integer);
    destructor Destroy; override;
    procedure SetSize(const aMapW, aMapH, aMapS:Integer);
    procedure ClearMap;
    function SetObject(const aX, aY:Integer; aName:String): TGameBaseSprite;
    function FindExtra(const aChar:Char):TImageItem;
    function RepeatLevel:Boolean;
    function CheckCollision(const aX, aY:Integer):TGameBaseSprite;
    procedure DeleteObject(const aX, aY:Integer; const aNoDestroy:Boolean = False);
    procedure PaintItem(const aX, aY:Integer; const noMapDraw:Integer = -1);
    procedure Paint;
    procedure SetSnakeLength(const aNewLength:Integer);
    procedure MapSave;
    procedure MapLoad;
    procedure MovePlayer(const aKey:Word);
    procedure NextLevel;
    procedure LinkonClick(Sender:TGameBaseSpriteLinkText; const x, y: Integer; shift: TShiftState);
    procedure NewLevel(const aDisplayImage:String = ''; const aBackGrundImage:String = ''; const aImageFile:String = ''; const aClearMap:Boolean = False);
    property Mission:String read fMission write SetMission;
    property PlayerDir:Integer read fPlayerDir write SetPlayerDir;
Na, was könnten diese Methoden machen? Schau dir mal die Methode "MovePlayer" genauer an. Die verschiebt die Schlange. Dann schau dir noch mal die Methode "TGameSnake.SetPlayerDir" an. Dort bekommt der Kopf der Schlange genau das Aussehen, in der die Schlange fährt. Damit man es Visuell auch erkennen kann.

ps: Ich sehe gerade, dass ist gar nicht der Code, der als Beispiel gedacht war. Glaube ich. Aber das Spielt keine Rolle.

Ich nutzte hier ein eigenes Menü, darum sind es auch mehr Klassen, als eigentlich Notwendig. Zugegeben, der Code ist etwas aufwendig, aber doch gut Nachzuvollziehen?
Du kannst ihn nach beliebigen Anpassen oder ihn als Schablone nutzen.

Den Code habe ich schon vor einiger Zeit erstellt. Darum bin ich nicht mehr drin im Code. aber eigentlich ergibt sich alles. Aus den "Zeilen". Heute würde ich den Code vielleicht auch anders schreiben.
MFG
Michael Springwald

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: procedure selbst erstellen

Beitrag von scihbam37 »

scihbam37 hat geschrieben:dankeschön :wink:

ich hätte noch eine andere frage

kann man einen if process auch nur einmal abfragen?
noch was anderes:

Code: Alles auswählen

if button1.click(.......) then
.
.
.
was muss ich in die klammern schreiben damit ich dies benutzten kann
Könnt ihr mir die fragen vielleicht noch beantworten?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: procedure selbst erstellen

Beitrag von MAC »

kannst du nicht, da lazarus objektorientiert ist.

Wenn du code ausführen willst sobalt du auf das button klickst dann nimm doch Button1OnClick.
Wenn es echt so wichtig ist, das genau so abzugragen, dann brauchst du eine Globale Variable, bei Button1onmouse down wird die auf True gesetzt und bei Button1onMouseUp wieder auf false...

Außerdem:
wenn man button1.Click schreibt und wartet, kommt doch die Autovervollstädigung welche sagt das es keine Klammern gibt. und das es kein Rückgabewert gibt...

Wenn du das Button1.OnCLick ereignis aus deinem Code her ausrüfen willst, auch wenn jemand z.B: Button2 drückt.
Dann brauchst du eine Variable TObjekt.
Also schreibst du entweder Button1Click(Sender); oder Button1(nil);
du kannst auf Button1(Button2) schreiben.
Es kommt drauf an ob du die Variable Sender überhaupt benutzt...

Code: Alles auswählen

Signatur := nil;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: procedure selbst erstellen

Beitrag von Christian »

Du kannst alles.
Genau das mach die Message Que. Wenn man da nen eigenen handler reinhängt kann man auch das, aber will man das ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten