Autor Beitrag
Genfeld_erwin_rommel
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 26.08.04 02:01 
hallo leute!

wollte gern ein spiel proggen. kennt ihr bestimmt schon alle. ein ball fliegt oberhalb des bildschirmes rum, schießt solch komischen steine ab und unten muss man versuchen mit ner art raumschiff den ball im spielfeld zu halten, weil unten sonst der ball verloren geht. so! da ich aber ned will das der ball immer im 45° winkel ein- und ausschlägt, habe ich mir gedacht das ich einfach die formel y=mx - b anwende und immer nur den steigungswinkel verändere....ha! denkste.! sobald man den wert m verändert, verändert sich auch die geschwindigkeit des balles! und das will ich nicht! sobald m 1 ist fliegt der ball (da die umkehrung vom tangenz 1 45° beträgt) der ball in 45° davon. je höher die differenz von m = 1 ist, desto schneller wird der ball.

ausblenden Quelltext
1:
2:
3:
4:
vx:= 1 / m;
vy:= -1 * m;
X:= X + vx;
Y:= Y + vy;


ich komme einfach nicht weiter und würde mich freuen, wenn mir einer weiter hilft. mein ziel ist es, dass der ball egal wie er fliegt die gleiche geschwindigkeit beibehält. oder hat noch jemand eine idee, wie ich einen ball dazu bringe, auch andere ein- und ausfall winkel zu besitzten, ohne das sich die geschwindigkeit ändert....ich hoffe ihr habt mich verstanden ;P

mfg


Moderiert von user profile iconKlabautermann: Topic aus Sonstiges verschoben am Do 26.08.2004 um 04:21
thebe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Do 26.08.04 07:30 
Rechne nicht mit ner Steigungsformel des Balls, sondern mit seinem Flugwinkel und seiner Geschwindigkeit

denn:

XDiff := (cos(winkel)*Speed)+XAlt;
YDiff := (sin(winkel)*Speed)+YAlt;

Winkel geht von 0 bis 360°, 0° ist direkt nach Rechts und dann wird im Uhrzeigersinn herum gedreht. Da haste dann nicht mehr diese Geschwindigkeitsunterschiede..

Wenn Du falsche Werte da teilweise rauskriegst, dann musst Du den Winkel inner Cos/Sin Funktion noch mal durch 180 teilen und mit PI malnehmen.

sprich:

XDiff := (cos((winkel/180)*PI)*Speed)+XAlt;
YDiff := (sin((winkel/180)*PI)*Speed)+YAlt;

MfG

- Thebe
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 26.08.04 08:45 
Du solltest vielleicht anstatt Winkel Vektoren nehmen. Wenn der Ball die Richtung ändert, kannst du nach der Berechnung den Vektor wieder auf einen beliebigen Betrag normieren, der deine Geschwindigkeit darstellt.

Berechnungsbeispiel für jeden "Schritt";

XNeu:=XSpeed+XAlt;
YNeu:=YSpeed+YAlt;

Die Winkelfunktionen brauchst du nur, wenn sich die Richtung ändert, und dann auch nur den (arc)cos. Stichwort Skalarprodukt.

Gruß,
Jörg
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Do 26.08.04 09:36 
das Hauptproblem bei sowas ist dann nurnoch die Kollision an Ecken. Doch wenn man sich ein bisschen durch die Mathematik wühlt findet man auch dort die Linie, an der der Vektor gespiegelt wird recht leicht. Sie ist eine Tangente an den Ball, die ihn im Eckpunkt berührt. Richtig lustig ist sowas erst in 3D :wink:

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 26.08.04 09:37 
Eigentlich ist die Variante mit den Vektoren schon die angesprochene mit den Winkeln, mit dem einzigen Unteschied, dass bei den Vektoren die Winkel manuell berechnet werden müssen. Die Flugkurve des Balles ist einfacher zu verstehen.

Ansonsten:

speed^2 = x^2 + y^2

Hoffe, dir kommt das bekannt vor.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Do 26.08.04 09:49 
Hallo nochmal

Ich würde dir empfehlen für dieses vektorrechnen einen eigenen Datentyp und eigene funktionen anzulegen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
type....
TVector = packed record
  x, y: real;
end;



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function mulVec(Vector: TVector; factor: real):TVector;  //multiplizuert einen Vektor mit einem Faktor
begin
Result.x := Vector.x * factor;
Result.y := Vector.y * factor;
end;


function vecLength(Vector: TVector;):Real;  //berechnet die Länge eines Vektors
begin
Result := sqrt(sqr(Vector.x) + sqr(Vector.y));
end;
....


solche funktionen erleichtern das arbeiten mit vektoren erheblich. Alternativ könnte man statt funktionen auch Prozeduren mit var-Parametern nehmen, soweit ich mich erinnere ist das minimal schneller, macht den Quelltext allerdings weniger leicht lesbar.

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Genfeld_erwin_rommel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 26.08.04 12:21 
WoW! krass was ihr so aufm kasten habt hehe

