Tetris Zerbröseleffekt
lima-city → Forum → Programmiersprachen → Delphi & Pascal
anlegen
array
bruch
code
darstellen
effekt
falle
frage
gedanke
geschwindigkeit
gewicht
http
klasse
paar
position
record
sache
teil
type
url
-
Hallo,
ich habe ein Tetrisspiel via Delphi programmiert. Es läuft auch einwandfrei und nun möchte ich mich gerne an die Effekte machen. Die Midi - Musik habe ich schon mühsam eingefügt, doch wie kann man einen Effekt machen, sodass die Steine zerbröseln, also in allen Richtungen zerspringen? Bin da wirklich ratlos, könnte mir vorstellen das man vll jedes einzelne Pixel animieren muss, aber selbst da scheitere ich.
Hier mein Tetrisspiel (nur exe) : http://www.mediafire.com/?fofdwmkjtzm
und hier der Code: http://www.mediafire.com/?zhziynymmxe
Hoffe es hat schon wer damit Erfahrung gemacht und kann mir helfend zur Seite stehen
LG Maximilian -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich weiß ja nicht, wie du dir das gedacht hast aber für mich klingt es entweder nach einem Partikelsystem oder nach einer einfachen Animationssequenz. Ich geh mal vom Variableren Partikelsystem aus: Du hast den Block und versucht den nun durch sagen wir 20 Bruchstücke erst als ganzes dazustellen. Jedes dieser Bruchstücke ist durch sein Gewicht, seine Geschwindigkeit (als Vektor) und seine Position beschrieben. Man würde jetzt einfach in der Ausgangssituation die Position und das Gewicht (vielleicht nach der Größe des Bruchstückes) festlegen. Dann kommen da ein paar Kollisionstests rein usw. Aber das ist schon relativ heftig.
-
Naja wenn dann würde ich die Bruchstücke halt in Form von Punkten darstellen, mit const. Masse, Geschwindigkeit, etc.
Gibt es da vielleicht Tutorial im Netz ohne das ich gleiche eine Grafikengine benutzen muss?
Bzw. gibt es mathematische Formeln und wenn ja wie setzt man sie korrekt ein? -
Es kommt drauf an, wie komplex du das machen möchtest.
Ich denke das einfachst, was du machen kannst ist einfach die Teile fallen zu lassen.
Das heißt du hast eine Ausgangsposition und eine Ausgangsgeschwindigkeit.
Zur Geschwindigkeit in vertikaler Richtung addierst du immer einen bestimmten Betrag pro Anzeigedurchlauf.
Hier mal so ein wenig Pseudocode:
TYPE Bruchstueck = RECORD posx, posy : real; vx, vy : real; END;
Wenn jetzt dein Teil zerbröseln soll, dann zerlegst du das erstmal in eine angemessene Anzahl Bruchstücke, zb so viele, wie Pixel benötigt werden um das Teil darzustellen. Jedes dieser Bruchstücke hat jetzt eine Position in dem Teil aus dem sie entstehen. Dann kannst du eine zufällige Geschwindigkeit erzeugen mit der sich das Bruchstück bewegt, wenn das Teil anfängt zu zerbröseln.
Jetzt zum Kernstück, der Animation:
PROCEDURE animate(stueck : Bruchstueck) BEGIN stueck.vy := stueck.vy + 0.1 * t; stueck.posx := stueck.posx + stueck.vx * t; stueck.posy := stueck.posy + stueck.vy * t; END;
Das führst du für jedes Bruchstück aus. Damit werden deine Bruchstücke relativ zufällig aus dem Teil geschleudert und dann nach unten fallen. Die Variable t gibt an, wie groß der Zeitschritt ist, der dabei gemacht werden soll. Je kleiner t, desto langsamer (und runder) wird die Bewegung der Bruchstücke sein.
Wenn du nur ein einfaches nach unten Zerbröseln möchtest, dann solltest du von unten anfangend die Bruchstücke "aktivieren" und möglichst nur mit sehr niedriger Anfangsgeschwindigkeit ausstatten. Die random Methode sollte dir helfen, dass das alles nicht allzu Computertechnisch aussieht sondern einigermaßen natürlich.
Wenn du noch Fragen hast immer her damit.
PS:
Sorry für Quelltextfehler ich hab schon länger nicht mehr Pascal/Delphi-Programmiert -
Wegen den Quelltext fehlern, mach dir keine Gedanken brauchte eh nur nen Anstoß, danke für deine Superhilfe ich werde mich dann morgen mal ransetzen und schauen ob es klappt. Trotsdem vielen Dank erstmal hast mir sehr geholfen
Eine Frage hätte ich aber noch, deine Prozedure verändert ja nur die Position von einem Stück. Nehmen wir an ich würde 20 Stücke haben, müsste ich dann ein Array mit dem Typ Bruchstueck vereinbaren? Ich glaub fast das war der Teil wo ich gescheitert bin ^^
Beitrag zuletzt geändert: 29.6.2010 19:06:15 von gauss-design -
Joa im Prinzip einfach einen Array davon anlegen, wie genau du das dann behandelst, also ob statisch oder dynamisch ist deine Sache. Wenn du mit Objektpascal arbeitest, kannst du auch eine Klasse Bruchstueck anlegen und Instanzen davon dann in einem Array verwalten. Wichtig ist eben das Array, da du sonst kaum Herr über die Sache wirst.
-
Könntest du mir vielleicht ein Codebeispiel geben, wie du das mit den Klassen und Arrays meinst, ich arbeite nicht so oft mit Klassen und verwende Delphi auch erst seit einem Jahr.
Edit: Ok habs hinbekommen, man bin ich stolz :D also unter den uses die type
vereinbarung:type Bruch = record x : integer; y: integer; tx : integer; ty: integer; end;
dann bei var den array :stuecke: array[0..3] of Bruch;
und zu guter letzt noch ein paar Abfragen:
stuecke[0].x:= 100; //weise dem Record x in der Position 0 des Arrays 100 zu Showmessage(Inttostr(stuecke[0].x)) // Frage, welche Zahl bei 0 Stelle des Array und x von Bruch steht;
Vielen Dank sektor ohne dich wäre ich nie auf die Idee gekommen das ganze so anzugehen.
Beitrag zuletzt geändert: 29.6.2010 21:05:47 von gauss-design -
Da muss der Prozessor allerdings viel rechnen und die Grafikkarte guckt zu.
Ich würde eine animierte GIF-Grafik malen und dann anzeigen lassen. Das ist viel einfacher. -
naja aber nach meinen Erkenntnissen frisst gif doch ne Menge Ram, oder?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage