  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 12.03.2007, 18:43    Titel: Bildschirm drehen | 
				     | 
			 
			
				
  | 
			 
			
				Hallo Läute,
 
ich progge gerade einen Flugsimulator in QBasic und habe ein
 
kleines Problem(chen): Da sich Flugzeuge bekanntlich bei einer 
 
Kurve drehen, sollte das in meinem Flusi auch so sein leider weiß
 
ich nicht wie ich das anstellen soll    
 
Kann mir mal jemand helfen?
 
Danke | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skilltronic
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
  | 
		
			
				 Verfasst am: 12.03.2007, 22:20    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo und Wilkommen im Forum!
 
 
Also ich denke, dazu musst du die kartesischen xy-Koordinaten der Grafik in polare (Radius und Winkel) umwandeln, dann drehen, zurückwandeln und neu zeichnen. Da steckt aber ein ziemlicher Rechenaufwand (SIN, COS und ATN) dahinter, was das Ganze - vor allem mit QB - recht langsam macht.
 
 
Gruß
 
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eisbaer
 
  
  Anmeldungsdatum: 16.10.2004 Beiträge: 354 Wohnort: Deutschland,Bayern
  | 
		
			
				 Verfasst am: 12.03.2007, 23:21    Titel: Flugsimulator | 
				     | 
			 
			
				
  | 
			 
			
				Auf der Seite von Triton gibt es eine nette kleine Spielerei dazu;
 
 
FSim43 - genialer 3D Flugsimulator! 
 
 
http://www.silizium-net.de/downspie.htm
 
 
evt. ist das was für dich.. 
 
 
oder
 
 
Flight - Beste QB Flugsimulation die ich je gesehen habe!!! 
 
 
 
Grüße Eisbaer _________________ Eigene Webseite:
 
http://www.eisbaer-studios.de | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Elvis
 
  
  Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
  | 
		
			
				 Verfasst am: 13.03.2007, 18:15    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich habe mir zwar die Links von Eisbaer nicht genau angesehen, würde dir
 
aber eine möglichst in Assembler oder C/C++ geschriebene Lib empfehlen,
 
die dann Rechenaufwändige Abschnitte für QBasic übernimmt.  
 
Am besten wäre es natürlich, wenn du sie selbst schreiben könntest, was
 
ich aber kaum glaube...  
 
 
 
Grüße, Elvis | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 14.03.2007, 16:42    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke, dass ihr mir geantwortet habt!!!
 
Welche Lib würdest du mir denn empfehlen??
 
Die Routiene kann ich wirklich nicht selber schreiben 
 
SCHADE    | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Elvis
 
  
  Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
  | 
		
			
				 Verfasst am: 14.03.2007, 20:31    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Keine Ahnung...  
 
Sie muss lediglich schnell rechnen können, also eine Mathe-Lib...  
 
 
 
Grüße, Elvis | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 16.03.2007, 16:22    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Reicht UGL aus??
 
Wenn nicht kann mir mal jemand eine Routine schreiben    
 
oder mir ein paar gute Tips zum schreiben dieser Routine
 
geben??
 
 
Danke im Vorraus | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		dreael Administrator
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 2531 Wohnort: Hofen SH (Schweiz)
  | 
		
			
				 Verfasst am: 16.03.2007, 20:40    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Skilltronic hat Folgendes geschrieben: | 	 		  | Da steckt aber ein ziemlicher Rechenaufwand (SIN, COS und ATN) dahinter, was das Ganze - vor allem mit QB - recht langsam macht. | 	  
 
Grundsätzlich völlig korrekt im Zeitalter, wo QB von der Technologie aktuell war - sprich 286er/386er-DOS-Zeitalter - noch tatsächlich undenkbar damals ohne Assembler.
 
 
Inzwischen aber hat sich dank mit 3,4 GHz getakteten Pentium D-Prozessoren die Situation dramatisch geändert, dass heutzutage selbst ohne Compiler genügend Geschwindigket für Animationen vorhanden sind.
 
 
@Ferdi: In Deinem Fall lautet das Stichwort Koordinatentransformation, wofür man sich in der Linearen Algebra entsprechend auskennen sollte, speziell, was eine Matrix aus 3 orthogonal zueinanderstehenden Einheitsvektoren (in QB übrigens ein herrliches Beispiel für TYPE!) ist. Ebenso ist Knowhow im Bereich Zentralprojektion notwendig: Der Bildschirm stellt quasi eine im Raum schwebende Ebene dar, auf welcher Du die momentan gesehene Landschaft draufprojezierst.
 
 
Vielleicht kannst Du uns ja sonst einmal einen Zwischenstand Deines Projekts auf einen Webspace hochladen, damit wir hineinschauen können. Ansonsten kann ich Dir aus meiner Sammlung folgende Beispiele aus dem Bereich 3D und Zentralprojektion anbieten:
 
 
http://www.dreael.ch/Deutsch/Download/Labyrinth.html
 
http://www.dreael.ch/Deutsch/Download/Pyramide3D.html
 
 
Ferner steckt noch im Projekt
 
 
http://www.dreael.ch/Deutsch/Download/Funktionsdarstellung.html
 
 
ebenfalls etwas für Dich wertvolles: Dreieck-Zeichenroutine (Unterprogramm), welche auch Kommastellen berücksichtigt, was die Darstellung von noch weit entfernten Landschaftsobjekten viel präziser darstellt, als wenn man nur eine eine Integerkoordinaten-Polygonroutine verwendet. _________________ Teste die PC-Sicherheit mit www.sec-check.net | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		darkinsanity aka sts
  
  Anmeldungsdatum: 01.11.2006 Beiträge: 456
 
  | 
		
			
				 Verfasst am: 18.03.2007, 18:17    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| Ich hab irgendwo noch Sub´s rumfliegen, drei davon können einen Punkt im 3D Raum drehen und eine die einen Punkt im 2D drehen kann, (um eine bestimmte Koordinate) bei interesse Mail an info@greensoft.de.vu | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 18.03.2007, 18:19    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				hm, wieso stellst du's nicht einfach hier rein bzw ladest die datei hoch? dafür ist ein forum doch da   andere könnten den source auch gebrauchen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 18.03.2007, 18:20    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				ein einzelnen Punkt um eine bestimmte achse zu drehen ist nicht so kompliziert, aber ein ganzes Bild so ohne Lib, da muss man schon 'ne gute und vorallem schnelle berechnung basteln, sonst schläft man ein *gg* _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		darkinsanity aka sts
  
  Anmeldungsdatum: 01.11.2006 Beiträge: 456
 
  | 
		
			
				 Verfasst am: 19.03.2007, 14:47    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich such den Source mal...
 
Man könnte doch die einzelnen Punkte nehmen, drehen und wieder zeichnen, da gibts so en befehl, fällt mir aber grad nicht ein. Problem ist allerdings die Geschwindigkeit. Aber auf neueren PC´s sollte das doch klappen, oder??
 
wenn nicht, da gibts so en Programm das wandelt QBASIC in C um, habs noch nicht getestet, aber das müsste das ganze doch schneller machen, oder? | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Elvis
 
  
  Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
  | 
		
			
				 Verfasst am: 19.03.2007, 14:52    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Solche Auto-Compiler produzieren glaube ich keinen so besonders guten
 
Code...  
 
Aber ausschliessen will ich es trotzdem nicht...  
 
 
 
Grüße, Elvis | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 19.03.2007, 15:17    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hab gerade mal 'n Verusch gemacht, aber da ist irgendwie der Wurm drinne, ist allerdings auch FreeBASIC...
 
 
 	  | Code: | 	 		  
 
CONST PI AS DOUBLE = 3.1415926535897932/180
 
 
Screen 18,32,2
 
 
Bload "Test.bmp"
 
 
CenterX=320
 
CenterY=240
 
 
Dim Read_Scr as UByte
 
Dim Write_Scr as UByte
 
Read_Scr=0 : Write_Scr=1
 
 
While Inkey$<>Chr$(27)
 
    
 
    
 
    For y=0 to 479
 
    For x=0 to 639
 
 
        ScreenSet Read_Scr,Write_Scr
 
    
 
        XX=0-CenterX+x
 
        YY=0-CenterY+y
 
    
 
        Col=Point(x,y)
 
    
 
        ScreenSet Write_Scr,Write_Scr
 
    
 
        NewX=Cos(Winkel*pi)*XX
 
        NewY=Sin(Winkel*pi)*YY
 
        
 
        NewX=CenterX+NewX
 
        NewY=CenterY+NewY
 
        
 
        If NewX>-1 and NewY>-1 and NewX<640 and NewY<480 Then Pset (NewX,NewY),Col
 
 
    Next x
 
    Next y
 
    
 
    Winkel=Winkel+1
 
    If Winkel=360 then Winkel=0
 
Wend
 
 
 
sleep
 
 | 	  
 
 
Habs nicht so mit komplexer Mathematik   _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skilltronic
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
  | 
		
			
				 Verfasst am: 19.03.2007, 15:45    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
 
Also ich glaube, da ist in mehrfacher Hinsicht der Wurm drin. Erstens ist das Verfahren, den ganzen Bildschirm Pixelweise zu drehen eher ungeeignet. Für einen Flugsimulator o.ä. ist es besser, die Koordinaten für die angezeigten Objekte, z.B. die Eckpunkte von Polygonen oder so zu drehen und so ein neues Bild zu zeichnen. So muss auch nur ein Bruchteil der Berechnungen ausgeführt werden, als wenn man den ganzen Bildschirm dreht.
 
 
Ausserdem müsstest du bei deiner Methode erstmal den Ausgangswinkel und Abstand zum Mittelpunkt für jedes Pixel berechnen. Das meinte ich mit wandeln in Polarkoordinaten. Für 3D sogar mit 2 Winkeln und einem Radius.
 
 
Ach ja, den Wert von Pi brauchst du nicht unbedingt auszuschreiben. Probier mal das:
 
 
 	  | Code: | 	 		  pi# = 4 * ATN(1)
 
PRINT pi# | 	  
 
 
Gruß
 
Sklilltronic _________________ Elektronik und QB? www.skilltronics.de ! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 19.03.2007, 15:49    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ja, gut ist die Routine nicht, auch wenn sie funktionieren würde, es ging mir eigentlich dabei um einen einfachen test, aber der ist gründlich daneben gegangen  
 
Das mit dem ATN hatte ich schon wieder vergessen    _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 20.03.2007, 20:05    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Tja, leider bin ich noch überhaupt nicht fertig mit meinem Flusi und wenn ihr meinen Quellcode sehen würdet, würdet ihr umfallen   
 
Der ist so schlecht geschrieben   
 
Aber ich mach es (nur weil ihr es seid):
 
 
 	  | Code: | 	 		  DECLARE SUB Tag (y1!, y2!)
 
DECLARE SUB Nacht (y1!)
 
DECLARE SUB VerschiebeKameraFACETRI3D (Dreieck AS ANY, kamera AS ANY, NeuDreieck AS ANY)
 
DECLARE SUB VerschiebeFACETRI3D (Dreieck AS ANY, Vektor AS ANY, NeuDreieck AS ANY)
 
DECLARE SUB SkaliereFACETRI3D (Dreieck AS ANY, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuDreieck AS ANY)
 
DECLARE SUB ZeichneFACETRI3D (Dreieck AS ANY, Farbe AS INTEGER)
 
DECLARE SUB RotiereXYZFACETRI3D (Dreieck AS ANY, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuDreieck AS ANY)
 
 
DECLARE SUB VerschiebePUNKT3D (Punkt AS ANY, Vektor AS ANY, NeuPunkt AS ANY)
 
DECLARE SUB SkalierePUnkt3D (Punkt AS ANY, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereXPUNKT3D (Punkt AS ANY, Beta AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereYPUNKT3D (Punkt AS ANY, Gamma AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereZPUNKT3D (Punkt AS ANY, Alpha AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereXYZPuNKT3D (Punkt AS ANY, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB Wolke1 (x!, y!)
 
 
'//-------------------------- KONSTANTEN ----------------------------
 
CONST FOCUS = 255                      ' Entfernung Betrachter->Projektionsfl„che
 
CONST DEGtoRAD = 3.141593 / 180        ' "Grad in Bogenmaá"-Konstante
 
 
'//-------------------------- DATENTYPEN ---------------------------
 
TYPE PUNKT3D
 
      x AS SINGLE
 
      y AS SINGLE
 
      z AS SINGLE
 
END TYPE
 
 
TYPE VEKTOR3D
 
      x AS SINGLE
 
      y AS SINGLE
 
      z AS SINGLE
 
END TYPE
 
 
TYPE FACETRI3D
 
      p1 AS PUNKT3D
 
      p2 AS PUNKT3D
 
      p3 AS PUNKT3D
 
      p4 AS PUNKT3D
 
      p5 AS PUNKT3D
 
      p6 AS PUNKT3D
 
      p7 AS PUNKT3D
 
      p8 AS PUNKT3D
 
END TYPE
 
 
TYPE KAMERA3D
 
      Position AS PUNKT3D
 
      Xrot AS SINGLE
 
      Yrot AS SINGLE
 
      Zrot AS SINGLE
 
END TYPE
 
 
'// ------------------------ VARIABLEN FšR DEMO ----------------------
 
DIM kamera(9) AS KAMERA3D              ' unsere Kamera...
 
DIM Dreieck(9) AS FACETRI3D            ' Dreieck im Objektraum
 
DIM TransDreieck(9) AS FACETRI3D       ' Datenstruktur f?r transformiertes Dreieck
 
DIM Alpha AS SINGLE                    ' Rotationswinkel um den Dreieck im Objektraum gedreht werden soll
 
DIM Taste$                             ' hier speichern wir die von INKEY$ erhaltene Taste
 
 
'// Die Start x1 und y1 Koordinaten f?r den Horizont
 
y1 = 50
 
y2 = 50
 
 
'// Videomodus f?r Doublebuffering initialisieren
 
SCREEN 7, , 0, 1
 
 
'// Hauptschleife
 
DO
 
      '// Rotationswinkel um die Y-Achse erh”hen
 
      '// und vermeiden, dass wir einen šberlauf kriegen
 
      'Alpha = Alpha + 1    'Stillgelegt
 
      IF Alpha >= 360 THEN Alpha = 0
 
 
      '// Dreieck im Objektraum drehen
 
      FOR bb = 1 TO 9
 
      RotiereXYZFACETRI3D Dreieck(bb), 0, 0, Alpha, TransDreieck(bb)
 
      NEXT bb
 
      '// Transformiertes Dreieck in den Kameraraum transformieren
 
      FOR BBB = 1 TO 9
 
      VerschiebeKameraFACETRI3D TransDreieck(BBB), kamera(BBB), TransDreieck(BBB)
 
      NEXT BBB
 
      '// Projizieren und Zeichnen
 
      IF genug% < 9 THEN
 
FOR b = 1 TO 9
 
RANDOMIZE TIMER
 
Dreieck(b).p1.x = INT(RND * 1000) + -1000
 
Dreieck(b).p1.y = INT(RND * 1000) + -1000
 
Dreieck(b).p1.z = INT(RND * 0) + 1000
 
'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
Dreieck(b).p2.x = Dreieck(b).p1.x + 40: Dreieck(b).p2.y = Dreieck(b).p1.y + 80: Dreieck(b).p2.z = Dreieck(b).p1.z
 
Dreieck(b).p3.x = Dreieck(b).p1.x + 80: Dreieck(b).p3.y = Dreieck(b).p1.y: Dreieck(b).p3.z = Dreieck(b).p1.z
 
Dreieck(b).p4.x = Dreieck(b).p1.x + 48: Dreieck(b).p4.y = Dreieck(b).p1.y: Dreieck(b).p4.z = Dreieck(b).p1.z
 
Dreieck(b).p5.x = Dreieck(b).p1.x + 40: Dreieck(b).p5.y = Dreieck(b).p1.y: Dreieck(b).p5.z = Dreieck(b).p1.z
 
Dreieck(b).p6.x = Dreieck(b).p1.x + 48: Dreieck(b).p6.y = Dreieck(b).p1.y - 40: Dreieck(b).p6.z = Dreieck(b).p1.z
 
Dreieck(b).p7.x = Dreieck(b).p1.x + 40: Dreieck(b).p7.y = Dreieck(b).p1.y - 40: Dreieck(b).p7.z = Dreieck(b).p1.z
 
 
      ZeichneFACETRI3D TransDreieck(b), 4
 
genug% = genug% + 1
 
NEXT b
 
END IF
 
 
IF genug% >= 9 THEN
 
 FOR baeume = 1 TO 9
 
  Dreieck(ba).p2.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p2.y = Dreieck(ba).p1.y + 80: Dreieck(ba).p2.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p3.x = Dreieck(ba).p1.x + 80: Dreieck(ba).p3.y = Dreieck(ba).p1.y: Dreieck(ba).p3.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p4.x = Dreieck(ba).p1.x + 48: Dreieck(ba).p4.y = Dreieck(ba).p1.y: Dreieck(ba).p4.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p5.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p5.y = Dreieck(ba).p1.y: Dreieck(ba).p5.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p6.x = Dreieck(ba).p1.x + 48: Dreieck(ba).p6.y = Dreieck(ba).p1.y - 40: Dreieck(ba).p6.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p7.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p7.y = Dreieck(ba).p1.y - 40: Dreieck(ba).p7.z = Dreieck(ba).p1.z
 
      ZeichneFACETRI3D TransDreieck(baeume), 4
 
 NEXT baeume
 
END IF
 
 
 
      '// Wetterdaten auswerten
 
      Wetter$ = "Tag"
 
      IF Wetter$ = "Tag" THEN
 
       CALL Tag(y1, y2)
 
      ELSE
 
       CALL Nacht(y1)
 
      END IF
 
 
 
      '// Wolken zeichnen
 
       CALL Wolke1(100, y1 - 25)
 
       CALL Wolke1(150, y1 - 20)
 
       CALL Wolke1(200, y1 - 40)
 
 
      '// Hier nehmen wir die Tastatureingabe
 
      '// vom Benutzer entgegen. Derzeit noch mit INKEY$
 
      Taste$ = INKEY$
 
              
 
            '// Bewegung entlang positiver Z-Achse (vorw„rts)?
 
            IF (Taste$ = CHR$(0) + CHR$(62)) THEN
 
            Geschwindigkeit% = 200
 
            END IF
 
       
 
            IF (Taste$ = CHR$(0) + CHR$(61)) THEN
 
               Geschwindigkeit = Geschwindigkeit + 10
 
            END IF
 
 
            '// Bewegung entlang negativer Z-Achse (r?ckw„rts)?
 
            '// Dies ist eine unbeschriebene Funktion, die in
 
            '// der Wirklichkein nicht stattfindet :-)
 
            IF (Taste$ = "s") THEN
 
            Geschwindigkeit = Geschwindigkeit - 10
 
            END IF
 
 
            IF (Taste$ = CHR$(0) + CHR$(60)) THEN
 
             Geschwindigkeit = Geschwindigkeit - 10
 
            END IF
 
 
            '// Bewegung entlang positiver X-Achse (rechts)?
 
            IF (Taste$ = CHR$(0) + CHR$(77)) THEN
 
            Rechts = Rechts + 10
 
            END IF
 
       
 
            '// Bewegung entlang negativer X-Achse (links)?
 
            IF (Taste$ = CHR$(0) + CHR$(75)) THEN
 
            Rechts = Rechts - 10
 
            END IF
 
 
            '// Bewegung entlang positiver Y-Achse (unten)?
 
            IF (Taste$ = CHR$(0) + CHR$(80)) THEN
 
               Unten = Unten - 10
 
               y1 = y1 - 1
 
               y2 = y2 - 1
 
 
               KKKKK = 9
 
               
 
            END IF
 
           
 
            '// bewegung entlang negativen Y-Achse (oben)?
 
            IF (Taste$ = CHR$(0) + CHR$(72)) THEN
 
            Unten = Unten + 10
 
            y1 = y1 + 1
 
            y2 = y2 + 1
 
            END IF
 
 
            IF (Taste$ = CHR$(27)) THEN '//Wenn Escape-Taste
 
             Ende% = 1                  '  gedr?ckt dann
 
            END IF                      '  Ende% = 1
 
 
 
            '// [("Alle")] Baume verschieben
 
             kamera(K).Position.z = kamera(K).Position.z + Geschwindigkeit%
 
             kamera(KKK).Position.x = kamera(KKK).Position.x + Rechts
 
             kamera(KKKKK).Position.y = kamera(KKKKK).Position.y + Unten
 
      '// Good old Doublebuffering...
 
      PCOPY 0, 1
 
      CLS
 
 
'//Abbruch bei Druck auf Escape-Taste
 
LOOP UNTIL Ende% = 1
 
 
Ende:
 
'// zur?ck in den Textmodus (sch”ne Variante)
 
SCREEN 0
 
WIDTH 80, 25
 
END
 
 
SUB Nacht (y1)
 
VIEW SCREEN (1, 1)-(319, 199)
 
AnzahlDerSterne% = 1000
 
FOR Sterne = 1 TO AnzahlDerSterne%
 
 sternX = INT(RND * 400) + 1
 
 sterny = INT(RND * y1) + 1
 
 PSET (sternX, sterny), 15
 
NEXT Sterne
 
VIEW
 
END SUB
 
 
'// Funktion: RotiereXPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Beta um die
 
'//               X-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereXPUNKT3D (Punkt AS PUNKT3D, Beta AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x
 
      NeuPunkt.y = Punkt.y * COS(DEGtoRAD * Beta) - Punkt.z * SIN(DEGtoRAD * Beta)
 
      NeuPunkt.z = Punkt.y * SIN(DEGtoRAD * Beta) + Punkt.z * COS(DEGtoRAD * Beta)
 
END SUB
 
 
'// Funktion: RotiereXYZFACETRI3D
 
'//
 
'// Beschreibung: Rotiert das ?bergebene Dreieck um die Winkel Alpha, Beta und
 
'//               Gamma um die Z-, X- und Y-Achse und speichert das Ergebnis
 
'//               in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB RotiereXYZFACETRI3D (Dreieck AS FACETRI3D, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuDreieck AS FACETRI3D)
 
          
 
      RotiereXYZPuNKT3D Dreieck.p1, Alpha, Beta, Gamma, NeuDreieck.p1
 
      RotiereXYZPuNKT3D Dreieck.p2, Alpha, Beta, Gamma, NeuDreieck.p2
 
      RotiereXYZPuNKT3D Dreieck.p3, Alpha, Beta, Gamma, NeuDreieck.p3
 
      RotiereXYZPuNKT3D Dreieck.p4, Alpha, Beta, Gamma, NeuDreieck.p4
 
      RotiereXYZPuNKT3D Dreieck.p5, Alpha, Beta, Gamma, NeuDreieck.p5
 
      RotiereXYZPuNKT3D Dreieck.p6, Alpha, Beta, Gamma, NeuDreieck.p6
 
      RotiereXYZPuNKT3D Dreieck.p7, Alpha, Beta, Gamma, NeuDreieck.p7
 
      RotiereXYZPuNKT3D Dreieck.p8, Alpha, Beta, Gamma, NeuDreieck.p8
 
      
 
 
END SUB
 
 
'// Funktion: RotiereXYZPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um die Winkel Alpha, Beta und
 
'//               Gamma um die Z-, X- und Y-Achse und speichert das Ergebnis
 
'//               in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereXYZPuNKT3D (Punkt AS PUNKT3D, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuPunkt AS PUNKT3D)
 
 
      DIM ptemp1 AS PUNKT3D
 
      DIM ptemp2 AS PUNKT3D
 
 
      RotiereYPUNKT3D Punkt, Gamma, ptemp1
 
      RotiereXPUNKT3D ptemp1, Beta, ptemp2
 
      RotiereZPUNKT3D ptemp2, Alpha, NeuPunkt
 
END SUB
 
 
'// Funktion: RotiereYPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Gamma um die
 
'//               Y-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereYPUNKT3D (Punkt AS PUNKT3D, Gamma AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.z * SIN(DEGtoRAD * Gamma) + Punkt.x * COS(DEGtoRAD * Gamma)
 
      NeuPunkt.y = Punkt.y
 
      NeuPunkt.z = Punkt.z * COS(DEGtoRAD * Gamma) - Punkt.x * SIN(DEGtoRAD * Gamma)
 
END SUB
 
 
'// Funktion: RotiereZPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Alpha um die
 
'//               Z-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereZPUNKT3D (Punkt AS PUNKT3D, Alpha AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.y * SIN(DEGtoRAD * Alpha) + Punkt.x * COS(DEGtoRAD * Alpha)
 
      NeuPunkt.y = Punkt.y * COS(DEGtoRAD * Alpha) - Punkt.x * SIN(DEGtoRAD * Alpha)
 
      NeuPunkt.z = Punkt.z
 
END SUB
 
 
'// Funktion: SkaliereFACETRI3D
 
'//
 
'// Beschreibung: Skaliert das ?bergebene Dreieck um die Skalare Skalarx,
 
'//               Skalary und Skalarz auf den drei Achsen  und speichert
 
'//               das Ergebnis in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB SkaliereFACETRI3D (Dreieck AS FACETRI3D, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuDreieck AS FACETRI3D)
 
      SkalierePUnkt3D Dreieck.p1, Skalarx, Skalary, Skalarz, NeuDreieck.p1
 
      SkalierePUnkt3D Dreieck.p2, Skalarx, Skalary, Skalarz, NeuDreieck.p2
 
      SkalierePUnkt3D Dreieck.p3, Skalarx, Skalary, Skalarz, NeuDreieck.p3
 
      SkalierePUnkt3D Dreieck.p4, Skalarx, Skalary, Skalarz, NeuDreieck.p4
 
      SkalierePUnkt3D Dreieck.p5, Skalarx, Skalary, Skalarz, NeuDreieck.p5
 
      SkalierePUnkt3D Dreieck.p6, Skalarx, Skalary, Skalarz, NeuDreieck.p6
 
      SkalierePUnkt3D Dreieck.p7, Skalarx, Skalary, Skalarz, NeuDreieck.p7
 
      SkalierePUnkt3D Dreieck.p8, Skalarx, Skalary, Skalarz, NeuDreieck.p8
 
 
END SUB
 
 
'// Funktion: SkaliereFACETRI3D
 
'//
 
'// Beschreibung: Skaliert den ?bergebenen Punkt um die Skalare Skalarx,
 
'//               Skalary und Skalarz auf den drei Achsen  und speichert
 
'//               das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB SkalierePUnkt3D (Punkt AS PUNKT3D, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x * Skalarx
 
      NeuPunkt.y = Punkt.y * Skalary
 
      NeuPunkt.z = Punkt.z * Skalarz
 
END SUB
 
 
SUB Tag (y1, y2)
 
'PRINT "SUB Tag aufgerufen"
 
IF y1 AND y2 < 0 THEN
 
 EXIT SUB
 
END IF
 
LINE (0, y1)-(400, y2), 1
 
PAINT (1, 1), 1
 
CIRCLE (10, y1 - 20), 16, 14
 
PAINT (15, y1 - 30), 14
 
END SUB
 
 
'// Funktion: VerschiebeFACETRI3D
 
'//
 
'// Beschreibung: Verschiebt das ?bergebene Dreieck um den angegebenen
 
'//               Vektor und speichert das Ergebnis in NeuDreieck
 
'//  
 
'//---------------------------------------------------------------------------
 
SUB VerschiebeFACETRI3D (Dreieck AS FACETRI3D, Vektor AS VEKTOR3D, NeuDreieck AS FACETRI3D)
 
      VerschiebePUNKT3D Dreieck.p1, Vektor, NeuDreieck.p1
 
      VerschiebePUNKT3D Dreieck.p2, Vektor, NeuDreieck.p2
 
      VerschiebePUNKT3D Dreieck.p3, Vektor, NeuDreieck.p3
 
      VerschiebePUNKT3D Dreieck.p4, Vektor, NeuDreieck.p4
 
      VerschiebePUNKT3D Dreieck.p5, Vektor, NeuDreieck.p5
 
      VerschiebePUNKT3D Dreieck.p6, Vektor, NeuDreieck.p6
 
      VerschiebePUNKT3D Dreieck.p7, Vektor, NeuDreieck.p7
 
      VerschiebePUNKT3D Dreieck.p8, Vektor, NeuDreieck.p8
 
      
 
 
END SUB
 
 
'// Funktion: VerschiebeKameraFACETRI3D
 
'//
 
'// Beschreibung: Verschiebt das ?bergebene Dreieck um die inverse
 
'//               Kameraposition in vom Weltraum in den Kameraraum
 
'//               rotiert es um die negativen Rotationswinkel der
 
'//               Kameraachsen und speichert das Ergebnis in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB VerschiebeKameraFACETRI3D (Dreieck AS FACETRI3D, kamera AS KAMERA3D, NeuDreieck AS FACETRI3D)
 
 
      DIM KameraVektor AS VEKTOR3D
 
          
 
      '// den inversen Vektor aus der Kameraposition
 
      '// erstellen um den das Dreieck verschoben wird
 
      
 
      KameraVektor.x = -kamera.Position.x
 
      KameraVektor.y = -kamera.Position.y
 
      KameraVektor.z = -kamera.Position.z
 
 
      '// Alle Punkte des Dreiecks verschieben...
 
         
 
      VerschiebeFACETRI3D Dreieck, KameraVektor, NeuDreieck
 
      
 
      '// ...und um den Ursprung um die negativen
 
      '// Rotationswinkel rotieren. Beachtet das
 
      '// wir die Winkel nach Alpha (z), Beta (x), Gamma(y) ?bergeben m?ssen!!!
 
      RotiereXYZFACETRI3D NeuDreieck, -kamera.Zrot, -kamera.Xrot, -kamera.Yrot, NeuDreieck
 
END SUB
 
 
'// Funktion: VerschiebePUNKT3D
 
'//
 
'// Beschreibung: Verschiebt den ?bergebenen Punkt um den angegebenen
 
'//               Vektor und speichert das Ergebnis in NeuPunkt
 
'//
 
'//---------------------------------------------------------------------------
 
SUB VerschiebePUNKT3D (Punkt AS PUNKT3D, Vektor AS VEKTOR3D, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x + Vektor.x
 
      NeuPunkt.y = Punkt.y + Vektor.y
 
      NeuPunkt.z = Punkt.z + Vektor.z
 
END SUB
 
 
SUB Wolke (x, y)
 
RANDOMIZE TIMER
 
RadiusDerWolke1 = INT(RND * 16) + 8
 
RadiusDerWolke2 = INT(RND * 16) + 8
 
RadiusDerWolke3 = INT(RND * 16) + 8
 
xDerWolke2 = x - RadiusDerWolke1 + 9
 
yDerWolke2 = y '- RadiusDerWolke1 + 9
 
xDerWolke3 = x + RadiusDerWolke1 + 9
 
yDerWolke3 = y '+ RadiusDerWolke1 + 9
 
CIRCLE (x, y), RadiusDerWolke1
 
CIRCLE (xDerWolke2, yDerWolke2), RadiusDerWolke2
 
CIRCLE (xDerWolke3, yDerWolke3), RadiusDerWolke3
 
PAINT (x - 8, y - 8), 15
 
PAINT (xDerWolke2 + 3, yDerWolke2 + 3), 15
 
PAINT (xDerWolke3 + 3, yDerWolke3 + 3), 15
 
END SUB
 
 
SUB Wolke1 (x, y)
 
RadiusDer1Wolke = 16
 
RadiusDer2Wolke = 8
 
RadiusDer3Wolke = 10
 
xDer2Wolke = x + 16
 
yDer2Wolke = y
 
xDer3Wolke = x - 10
 
yDer3Wolke = y
 
CIRCLE (x, y), 15
 
CIRCLE (xDer2Wolke, yDer2Wolke), RadiusDer2Wolke, 15
 
CIRCLE (xDer3Wolke, yDer3Wolke), RadiusDer3Wolke, 15
 
PAINT (x + 3, y + 3), 15
 
PAINT (xDer2Wolke, yDer2Wolke), 15
 
PAINT (xDer3Wolke, yDer3Wolke), 15
 
PAINT (x + 14, y), 15
 
PAINT (xDer3Wolke - 8, yDer3Wolke - 1), 15
 
 
END SUB
 
 
'// Funktion: ZeichneFACETRI3D
 
'//
 
'// Beschreibung: Projiziert die Punkte eines Dreiecks auf die Projektions-
 
'//               fl„che (Bildschirmkoordinatensystem) und zeichnet die
 
'//               die Verbindungslinien zwischen den Punkten (Drahtgitter-
 
'//               modell)
 
'//---------------------------------------------------------------------------
 
SUB ZeichneFACETRI3D (Dreieck AS FACETRI3D, Farbe AS INTEGER)
 
      DIM xp1, yp1
 
      DIM xp2, yp2
 
      DIM xp3, yp3
 
      DIM xp4, yp4
 
      DIM xp5, yp5
 
      DIM xp6, yp6
 
      DIM xp7, yp7
 
  
 
 
      xp1 = Dreieck.p1.x * FOCUS / (FOCUS + Dreieck.p1.z) + 160
 
      yp1 = -Dreieck.p1.y * FOCUS / (FOCUS + Dreieck.p1.z) + 100
 
 
      xp2 = Dreieck.p2.x * FOCUS / (FOCUS + Dreieck.p2.z) + 160
 
      yp2 = -Dreieck.p2.y * FOCUS / (FOCUS + Dreieck.p2.z) + 100
 
  
 
      xp3 = Dreieck.p3.x * FOCUS / (FOCUS + Dreieck.p3.z) + 160
 
      yp3 = -Dreieck.p3.y * FOCUS / (FOCUS + Dreieck.p3.z) + 100
 
 
      xp4 = Dreieck.p4.x * FOCUS / (FOCUS + Dreieck.p4.z) + 160
 
      yp4 = -Dreieck.p4.y * FOCUS / (FOCUS + Dreieck.p4.z) + 100
 
 
      xp5 = Dreieck.p5.x * FOCUS / (FOCUS + Dreieck.p5.z) + 160
 
      yp5 = -Dreieck.p5.y * FOCUS / (FOCUS + Dreieck.p5.z) + 100
 
 
      xp6 = Dreieck.p6.x * FOCUS / (FOCUS + Dreieck.p6.z) + 160
 
      yp6 = -Dreieck.p6.y * FOCUS / (FOCUS + Dreieck.p6.z) + 100
 
 
      xp7 = Dreieck.p7.x * FOCUS / (FOCUS + Dreieck.p7.z) + 160
 
      yp7 = -Dreieck.p7.y * FOCUS / (FOCUS + Dreieck.p7.z) + 100
 
 
      xp8 = Dreieck.p8.x * FOCUS / (FOCUS + Dreieck.p8.z) + 160
 
      yp8 = -Dreieck.p8.y * FOCUS / (FOCUS + Dreieck.p8.z) + 100
 
 
      LINE (xp1, yp1)-(xp2, yp2), 2
 
      LINE (xp2, yp2)-(xp3, yp3), 2
 
      LINE (xp3, yp3)-(xp1, yp1), 2
 
 
      LINE (xp4, yp4)-(xp6, yp6), 6
 
      LINE (xp5, yp5)-(xp7, yp7), 6
 
      LINE (xp6, yp6)-(xp7, yp7), 6
 
      ' LINE (xp7, yp7)-(xp8, yp8), 6
 
 
      
 
      xx = xp1
 
      yy = yp1 + 5
 
       'PAINT (xx, yy), 2
 
      END SUB
 
 | 	  
 
 
Ich habe das Tuturial von Mario Zechner gelesen und habe das halbe Programm übernommen    
 
 
Wie ihr bestimmt sehen könnt kann ich zwar  ein paar Bäume zeichnen aber nicht bewegen      
 
Vieleicht könnt ihr mir dabei auch helfen      | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 30.08.2007, 16:42    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hab die halben Sommerferien an meinem Flusi gearbeitet.
 
Hier der verbesserte Code:
 
 	  | Code: | 	 		  DECLARE SUB BOOM ()
 
DECLARE SUB Motor (Geschwindigkeit%)
 
DECLARE SUB DrawFlugzeug (Geschwindigkeit%, Neigung1%, Hoehe%, starttime!, Stroemungsabriss%, Variometer%)
 
DECLARE SUB Tag (y1%, y2%)
 
DECLARE SUB Nacht (y1%)
 
DECLARE SUB VerschiebeKameraFACETRI3D (Dreieck AS ANY, kamera AS ANY, NeuDreieck AS ANY)
 
DECLARE SUB VerschiebeFACETRI3D (Dreieck AS ANY, Vektor AS ANY, NeuDreieck AS ANY)
 
DECLARE SUB SkaliereFACETRI3D (Dreieck AS ANY, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuDreieck AS ANY)
 
DECLARE SUB ZeichneFACETRI3D (Dreieck AS ANY, Farbe AS INTEGER)
 
DECLARE SUB RotiereXYZFACETRI3D (Dreieck AS ANY, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuDreieck AS ANY)
 
 
DECLARE SUB VerschiebePUNKT3D (Punkt AS ANY, Vektor AS ANY, NeuPunkt AS ANY)
 
DECLARE SUB SkalierePUnkt3D (Punkt AS ANY, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereXPUNKT3D (Punkt AS ANY, Beta AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereYPUNKT3D (Punkt AS ANY, Gamma AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereZPUNKT3D (Punkt AS ANY, Alpha AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB RotiereXYZPuNKT3D (Punkt AS ANY, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuPunkt AS ANY)
 
DECLARE SUB Wolke1 (x%, y%)
 
 
DECLARE SUB Neigung (Wert%)
 
DECLARE SUB Variomet (Wert%)
 
DECLARE SUB Speed (Wert%)
 
DECLARE SUB Alt (Wert%)
 
 
DECLARE SUB LoadJMP (f$)
 
 
DECLARE SUB DrawHilfen (Geschwindigkeit%, Neigung1%, Hoehe%, Variometer%, Stroemungsabriss%)
 
'//-------------------------- KONSTANTEN ----------------------------
 
CONST FOCUS = 200 '255                         ' Entfernung Betrachter->Projektionsfl„che
 
CONST DEGtoRAD = 3.14159265358979# / 180       ' "Grad in Bogenmaá"-Konstante
 
 
'//-------------------------- DATENTYPEN ---------------------------
 
TYPE PUNKT3D
 
      x AS SINGLE
 
      y AS SINGLE
 
      z AS SINGLE
 
END TYPE
 
 
TYPE VEKTOR3D
 
      x AS SINGLE
 
      y AS SINGLE
 
      z AS SINGLE
 
END TYPE
 
 
TYPE FACETRI3D
 
      p1 AS PUNKT3D
 
      p2 AS PUNKT3D
 
      p3 AS PUNKT3D
 
      p4 AS PUNKT3D
 
      p5 AS PUNKT3D
 
      p6 AS PUNKT3D
 
      p7 AS PUNKT3D
 
      p8 AS PUNKT3D
 
END TYPE
 
 
TYPE KAMERA3D
 
      Position AS PUNKT3D
 
      Xrot AS SINGLE
 
      Yrot AS SINGLE
 
      Zrot AS SINGLE
 
END TYPE
 
 
'// ------------------------ VARIABLEN FšR DEMO ----------------------
 
DIM SHARED MaxBaeume%
 
MaxBaeume% = 900
 
DIM SHARED kamera AS KAMERA3D              ' unsere Kamera...
 
DIM SHARED Dreieck(MaxBaeume%) AS FACETRI3D            ' Dreieck im Objektraum
 
DIM SHARED TransDreieck(MaxBaeume%) AS FACETRI3D       ' Datenstruktur fr transformiertes Dreieck
 
DIM SHARED Alpha AS SINGLE                     ' Rotationswinkel um den Dreieck im Objektraum gedreht werden soll
 
DIM SHARED Taste$                              ' hier speichern wir die von INKEY$ erhaltene Taste
 
'DIM SHARED starttime                           ' Startzeit des Flugsimulators
 
DIM SHARED Vektor AS VEKTOR3D
 
DIM SHARED Neigung1%                           ' Die Neigung des Flugzeugs
 
DIM SHARED Variometer%                          ' Steigung
 
DIM vorher(MaxBaeume%)
 
'starttime! = TIMER                             ' Startzeit des Flugsimulators
 
DIM SHARED AnzahlDerBaeume%
 
 
AnzahlDerBaeume% = 90
 
 
'// Die Start x1 und y1 Koordinaten fr den Horizont
 
y1% = 50
 
y2% = 50
 
 
'################################INTRO#######################################
 
 
'CLS
 
'WIDTH 80, 50
 
'SCREEN 13
 
'CLS
 
'LoadJMP "C:\FFSSetup\I2.jmp"
 
'PRINT "Das ist der Flughafen Seattle"
 
'SLEEP
 
'LoadJMP "C:\FFSSetup\I1.jmp"
 
LOCATE 24, 1
 
'PRINT "Steigen Sie in ihre neue Cessna ein und fliegen Sie los."
 
'SLEEP
 
 
 
'// Videomodus fr Doublebuffering initialisieren
 
SCREEN 7, , 0, 1
 
 
'// Hauptschleife
 
DO
 
      '// Rotationswinkel um die Y-Achse erh”hen
 
      '// und vermeiden, dass wir einen šberlauf kriegen
 
      'Alpha = Alpha + 1    'Stillgelegt
 
      'IF Alpha >= 360 THEN Alpha = 0
 
 
      '// Dreieck im Objektraum drehen
 
      'FOR bb = 1 TO AnzahlDerBaeume%
 
      'RotiereXYZFACETRI3D Dreieck(bb), Alpha, Beta, Gamma, TransDreieck(bb)
 
      'NEXT bb
 
 
      '// Transformiertes Dreieck in den Kameraraum transformieren
 
      FOR BBB = 1 TO AnzahlDerBaeume%
 
      VerschiebeKameraFACETRI3D TransDreieck(BBB), kamera, TransDreieck(BBB)
 
      NEXT BBB
 
      '// Projizieren und Zeichnen
 
      '
 
      'Das ist ein bisschen kompliziert. Eine kleine Erl„uterung:
 
 
      '      P2
 
      '      /\
 
      '     /  \
 
      '    /    \
 
      '   /      \
 
      '  /        \
 
      'P1----------P3
 
      '   P5|  |P4
 
      '     |  |
 
      '     |  |
 
      '     |  |
 
      '     |  |
 
      '    P7--P6
 
      '
 
      'Das soll ein BAUM sein. Die ganzen Ps sind die Punkte
 
      'Die Verteilung der Baume geschieht per Zufallszahlen
 
 
 
      IF genug% < AnzahlDerBaeume% THEN
 
RANDOMIZE TIMER
 
'Max% = INT((10000 - 1000 + 1) * RND + 1000)
 
IF ErsteRunde% = 0 THEN
 
 Max% = INT((3 - 2) + 1) * RND + 2
 
 ErsteRunde% = 1
 
ELSE
 
 
 IF Max3% = 1 THEN
 
  Max% = 2
 
  Max2% = 0
 
 END IF
 
 
 IF Max2% = 1 THEN
 
  Max% = 3
 
  Max3% = 0
 
 END IF
 
 
 IF Max% = 3 THEN
 
  Max% = 1000
 
  Max3% = 1
 
  Max2% = 0
 
 END IF
 
 
 IF Max% = 2 THEN
 
  Max% = 100
 
  Max2% = 1
 
  Max3% = 0
 
 END IF
 
 
END IF
 
 
FOR B = genug% TO AnzahlDerBaeume%
 
RANDOMIZE B
 
Dreieck(B).p1.x = Max% 'INT((Max% - -Max% + 1) * RND + -Max%)  'INT(RND * 10000) + -10000
 
Dreieck(B).p1.y = INT(RND * 100) + -100
 
Dreieck(B).p1.z = INT(RND * 0) + 10000
 
'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
Dreieck(B).p2.x = Dreieck(B).p1.x + 40: Dreieck(B).p2.y = Dreieck(B).p1.y + 80: Dreieck(B).p2.z = Dreieck(B).p1.z
 
Dreieck(B).p3.x = Dreieck(B).p1.x + 80: Dreieck(B).p3.y = Dreieck(B).p1.y: Dreieck(B).p3.z = Dreieck(B).p1.z
 
Dreieck(B).p4.x = Dreieck(B).p1.x + 48: Dreieck(B).p4.y = Dreieck(B).p1.y: Dreieck(B).p4.z = Dreieck(B).p1.z
 
Dreieck(B).p5.x = Dreieck(B).p1.x + 40: Dreieck(B).p5.y = Dreieck(B).p1.y: Dreieck(B).p5.z = Dreieck(B).p1.z
 
Dreieck(B).p6.x = Dreieck(B).p1.x + 48: Dreieck(B).p6.y = Dreieck(B).p1.y - 40: Dreieck(B).p6.z = Dreieck(B).p1.z
 
Dreieck(B).p7.x = Dreieck(B).p1.x + 40: Dreieck(B).p7.y = Dreieck(B).p1.y - 40: Dreieck(B).p7.z = Dreieck(B).p1.z
 
 
IF ERR = 9 THEN
 
 PRINT "Leider ist ein Technischer Fehler aufgetreten"
 
 SLEEP 2
 
 RUN
 
END IF
 
      'ZeichneFACETRI3D Dreieck(B), 4
 
genug% = genug% + 1
 
z = z + 1
 
NEXT B
 
END IF
 
 
IF genug% >= AnzahlDerBaeume% THEN
 
 FOR ba = 1 TO AnzahlDerBaeume%
 
  Dreieck(ba).p2.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p2.y = Dreieck(ba).p1.y + 80: Dreieck(ba).p2.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p3.x = Dreieck(ba).p1.x + 80: Dreieck(ba).p3.y = Dreieck(ba).p1.y: Dreieck(ba).p3.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p4.x = Dreieck(ba).p1.x + 48: Dreieck(ba).p4.y = Dreieck(ba).p1.y: Dreieck(ba).p4.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p5.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p5.y = Dreieck(ba).p1.y: Dreieck(ba).p5.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p6.x = Dreieck(ba).p1.x + 48: Dreieck(ba).p6.y = Dreieck(ba).p1.y - 40: Dreieck(ba).p6.z = Dreieck(ba).p1.z
 
  Dreieck(ba).p7.x = Dreieck(ba).p1.x + 40: Dreieck(ba).p7.y = Dreieck(ba).p1.y - 40: Dreieck(ba).p7.z = Dreieck(ba).p1.z
 
      ZeichneFACETRI3D Dreieck(ba), 4
 
 NEXT ba
 
END IF
 
 
 
'Und hier wird berprft, ob die B„ume berhaupt zu sehen sind
 
FOR B = 1 TO AnzahlDerBaeume%
 
 IF Dreieck(B).p1.z <= 0 THEN
 
  'genug% = genug% - 1
 
  RANDOMIZE B
 
  Dreieck(B).p1.x = INT((1000 - -1000 + 1) * RND + -5000)
 
  Dreieck(B).p1.y = INT(RND * 100) + -100
 
  Dreieck(B).p1.z = INT(RND * 0) + 10000
 
  'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
  Dreieck(B).p2.x = Dreieck(B).p1.x + 30: Dreieck(B).p2.y = Dreieck(B).p1.y + 70: Dreieck(B).p2.z = Dreieck(B).p1.z
 
  Dreieck(B).p3.x = Dreieck(B).p1.x + 80: Dreieck(B).p3.y = Dreieck(B).p1.y: Dreieck(B).p3.z = Dreieck(B).p1.z
 
  Dreieck(B).p4.x = Dreieck(B).p1.x + 48: Dreieck(B).p4.y = Dreieck(B).p1.y: Dreieck(B).p4.z = Dreieck(B).p1.z
 
  Dreieck(B).p5.x = Dreieck(B).p1.x + 40: Dreieck(B).p5.y = Dreieck(B).p1.y: Dreieck(B).p5.z = Dreieck(B).p1.z
 
  Dreieck(B).p6.x = Dreieck(B).p1.x + 48: Dreieck(B).p6.y = Dreieck(B).p1.y - 40: Dreieck(B).p6.z = Dreieck(B).p1.z
 
  Dreieck(B).p7.x = Dreieck(B).p1.x + 40: Dreieck(B).p7.y = Dreieck(B).p1.y - 40: Dreieck(B).p7.z = Dreieck(B).p1.z
 
 END IF
 
 IF Dreieck(B).p1.x = -1500 OR Dreieck(B).p1.z < 30 THEN
 
  genug% = genug% - 1
 
  RANDOMIZE B
 
  Dreieck(B).p1.x = INT((1000 - -1000 + 1) * RND + -5000)
 
  Dreieck(B).p1.y = INT(RND * 100) + -100
 
  Dreieck(B).p1.z = INT(RND * 0) + 10000
 
  'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
  Dreieck(B).p2.x = Dreieck(B).p1.x + 40: Dreieck(B).p2.y = Dreieck(B).p1.y + 80: Dreieck(B).p2.z = Dreieck(B).p1.z
 
  Dreieck(B).p3.x = Dreieck(B).p1.x + 80: Dreieck(B).p3.y = Dreieck(B).p1.y: Dreieck(B).p3.z = Dreieck(B).p1.z
 
  Dreieck(B).p4.x = Dreieck(B).p1.x + 48: Dreieck(B).p4.y = Dreieck(B).p1.y: Dreieck(B).p4.z = Dreieck(B).p1.z
 
  Dreieck(B).p5.x = Dreieck(B).p1.x + 40: Dreieck(B).p5.y = Dreieck(B).p1.y: Dreieck(B).p5.z = Dreieck(B).p1.z
 
  Dreieck(B).p6.x = Dreieck(B).p1.x + 48: Dreieck(B).p6.y = Dreieck(B).p1.y - 40: Dreieck(B).p6.z = Dreieck(B).p1.z
 
  Dreieck(B).p7.x = Dreieck(B).p1.x + 40: Dreieck(B).p7.y = Dreieck(B).p1.y - 40: Dreieck(B).p7.z = Dreieck(B).p1.z
 
 END IF
 
 IF Dreieck(B).p1.y = -10 OR Dreieck(B).p1.y = 50 THEN
 
  genug% = genug% - 10
 
  RANDOMIZE B
 
  Dreieck(B).p1.x = INT((1000 - -1000 + 1) * RND + -5000)
 
  Dreieck(B).p1.y = INT(RND * 100) + -100
 
  Dreieck(B).p1.z = INT(RND * 0) + 10000
 
  'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
  Dreieck(B).p2.x = Dreieck(B).p1.x + 40: Dreieck(B).p2.y = Dreieck(B).p1.y + 80: Dreieck(B).p2.z = Dreieck(B).p1.z
 
  Dreieck(B).p3.x = Dreieck(B).p1.x + 80: Dreieck(B).p3.y = Dreieck(B).p1.y: Dreieck(B).p3.z = Dreieck(B).p1.z
 
  Dreieck(B).p4.x = Dreieck(B).p1.x + 48: Dreieck(B).p4.y = Dreieck(B).p1.y: Dreieck(B).p4.z = Dreieck(B).p1.z
 
  Dreieck(B).p5.x = Dreieck(B).p1.x + 40: Dreieck(B).p5.y = Dreieck(B).p1.y: Dreieck(B).p5.z = Dreieck(B).p1.z
 
  Dreieck(B).p6.x = Dreieck(B).p1.x + 48: Dreieck(B).p6.y = Dreieck(B).p1.y - 40: Dreieck(B).p6.z = Dreieck(B).p1.z
 
  Dreieck(B).p7.x = Dreieck(B).p1.x + 40: Dreieck(B).p7.y = Dreieck(B).p1.y - 40: Dreieck(B).p7.z = Dreieck(B).p1.z
 
 END IF
 
NEXT B
 
 
IF mehrBaeume% = 1 THEN
 
'LOCATE 1, 1: PRINT "Mehr Baeume"
 
'AnzahlDerBaeume% = AnzahlDerBaeume + 90
 
IF Runde% = 10 THEN
 
 Hallo% = 1
 
 Runde% = Runde% + 1
 
 IF Runde% > 10 THEN
 
  Runde% = 1
 
 END IF
 
END IF
 
END IF
 
 
IF Hallo% = 1 THEN
 
 AnzahlDerBaeume% = AnzahlDerBaeume + 90
 
END IF
 
 
IF AnzahlDerBaeume% >= MaxBaeume% THEN
 
 AnzahlDerBaeume% = MaxBaeume%
 
END IF
 
 
      CALL DrawFlugzeug(Geschwindigkeit%, Neigung1%, Hoehe%, starttime!, Stroemungsabriss%, Variometer%)
 
 
      LINE (1, 1)-(400, 35), 0, BF
 
      Alt (Hoehe%)
 
      Speed (Geschwindigkeit%)
 
      Neigung (Neigung1%)
 
      Variomet (Variometer%)
 
 
      '// Wetterdaten auswerten
 
      Wetter$ = "Tag"
 
      IF Wetter$ = "Tag" THEN
 
       CALL Tag(y1%, y2%)
 
      ELSE
 
       CALL Nacht(y1%)
 
      END IF
 
 
      '// Wolken zeichnen
 
       CALL Wolke1(100, y1% - 25)
 
       CALL Wolke1(150, y1% - 20)
 
       CALL Wolke1(200, y1% - 40)
 
 
      LINE (0, 150)-(320, 150), 8
 
      LINE (20, 150)-(0, 0), 8
 
      LINE (300, 150)-(320, 0), 8
 
      LINE (160, 150)-(120, 0), 8
 
      LINE (160, 150)-(200, 0), 8
 
      LINE (0, 1)-(320, 1), 8
 
 
      PAINT (10, 149), 8
 
      PAINT (160, 147), 8
 
      PAINT (310, 148), 8
 
      PAINT (3, 0), 8
 
      PAINT (122, 0), 8
 
      PAINT (222, 0), 8
 
      PAINT (5, 151), 8, 15
 
 
      'LINE (1, y1%)-(400, y1%), 0, BF
 
 
      CALL DrawHilfen(Geschwindigkeit%, Neigung1%, Hoehe%, Variometer%, Stroemungsabriss%)
 
 
      '// Hier nehmen wir die Tastatureingabe
 
      '// vom Benutzer entgegen. Derzeit noch mit INKEY$
 
      FOR f = 1 TO AnzahlDerBaeume%
 
       vorher(f) = Dreieck(f).p1.z
 
      NEXT f
 
      Taste$ = INKEY$
 
              
 
            '// Bewegung entlang positiver Z-Achse (vorw„rts)?
 
            IF (Taste$ = CHR$(0) + CHR$(62)) THEN 'F4-Taste
 
            'FOR j = 1 TO 9
 
            ' Dreieck(j).p1.z = Dreieck(j).p1.z + 1
 
            'NEXT j
 
            mehr% = mehr% + AnzahlDerBaeume%
 
            Geschwindigkeit% = 200
 
            Vektor.z = 200
 
            END IF
 
       
 
            '// Bewegung entlang der negativen Z-Achse (rckw„rts)?
 
            IF (Taste$ = CHR$(0) + CHR$(59)) THEN 'F1-Taste ?
 
             Geschwindigkeit% = 0
 
             Vektor.z = 0
 
            END IF
 
 
            IF (Taste$ = CHR$(0) + CHR$(61)) THEN 'F3-Taste
 
             'FOR j = 1 TO 9
 
             ' Dreieck(j).p1.z = Dreieck(j).p1.z + 1
 
             'NEXT j
 
             mehr% = mehr% + AnzahlDerBaeume%
 
             IF Geschwindigkeit% < 200 THEN
 
               Geschwindigkeit% = Geschwindigkeit% + 1
 
               Vektor.z = Vektor.z + 1
 
             END IF
 
             IF Geschwindigkeit% < 0 THEN Geschwindigkeit% = 0
 
            END IF
 
 
            '// Bewegung entlang negativer Z-Achse (rckw„rts)?
 
            '// Dies ist eine unbeschriebene Funktion, die in
 
            '// der Wirklichkein nicht stattfindet 
 
            IF (Taste$ = "s") THEN
 
             'FOR j = 1 TO 9
 
             ' Dreieck(j).p1.z = Dreieck(j).p1.z + 1
 
             'NEXT j
 
            Geschwindigkeit% = Geschwindigkeit% - 1
 
            Vektor.z = Vektor.z - 1
 
            END IF
 
 
            IF (Taste$ = CHR$(0) + CHR$(60)) THEN 'F2-Taste
 
             'FOR j = 1 TO 9
 
             ' Dreieck(j).p1.z = Dreieck(j).p1.z - 1
 
             'NEXT j
 
            Geschwindigkeit% = Geschwindigkeit% - 1
 
            Vektor.z = Vektor.z - 1
 
            IF Geschwindigkeit% < 0 THEN Geschwindigkeit% = 0
 
            END IF
 
 
            '// Bewegung entlang positiver X-Achse (Rechts%)?
 
            IF (Taste$ = CHR$(0) + CHR$(77)) THEN '
 
             'FOR j = 1 TO 9
 
             ' Dreieck(j).p1.x = Dreieck(j).p1.x - 1
 
             'NEXT j
 
             Beta = Beta + 10
 
             Neigung1% = Neigung1% + 10
 
             Rechts% = Rechts% + 10
 
             Vektor.x = Vektor.x + 10
 
             IF Rechts% > 360 THEN Rechts% = 0
 
            END IF
 
       
 
            '// Bewegung entlang negativer X-Achse (links)?
 
            IF (Taste$ = CHR$(0) + CHR$(75)) THEN
 
             'FOR j = 1 TO 9
 
             ' Dreieck(j).p1.x = Dreieck(j).p1.x + 1
 
             'NEXT j
 
             Beta = Beta - 10
 
            Neigung1% = Neigung1% - 10
 
            Rechts% = Rechts% - 10
 
            Vektor.x = Vektor.x - 10
 
            IF Rechts% < -360 THEN Rechts% = 0
 
            END IF
 
 
            '// Bewegung entlang positiver Y-Achse (unten)?
 
            IF (Taste$ = CHR$(0) + CHR$(80)) THEN
 
            'FOR j = 1 TO 9
 
            ' Dreieck(j).p1.y = Dreieck(j).p1.y - 1
 
            'NEXT j
 
               'Unten = Unten - 10
 
               Variometer% = Variometer% - 1
 
               'Vektor.y = Vektor.y - 10
 
               IF Unten < 0 THEN Unten = 0
 
               y1% = y1% - 1
 
               y2% = y2% - 1
 
               IF y1% < 0 THEN y1% = 0
 
               IF y2% < 0 THEN y2% = 0
 
               END IF
 
           
 
            '// bewegung entlang negativen Y-Achse (oben)?
 
            IF (Taste$ = CHR$(0) + CHR$(72)) THEN
 
            'FOR j = 1 TO 9
 
            ' Dreieck(j).p1.y = Dreieck(j).p1.y + 1
 
            'NEXT j
 
            'Unten = Unten + 10
 
            Variometer% = Variometer% + 1
 
            Vektor.y = Vektor.y + 10
 
            y1% = y1% + 1
 
            y2% = y2% + 1
 
            IF Unten < 0 THEN Unten = 0
 
            END IF
 
 
            '//Str”mungsabriss?
 
            IF Variometer% > 50 OR Variometer% < -50 THEN
 
             Stroemungsabriss% = 1
 
              ELSE Stroemungsabriss% = 0
 
            END IF
 
 
            IF Taste$ = "o" THEN
 
             Variometer% = 0
 
            END IF
 
 
            IF (Taste$ = CHR$(27)) THEN '//Wenn Escape-Taste
 
             Ende% = 1                  '  gedrckt dann
 
            END IF                      '  Ende% = 1
 
                
 
 
            Hoehe% = Hoehe% + Variometer%
 
 
            IF Hoehe% = 0 AND Variometer% < -10 THEN
 
             CALL BOOM
 
            END IF
 
                
 
 
            IF Hoehe% < 0 THEN
 
             Hoehe% = 0
 
             Variometer% = 0
 
            END IF
 
 
            y1% = y1% + Variometer
 
 
            IF y1% < 0 THEN
 
             y1% = 0
 
            END IF
 
 
            '// [("Alle")] Baume verschieben
 
            FOR GG = 1 TO AnzahlDerBaeume%
 
             Vektor.z = Geschwindigkeit%
 
             Vektor.x = Rechts%
 
             Vektor.y = Hoehe%
 
             kamera.Position.z = Geschwindigkeit%
 
             kamera.Position.x = Rechts%
 
             kamera.Position.y = Hoehe%
 
            
 
             'CALL VerschiebeFACETRI3D(Dreieck(GG), Vektor, Dreieck(GG))
 
             'CALL VerschiebeKameraFACETRI3D(Dreieck(GG), kamera, Dreieck(GG))
 
             Dreieck(GG).p1.z = Dreieck(GG).p1.z - Geschwindigkeit%
 
             Dreieck(GG).p1.x = Dreieck(GG).p1.x - Rechts%
 
             Dreieck(GG).p1.y = -Hoehe% 'Dreieck(GG).p1.Y - Hoehe%
 
             'y2% = y2% + Unten
 
             IF vorher(GG) <> Dreieck(GG).p1.z THEN
 
              mehrBaeume% = 1
 
             ELSE
 
              mehrBaeume% = 0
 
             END IF
 
 
             IF Hoehe% < 252 AND Dreieck(GG).p1.z = 0 THEN
 
              CALL BOOM
 
             END IF
 
            NEXT GG
 
            
 
            'LOCATE 1, 1
 
            'PRINT "AnzahlDerBaeume:";
 
            'PRINT AnzahlDerBaeume%
 
            'PRINT "Hallo:" + STR$(Hallo%) + " ";
 
            'PRINT "MehrBaeume:" + STR$(mehtBaeume%) + " ";
 
            'PRINT "Runde: " + STR$(Runde%) + " ";
 
 
                
 
            'Bitte etwas Warten...
 
            'time! = TIMER
 
            'DO: LOOP UNTIL TIMER - time! = .05
 
 
      '// Good old Doublebuffering...
 
      PCOPY 0, 1
 
      CLS
 
 
'//Abbruch bei Druck auf Escape-Taste
 
LOOP UNTIL Ende% = 1
 
 
Ende:
 
'// zurck in den Textmodus (sch”ne Variante)
 
SCREEN 0
 
WIDTH 80, 25
 
END
 
 
SUB Alt (Wert%)
 
w = 30: h = 30: y = 17: x = 17
 
BYTES = 30 * 30 + 4
 
FOM = INT((BYTES + 1) / 1)
 
o = 0
 
DIM frame(FOM - 1, 1 TO 11) AS INTEGER
 
OPEN "C:\Alt.qaa" FOR INPUT AS #1
 
DO
 
INPUT #1, a, B, f
 
PSET (a, B), f
 
LOOP UNTIL EOF(1)
 
CLOSE
 
'SLEEP
 
'FOR ax = 1 TO 10
 
 'LINE (16, 384)-(336, 416), 0, BF
 
'NEXT
 
FOR x = 17 TO (16 * 17) + 32 STEP 32
 
o = o + 1
 
LINE (x - 16, y - 16)-(x + 16, y + 16), 0, B
 
GET (x - 16, y - 16)-(x + 16, y + 16), frame(0, o)
 
NEXT x
 
dx = 0
 
dy = 0
 
o = 1
 
i = 5
 
 
'--------|
 
x = 50  '|
 
'....... |
 
y = 170 '|
 
'--------|
 
'DO
 
' a$ = ""
 
' WHILE a$ = ""
 
'  a$ = INKEY$
 
'WEND
 
IF Wert% > 9 AND Wert% < 100 THEN Wert% = Wert% / 10
 
IF Wert% > 100 AND Wert% < 1000 THEN Wert% = Wert% / 100
 
dx = 0
 
dx = 1: o = Wert% + 1: i = 0
 
IF a$ = CHR$(27) THEN END
 
IF o > 9 THEN o = 1
 
IF i > 9 THEN i = 1
 
IF dx = 1 THEN PUT (x - 16, y - 16), frame(0, o), PSET
 
IF dx = -1 THEN PUT (x - 16, y - 16), frame(0, i), PSET
 
x = x - dx * 0
 
'IF INKEY$ = CHR$(27) THEN EXIT SUB
 
'LOOP
 
 
END SUB
 
 
SUB BOOM
 
CLS
 
SCREEN 0
 
COLOR 0, 4
 
CLS
 
WIDTH 80, 25
 
FOR y = 1 TO 25
 
 FOR x = 1 TO 80
 
  LOCATE y, x
 
  PRINT "BOOM "
 
 NEXT x
 
NEXT y
 
SLEEP
 
CLS
 
 FOR Farbe = 1 TO 15
 
  COLOR Farbe
 
  IF Farbe = 4 THEN
 
   COLOR 19
 
  END IF
 
  PRINT "Bitte Drcken Sie eine Taste zum berspringen"
 
  PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"
 
  PRINT ""
 
  PRINT ""
 
  PRINT "ÛÛÛ      ÛÛÛ     ÛÛÛ    ÛÛ   ÛÛ"
 
  PRINT "Û  Û    Û   Û   Û   Û   Û Û Û Û"
 
  PRINT "Û   Û   Û   Û   Û   Û   Û Û Û Û"
 
  PRINT "Û  Û    Û   Û   Û   Û   Û  Û  Û"
 
  PRINT "ÛÛÛ     Û   Û   Û   Û   Û  Û  Û"
 
  PRINT "Û  Û    Û   Û   Û   Û   Û     Û"
 
  PRINT "Û   Û   Û   Û   Û   Û   Û     Û"
 
  PRINT "Û  Û    Û   Û   Û   Û   Û     Û"
 
  PRINT "ÛÛÛ      ÛÛÛ     ÛÛÛ    Û     Û"
 
  SLEEP 1
 
 NEXT Farbe
 
SLEEP
 
END
 
END SUB
 
 
SUB DrawFlugzeug (Geschwindigkeit%, Neigung1%, Hoehe%, starttime!, Stroemungsabriss%, Variometer%)
 
'LINE (0, 150)-(320, 150), 8
 
'LINE (20, 150)-(0, 0), 8
 
'LINE (300, 150)-(320, 0), 8
 
'LINE (160, 150)-(120, 0), 8
 
'LINE (160, 150)-(200, 0), 8
 
'LINE (0, 1)-(320, 1), 8
 
 
'PAINT (10, 149), 8
 
'PAINT (160, 147), 8
 
'PAINT (310, 148), 8
 
'PAINT (160, 160), 8
 
'PAINT (3, 0), 8
 
'PAINT (122, 0), 8
 
'PAINT (222, 0), 8
 
 
COLOR 10', 8
 
 
LOCATE 25, 12
 
'PRINT "Geschwindigkeit%: ";
 
PRINT Geschwindigkeit%
 
LOCATE 25, 18
 
'PRINT "Neigung:  ";
 
'PRINT Rechts%!;
 
PRINT Neigung1%
 
LOCATE 25, 6
 
'PRINT "H”he: ";
 
PRINT Hoehe%
 
LOCATE 25, 24
 
'PRINT "Variometer:";
 
PRINT Variometer%
 
'LOCATE 1, 24
 
'COLOR 4, 0
 
'PRINT "Start: ";
 
'PRINT starttime! / 60 ^ 2
 
LOCATE 23, 1
 
IF Stroemungsabriss% = 1 THEN
 
LOCATE 22, 26
 
COLOR 4, 0
 
PRINT "Str”mungsabriss"
 
 Stroemungsabriss% = 0
 
END IF
 
 
'CALL Motor(Geschwindigkeit%)
 
 
COLOR 15, 0
 
 
END SUB
 
 
SUB DrawHilfen (Geschwindigkeit%, Neigung1%, Hoehe%, Variometer%, Stroemungsabriss%)
 
LOCATE 25, 12
 
'PRINT "Geschwindigkeit%: ";
 
PRINT Geschwindigkeit%
 
LOCATE 25, 18
 
'PRINT "Neigung:  ";
 
'PRINT Rechts%!;
 
PRINT Neigung1%
 
LOCATE 25, 6
 
'PRINT "H”he: ";
 
PRINT Hoehe%
 
LOCATE 25, 24
 
'PRINT "Variometer:";
 
PRINT Variometer%
 
'LOCATE 1, 24
 
'COLOR 4, 0
 
'PRINT "Start: ";
 
'PRINT starttime! / 60 ^ 2
 
LOCATE 23, 1
 
IF Stroemungsabriss% = 1 THEN
 
LOCATE 22, 26
 
COLOR 4, 0
 
PRINT "Str”mungsabriss"
 
 Stroemungsabriss% = 0
 
END IF
 
 
END SUB
 
 
SUB LoadJMP (f$)
 
'+------SYNTAX-------+
 
'| F$ - Eingabedatei |
 
'+-------------------+
 
 
CLOSE #1
 
 
DIM Byte AS STRING * 1, id AS STRING * 8
 
 
OPEN f$ FOR INPUT AS #1: CLOSE #1
 
OPEN f$ FOR BINARY AS #1
 
 
GET #1, 1, id
 
IF id = "JMP10QB" + CHR$(4) THEN 'Standard: Farben 0-15 bzw. 0-255
 
 GET #1, 9, Byte     '<== Cursorposition in Datei setzen fr lesen der Palette
 
 Farbe1 = 0
 
 Anzahl = ASC(Byte) '     und Farbanzahl festsetzen
 
ELSEIF id = "JMP10QB" + CHR$(1) THEN  'NEU: Farben, die ver„ndert werden sollen, k”nnen festgelegt werden
 
 GET #1, , Byte: Farbe1 = ASC(Byte)   'Farbe 1
 
 GET #1, , Byte: Anzahl = ASC(Byte)   'Farbe 2
 
ELSEIF id = "JMP10QB" + CHR$(2) THEN  'Graue Palette (Normal) Syntax wie oben
 
 GET #1, 9, Byte
 
 Farbe1 = 0
 
 Anzahl = ASC(Byte)
 
ELSEIF id = "JMP10QB" + CHR$(3) THEN  'Graue Palette (Extra) Syntax wie oben
 
 GET #1, , Byte: Farbe1 = ASC(Byte) 'Farbe 1
 
 GET #1, , Byte: Anzahl = ASC(Byte) 'Farbe 2
 
ELSE
 
 CLS : LOCATE 1: COLOR 15: PRINT "No JMP-File!": END
 
END IF
 
 
'Lese Palette
 
IF id = "JMP10QB" + CHR$(2) OR id = "JMP10QB" + CHR$(3) THEN
 
 FOR Attr = Farbe1 TO Anzahl: OUT &H3C8, Attr
 
 GET #1, , Byte: FOR RGB1 = 1 TO 3: OUT &H3C9, ASC(Byte)
 
 NEXT RGB1, Attr
 
ELSE
 
 FOR Attr = Farbe1 TO Anzahl: OUT &H3C8, Attr
 
 FOR RGB1 = 1 TO 3: GET #1, , Byte: OUT &H3C9, ASC(Byte)
 
 NEXT RGB1, Attr
 
END IF
 
 
IF id = "JMP10QB" + CHR$(4) THEN
 
  IF Anzahl = 15 THEN Start = 60 ELSE Start = 800
 
ELSEIF id = "JMP10QB" + CHR$(2) THEN
 
  IF Anzahl = 15 THEN Start = 26 ELSE Start = 266
 
ELSEIF id = "JMP10QB" + CHR$(3) THEN
 
  Start = 10 + (Anzahl - Farbe1 + 1) + 5
 
ELSE
 
  Start = 10 + (Anzahl - Farbe1 + 1) * 3 + 5
 
END IF
 
 
'Bitmap
 
GET #1, Start, Xsize: GET #1, , Ysize
 
GET #1, Start + 9, Byte '<== Cursorposition in Datei setzen fr lesen der Farben
 
 
FOR x = 0 TO Xsize
 
  Row$ = SPACE$(Ysize + 1): GET #1, , Row$
 
  FOR y = 0 TO Ysize
 
    PSET (x, y), ASC(MID$(Row$, y + 1, 1))
 
NEXT y, x
 
CLOSE
 
END SUB
 
 
SUB Motor (Geschwindigkeit%)
 
'Das ist ein Versuch ein anst„ndiges Motorenger„usch
 
'zu erzeugen. Is'n bischen Nervig, deswegen habe ich es
 
'auch herausgenommen. Wer lust hat es fertig zu Programmieren
 
'kann dies auch tun. Es w„hre nett wenn man's mir zu Mailen
 
'wrde. Viel Spaá :-D
 
 
'SELECT CASE Geschwindigkeit%
 
' CASE 0 TO 50
 
'  SOUND 65.5, 1
 
' CASE 50 TO 100
 
'  SOUND 98, 1
 
' CASE 100 TO 150
 
'  SOUND 147, 1
 
' CASE 150 TO 200
 
'  SOUND 196, 1
 
'END SELECT
 
 
'Zweiter versuch:
 
 
IF Geschwindigkeit% > 0 THEN
 
 'SOUND Geschwindigkeit% + 50, 2
 
END IF
 
 
END SUB
 
 
SUB Nacht (y1%)
 
VIEW SCREEN (1, 1)-(319, 199)
 
AnzahlDerSterne% = 1000
 
FOR Sterne = 1 TO AnzahlDerSterne%
 
 'sternX = INT(RND * 400) + 1
 
 'sternY = INT(RND * y1%) + 1
 
 PSET (sternX, sternY), 15
 
NEXT Sterne
 
VIEW
 
END SUB
 
 
SUB Neigung (Wert%)
 
w = 30: h = 30: y = 17: x = 17
 
BYTES = 30 * 30 + 4
 
FOM = INT((BYTES + 1) / 1)
 
o = 0
 
DIM frame(FOM - 1, 1 TO 11) AS INTEGER
 
OPEN "C:\Neigung.qaa" FOR INPUT AS #1
 
DO
 
INPUT #1, a, B, f
 
PSET (a, B), f
 
LOOP UNTIL EOF(1)
 
CLOSE
 
'SLEEP
 
'FOR ax = 1 TO 10
 
 LINE (16, 384)-(336, 416), 0, BF
 
'NEXT
 
FOR x = 17 TO (16 * 17) + 32 STEP 32
 
o = o + 1
 
LINE (x - 16, y - 16)-(x + 16, y + 16), 0, B
 
GET (x - 16, y - 16)-(x + 16, y + 16), frame(0, o)
 
NEXT x
 
dx = 0
 
dy = 0
 
o = 1
 
i = 5
 
 
'--------|
 
x = 150 '|
 
'....... |
 
y = 170 '|
 
'--------|
 
'DO
 
' a$ = ""
 
' WHILE a$ = ""
 
'  a$ = INKEY$
 
'WEND
 
IF Wert% > 9 AND Wert% < 100 THEN Wert% = Wert% / 10
 
IF Wert% > 100 AND Wert% < 1000 THEN Wert% = Wert% / 100
 
IF Wert% < 0 THEN Wert% = Wert% * -1
 
IF Wert% < -9 AND Wert% < -100 THEN Wert% = (Wert% / 10) * -1
 
IF Wert% < -100 AND Wert% < -1000 THEN Wert% = (Wert% / 100) * -1
 
dx = 0
 
dx = 1: o = Wert% + 1: i = 0
 
IF a$ = CHR$(27) THEN END
 
IF o > 9 THEN o = 1
 
IF i > 9 THEN i = 1
 
IF dx = 1 THEN PUT (x - 16, y - 16), frame(0, o), PSET
 
IF dx = -1 THEN PUT (x - 16, y - 16), frame(0, i), PSET
 
x = x - dx * 0
 
'IF INKEY$ = CHR$(27) THEN EXIT SUB
 
'LOOP
 
 
 
END SUB
 
 
'// Funktion: RotiereXPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Beta um die
 
'//               X-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereXPUNKT3D (Punkt AS PUNKT3D, Beta AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x
 
      NeuPunkt.y = Punkt.y * COS(DEGtoRAD * Beta) - Punkt.z * SIN(DEGtoRAD * Beta)
 
      NeuPunkt.z = Punkt.y * SIN(DEGtoRAD * Beta) + Punkt.z * COS(DEGtoRAD * Beta)
 
END SUB
 
 
'// Funktion: RotiereXYZFACETRI3D
 
'//
 
'// Beschreibung: Rotiert das bergebene Dreieck um die Winkel Alpha, Beta und
 
'//               Gamma um die Z-, X- und Y-Achse und speichert das Ergebnis
 
'//               in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB RotiereXYZFACETRI3D (Dreieck AS FACETRI3D, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuDreieck AS FACETRI3D)
 
          
 
      RotiereXYZPuNKT3D Dreieck.p1, Alpha, Beta, Gamma, NeuDreieck.p1
 
      RotiereXYZPuNKT3D Dreieck.p2, Alpha, Beta, Gamma, NeuDreieck.p2
 
      RotiereXYZPuNKT3D Dreieck.p3, Alpha, Beta, Gamma, NeuDreieck.p3
 
      RotiereXYZPuNKT3D Dreieck.p4, Alpha, Beta, Gamma, NeuDreieck.p4
 
      RotiereXYZPuNKT3D Dreieck.p5, Alpha, Beta, Gamma, NeuDreieck.p5
 
      RotiereXYZPuNKT3D Dreieck.p6, Alpha, Beta, Gamma, NeuDreieck.p6
 
      RotiereXYZPuNKT3D Dreieck.p7, Alpha, Beta, Gamma, NeuDreieck.p7
 
      RotiereXYZPuNKT3D Dreieck.p8, Alpha, Beta, Gamma, NeuDreieck.p8
 
      
 
 
END SUB
 
 
'// Funktion: RotiereXYZPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um die Winkel Alpha, Beta und
 
'//               Gamma um die Z-, X- und Y-Achse und speichert das Ergebnis
 
'//               in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereXYZPuNKT3D (Punkt AS PUNKT3D, Alpha AS SINGLE, Beta AS SINGLE, Gamma AS SINGLE, NeuPunkt AS PUNKT3D)
 
 
      DIM ptemp1 AS PUNKT3D
 
      DIM ptemp2 AS PUNKT3D
 
 
      RotiereYPUNKT3D Punkt, Gamma, ptemp1
 
      RotiereXPUNKT3D ptemp1, Beta, ptemp2
 
      RotiereZPUNKT3D ptemp2, Alpha, NeuPunkt
 
END SUB
 
 
'// Funktion: RotiereYPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Gamma um die
 
'//               Y-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereYPUNKT3D (Punkt AS PUNKT3D, Gamma AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.z * SIN(DEGtoRAD * Gamma) + Punkt.x * COS(DEGtoRAD * Gamma)
 
      NeuPunkt.y = Punkt.y
 
      NeuPunkt.z = Punkt.z * COS(DEGtoRAD * Gamma) - Punkt.x * SIN(DEGtoRAD * Gamma)
 
END SUB
 
 
'// Funktion: RotiereZPUNKT3D
 
'//
 
'// Beschreibung: Rotiert den šbergebenen Punkt um den Winkel Alpha um die
 
'//               Z-Achse und speichert das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB RotiereZPUNKT3D (Punkt AS PUNKT3D, Alpha AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.y * SIN(DEGtoRAD * Alpha) + Punkt.x * COS(DEGtoRAD * Alpha)
 
      NeuPunkt.y = Punkt.y * COS(DEGtoRAD * Alpha) - Punkt.x * SIN(DEGtoRAD * Alpha)
 
      NeuPunkt.z = Punkt.z
 
END SUB
 
 
'// Funktion: SkaliereFACETRI3D
 
'//
 
'// Beschreibung: Skaliert das bergebene Dreieck um die Skalare Skalarx,
 
'//               Skalary und Skalarz auf den drei Achsen  und speichert
 
'//               das Ergebnis in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB SkaliereFACETRI3D (Dreieck AS FACETRI3D, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuDreieck AS FACETRI3D)
 
      SkalierePUnkt3D Dreieck.p1, Skalarx, Skalary, Skalarz, NeuDreieck.p1
 
      SkalierePUnkt3D Dreieck.p2, Skalarx, Skalary, Skalarz, NeuDreieck.p2
 
      SkalierePUnkt3D Dreieck.p3, Skalarx, Skalary, Skalarz, NeuDreieck.p3
 
      SkalierePUnkt3D Dreieck.p4, Skalarx, Skalary, Skalarz, NeuDreieck.p4
 
      SkalierePUnkt3D Dreieck.p5, Skalarx, Skalary, Skalarz, NeuDreieck.p5
 
      SkalierePUnkt3D Dreieck.p6, Skalarx, Skalary, Skalarz, NeuDreieck.p6
 
      SkalierePUnkt3D Dreieck.p7, Skalarx, Skalary, Skalarz, NeuDreieck.p7
 
      SkalierePUnkt3D Dreieck.p8, Skalarx, Skalary, Skalarz, NeuDreieck.p8
 
 
END SUB
 
 
'// Funktion: SkaliereFACETRI3D
 
'//
 
'// Beschreibung: Skaliert den bergebenen Punkt um die Skalare Skalarx,
 
'//               Skalary und Skalarz auf den drei Achsen  und speichert
 
'//               das Ergebnis in NeuPunkt
 
'//---------------------------------------------------------------------------
 
SUB SkalierePUnkt3D (Punkt AS PUNKT3D, Skalarx AS SINGLE, Skalary AS SINGLE, Skalarz AS SINGLE, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x * Skalarx
 
      NeuPunkt.y = Punkt.y * Skalary
 
      NeuPunkt.z = Punkt.z * Skalarz
 
END SUB
 
 
SUB Speed (Wert%)
 
 
w = 30: h = 30: y = 17: x = 17
 
BYTES = 30 * 30 + 4
 
FOM = INT((BYTES + 1) / 1)
 
o = 0
 
DIM frame(FOM - 1, 1 TO 11)       AS INTEGER
 
OPEN "C:\Speed.qaa" FOR INPUT AS #2
 
DO
 
INPUT #2, a, B, f
 
'PSET (a, B), f
 
LOOP UNTIL EOF(2)
 
CLOSE
 
'FOR ax = 1 TO 10
 
' LINE (16, 384)-(336, 416), 0, BF
 
'NEXT
 
FOR x = 17 TO (16 * 17) + 32 STEP 32
 
o = o + 1
 
'LINE (x - 16, y - 16)-(x + 16, y + 16), 0, B
 
GET (x - 16, y - 16)-(x + 16, y + 16), frame(0, o)
 
NEXT x
 
dx = 0
 
dy = 0
 
o = 1
 
i = 5
 
 
'---------|
 
x = 100  '|
 
'.......  |
 
y = 170  '|
 
'---------|
 
IF Wert% > 9 AND Wert% < 100 THEN Wert% = Wert% / 10
 
IF Wert% > 100 AND Wert% < 1000 THEN Wert% = Wert% / 100
 
IF Wert% < 0 THEN Wert% = Wert% * -1
 
IF Wert% < -9 AND Wert% < -100 THEN Wert% = (Wert% / 10) * -1
 
IF Wert% < -100 AND Wert% < -1000 THEN Wert% = (Wert% / 100) * -1
 
dx = 0
 
dx = 1: o = Wert% + 1: i = 0
 
IF o > 9 THEN o = 1
 
IF i > 9 THEN i = 1
 
IF dx = 1 THEN PUT (x - 16, y - 16), frame(0, o), PSET
 
IF dx = -1 THEN PUT (x - 16, y - 16), frame(0, i), PSET
 
x = x - dx * 0
 
IF INKEY$ = CHR$(27) THEN EXIT SUB
 
END SUB
 
 
SUB Tag (y1%, y2%)
 
'PRINT "SUB Tag aufgerufen"
 
 
y1% = y2%
 
y2% = y1%
 
 
IF y1% AND y2% <= 0 THEN
 
 EXIT SUB
 
END IF
 
 
LINE (0, y1%)-(400, y2%), 1
 
PAINT (1, 1), 1
 
CIRCLE (10, y1% - 20), 16, 14
 
PAINT (15, y1% - 30), 14
 
END SUB
 
 
SUB Variomet (Wert%)
 
w = 30: h = 30: y = 17: x = 17
 
BYTES = 30 * 30 + 4
 
FOM = INT((BYTES + 1) / 1)
 
o = 0
 
DIM frame(FOM - 1, 1 TO 11) AS INTEGER
 
OPEN "C:\Variomet.qaa" FOR INPUT AS #1
 
DO
 
INPUT #1, a, B, f
 
PSET (a, B), f
 
LOOP UNTIL EOF(1)
 
CLOSE
 
'SLEEP
 
'FOR ax = 1 TO 10
 
 'LINE (16, 384)-(336, 416), 0, BF
 
'NEXT
 
FOR x = 17 TO (16 * 17) + 32 STEP 32
 
o = o + 1
 
LINE (x - 16, y - 16)-(x + 16, y + 16), 0, B
 
GET (x - 16, y - 16)-(x + 16, y + 16), frame(0, o)
 
NEXT x
 
dx = 0
 
dy = 0
 
o = 1
 
i = 5
 
 
'--------|
 
x = 200 '|
 
'....... |
 
y = 170 '|
 
'--------|
 
'DO
 
' a$ = ""
 
' WHILE a$ = ""
 
'  a$ = INKEY$
 
'WEND
 
IF Wert% > 9 AND Wert% < 100 THEN Wert% = Wert% / 10
 
IF Wert% > 100 AND Wert% < 1000 THEN Wert% = Wert% / 100
 
IF Wert% < 0 THEN Wert% = Wert% * -1
 
IF Wert% < -9 AND Wert% < -100 THEN Wert% = (Wert% / 10) * -1
 
IF Wert% < -100 AND Wert% < -1000 THEN Wert% = (Wert% / 100) * -1
 
dx = 0
 
dx = 1: o = Wert% + 1: i = 0
 
IF a$ = CHR$(27) THEN END
 
IF o > 9 THEN o = 1
 
IF i > 9 THEN i = 1
 
IF dx = 1 THEN PUT (x - 16, y - 16), frame(0, o), PSET
 
IF dx = -1 THEN PUT (x - 16, y - 16), frame(0, i), PSET
 
x = x - dx * 0
 
'IF INKEY$ = CHR$(27) THEN EXIT SUB
 
'LOOP
 
 
END SUB
 
 
'// Funktion: VerschiebeFACETRI3D
 
'//
 
'// Beschreibung: Verschiebt das bergebene Dreieck um den angegebenen
 
'//               Vektor und speichert das Ergebnis in NeuDreieck
 
'//
 
'//---------------------------------------------------------------------------
 
SUB VerschiebeFACETRI3D (Dreieck AS FACETRI3D, Vektor AS VEKTOR3D, NeuDreieck AS FACETRI3D)
 
      VerschiebePUNKT3D Dreieck(GG).p1, Vektor, Dreieck(GG).p1
 
      VerschiebePUNKT3D Dreieck(GG).p2, Vektor, Dreieck(GG).p2
 
      VerschiebePUNKT3D Dreieck(GG).p3, Vektor, Dreieck(GG).p3
 
      VerschiebePUNKT3D Dreieck(GG).p4, Vektor, Dreieck(GG).p4
 
      VerschiebePUNKT3D Dreieck(GG).p5, Vektor, Dreieck(GG).p5
 
      VerschiebePUNKT3D Dreieck(GG).p6, Vektor, Dreieck(GG).p6
 
      VerschiebePUNKT3D Dreieck(GG).p7, Vektor, Dreieck(GG).p7
 
      VerschiebePUNKT3D Dreieck(GG).p8, Vektor, Dreieck(GG).p8
 
      
 
 
END SUB
 
 
'// Funktion: VerschiebeKameraFACETRI3D
 
'//
 
'// Beschreibung: Verschiebt das bergebene Dreieck um die inverse
 
'//               Kameraposition in vom Weltraum in den Kameraraum
 
'//               rotiert es um die negativen Rotationswinkel der
 
'//               Kameraachsen und speichert das Ergebnis in NeuDreieck
 
'//---------------------------------------------------------------------------
 
SUB VerschiebeKameraFACETRI3D (Dreieck AS FACETRI3D, kamera AS KAMERA3D, NeuDreieck AS FACETRI3D)
 
 
      DIM KameraVektor AS VEKTOR3D
 
          
 
      '// den inversen Vektor aus der Kameraposition
 
      '// erstellen um den das Dreieck verschoben wird
 
      
 
      KameraVektor.x = -kamera.Position.x
 
      KameraVektor.y = -kamera.Position.y
 
      KameraVektor.z = -kamera.Position.z
 
 
      '// Alle Punkte des Dreiecks verschieben...
 
         
 
      VerschiebeFACETRI3D Dreieck, KameraVektor, NeuDreieck
 
      
 
      '// ...und um den Ursprung um die negativen
 
      '// Rotationswinkel rotieren. Beachtet das
 
      '// wir die Winkel nach Alpha (z), Beta (x), Gamma(y) bergeben mssen!!!
 
      RotiereXYZFACETRI3D NeuDreieck, -kamera.Zrot, -kamera.Xrot, -kamera.Yrot, NeuDreieck
 
END SUB
 
 
'// Funktion: VerschiebePUNKT3D
 
'//
 
'// Beschreibung: Verschiebt den bergebenen Punkt um den angegebenen
 
'//               Vektor und speichert das Ergebnis in NeuPunkt
 
'//
 
'//---------------------------------------------------------------------------
 
SUB VerschiebePUNKT3D (Punkt AS PUNKT3D, Vektor AS VEKTOR3D, NeuPunkt AS PUNKT3D)
 
      NeuPunkt.x = Punkt.x + Vektor.x
 
      NeuPunkt.y = Punkt.y + Vektor.y
 
      NeuPunkt.z = Punkt.z + Vektor.z
 
END SUB
 
 
SUB Wolke (x, y)
 
RANDOMIZE TIMER
 
RadiusDerWolke1 = INT(RND * 16) + 8
 
RadiusDerWolke2 = INT(RND * 16) + 8
 
RadiusDerWolke3 = INT(RND * 16) + 8
 
xDerWolke2 = x - RadiusDerWolke1 + 9
 
yDerWolke2 = y '- RadiusDerWolke1 + 9
 
xDerWolke3 = x + RadiusDerWolke1 + 9
 
yDerWolke3 = y '+ RadiusDerWolke1 + 9
 
CIRCLE (x, y), RadiusDerWolke1
 
CIRCLE (xDerWolke2, yDerWolke2), RadiusDerWolke2
 
CIRCLE (xDerWolke3, yDerWolke3), RadiusDerWolke3
 
PAINT (x - 8, y - 8), 15
 
PAINT (xDerWolke2 + 3, yDerWolke2 + 3), 15
 
PAINT (xDerWolke3 + 3, yDerWolke3 + 3), 15
 
END SUB
 
 
SUB Wolke1 (x%, y%)
 
RadiusDer1Wolke = 16
 
RadiusDer2Wolke = 8
 
RadiusDer3Wolke = 10
 
xDer2Wolke = x% + 16
 
yDer2Wolke = y%
 
xDer3Wolke = x% - 10
 
yDer3Wolke = y%
 
CIRCLE (x%, y%), 15
 
CIRCLE (xDer2Wolke, yDer2Wolke), RadiusDer2Wolke, 15
 
CIRCLE (xDer3Wolke, yDer3Wolke), RadiusDer3Wolke, 15
 
PAINT (x% + 3, y% + 3), 15
 
PAINT (xDer2Wolke, yDer2Wolke), 15
 
PAINT (xDer3Wolke, yDer3Wolke), 15
 
PAINT (x% + 14, y%), 15
 
PAINT (xDer3Wolke - 8, yDer3Wolke - 1), 15
 
 
END SUB
 
 
'// Funktion: ZeichneFACETRI3D
 
'//
 
'// Beschreibung: Projiziert die Punkte der ganzen B„ume auf die Projektions-
 
'//               fl„che (Bildschirmkoordinatensystem) und zeichnet die
 
'//               die Verbindungslinien zwischen den Punkten (Drahtgitter-
 
'//               modell)
 
'//---------------------------------------------------------------------------
 
SUB ZeichneFACETRI3D (Dreieck AS FACETRI3D, Farbe AS INTEGER)
 
      DIM xp1, yp1
 
      DIM xp2, yp2
 
      DIM xp3, yp3
 
      DIM xp4, yp4
 
      DIM xp5, yp5
 
      DIM xp6, yp6
 
      DIM xp7, yp7
 
  
 
 
      xp1 = Dreieck.p1.x * FOCUS / (FOCUS + Dreieck.p1.z) + 160
 
      yp1 = -Dreieck.p1.y * FOCUS / (FOCUS + Dreieck.p1.z) + 100
 
 
      xp2 = Dreieck.p2.x * FOCUS / (FOCUS + Dreieck.p2.z) + 160
 
      yp2 = -Dreieck.p2.y * FOCUS / (FOCUS + Dreieck.p2.z) + 100
 
  
 
      xp3 = Dreieck.p3.x * FOCUS / (FOCUS + Dreieck.p3.z) + 160
 
      yp3 = -Dreieck.p3.y * FOCUS / (FOCUS + Dreieck.p3.z) + 100
 
 
      xp4 = Dreieck.p4.x * FOCUS / (FOCUS + Dreieck.p4.z) + 160
 
      yp4 = -Dreieck.p4.y * FOCUS / (FOCUS + Dreieck.p4.z) + 100
 
 
      xp5 = Dreieck.p5.x * FOCUS / (FOCUS + Dreieck.p5.z) + 160
 
      yp5 = -Dreieck.p5.y * FOCUS / (FOCUS + Dreieck.p5.z) + 100
 
 
      xp6 = Dreieck.p6.x * FOCUS / (FOCUS + Dreieck.p6.z) + 160
 
      yp6 = -Dreieck.p6.y * FOCUS / (FOCUS + Dreieck.p6.z) + 100
 
 
      xp7 = Dreieck.p7.x * FOCUS / (FOCUS + Dreieck.p7.z) + 160
 
      yp7 = -Dreieck.p7.y * FOCUS / (FOCUS + Dreieck.p7.z) + 100
 
 
      xp8 = Dreieck.p8.x * FOCUS / (FOCUS + Dreieck.p8.z) + 160
 
      yp8 = -Dreieck.p8.y * FOCUS / (FOCUS + Dreieck.p8.z) + 100
 
 
      xp1$ = STR$(INT(xp1)): yp1$ = STR$(INT(yp1))
 
      xp2$ = STR$(INT(xp2)): yp2$ = STR$(INT(yp2))
 
      xp3$ = STR$(INT(xp3)): yp3$ = STR$(INT(yp3))
 
      xp4$ = STR$(INT(xp4)): yp4$ = STR$(INT(yp4))
 
      xp5$ = STR$(INT(xp5)): yp5$ = STR$(INT(yp5))
 
      xp6$ = STR$(INT(xp6)): yp6$ = STR$(INT(yp6))
 
      xp7$ = STR$(INT(xp7)): yp7$ = STR$(INT(yp7))
 
      
 
      'Neigung:
 
      'IF Neigung1% > 360 THEN Neigung% = 0
 
      'IF Neigung1% < -360 THEN Neigung = 0
 
 
      'Neigung$ = STR$(Neigung%)
 
      'DRAW "TA" + STR$(Neigung%)
 
      'DRAW "TA60"
 
 
 
      LINE (xp1, yp1)-(xp2, yp2), 2
 
      'DRAW "C4"
 
      'DRAW "BM" + xp1$ + "," + yp1$ + ""
 
      'DRAW "M" + xp2$ + "," + yp2$ + ""
 
          
 
      LINE (xp2, yp2)-(xp3, yp3), 2
 
      'DRAW "C4"
 
      'DRAW "BM" + xp2$ + "," + yp2$ + ""
 
      'DRAW "M" + xp3$ + "," + yp3$ + ""
 
          
 
      LINE (xp3, yp3)-(xp1, yp1), 2
 
      'DRAW "C4"
 
      'DRAW "BM" + xp3$ + "," + yp3$ + ""
 
      'DRAW "M" + xp1$ + "," + yp1$ + ""
 
          
 
      LINE (xp4, yp4)-(xp6, yp6), 6
 
      'DRAW "C6"
 
      'DRAW "BM" + xp4$ + "," + yp4$ + ""
 
      'DRAW "M" + xp6$ + "," + yp6$ + ""
 
 
      LINE (xp5, yp5)-(xp7, yp7), 6
 
      'DRAW "C6"
 
      'DRAW "BM" + xp5$ + "," + yp5$ + ""
 
      'DRAW "M" + xp7$ + "," + yp7$ + ""
 
          
 
      LINE (xp6, yp6)-(xp7, yp7), 6
 
      'DRAW "BM" + xp6$ + "," + yp6$ + ""
 
      'DRAW "M" + xp7$ + "," + yp7$ + ""
 
 
      ' LINE (xp7, yp7)-(xp8, yp8), 6
 
 
      
 
      xx = xp1
 
      yy = yp1 + 5
 
       'PAINT (xx, yy), 2, 2 , CHR$(77)
 
      END SUB
 
 
 | 	  
 
 
Das "Baumproblen is jetz auch gelöst.
 
Davür ein neues Problem: 
 
Bei
 
 	  | Code: | 	 		  FOR B = genug% TO AnzahlDerBaeume%
 
RANDOMIZE B
 
Dreieck(B).p1.x = Max% 'INT((Max% - -Max% + 1) * RND + -Max%)  'INT(RND * 10000) + -10000
 
Dreieck(B).p1.y = INT(RND * 100) + -100
 
Dreieck(B).p1.z = INT(RND * 0) + 10000
 
'Dreieck.p1.x = -40: Dreieck.p1.y = -40: Dreieck.p1.z = 0
 
Dreieck(B).p2.x = Dreieck(B).p1.x + 40: Dreieck(B).p2.y = Dreieck(B).p1.y + 80: Dreieck(B).p2.z = Dreieck(B).p1.z
 
Dreieck(B).p3.x = Dreieck(B).p1.x + 80: Dreieck(B).p3.y = Dreieck(B).p1.y: Dreieck(B).p3.z = Dreieck(B).p1.z
 
Dreieck(B).p4.x = Dreieck(B).p1.x + 48: Dreieck(B).p4.y = Dreieck(B).p1.y: Dreieck(B).p4.z = Dreieck(B).p1.z
 
Dreieck(B).p5.x = Dreieck(B).p1.x + 40: Dreieck(B).p5.y = Dreieck(B).p1.y: Dreieck(B).p5.z = Dreieck(B).p1.z
 
Dreieck(B).p6.x = Dreieck(B).p1.x + 48: Dreieck(B).p6.y = Dreieck(B).p1.y - 40: Dreieck(B).p6.z = Dreieck(B).p1.z
 
Dreieck(B).p7.x = Dreieck(B).p1.x + 40: Dreieck(B).p7.y = Dreieck(B).p1.y - 40: Dreieck(B).p7.z = Dreieck(B).p1.z
 
 | 	  
 
 
Kommt "Index außerhalb der Bereiches"
 
Wie löse ich das Problem???
 
         | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Mao
 
 
  Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
  | 
		
			
				 Verfasst am: 30.08.2007, 17:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Code: | 	 		  | FOR B = genug% TO AnzahlDerBaeume%-1 | 	  
 
Versuch's mal damit.  
 
Das Array Dreieck enthält zwar 900 Elemente, aber diese gehen von 0 bis 899.
 
Deine Bäume zählst du aber wahrscheinlich von 1 an.  
 
 
(Btw, wäre es nicht besser, du würdest MaxBaeume% als Konstante verwenden?) _________________ Eine handvoll Glück reicht nie für zwei.
 
--
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Ferdi
 
  
  Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 30.08.2007, 17:36    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke!
 
Probiere es gleich aus.
 
Das mit der Konstante werd ich auch gleich einbauen.
 
         | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
     |