für mich hört sich das noch ein wenig spanisch an, aber ich werd gleich mal ein bischen rumexprimentieren!

was ich nicht kapier isch das pixel- / vectorprinzip......also in der schule hat man mir gesagt pixelbilder sind aus lauter kleinen punkten (klar!) und vector grafiken sind mehr striche oder so....;) und was genau isch jetzt vector in delphi!?

also ich hab eine klasse erstellt: [Ball]....den möcht ich wie oben erwähnt bewegen, bei konstanter geschwindigkeit und wechselender richtung.... ich arbeite mit DelphiX bzw. DXDraw und der engine DXSpriteengine.

vielen dank für euren support!!!!!!
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Do 26.08.04 13:35 
@Genfeld_erwin_rommel
Pixel sind konkrete Bildinformation. Beim Zoomen ergibt das Pixelmus. Bei Vektorgrafikten werden nicht Pixel gespeichert, sondern z.B. Linie A geht von Punkt(4/5) nach Punkt (7/1), hat eine Dicke von 5, die Farbe Rot. Da gibs kein Pixelmus beim Zoomen. @ alle fortgeschrittenen: Dies ist eine grobe Beschreibung!
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 26.08.04 15:21 
Genfeld_erwin_rommel hat folgendes geschrieben:
was ich nicht kapier isch das pixel- / vectorprinzip......

"Vektor" bezieht sich in dem Fall nicht auf die Darstellung, sondern die Berechnung. Ist Mathe 10./11. Klasse. Wenn du das noch nicht hattest, führt es jetzt definitv zu weit, das alles zu erklären, sonst könnte man den Matheunterricht ja gleich im Forum abhalten. ;-)
Genfeld_erwin_rommel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 26.08.04 18:10 
doch wir hatten das schonmal. aber wenn ich jetzt des ganze rein mathematisch betrachte, sind also vector grafiken einfach geraden, mit schnittpunkt angaben (daraus könnte man z.b. die gleicheung y=mx + b aufstellen), nur das dieses halt noch infomationen zur farbe und stärke enthält.....sehe ich das so richtig...? konkret:

beispiel von vorhin....

Punkt A (4|5) Punkt B (7|1)

Rechnung:

Y2 - Y1
----------- = m
X2 - X1

gleichung:

y= -4/3x + 10 1/3

hab ich in mathe nun aufgepasst oder nicht ;P
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 26.08.04 18:19 
Du solltest nicht versuchen, mit der Geradengleichung für ein kartesisches Koordinatensystem zu rechnen. Diese Gleichung ist eine Funktion und somit für vollständiges 360°-Verhalten ungeeignet. Um es an deinem Beispiel zu verdeutlichen: Punkt A (4|5), Punkt B (4|1). So und nun berechne mal m! ;-)
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Do 26.08.04 18:24 
das ist ja alles ganz schön und richtig, aber für den angesprochenen Fall ist dieses Technik unpraktisch bis nicht verwendebar. Was willst du mit funktionen machen, wenn der Ball mal senkrecht fliegt? m = ?

schmeiß die dummen Funktionen auf den Müll, die brigen dir hier nix. Ein vektor ist sowas wie die Anweisung gehe drei Schritte nach rechts und dann 3 geradeaus, also sie haben einen x- und einen y-Teil. Alternativ kann man sie auch aus einem Winkel und einer länge bestehen lassen.

Sie sind nichts weiter als Anweisungen. Wenn du dich z.B. bei 3|3 im Koosy befindest und einen vektor hast mit 2|1 musst du dich nach 5|5 bewegen, die beiden Teile werden einfach zusammengezählt.

also ich hatte das meines Wissens nach schon im der 8., aber egal :roll:

mache es mit Vektoren und den bereits von mir geschriebenen Funktionen.

Den Mittelpunkt des Balls speicherst du dann als Vektor

genauso den aktuellen bewegungsvektor.

wenn es nun zu einem timer/sonst einem Ereigniss kommt, das eine Bewegung machen soll musst du nun den bewegungvektor einfach zum Ortsvektor, der Position des balls dazuzählen.

eine entsprechende additionsfunktion sähe so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function addVec(Vec1, Vec2:TVector):TVector;
begin
Result.x := Vec1.x+Vec2.x;
Result.y := Vec1.y+Vec2.y;
end;



um das ganze dann noch schöner zu machen müsste man die aktuelle bewegung vor dem zusammenzählen noch mithilfe von MulVec (siehe oben) an die vergangene Zeit anpassen.


zur Kollision: Am Anfang ist es simpel: einfach wenn er an eine senkrechte Wand(Rand) stößt den x teil des vektors negativ nehmen
rate mal welchen teil du negativ nehmen musst, wenn er oben oder unten anstößt...




PS.: irgendwie habe ich das gefühl dass ich das ganze hier schonmal geschrieben habe ^^

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche