[B3D] Physik 4WD Buggy in 2D

Übersicht BlitzBasic Codearchiv

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Plasma

Betreff: jo

BeitragSa, Nov 11, 2006 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
gute idee !!

FreetimeCoder

BeitragSa, Nov 11, 2006 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ja wahnsinn! Mein Kompliment! Ich bin schon ganz gespannt auf die 3D Version.
"Wir haben keine Chance, aber wir werden sie nutzen!"
Projekte:
Dexterity Ball (100%)
Aquatic Atmosfear (22 % ca 4700 Zeilen) eingefrohren mangels OOP Fähigkeiten von Blitz
(ehemals Uboot)
PC: Intel D 3 GHz | NVidiaGforce 6700 256 Mb | 1024 Mb DDR RAM 400 Mhz | 2x160 GB S-ATA

Firstdeathmaker

BeitragFr, Jan 05, 2007 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstmal: Ich find das Ding einfach klasse.

Nur leider hab ich den Code noch nicht richtig verstanden. Könntest du mir weiterführende Quellen geben damit ich mich in die Thematik einlesen kann?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 05, 2007 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit 'weiterführende Quellen'? Es gibt keine, aus welchen ich mich eingearbeitet hätte. Ich habe ähnliches an fertigen Programmen gesehen und mich dann selber Gedanken darüber gemacht und es dann selber ausgearbeitet. Ich kann aber denoch versuchen es mal zu erklären:

Das ganze Prinzip beruht auf Zusammenstellungen der KPs und VKs.

KPs sind Knotenpunkte, also Verbindungspunkte die eine Position (EntityX/Y) und jeweils eine Geschwindigkeit (kp\xg, kp\yg) mitsich bringen. Damit hat jeder Punkt auch schon eine gewisse Massenträgheit durch die Eigengeschwindigkeit. Jeder KP speichert also nichts mehr, als die angegebenen Eigenschaften.

VKs sind VerKlinkungen, also Verbindungen zweier KPs die die Distanz zweier KPs (vk\ln), Zielinformation zu welchen KPs (vk\k1, vk\k2) und deren Dämpfung und Federung angeben. Dämpfung und Federung kann auch festgelegt werden und muß daher nicht mit in das Type, wenn alle Verbindungen gleich fest sein sollen.

Wenn man jetzt die KPs positioniert und mit VKs verbindet, wird durch eine Funktion auch die Solllänge jeglicher VKs ins vk\ln gespeichert. Dadurch haben wir eine art feste Strucktur geschaffen. In der Animationsphase (Spielmodus) wird eine Routine gestartet, die alle VKs durch geht und deren Zielpositionen (KPs) der Istentfernung durch die Sollentfernung korrigiert. Wichtig hier ist, mit Veränderung der Korrektur lassen sich unterschiedliche Eigenschaften der Strucktur festlegen (zB: schwabelig, hart, federnd bzw. hüpfend oder dumpf dämpfend). Ausschlaggebend sind hier die Korrekturen der jeweiligen Position der KPs im Verhältnis zur Korrektur der Geschwindigkeit. Um normale Korrekturen durchführen zu können, wie man es durch 'normale' Materie annehmen würde, so sollte sowohl Position als auch Geschwindigkeit einer Korrektur im Verhältnis 50:50 liegen.

Wichtig auch: Jegliche Korrektur sollte durch 4 geteilt werden, da es vier Positionen zu korregieren gibt: Position KP1 und KP2 und Geschwindigkeit KP1 und KP2. Wird die Zahl 4 vergrößert, so wird die Berechnung zwar 'realer' aber auch wesentlich weicher (nicht erwünscht). Wird die Zahl 4 kleiner so wird die Animationsstrucktur härter, aber auch instabil, da eine Übersteuerung vorgenommen wird sie unrealischisch ist. Unter Umständen wird die Strucktur in Eigenschwingung versetzt und zerrissen.

Anschliessend muß noch die Positionsänderung und die Eigengeschwindigkeit jeglicher KPs angewand werden. Dadurch erreichen wird erst die Massenträgheit. Dies geschieht in einer Routine.

Im Grunde wird jetzt die Animationsfunktion immer bestrebt sein, die Strucktur zusammen zu halten und zu animieren. In der realen Welt funktioniert das Zusammenhalten der auch nicht viel anders. Dadurch werden unterschiedliche Physikalische Eigenschaften automatisch 'übernommen'.

Als Beispiel in der 3D-Ausführung:

- Massenträgheit unterscheidet sich durch die Masse also Anzahl der KPs.
- Drehmonent wird eingehalten und unterscheidet sich durch die Anzahl also auch Positions(Masse)verteilung der KPs.
- Fliehkraft wird automatisch durch die Eigenmasse der KPs eingehalten.
- Kreiselstabilität wird auch eingehalten.

Im Grunde alles was das Programmiererherz wünscht. Nachteile zu dieser Art der Programmierung habe ich zuvor schon oft angesprochen.

Eingeproggt

BeitragFr, Jan 05, 2007 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, die Frage kann ich mir auch selbst beantworten ( Laughing ) aber kann man das auch mit B2D/B+ machen? oder braucht man diese Entities unbedingt?

Ich hoffe mal, dass das geht Very Happy
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

StepTiger

BeitragFr, Jan 05, 2007 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
rein theorethisch ja aber:

a) Das wird langsamer
b) Du musst dir eine eigene Kollisionsabfrage basteln
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 05, 2007 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht natürlich auch mit BB. Der Vorteil den B3D bietet ist, daß durch EntityX/Y auf Positionsvariablen verzichtet werden kann. Aber auch durch EntityDistance eine Atan2-Berechnugn ausfällt etc...

Hier ein BB-Beispiel:

Code: [AUSKLAPPEN]
gfx=1280
gfy=gfx*.75
ghx=gfx/2
ghy=gfy/2
Graphics gfx,gfy,0,1
SetBuffer BackBuffer()

Type kp ;KnotenPunkte
 Field xs% ;X-FestPosition
 Field ys% ;Y-FestPosition
 Field xp# ;X-Position
 Field yp# ;Y-Position
 Field xg# ;X-Speed
 Field yg# ;Y-Speed
 Field at% ;mobil/fest
End Type

Type vk ;VerKlinkungen
 Field k1% ;von KP-1
 Field k2% ;zum KP-2
 Field ln# ;Solllänge
End Type

sw%=0 ;Switch
id%=0 ;Handle
wk#=0 ;Winkel
dx#=0 ;
dy#=0 ;
mp%=1 ;MovingPosition




;Edit Hauptschleife
While Not KeyHit(1)
 mx=MouseX()
 my=MouseY()
 nx=Int(mx/10.0)*10
 ny=Int(my/10.0)*10

 If MouseHit(1)
  id=0
  For kp.kp=Each kp
   If kp\xp=nx And kp\yp=ny id=Handle(kp)
  Next

  If id=0
   kp.kp=New kp
   kp\xs=nx
   kp\ys=ny
   kp\xp=nx
   kp\yp=ny
   kp\xg=0
   kp\yg=0
   kp\at=0
   id=Handle(kp)
  End If

  If sw=0
   vk.vk=New vk
   vk\k1=id
   vk\k2=id
   sw=1
  Else
   vk.vk=Last vk
   vk\k2=id
   k1.kp=Object.kp(vk\k1)
   k2.kp=Object.kp(vk\k2)
   vk\ln=Sqr((k1\xp-k2\xp)^2+(k1\yp-k2\yp)^2)
   sw=0
  End If
 End If

 If MouseHit(2)
  id=0
  For kp.kp=Each kp
   If kp\xp=nx And kp\yp=ny id=Handle(kp)
  Next

  If id<>0
   k1.kp=Object.kp(id)
   k1\at=1-k1\at
  End If
 End If

 Color 32,32,48:Rect 0,gfy-40,gfx,60,1
 Color 48,48,72:For q=0 To gfx Step 10:Rect q,0,1,gfy,1:Rect 0,q,gfx,1,1:Next
 Color 64,64,96:For q=0 To gfx Step 40:Rect q,0,1,gfy,1:Rect 0,q,gfx,1,1:Next
 Color 96,96,144:Rect ghx,0,1,960,1
 Color 240,240,240:For kp.kp=Each kp:Rect kp\xp-4,kp\yp-4,9,9,kp\at:Next

 Rect mx-2,my-2,5,5,1
 Rect nx-4,ny-4,9,9,0

 For vk.vk=Each vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  Line k1\xp,k1\yp,k2\xp,k2\yp
  If k1=k2 Line k1\xp,k1\yp,nx,ny
 Next

 Flip
 Cls
Wend




;Anim Hauptschleife
While Not KeyHit(1)

 Color 48,48,72
 Rect 0,gfy-40,gfx,40,1

 For w=1 To 8
  For vk.vk=Each vk
   k1.kp=Object.kp(vk\k1)
   k2.kp=Object.kp(vk\k2)
   wk=(ATan2(k2\yp-k1\yp,k2\xp-k1\xp))Mod 360
   dx=(k1\xp+Cos(wk)*vk\ln)-k2\xp
   dy=(k1\yp+Sin(wk)*vk\ln)-k2\yp
   dx=dx/3
   dy=dy/3
   k1\xp=k1\xp-dx
   k1\yp=k1\yp-dy
   k1\xg=k1\xg-dx
   k1\yg=k1\yg-dy
   k2\xp=k2\xp+dx
   k2\yp=k2\yp+dy
   k2\xg=k2\xg+dx
   k2\yg=k2\yg+dy
  Next
 Next

 Color 240,240,240
 For kp.kp=Each kp
  If kp\at=1
kp\xp=kp\xs
   kp\yp=kp\ys
kp\xg=0
   kp\yg=0
  End If
  kp\yg=kp\yg+.05
  kp\xp=kp\xp+kp\xg
  kp\yp=kp\yp+kp\yg
  If kp\yp>gfy-43 kp\yp=gfy-43:kp\yg=0:kp\xg=0
  Rect kp\xp-2,kp\yp-2,5,5,0
 Next

 Color 64,64,96
 For vk.vk=Each vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  Line k1\xp,k1\yp,k2\xp,k2\yp
 Next

 kp.kp=Last kp
 k1.kp=Object.kp(mp)
 If KeyHit(29) mp=mp-1:If mp<1 mp=Handle(kp)
 If KeyHit(56) mp=mp+1:If mp>Handle(kp) mp=1
 If KeyDown(203) k1\xg=k1\xg-.05*Handle(kp)
 If KeyDown(205) k1\xg=k1\xg+.05*Handle(kp)
 If KeyDown(200) k1\yg=k1\yg-.05*Handle(kp)
 If KeyDown(208) k1\yg=k1\yg+.05*Handle(kp)
 Color 240,240,240:Rect k1\xp-2,k1\yp-2,5,5,1

 If KeyDown(30) vk.vk=First vk:vk\ln=vk\ln+.5
 If KeyDown(44) vk.vk=First vk:vk\ln=vk\ln-.5:If vk\ln<10 vk\ln=10

 Flip
 Cls
Wend
End

EDIT-MODUS:

- Mit der Linken Maustaste wird ein neuer KP gesetzt. Mit dem zweiten KP wird eine VK zwischen beiden KPs gelegt. Ist ein KP bereits vorhanden, so wird dieser übernommen.

- Mit der Rechten Maustaste kann ein KP festgesetzt bzw. wieder gelöst werden. Dadurch kann ein Rädchen oder ein Gelenk erstellt werden wo andere Struckturen dran hängen

- Mit dem ersten ESC gelangt man aus dem Edit-Modus zum Anim-Modus. Hier kann dann die Strucktur angesehen und getestet werden.

ANIM-MODUS:

- Mit [Strg] oder [Alt] kann zwischen den KPs ausgewählt werden.

- Mit Cursor kann das ausgewählte KP mit der Kraft der Gesammt vorhandenen Masse der KPs in die jeweilige Richtung beschleunigt werden.

- Mit dem zweiten ESC verlässt man das Programm.

edit1:

Zitat:
a) Das wird langsamer
b) Du musst dir eine eigene Kollisionsabfrage basteln

Stimmt! Es wird langsamer aber vor allem lässt sich eine so schöne Landschaft nicht so einfach generieren. Ausser, mann beschäftigt sich sehr eingehend mit Vektoren etc.

Eingeproggt

BeitragFr, Jan 05, 2007 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!

Das dürfte alles sein, was man so zum Probieren braucht Smile
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Christoph

BeitragSa, Jan 06, 2007 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach nur genial. Ich hab mir selber schon eine Funktion gebastelt, die Meshs einliest und dann so ein "Schwabbelmesh"( Very Happy ) erstellt Wink

Goodjee

BeitragSa, Jan 06, 2007 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
zeig mal her!!!
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

#Reaper

Newsposter

BeitragSa, Jan 06, 2007 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
finds genial Very Happy

Hab einmal eine Eiffelturm-ähneliches Gebilde erschaffen, sehr stabil übrigens^^
hatte nur 1nen knick reinbekommen, der hat sich aber gleich wieder selbst ausgebeult... Wink

und ein Auto mit Rädern, die sich sogar drehen können^^, hab ich gemacht Very Happy
(nur die Radaufhängung war ein wenig schwach Rolling Eyes

hier mal alles zusammengefasst:
user posted image
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 06, 2007 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu beachten gild: Jede VK ist gleich stabil, egal wie lang sie ist. Bedeutet leider aber auch, dass eine Aneinanderkettung von VKs zu sehr labilen Strukt führt. Anderenfalls, wenn man den erwähnten Eifelturm in betracht zieht, sollten Verstrebungen nicht allzu parallel verlaufen. Also wie man sieht, ein kleines Paradox.

Hier ein paar meiner Beispiele:

user posted image
Der Kran lässt sich mit [A/Y] hoch runter fahren.

user posted image
1. Die 'Schlange' neigt selbst dazu, sich wieder grade zu machen.
2. Das Fahrzeug hat Hinterradantrieb und muß eine Last ziehen.
3. Das Fahrzeug lässt sich zusätzlich noch in der Höhe variieren.

PS. Die erste VK lässt sich mit [A] und [Y] in der Animationsphase in der Länge verändern. Dadurch kann man Kräne etc erstellen.
  • Zuletzt bearbeitet von hectic am Fr, Aug 28, 2009 18:47, insgesamt einmal bearbeitet
 

Steven

ehemals "Steven04"

BeitragSa, Jan 06, 2007 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ja funny Very Happy

Ich habe aber nochmal eine Frage zu dem ursprünglichen Code:
Wenn ich eine Box als "Verkleidung" um das Auto tuen möchte, gibt es das Problem, dass nach meiner Ansicht nach es kein Entity gibt, wo man die Drehwinkelwerte mit z.B EntityYaw ablesen, könnte. Nun stellt sich die Frage, soll ik dann selbst so Fühler mitlaufen lassen, oder gibt es da noch eine andere Möglichkeit?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 06, 2007 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes sichtbare Pivot hat ein EntityRadius und eine Position. Drehwinkel einzelner Pivots bleiben beim drehen der Struktur unverändert. Will man den Winkel haben, so muß dieses mit zweiter Pivotpositionen und Atan2 geschehen. Falls du als 'Box' ein Image meinst, wie es in meinem Contestgame angewandt wurde, so gebe ich mal Auskunft über, wie ich es da gemacht habe:

- Pivots können EntityRadius haben oder sind nur als Verbindungspunkte ohne Kollision gedacht.

- Zur Ausrichtung des Images wird ein Zwei-Triangle-Mesh mit dem Image an Position gebracht und gedreht.

- Für besseres Gewichtsverhältnis als auch anderer besserer Eigenschaften wird nur ein KP pro Reifen benutzt. Dazu muß aber der Drehmoment etc. spezifisch berechnet werden.
 

FWeinb

ehemals "ich"

BeitragSo, Jan 07, 2007 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic du bist genial als das ist voll toll damit rumzuspielen köntest du noch ein Speicherfunktion hinzufügen ich bekomm das nicht hin

Dank im Voraus

[Edit]

Also ich habe das jetzt soweit hinbekommen doch ich komme mit disen Handeln nicht klar also ich will das ich k1.kp und k2.kp sichern kann aber wenn ich schreibe

WriteLine Datei,Object.kp(vk\k1)

Dann geht das nicth ich bitte um Hilfe

Also es kann ja nicht sein das ich das nicht inbekomme


PS: Das Progg ist super also Danke für Hilfe nochmal
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Firstdeathmaker

BeitragMi, Jan 10, 2007 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte mich an dieser Stelle auch noch mal bei dir bedanken hectic, das war genau die Erklärung die ich gebraucht habe. Ich werd jetzt leider die nächsten 3 Monate nicht so oft hier vorbei schauen können, aber Dank die hab ich was zum basteln Wink

(Ich möchte das ganze nicht für Autorennspiele e.t.c. missbrauchen, sondern für meinen Spaceshooter-Wahn... mir schwebt da so was wie "Bau dein eigenes Raumschiff und bestimme wo die Schubdüsen hinkommen sollen" Ding vor Wink )
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 10, 2007 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erst mal für den vielen Lob Smile Da anscheinend doch Interesse besteht, habe ich mal eine neue Version des Editors geschrieben.

Beschreibung:

- Neue Verbindungen können wie gehabt mit der Maus gesetzt werden.

- [a/y] verlängert/verkürtzt die 1. VK-Stange.

- [s/x] beschleunigt die 2. und 3. VK-Stange nach vorn/hinten.

- [d/c] dreht die 4. VK-Stange nach links/rechts.

- [strg/alt] ein neuen KP auswählen.

- [cursor] ausgewählten KP in Richtung beschleunigen.

- [F1] Quickload

- [F2] Quicksave

- [ESC] Anim-Modus bzw. Programm beenden.

Beachtet bitte, dass Quickload nur funktioniert, wenn noch keine VKs oder KPs vorhanden sind oder waren, da sonst die id-Handles auf die man als Programmierer kein Zugriff hat, durcheinander kommen.

Code: [AUSKLAPPEN]
;Grafikkramm
gfx=1280
gfy=gfx*.75
ghx=gfx/2
ghy=gfy/2
Graphics gfx,gfy,0,1
SetBuffer BackBuffer()

Type kp ;KnotenPunkte
 Field xs% ;X-Fest-Position
 Field ys% ;Y-Fest-Position
 Field xp# ;X-Position
 Field yp# ;Y-Position
 Field xg# ;X-Speed
 Field yg# ;Y-Speed
 Field at% ;mobil/fest
End Type

Type vk ;VerKlinkungen
 Field k1% ;von KP-1
 Field k2% ;zum KP-2
 Field ln# ;Solllänge
End Type

sw%=0 ;Switch
id%=0 ;Handle
wk#=0 ;Winkel
dx#=0 ;
dy#=0 ;
mp%=1 ;Moving-Position
nn%=0 ;GetKey-Mode-Switch
gk%=0 ;GetKey-Puffer
nm$="";Filename




;EDIT Hauptschleife
While Not KeyHit(1)

 ;Mauskramm
 mx=MouseX()
 my=MouseY()
 nx=Int(mx/10.0)*10
 ny=Int(my/10.0)*10

 ;KP Erstellen
 If MouseHit(1)
  id=0
  For kp.kp=Each kp
   If kp\xp=nx And kp\yp=ny id=Handle(kp)
  Next

  If id=0
   kp.kp=New kp
   kp\xs=nx
   kp\ys=ny
   kp\xp=nx
   kp\yp=ny
   kp\xg=0
   kp\yg=0
   kp\at=0
   id=Handle(kp)
  End If

  If sw=0
   vk.vk=New vk
   vk\k1=id
   vk\k2=id
   sw=1
  Else
   vk.vk=Last vk
   vk\k2=id
   k1.kp=Object.kp(vk\k1)
   k2.kp=Object.kp(vk\k2)
   vk\ln=Sqr((k1\xp-k2\xp)^2+(k1\yp-k2\yp)^2)
   sw=0
  End If
 End If

 ;Eigenschaft
 If MouseHit(2)
  id=0
  For kp.kp=Each kp
   If kp\xp=nx And kp\yp=ny id=Handle(kp)
  Next

  If id<>0
   k1.kp=Object.kp(id)
   k1\at=1-k1\at
  End If
 End If

 Color 32,32,48:Rect 0,gfy-40,gfx,60,1 ;Boden
 Color 48,48,72:For q=0 To gfx Step 10:Rect q,0,1,gfy,1:Rect 0,q,gfx,1,1:Next ;Gitter (fein)
 Color 64,64,96:For q=0 To gfx Step 40:Rect q,0,1,gfy,1:Rect 0,q,gfx,1,1:Next ;Gitter (grob)
 Color 96,96,144:Rect ghx,0,1,960,1 ;Mittellinie
 Color 240,240,240

 ;Maus-Position
 Rect mx-2,my-2,5,5,1
 Rect nx-4,ny-4,9,9,0

 ;KPs
 For kp.kp=Each kp
  Rect kp\xp-4,kp\yp-4,9,9,kp\at
 Next

 ;VKs
 For vk.vk=Each vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  Line k1\xp,k1\yp,k2\xp,k2\yp
  If k1=k2 Line k1\xp,k1\yp,nx,ny
 Next

 If KeyHit(59) nn=1 ;Load-Modus
 If KeyHit(60) nn=2 ;Save-Modus

 If nn>0
  gk=GetKey()
  If gk=8 If Not nm="" nm=Left(nm,Len(nm)-1)
  If gk>31 nm=nm+Chr$(gk)
  If KeyHit(57) nn=0

  ;Check
  If nn=1

   ;Handle-Konflikt
   For kp.kp=Each kp
    nn=0
   Next

   ;Handle-Konflikt
   For vk.vk=Each vk
    nn=0
   Next
  End If

  ;Load/Save
  If KeyHit(28)

   ;Load
   If nn=1
    nn=0

    ;Information einlesen
    If FileType(nm+".btm")
     file=ReadFile(nm+".btm")
      While Not Eof(file)
       If ReadByte(file)=1
        kp.kp=New kp
        kp\xs=ReadShort(file)
        kp\ys=ReadShort(file)
        kp\xp=ReadFloat(file)
        kp\yp=ReadFloat(file)
        kp\xg=ReadFloat(file)
        kp\yg=ReadFloat(file)
        kp\at=ReadByte(file)
        id=Handle(kp)
       Else
        vk.vk=New vk
        vk\k1=ReadShort(file)
        vk\k2=ReadShort(file)
        vk\ln=ReadFloat(file)
       End If
      Wend
     CloseFile file
    End If
   End If

   ;Save
   If nn=2
    nn=0

    ;Information schreiben
    file=WriteFile(nm+".btm")
     For kp.kp=Each kp
      WriteByte file,1
      WriteShort file,kp\xs
      WriteShort file,kp\ys
      WriteFloat file,kp\xp
      WriteFloat file,kp\yp
      WriteFloat file,kp\xg
      WriteFloat file,kp\yg
      WriteByte file,kp\at
     Next
     For vk.vk=Each vk
      WriteByte file,0
      WriteShort file,vk\k1
      WriteShort file,vk\k2
      WriteFloat file,vk\ln
     Next
    CloseFile file
   End If
  End If
 End If

 ;Load/Save -Info-Anzeige
 If nn=1 Text 100,100,"[Load] Filename: "+nm+".btm"
 If nn=2 Text 100,100,"[Save] Filename: "+nm+".btm"

 Flip
 Cls
Wend




;ANIM Hauptschleife
While Not KeyHit(1)

 ;Boden
 Color 48,48,72
 Rect 0,gfy-40,gfx,40,1

 ;VKs-Update
 For w=1 To 8 ;Extra-Härte
  For vk.vk=Each vk
   k1.kp=Object.kp(vk\k1)
   k2.kp=Object.kp(vk\k2)
   wk=(ATan2(k2\yp-k1\yp,k2\xp-k1\xp))Mod 360
   dx=(k1\xp+Cos(wk)*vk\ln)-k2\xp
   dy=(k1\yp+Sin(wk)*vk\ln)-k2\yp
   dx=dx/3.5
   dy=dy/3.5
   k1\xp=k1\xp-dx
   k1\yp=k1\yp-dy
   k1\xg=k1\xg-dx
   k1\yg=k1\yg-dy
   k2\xp=k2\xp+dx
   k2\yp=k2\yp+dy
   k2\xg=k2\xg+dx
   k2\yg=k2\yg+dy
  Next
 Next

 ;KPs-Update
 Color 240,240,240
 For kp.kp=Each kp
  If kp\at=1
   kp\xp=kp\xs
   kp\yp=kp\ys
   kp\xg=0
   kp\yg=0
  End If
  kp\yg=kp\yg+.05
  kp\xp=kp\xp+kp\xg
  kp\yp=kp\yp+kp\yg
  If kp\yp>gfy-43 kp\yp=gfy-43:kp\yg=0:kp\xg=0
  Rect kp\xp-2,kp\yp-2,5,5,0
 Next

 ;VKs zeichnen
 Color 64,64,96
 For vk.vk=Each vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  Line k1\xp,k1\yp,k2\xp,k2\yp
 Next

 kp.kp=Last kp
 k1.kp=Object.kp(mp)
 If KeyHit(29) mp=mp-1:If mp<1 mp=Handle(kp)
 If KeyHit(56) mp=mp+1:If mp>Handle(kp) mp=1
 If KeyDown(203) k1\xg=k1\xg-.05*Handle(kp)
 If KeyDown(205) k1\xg=k1\xg+.05*Handle(kp)
 If KeyDown(200) k1\yg=k1\yg-.05*Handle(kp)
 If KeyDown(208) k1\yg=k1\yg+.05*Handle(kp)
 Color 240,240,240:Rect k1\xp-2,k1\yp-2,5,5,1

 ;[a] Erste VK verlängern
 If KeyDown(30) vk.vk=First vk:vk\ln=vk\ln+.5

 ;[y] Erste VK verkürzen
 If KeyDown(44) vk.vk=First vk:vk\ln=vk\ln-.5:If vk\ln<10 vk\ln=10

 ;[s] 2/3te VK vorne beschleunigen
 If KeyDown(31)
  vk.vk=First vk
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg-(k1\xp-k2\xp)/100
  k1\yg=k1\yg-(k1\yp-k2\yp)/100
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg-(k1\xp-k2\xp)/100
  k1\yg=k1\yg-(k1\yp-k2\yp)/100
 End If

 ;[x] 2/3te VK zurück beschleunigen
 If KeyDown(45)
  vk.vk=First vk
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg+(k1\xp-k2\xp)/100
  k1\yg=k1\yg+(k1\yp-k2\yp)/100
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg+(k1\xp-k2\xp)/100
  k1\yg=k1\yg+(k1\yp-k2\yp)/100
 End If

 ;[d] 4te VK links drehen
 If KeyDown(32)
  vk.vk=First vk
  vk.vk=After vk
  vk.vk=After vk
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg+(k1\yp-k2\yp)/40
  k1\yg=k1\yg-(k1\xp-k2\xp)/40
  k2\xg=k2\xg-(k1\yp-k2\yp)/40
  k2\yg=k2\yg+(k1\xp-k2\xp)/40
 End If

 ;[c] 4te VK rechts drehen
 If KeyDown(46)
  vk.vk=First vk
  vk.vk=After vk
  vk.vk=After vk
  vk.vk=After vk
  k1.kp=Object.kp(vk\k1)
  k2.kp=Object.kp(vk\k2)
  k1\xg=k1\xg-(k1\yp-k2\yp)/40
  k1\yg=k1\yg+(k1\xp-k2\xp)/40
  k2\xg=k2\xg+(k1\yp-k2\yp)/40
  k2\yg=k2\yg-(k1\xp-k2\xp)/40
 End If

 Flip
 Cls
Wend
End


user posted image

In dieser kann man:

- mit [a/y] den Kran bediehnen,

- mit [s/x] die Rakette starten,

- mit [d/c] das Fahrzeug fahren.

Beachtet hier bitte, dass in dem Beispiel test1.btm die Auflösung von 1280x960 eingehalten werden muß. Eine Skallierung zwischen Auflösungen und dem Abspeichern habe ich noch nicht eingebaut, auch wenn dies nicht schwer währe. Sorry...

Viel Spaß damit... Very Happy
  • Zuletzt bearbeitet von hectic am Fr, Aug 28, 2009 18:48, insgesamt einmal bearbeitet

FireballFlame

BeitragMi, Jan 10, 2007 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Coole Sache Shocked Surprised
Kennt vielleicht einer von euch das Spiel "Bridge Builder"??

Da muss man über Gräben/Schluchten ect. Brücken für Züge oder Autos bauen. Anschließend müssen die eine "Belastungsprobe" (=Zug/Auto) bestehen.
Das Spiel funktioniert nach diesem Prinzip... es gibt außerdem mehrere Materialien (auch Seile, die sind elastisch) und wenn die Belastung an einem Punkt zu groß wird, reißt er ^^
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Steven

ehemals "Steven04"

BeitragDo, Jan 11, 2007 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe das irgendwie nicht ganz mit der "Verkleidung". Habe so etwas aber auch noch nie gemacht...
Könntest du das vllt ein bisschen genauer erklären, wie man es berechnen soll oder einen kleinen Ansatz schreiben? Bedanke mich jetzt schonmal für die Antworten....

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 11, 2007 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Steven04, es heisst bei mir nicht 'Verkleidung' sondern 'Verklinkung' und diese geben an, welche Knotenpunkte miteinander verbunden sind (vergleichbar in etwa, in ihrer Länge elastische Stangen). Die Funktionsweise habe ich bereits mehrfach beschrieben.

Denoch versuch ich es nochmal zu erklären:

- Bei mir KP genannt, sind Knotenpunkte die durch ihre gespeicherte Geschwindigkeit ihre Masse und der darin angewandten Gravitation ihr Gewicht mitsich bringen.

KPs haben also Position und Geschwindigkeit und werden in einer Schleife pro Schleifendurchlauf jeweils einzelnd neu berechnet (Energieerhaltungssatz etc.).

- Bei mir VK genannt, sind Verklinkungen die durch angabe, welche KPs miteinander verbunden sind und deren Sollentfernung, eine 'Strucktur' bilden.

VKs haben also nur Verbindungen zweier KPs und deren Sollentfernung gespeichert. Pro Schleifendurchlauf wird jede VK einzelnd durchgangen, die dann eine Korrektur der KP-Schleife und direkt in dieser durchnimmt. Das heisst: Ist zB durch Äussere Einwirkung eine Verformung der Grundstrucktur eingetretten, so wird die VK-Schleife diese versuchen stetts zu korregieren und in die Ausgangssituation zu bringen. Dabei wird in jeweils beider Richtungen der VK korrigiert (wir errinern uns 'Stangen'). Ist die eine Seite verhindert (zB Bodenkontakt), so geht die Verformungsenergie nur noch in die andere Richtung. Dadurch 'federt' die Strucktur erst ein und dann wieder zurück. Dabei entsteht ein leichter Sprungeffekt, der durch die Massenträgheit der KPs zustande kommt.


Programmierung naiver physikalischer Grundstrukturen.

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group