Schneeball fliegt nicht richtig
Übersicht

![]() |
BlitzCheckerBetreff: Schneeball fliegt nicht richtig |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Ich bin dabei ein Game zu proggen, allerdings hab ich ein Problem: Ich will machen, das wenn man die linke Maustaste drückt, ein Schneeball geradeaus fliegt. Allerdings fliegt er immer sehr stark zu seite. Ich denke, es ist ein Rundungsfehler. Aber ich hab ihn noch nicht gefunden. Hier mal die entscheidenden Code-Stücke: Schneebälle positionieren: Code: [AUSKLAPPEN] For schneeball.schneebaelle = Each schneebaelle
id = schneeball\id x_s = schneeball\x y_s = schneeball\y z_s = schneeball\z status = schneeball\status PositionEntity id,x_s,y_s,z_s status = status + 1 If status = 180 Then status = 1 schneeball\status = status/2 RotateEntity id,schneeball\pitch#,schneeball\yaw#,schneeball\roll# MoveEntity id,1,Sin(status),1 schneeball\x=EntityX(id) schneeball\y=EntityY(id) schneeball\z=EntityZ(id) Next Neuen Schneeball erzeugen: Code: [AUSKLAPPEN] If MouseHit(1) Then
schneeball.schneebaelle = New schneebaelle schneeball\id = CopyEntity(snowball_roh) temp_x = EntityX(camera) temp_z = EntityZ(camera) schneeball\x = temp_x schneeball\z = temp_z schneeball\y = EntityY(camera) schneeball\status = 1 schneeball\pitch# = EntityPitch(camera) schneeball\yaw# = EntityYaw(camera) schneeball\roll# = EntityRoll(camera) EndIf Ich hoffe ihr könnt mir helfen! mfg BlitzChecker |
||
www.xairro.com |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was hat den Sin in einer Flugbahn zu suchen? Ein Flugkörper der ohne eigenen Antrieb durch die Luft fliegt ist allein den Naturgesetzen ausgeliefert und die währen... Gravitation und Luftwiederstand... Wenn man es dann auch noch etwas realistischer machen will, kann man noch ein Drehimpuls mit einbeziehen der die Luft so 'umwältzt' das ein Flugkörper einen leichten Bogen fliegt (wie es beim Fussball oder Tischtennis angewandt wird)...
Du benötigst also nur jeweils eine X,Y,Z Positionskoordinate und jeweils eine X,Y,Z Bewegungskoordinate... Die Position wird von der Bewegung beeinflusst... Zusätzlich addierst oder subtraiertst du der Y-Bewegungsvariable eine Gravitation hinzu... Bei einem neuem Wurf wird ein ein Schneball an der Position des werfenden erstellt und die Beweghungsrichtung und Stärke den Bewegungsvariablen zugeteilt (Stossimpuls). den Rest sollten die restlichen Berechnungen wie oben genannt dann machen... Fertig... |
||
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich verstehe eigentlich nicht, wozu du im Type die Koordinaten des Schneeballs angegeben hast. Schließlich sind die Koordinaten bereits in der Entity gespeichert. Du müsstest nur beim Erstellen des Schneeballs diesen an die richtige Stelle setzen sowie entsprechend rotieren und dann in der Hauptschleife diesen nach vorne zu bewegen. | ||
![]() |
BlitzChecker |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh... ![]() stimmt... das mit dem sin war nur vorrübergehend so. nur damit das wenigstens ein bisschen "real" aussieht und damit er auch mal auf den bode kommt. aber das mit der physik des schneeballs hab ich noch nicht so ganz verstanden. wie kann ich denn am besten die gravitation erzeugen? mfg BlitzChecker |
||
www.xairro.com |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sry vielleicht hab ich das falsch verstanden aber ich denke mal:
Code: [AUSKLAPPEN] moveentity schneeball,0,-gravity,0 |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So müsste das aussehen. Wer es noch realer machen will, benutzt Folgendes:
Code: [AUSKLAPPEN] MoveEntity schneeball,0,-(gravity*mass),ZSpeed
Dann ist gravity eine globale Konstante, während mass ein Typefield ist. |
||
![]() |
BlitzChecker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mein eigentliches Problem war (und ist) ja:
der Ball fliegt nicht gerade, sonder zu weit nach rechts. Manchmal fliegt er auch ganz nach hinten. |
||
www.xairro.com |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@5k41, der Ansatz ist schon ok, nur das Problem das die Gravitation nicht verstärkt wird, ausser wenn die Gravitationsvariable während der Laufzeit verändert wird...
@BlitzChecker, da ich nun nicht soviel Lust habe wieder einen neuen Code zu schreiben und auch kaum noch Zeit habe, gebe ich dir mal ein anderen alten Beispielcode den man nur ein wenig Umreiben müsste...Code: [AUSKLAPPEN] Graphics3D 640,480,32,2
SetBuffer BackBuffer() xp#=10;X-Geschwindigkeit yp#=10;Y-Geschwindigkeit zp#=20;Z-Geschwindigkeit xg#=0;X-Position yg#=0;Y-Position zg#=0;Z-Position camera=CreateCamera() light=CreateLight() cube=CreateCube() PositionEntity camera,0,8,0 PositionEntity cube,x,y,z TurnEntity light,70,0,0 ;Hauptschleife While Not KeyHit(1) If KeyDown(203) Then xg=xg-0.02 If KeyDown(205) Then xg=xg+0.02 If KeyDown(200) Then zg=zg+0.02 If KeyDown(208) Then zg=zg-0.02 If KeyDown(57) And yp=0 Then yg=.5 ;Berechnung des 'Luftwiederstandes' xg=xg/1.02 yg=yg/1.02 zg=zg/1.02 ;Anwendung der Gravitation yg=yg-0.01 ;Anwendung der Geschwindigkeit an die Positionen xp=xp+xg yp=yp+yg zp=zp+zg ;Ganz billige Bodenabfrage If yp<0 Then yp=0:yg=-yg/2 PositionEntity cube,xp,yp,zp RenderWorld Flip Wend End /EDIT: @BlitzChecker, du musst beim Wurf die Richtung mit Sin/Cos ausrechnen. Du hast bei deinem ersten Post das Sin in der Bewegungsroutine mit drin, da soll es eben nicht rein. Beim erzeugen bzw. Wurf ist es ja was anderes... |
||
- Zuletzt bearbeitet von hectic am Sa, März 04, 2006 15:47, insgesamt einmal bearbeitet
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also das Problem, dass er nach rechts fliegt, ist ohne Weiteres zu erkennen:
Code: [AUSKLAPPEN] MoveEntity id,1,Sin(status),1
So sieht es jetzt im Moment bei dir aus, schätze ich. Aber die erste 1 ist doch eigentlich unnötig. Wenn du ihn entlang der X-Achse mit einem positiven Wert bewegst, dann bewegst du ihn nach rechts. So einfach ist das. ![]() Dass er nach hinten fliegt, kann ich mir nicht erklären. ![]() |
||
![]() |
BlitzChecker |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke, jetzt gehts! ![]() |
||
www.xairro.com |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Gravitation auf MoveEntity auszuführen ist übrigens falsch. Dies wirkt sich auf das lokale Koordinatensystem aus, nicht auf die Weltachsen.
Insofern müsste man TranslateEntity oder PositionEntity verwenden. Da für eine Gravitation jedoch eh Position und Geschwindigkeit und Beschleunigung nötig sind, wird wohl PositionEntity fast einfacher sein (New Position = Old Position + Geschwindigkeit, New Geschwindigkeit = Old Geschwindigkeit + Beschleunigung. Letzteres wären dann Graviation und Reibung im vorliegenden Falle, wobei Reibung durch ein einfaches Reibung = -0.03 * Geschwindigkeit zu erreichen ist) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt ja... Division braucht mehr Taktzyklen als eine Multiplikation...
Code: [AUSKLAPPEN] xg=xg/1.02
yg=yg/1.02 zg=zg/1.02 kann durch Code: [AUSKLAPPEN] xg=xg*.98
yg=yg*.98 zg=zg*.98 ersetzt werden... |
||
![]() |
BlitzChecker |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, ich hab ein neues problem:
machmal starten die schneebälle wer weiss wo. aber nur manchmal. Code: [AUSKLAPPEN] For schneeball.schneebaelle = Each schneebaelle
id = schneeball\id MoveEntity id,0,0,1 RotateEntity id,schneeball\pitch#,schneeball\yaw#,schneeball\roll# Next Code: [AUSKLAPPEN] If MouseHit(1) Then
schneeball.schneebaelle = New schneebaelle temp = CopyEntity(snowball_roh) schneeball\id = temp schneeball\pitch# = EntityPitch(camera) schneeball\yaw# = EntityYaw(camera) schneeball\roll# = EntityRoll(camera) PositionEntity temp,EntityX(camera),EntityY(camera),EntityZ(camera) EndIf |
||
www.xairro.com |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nur so nebenbei: Die masse hat generell nichts mit der Geschwindigkeit zu tun, mit der ein Körper nach unten fällt, entscheident ist der Luftwiederstand.
Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
falsch.
Beschleunigung = Kraft / Masse wenn mans reibungsfrei macht. Aber normalerweise setzt man die Gravitation als Konstante, womit das Gewicht nicht zum tragen kommt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, sry. Ich mein natürlich nur bei der Gravitation. Ist villeicht etwas unklar ausgedrückt.
Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
BlitzChecker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weiss denn keiner, warum die Schneebälle an der falschen Stelle losfliegen? ![]() |
||
www.xairro.com |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group