procedure selbst erstellen

Für Fragen von Einsteigern und Programmieranfängern...
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 »

damit meinte ich die vor 5 Posts geposteten funktion Rumpftop und Rumpfleft...
Da bei dieser funktion ja schon Potential gibt sie zu verbessern, wie carli schon sage, eben mit Array oder dann auf ein Canvas, entweder das der Form /Paintbox oder Image zeichnen...

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: procedure selbst erstellen

Beitrag von carli »

pluto hat geschrieben:
Wenn ich genau wüsdte was das für images sind und so (qullcode des ganzen Programms) könnte man das bestimmt auf unter 30 Zeilen zusammenfassen
Das glaube ich kaum. Wobei: Wenn man es sehr, sehr einfach macht vielleicht.
Mit ein bisschen CodeStyle brechen gehts auch ;)

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 »

Es würde auch reichen, meinen Code anzuschauen. Den habe ich als Lern-Projekt hochgeladen und auch als solches geschrieben. Der ist zwar etwas länger, aber sollte die meisten Fragen klären.
eigentlich wollte ich auch noch ein Tutorial schreiben, aber ich habe kein Programm gefunden womit das gehen könnte.
sagt jetzt nicht OpenOffice oder MS Office *G*. Wobei: vielleicht geht es jetzt. Es gibt so eine Web-Ansicht bei OpenOffice.
MFG
Michael Springwald

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

Re: procedure selbst erstellen

Beitrag von scihbam37 »

tja leider bin ich kein profi in dem programm :roll:

deshalb stell ich hier ja die fragen wie man das besser machen kann, da helfen mir solche antworten nich viel :?
könnt ihr das nich richtig erklären vllt mit code usw?

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 »

Das Erklären kostet Zeit, den Code hast du ja schon.

Ich könnte dir ein Link zu einem Tutorial geben, jedoch ist das für Delphi geschrieben(von mir) und nutzt eine Komponenten Sammlung: DelphiX.

Hier findest du einige Snake-Tutorials:http://www.delphipraxis.net/

edit01: Womit hast du denn genau Probleme? Dynamische Array's?
MFG
Michael Springwald

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

Re: procedure selbst erstellen

Beitrag von scihbam37 »

jo
im moment mach ich das mit images die ich hinten ranhänge, funktioniert bloß nich so gut weil es wie eine stange von images aussieht und außerdem nur linea bewegt

wenn du mir das mit den arrays erklären könntest wäre ich sehr dankbar

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 »

Ein array kann man ganz leicht erklären:

Du hast ein Programm mit folgende Variablen für die Posisionierung von deinen Schlangenteilen zum beispiel:

Code: Alles auswählen

s1x,s1y,s2x,s2y,s3x,s3y,s4x,s4y,s5x,s5y:integer;
so , s steht für schlange
1 ist dann das element
und x steht für left, y für top...

Das kann man erstmal vereinfachen:

Code: Alles auswählen

s1,s2,s3,s4,s5:TPoint;
Du kannst jetzt s1.x und s1.y verwenden, sieht schonmal schöner aus, hat aber noch nichts mit arrays zu tun.

Wenn du jetzt Deine schlange bewegen willst dann machst du das so:

Code: Alles auswählen

s5 := s4;
s4 := s3;
s3 := s2;
s2 := s1;
s1 := s1.x + 1;
/also alles rückt anch und der kopf bewegt sich entweder nach links /rechts /oben /unten...
So und jetzt eine Aufgabe: Gib mir den Code für 200 Schlangenteile,
VIEL SPAß !!!

Genau dafür ist ein Array da, am besten kann man ein Array mit einer for schleife verwenden.
Du definierst die variable jetzt als:

Code: Alles auswählen

s: array [1..5] of TPoint;
So, es wird jetzt von 1 bis 5 - TPoint's erstellt...
Ein Array ist sozusagen wie ein Schrank mit vielen Schubladen, in diesen Fall Schublade 1 bis 5... Du kannst diese jetzt in einer For-Schleife oder wie auch immer mit einer Zah abrufen...
jetzt kannst du auf das erste Element zugreifen indem du folgendes machst:

Code: Alles auswählen

s[1].x := s[1].x + 1;
Das Tolle: du kannst due 1 auch durch eine Variable oder sinst etwas ersetzen...
Der Nachteil: Ist diese Variable nicht in unserem Bereich von 1..5 gibts nen Netten Fehler...

Du könntest den Ganzen Code umschreiben aber vorher empfehle ich dir eine kleine Änderung der Definition vorzunehmen:

Code: Alles auswählen

s: array [0..4] of TPoint;
Hä, wieso jetzt von 0 zu 4 . von 1 zu 5 war doch auch gut .
Ja, es macht überhaupt keinen Unterschied, nur ist es besser sich direkt richtig drann zu gewöhnen... Und Richtig heißt in diesem Sinn, ein Array fängt immer mit 0 an. Wieso wirst du später sehen...

Erstmal zeig ich aber wie du die Schlange damit bewegst...
Aus dem Code:

Code: Alles auswählen

s5 := s4;
s4 := s3;
s3 := s2;
s2 := s1;
s1 := s1.x + 1;
wird folgende;

Code: Alles auswählen

var
 i:integer;
begin
for i := 4 downto 1 do
begin
s[i] := s[i-1];
end;
s[0] := s[0].x + 1;
end;
Beachte, "Downto" zählt rückwärts... es gibt auch nur "to", das zählt hoch...
Das Tolle hieran ist leicht zu erkennen oder ?
Soll der jetzt das 200 mal machen dann änderst du die 4 einfach in eine 200...

So und jetzt zu dem Grund wieso unser Array von 0..4 geht...
Der Dynamische Array:
Ist im Grunde das Gleiche , nur das dieser ein bisschen anders Definiert wird:

Code: Alles auswählen

s: array of TPoint;
Ja, aber jetzt steht da keine [0..4] mehr, wie viele Variablen kann ich jetzt da Speichern ???

NULL. Im moment, denn wir kömmen dem Array sagen wieviel wir speichern wollen, dynamisch eben , zu laufzeit:

Code: Alles auswählen

setlength(s,200);
Und hier steckt auch der Grund drinn wieso wir eben gesagt haben wir fangen bei 0 an und gehen auf 4...
Dann bei dynamischen Array's fängt es immer bei 0 an.

Das niedrigste Element ist also s[0] und das höchste s[199].
mit high(s) bekommen wir den Wert 199. Das höchste Element.
Mit length(s) bekommen wir 200. Die insgesammt länge.
Mit low(s) bekommen wir das niedrigste , also immer 0...
Die 3 Funkionen gehen auch bei den Normalen Array...


Der Code würde jetzt heißten:

Code: Alles auswählen

var
 i:integer;
begin
for i := high(s) downto 0 do //  nur die 4 durch high ersetzt...
begin
s[i] := s[i-1];
end;
s[0] := s[0].x + 1;
end;
Du könntest jetzt jedes mal wenn die Schlange länger wird folgendes machen:
setlength(s,length(s)+1);
und in s[high(s)] dann die neue Position speichern...

In deinem Fall solltest du erstmal von den Images wegkommen und auf Deine Form Zeichen.
Du kannst z.B Form1.Canvas.CopyRect(arect... , Image3.Picture.Birmap.Canvas , brect...);
kopiert Image3 auf Die Form1 und zwar von brect auf arect... Einfach mal ausprobieren...


Ach ja, für den Fall das ich nicht erklären kann :)
Hier:
http://www.delphi-treff.de/tipps/object ... he-arrays/" onclick="window.open(this.href);return false;

Code: Alles auswählen

Signatur := nil;

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 »

Ach ja, für den Fall das ich nicht erklären kann
Eine Sehr schöne Erklärung. Ich habe noch keine bessere gesehen.
MFG
Michael Springwald

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 »

Freut mich zu höhren.

Code: Alles auswählen

Signatur := nil;

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

Re: procedure selbst erstellen

Beitrag von scihbam37 »

ich glaube ich hab das verstenden...

ich verstehe bkloß nicht wo das jetzt gezeichnet wird?
und das mit den bildern auf die form zeichnen... hä?

ich hätte gerne mal etwas zum angucken ^^ so damit ich verstehe was ich eig programmiere

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 »

ich hätte gerne mal etwas zum angucken ^^ so damit ich verstehe was ich eig programmiere
Schau dir einfach mal mein Code an. Da hast du was zum Anschauen. Ist sogar Jugendfrei. (Meines Wissens).

Aber, hier ein kleines Beispiel:
Ich gehe davon aus, dass die Position im Array gespeichert wird als TPoint

Code: Alles auswählen

procedure Paint;
var
  i:integer;
begin
  // Sollte nicht gemacht werden, wie es anders geht siehst du in meinem Code, oder bei unseren BreakOut Beispiel
  Canvas.FillRect(0,0,Canvas.Widht,Canvas.height); // Wenn die Methode Paint in einem Timer aufgerufen wird, kann es sehr viel CPU-Zeit kosten. Ist dafür aber einfach. Für kleine Bildflächen dürfte es aber gehen.
  for i:=0 to Lenght(MeinArray)-1 do begin
    if i = 0 then begin// Kopf zeichnen  
     Canvas.Brush.Color:=clBlue; // Der Kopf wird Blau gezeichnet
    end 
    else
     Canvas.Brush.Color:=clRed; // Der Körper Rot.  
 
    Canvas.Fillrect(MeinArray[i].Left, MeinArray[i].Top,MeinArray[i].Left+20, MeinArray[i].Top+20);
  end; // for i
end;
Canvas muss du ersetzten oder wenn du es im Form1 verwendest, kannst du es so lassen. Der Code dient legendlich als Schablone. Nicht zum Kopieren. Da du gewisse Sachen anpassen musst wie MeinArray und der gleichen. Mit Grafiken geht es ähnlich. Du könntest eine Grafik z.b. in Form von TBitMap als Kopf hinzufügen und eine für den Körper. Statt Fillrect zeichnest du dann mit Draw(x,y, Grafik) Und zwar da wo unterschieden wird ob kopf oder Körper.

An sich ist das nicht weiter Problematisch.

ABER SCHAU DIR MAL BITTE MEIN CODE AN. DER BEANTWORTET VIELE, VIELE FRAGEN.
ps: Sorry das ich groß schreiben, aber mein Projekt-Beispiel, geht hier wohl unter sonst. Das Projekt habe ich genau für solche Zwecke geschrieben. Es soll als Beispiel dienen. Dort Zeichne ich auch nicht jede Sekunde den Kompletten Bildschirm neu sondern nur den Bereich der sich ändert.Das ist natürlich etwas aufwendiger, lohnt sich aber. Wenn du Fragen zum Code hast, kann ich dir gerne weiter helfen(oder auch andere).
MFG
Michael Springwald

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

Re: procedure selbst erstellen

Beitrag von scihbam37 »

pluto hat geschrieben:
ABER SCHAU DIR MAL BITTE MEIN CODE AN. DER BEANTWORTET VIELE, VIELE FRAGEN.
ps: Sorry das ich groß schreiben, aber mein Projekt-Beispiel, geht hier wohl unter sonst. Das Projekt habe ich genau für solche Zwecke geschrieben. Es soll als Beispiel dienen. Dort Zeichne ich auch nicht jede Sekunde den Kompletten Bildschirm neu sondern nur den Bereich der sich ändert.Das ist natürlich etwas aufwendiger, lohnt sich aber. Wenn du Fragen zum Code hast, kann ich dir gerne weiter helfen(oder auch andere).

leider verstehe ich kein bisschen was von deinem programm.

kann man das nicht einfach mit meinen images machen?
sodass die immer nachrücken auf die Posi von dem vorhergehenden körperteil

ich müsste doch meinen kompletten code umschreiben wenn ich das nun aufeinmal mit canvas und lines usw. machen wollte

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 das nicht einfach mit meinen images machen?
Es geht alles. Versuch es doch einfach mal. Ich helfe dir gerne weiter, wenn ich kann. images sind dafür nicht geeignet. Oder würdest du nach USA schwimmen wollen? Gehen würde es bestimmt. Nur dir würde vorher die Kraft ausgehen. *G*.

Images sind für kleine Grafiken gedacht, die sich nicht ändern. Z.B. um ein Programm Grafisch zu verschönern. Nicht das man damit Spiele schreibt.

Einer (meiner) Grund-Regeln lautet: Lerne anderen Code zu verstehen. Klappt natürlich nicht immer. Andere Code können wahre Gold Gruben sein an Ideen und Möglichkeiten.

Selbst als Anfänger, dürfte es nicht weiter schwer Fallen. Ohne alles zu verstehen. Du kannst ja auch Geld Abheben, ohne zu verstehen, wie die Technik dahinter Funktioniert. Du kannst auch einkaufen gehen, ohne zuwissen, wie die einzelne Waren hier her gebracht wurde oder was sie alles gesehen haben. oder? Das mag etwas Hart klingen, aber so ist das nun mal.

Vielleicht findest du ja einen, der auf deinen Code eingeht, der nicht meiner Meinung ist. Ich habe dir ja noch ein Beispiel-code Geschrieben in meiner Letzten Antwort. Denn kannst du natürlich auch umschreiben, das der für Timage-Komponenten geht. Ist das gleiche. Geh das Beispiel mal durch. Du wirst sehen, der Code ist Anpassungs Fähig. es ist immer das gleiche. Auf Canvas verwendest du X und Y. Die Komponenten verwenden dafür Left und Top.
MFG
Michael Springwald

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

Re: procedure selbst erstellen

Beitrag von scihbam37 »

vielen dank für diesen hilfreichen beitrag

das grundgerüst ist ja klar

z.b. image5.top=image1.top-15
image5.left=image1.left

dies eingefügt in einen timer und image5 verfolgt image1 immer auf senkrechter linie.
für die anderen richtungen ist ja auch klar, verschönert hab ich das noch mit einer variablen usw.

nun bei einer richtungsänderung bewegt sich die schlange wie eine stange,
also muss ich wenn eine richtungsänderung durhc einen buttonclick gemacht wird, eig bei diesem buttonclick eine procedure schreiben
die dafür sorgt das die images eines nach dem anderen "abbiegt"

nun das ist leider mein problem, wie kann man schreiben das an der posi wo image1 sich befunden hat als der button geklickt wurde, die folgenden images auch abbiegen?
geht das, bitte helft mir

das is ein project für die schule und das muss ich am freiag abgeben :!:

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 »

So, als allerestes:
1. Ja Pluto's code ist kompliziert, ich hab gerade 2 Sekunden reingeschaut und mich erstmal von den Ganzen Klassen erschlagen lassen.
Aber hierzu kann man nur sagen wie Pluto auch meinte: Dir kann es egal sein wie die Klassen genau Intern arbeiten, ich weis ja auch nicht, wie Lazarus meine Nachricht umwandelt, diese dann an Windows schickt, welche bein Nächstenn Zeichnen in den Button eine Caption reinschreibt...
Aber der Code sieht Technich sehr sauber und korrekt aus, Objektorientiert ,u.s.w.
Klar, da es keine herleitung dazu gibt das ganze ziemlich ungewohnt vorkommt, aber dann muss man das Programm einfach mal durch gehen. Man startet das , schaut sich Form1Create (oder ähnliche) funktion an und geht den code durch... bei jeder verzweigung geht man mit, darum kommt man nicht.

2.
Images benutzt du wenn du ganz ganz einfache Spiele hast...
Alles was komplizierter ist (Pacman, Tetris, Snake ) zeichnet auf eine Sogenannte zeichenfläche, also ein Canvas (in englisch)...
Alles was och komplizierter ist benutzt 3D grafik.

3.
Nun eine kleine Erklärung:
Bis jetzt willst du belibig viele Images hin und herrücken und dann verschieben, stell dir also vor du schaust auf eine große Wand an welcher bilder hängen die du verschieben willst.
Alle diese Bilder besitzen eine Sogenannte Zeichenfläche, das ist das wo du mit deinem Paintprogramm draufgemalt hast, ein Viereck...
Diese Zeichenoberfläche bleibt bei dir ungenutzt, da die bilder an sich sich ja nicht ändern sonder nur verschieben...

Das was wir dir erklären wollen:
Schmeiß die Bilder von deiner wand runter, Hol dir ein Pinsel und zeichne auf die Wand selber...
Wieso ?
Du hast viel mehr Freiheit, außerdem kannst genau den gleichen Effekt (genau! den gleichen) erzielen wie mit einzelnen bildern...

Also , wie fängt man damit an:
a) Projekt speichern , neues Übungsprojekt machen.
b) erstell ein Timer und lass den jede sekunde zeichnen. // später machst du das anders , nur zum üben.
c) Schau dir Form1.Canvas an.
Das besitzt jede menge unterfunktionen, Die heinfachsten sind Line, Rectangle (ich konnte das noch nie richtig schreiben, sry :) )
Und Probier das aus. eventuell googelst du mal nach anderen funktionen und wenn du dich damit auskennst gehts weiter...

4.
Der Bewegungsablauf steht schon hier in diesem Thema,

Code: Alles auswählen

var
 i:integer;
begin
for i := high(s) downto 0 do //  nur die 4 durch high ersetzt...
begin
s[i] := s[i-1];
end;
s[0] := s[0].x + 1;
end;
Heißt:
Die Schlange besteht auf n stücken,
Das nte wandert auf die Position von n-1;
das n-1 auf die von n-2;
das 2 auf die vom 1
das 1 auf die vom 0ten.

So Das ist auf jeden fall immer so !!!
Du musst jetzt nur noch das kopfstück steuern, geht das nach oben , nach unten, links, rechts ?
Beim Nächsten Durchgang rücken alle Stücke eins auf un du musst wieder nur den Kopf bewegen...

Zeichen solltest du am einfachsten erstmal ein Viereck, du kannst aber auch ein Kompliziertes Bild was du mit einem Bildbearbeitungs-programm, erstelt hast einfügen...

Code: Alles auswählen

Signatur := nil;

Antworten