Kollisionsproblem, bitte um Hilfe^^

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

tmode00

Betreff: Kollisionsproblem, bitte um Hilfe^^

BeitragSo, Mai 20, 2007 8:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bin gerade bei der erstellung eines 3d-Kosmo Spiels. Erinnern soll es an das gut alte Kosmo aus längst vergessenen Dos-Zeiten:

Original-Kosmo(naut):
user posted image

Nun gut, so weit funktioniert schon alles sehr gut, es gibt einen Leveleditor (2d-IsoArtig), sowie eine Hauptroutine, die die gebauten Levels dann in 3d (Plattenmodelle) lädt.

Es gibt da aber ein kleines Problem was ich bislang nur vor mir weg geschoben habe. Das Problem mit der EntityBox bzw. EntityRadius! Eine Polygon2Polygon -Kollision ist ja bekanntlich nicht zu empfehlen und extrem langsam. Ich möchte aber das das Raumschiff (Spielerentity namens cube) am Rand der Platten abstürzt und nicht ab der Mitte Kugelartig runterrollt!

------>

user posted image


Ich hab mir schon irgendwie überlegt Parents zu machen die auch Kugel-Kollisions-Boxen bekommen so das es erst ganz am Rand abschmiert... naja, scheint aber auch keine Lösung zu sein, gerade wenn man betrachtet, das der Spieler bereits mit der Kamera, sowie der Skybox zusammenhängt...

Also so ist der Spieler erstellt:
Code: [AUSKLAPPEN]
;DER SPIELER--->
Global cube=LoadMesh("models\roomship.x")
EntityType cube,2 ;KOLLISIONSGRUPPE 2
EntityRadius cube,1,5
EntityTexture cube,cube_tex
PositionEntity cube,0,200,playerstartpoint
ScaleEntity cube,6,6,6


I hope there is a Freak who can help me^^

Thanks
While (1) : Wend
 

Mr Hopp

BeitragSo, Mai 20, 2007 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Collisions 2,1,3,3...

letzte 3 bedeutet "nur raufsliden" Wink
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

tmode00

Betreff: Oh Oh Oh..

BeitragSo, Mai 20, 2007 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stelle gerade fest das ich überaus dämlich bin! Ich habe deine Signatur als Antwort gelesen und daraufhin folgenden Text vormuliert, den ich hiermit selbstverständlich zurückziehe:

Zitat:
Ich habe mir echt mühe gegeben bei dem Spiel, bin jetzt bei über 1500 Zeilen Quellcode. Ich habe vorher im Forum nach Antworten gesucht! Es tut mir leid das nicht jeder so Perfekt ist gleich Halflife 2 zu programmieren. Probiers doch bitte erstmal aus befohr du dir dein Urteil bildest!
ttl-kosmo-project.zip
Es ist doch erst im Anfang, was soll die dreckige Ironie?
Ich gebe zu der letzte Satz (von mir) war recht sinnlos aber bitte nicht gleich viel viel Arbeit in Grund und Boden stampfen!


...das ist an dummheit meinerseits nicht mehr zu übertreffen!!

So, jetzt zu deiner Antwort:
Code: [AUSKLAPPEN]
Collisions 2,1,3,3...
letzte 3 bedeutet "nur raufsliden" Wink

Wenn ich die Kollision so mache wie du das sagst dann fällt das Raumschiff durch die Platten durch! Ich habe es so:
Code: [AUSKLAPPEN]
Collisions 2,1,2,3;KOLLISION prüfen

...da glitcht es aber an der Seite runter! Vieleicht muss ich den einzelnen Plattenmodellen noch irgendwie ne KollisionsBox geben, die habe ich nämlich nur so erstellt:
Code: [AUSKLAPPEN]

objektcounter = objektcounter + 1
objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit 
PositionMesh(objects(objektcounter),y_poss#,0,x_poss#);an die schleifenposition setzen
EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1


Anhang: ich muss dazu sagen, die Hintergründe für die SkyBox sind gegoogled und nicht selbstgemacht. Alles andere (auch Texturen..^^) ist selbst gemacht!
 

tmode00

Betreff: antwort?

BeitragSo, Mai 20, 2007 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
bekomme ich noch ne Antwort, es funktioniert nämlich immer noch nicht!
While (1) : Wend

tft

BeitragMo, Mai 21, 2007 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi .....

du must die Collision anders aufziehen. Dein Raumschiff benötigt eine oder mehrere Spheren die auf colision mit Kugel/Poly getestet werden. Der untergrund braucht dabei keine besondere beachtung geschenkt zu werden. Lediglich die abfolge der Colisions abfrage ist dafon abhängig ob du das Schiff oder den Untergrund... oder sogar beides bewegst. Am besten ist es erst das schiff anzuheben. Dann den untergrund zu bewegen und das Schiff dan mit einer definierten Schwerkraft nach unten zu stellen. Dann die Colisionsabrage testen... natürlich nach dem Update befehl. Beim erstellen des untergrundes must du natürlich auch die Normals neu berechnen. Meisten hilf UpdateNormal.

Da hilft nur Kreatives ausprbieren. Smile

Fiel spass
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

D2006

Administrator

BeitragMo, Mai 21, 2007 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu deiner Fertigung... das ist auch eine dumme Signatur.
Trotzdem würde ich dich bitten, Doppelposts zu vermeiden. Geduld ist eine Tugend, und wer auf die Art Ungeduld zeigt, dem wird nicht gern geholfen.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

tmode00

Betreff: kleinlich...

BeitragDi, Mai 22, 2007 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum müssen Menschen in Foren immer so kleinlich sein...
Ohh hat der böse tmode00 gesagt ,,bekomm ich noch ne Antwort?" Wie konnte er das tun. Die Welt ist geschockt, keiner konnte es fassen, er lief einfach Amock...

Es ist kein Weltuntergang ein Doppelpost zu schreiben, ich hab ja schließlich nicht n neuen Thread eröffnet!

Die Signatur schaff ich jetzt ab, das seh ich ein....

Danke an tft, ich versuch den Post als denkanstoß für mein Problem zu nehmen, auch wenn ich leider noch nicht wirklich weis wie ich das machen soll, vielleicht hab ichs aber auch etwas schlecht erklärt... ich meine so schwer kanns doch nicht sein 2 Blöcke miteinander kollidieren zu lassen. Sicherlich ist es nicht realistisch einen 8km langen Zug über einen Abgrund fahren zu lassen und obwohl er den Mittelpunkt überschritten hat stürtzt der nicht ab sondern fährt weiter bis zum letzten stück und fällt dann mit einmal gerade nach unten! Da es mir aber zu kompliziert scheint das Raumschiff Ab ,,roll" en zu lassen sobald es in der MItte kippt denke ich doch könnte man es genau so machen das es eben erst am letzten Rand gerade nach unten fällt. Naja....

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Mai 22, 2007 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
tft hat schon - zwar etwas versteckt aber - gut erklärt, woran es vermutlich liegt. Kollisionen in 3D gehen nur aus der Bewegung aus (anders als in 2D). Ausserdem kann Blitz3D nur Kollisionen berechnen, wenn ein Objekt auf ein unbewegtes trifft. Bewegt sich der Untergrund, so fällt die Kollision durch. Vermutlich ändert sich die Position der kamera und des Spielers nicht und du bewegst nur den Hintergrund (einfachster Programmieraufwand). Allerdings muss dann entsprechend mit Tricks gearbeitet werden, um die kommenden Probleme zu vermeiden. Die Tricks hat u.A. tft schon genannt (habe sie selber aber noch nicht ausprobiert).
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

tmode00

Betreff: Antwort

BeitragDi, Mai 22, 2007 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe nicht einfachsten Programmieraufwand betrieben!!!!!! Die Platten werden aus ner Datei geladen (bzw. die Informationen z.B. Levellänge, Plattennummer) also wie ne Art Datenbank. Dann werden die als Modelle in ner schleife die immer ein Modell lädt geladen. Das Raumschiff ist ein eigenständiges Modell was Gas geben/bremsen links/rechts kann und springen (per sinus). Ich hab das Gefühl ich werd hier immermehr ins Licht des Binsenbauprogrammieres alla Qbasic geückt. Ich bin kein Bill Gates, aber so schlimm wie Ihr euch das denkt ist es nicht. Aus diesem Grunde gibts jetzt Quelltext:
Code: [AUSKLAPPEN]

;Init-->
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;Global/Const/Dim--->
Global mega = LoadFont("Courier New",40,1,0,0)
Global is_animating,blocksp,error_tex$
Global cube_y# = -2
Global winkel,jump,jumping_now,speed#
Global camera_mode = 1;speichert den Aktuellen Cameramodus
Dim block_zu(2)
Global fly_mode
;Const:
Const max_speed# = 3
Const max_speed_leftright# = 2
Global speed_leftright#;speichert die aktuelle geschwindigkeit (von -1.5 - +1.5)
Const left_right_faktor# = 0.3;definiert den rechts/links geschwindigkeitsfaktor

Const jump_height# = 3
Const jump_speed# = 6
Const gasspeed# = .03
Const bremsspeed# = .05
Const max_objects = 10000;max Objekte!
Const block_depth = 30;scaletiefe der einzalnen Block-Teile (1= Originalgröße)
Const block_width = 20;scalebreite der einzalnen Block-Teile (1= Originalgröße)
Global filein;dateistrem für level-laden
Global reset
Global playerstartpoint = 40;Dort (z) startet der Spieler

Global globalreturn;speichert ob es nach einen preview wieder den Leveleditor starten soll(1/0)
Dim objects(max_objects);da sind später die 3d-Mesh Daten drin!

;Laden von Dateien-->
Global bg = LoadImage("gfx\bg_2.png")
;menü:
Global leveledit_but = LoadImage("gfx\leveledit_but.png")
Global leveledit_but_on = LoadImage("gfx\leveledit_but_on.png")
Global levelload_but = LoadImage("gfx\levelload_but.png")
Global levelload_but_on = LoadImage("gfx\levelload_but_on.png")
Global exit_but = LoadImage("gfx\exit_but.png")
Global exit_but_on = LoadImage("gfx\exit_but_on.png")
Global mouse_map = LoadImage("gfx\maus.png")
Global standart_font = LoadFont("Arial",18,1)
;Texturen:
Global grundplatten_tex = LoadTexture("gfx\textures\grundplatten_tex.png")
Global sky_tex = LoadTexture("gfx\textures\stars.jpg")
Global cube_tex=LoadTexture("gfx\textures\roomship_tex.bmp")
Global bank_tex=LoadTexture("gfx\textures\banks.png")
Global block1_tex=LoadTexture("gfx\textures\block1_tex.png")
;DER SPIELER--->
Global cube=LoadMesh("models\roomship.x")
EntityType cube,2 ;KOLLISIONSGRUPPE 2
EntityRadius cube,1,5
EntityTexture cube,cube_tex
PositionEntity cube,0,200,playerstartpoint
ScaleEntity cube,6,6,6
;lights
Global licht=CreateLight(1)
PositionEntity licht,0,100,0,2
RotateEntity licht,90,0,0
LightRange licht,500
LightColor licht,255,128,0
AmbientLight 255,255,255
;camera->
Global camera=CreateCamera();camera erstellen

;setzt die Camera auf den richtigen Modus (3rd Person, Ego (Kockpit)):
function set_cam(modus)
select modus
   case 1;3rd person
      freeentity(camera)
      camera = 0
      camera=CreateCamera();camera erstellen
      CameraViewport camera, 0,0,1024,768;viewport einstellen
      PositionEntity camera,entityx(cube),entityY(cube)+40,entityZ(cube)-50;positionieren
      rotateEntity camera,20,1,0;rotieren
      cameraRange camera,1,3000
      entityParent camera,cube;Die Kamera an den Cube hängen
   case 2;Ego
      freeentity(camera)
      camera = 0
      camera=CreateCamera();camera erstellen
      CameraViewport camera, 0,0,1024,768;viewport einstellen
      PositionEntity camera,entityx(cube),entityY(cube)+10,entityZ(cube)+2;positionieren
      rotateEntity camera,15,1,0;rotieren
      cameraRange camera,1,3000
      entityParent camera,cube;Die Kamera an den Cube hängen
end select
end function

;skybox (Bild auf großen Block)
Global sky=CreateSprite()
PositionEntity(sky,0,-700,1200)
EntityTexture sky,sky_tex
SpriteViewMode Sky,2
ScaleSprite sky, 2000,1500
EntityParent(sky,cube)

Include ".\tmode_lib\narichten.bb"
Include "leveledit.bb"

Function reset_player()
   EntityType cube,4
   PositionEntity cube,0,200,playerstartpoint
   speed# = 0
   checkpoint = 0
   reset = 1
End Function


Function clear_leveldata()
   i= 1
   While (objects(i) <> 0);wenn daten in dem ersten 3d-Objekt sind
      FreeEntity(objects(i))
      objects(i) = 0
      i=i+1
   Wend
   reset_player()

   Return
End Function

;Level-laden:
Function load_level(load_local = 0)
clear_leveldata()
If (load_local = 0) Then;muss ein level geladen werden oder wurde es vom Leveldeditor übergeben?
   ;Level-Laden Screen:
   resultat = 1
   While (1)
      levelname$ = filelist$("Bitte Level auswählen!",".\lev")
      If levelname$ <> "esc" Then
         filein = OpenFile(".\lev\"+levelname$);Datei zum lesen öffnen
         If filein <> 0 Then ;level erfolgreich geladen?
            laden=1
            Exit
         Else
            msg("Error!","Level: " +  levelname$,"konnte nicht","geladen werden")
            resultat = janein("Neu?","Neues Level laden?","")
            If resultat = 0 Then Return 0
         EndIf
      Else
         Return 0;escape
      EndIf
   Wend
   If resultat = 0 Then Return 0;wenn kein neuer ladeversuch gestartet
Else
   globalreturn = load_local;nach preview level_editor-Hauptmenü laden!!
   filein = OpenFile(".\lev\preview.lev");Datei zum lesen öffnen
   If filein <> 0 Then
      laden=1;level geladen?
   EndIf
EndIf
;Laden des Hintergrunds/Levellänge/Ebene
For i = 1 To 3
   count_dataset = count_dataset + 1;datensatz 1
   filedata$ =ReadString(filein);immer einen datensatz lesen
   Select (count_dataset)
      Case 1
         If filedata$ = "TTL" Then
            msg("Okay!","Das Level" + levelname$,"wurde erfolgreich","geladen!")
         Else
            msg("Error 2!","Die Leveldatei ist","ungültig!","(Magic Number fehlerhaft!)")
            Return 0
         EndIf
      Case 2
         If (OpenFile(".\hintergrund\"+filedata$) <> 0) Then
            sky_tex = LoadTexture(".\hintergrund\"+filedata$)
            EntityTexture sky,sky_tex
         Else
            error_tex$ = "Hintergrund existiert nicht, Default (sky.jpg) geladen!"
         EndIf      
      Case 3
         levellenght# = Int(filedata$);levellänge ermitteln
      Case 4
         ebene = Int(filedata$)
   End Select
Next

;laden der einzelnen Leveldaten:
For y = 1 To 4
   For x = 1 To levellenght#
      count_dataset = count_dataset + 1 ; (1stes = Hitergrund, ab 2. Datensätze)
      filedata$ =ReadString(filein);immer einen datensatz lesen
      obejektnr$ = filedata$
         Select obejektnr$;Plattenmodelle laden:
            ;ebene1
            Case "1"
objektcounter = objektcounter + 1
objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit 
PositionMesh(objects(objektcounter),y_poss#,0,x_poss#);an die schleifenposition setzen
EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            Case "2"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slideup.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,5,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1          
            Case "3"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slidedown.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,5,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1                         
            ;ebene2:
            Case "61"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,15,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            Case "62"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slideup.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,20,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1          
            Case "63"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slidedown.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,20,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1                EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            ;ebene3
            Case "121"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 

               PositionMesh(objects(objektcounter),y_poss#,30,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            Case "122"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slideup.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,35,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1          
            Case "123"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slidedown.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,35,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1                
            ;ebene4
            Case "181"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,45,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            Case "182"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slideup.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,50,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1          
            Case "183"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\slidedown.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 
               PositionMesh(objects(objektcounter),y_poss#,50,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1                      
            ;ebene5            
            Case "241"
               objektcounter = objektcounter + 1
               objects(objektcounter) = LoadMesh("models\platte.x");Objekt laden
               ScaleMesh(objects(objektcounter),block_width,10,block_depth);jedes objekt ist nun 200 lang und 30 breit                 

               PositionMesh(objects(objektcounter),y_poss#,60,x_poss#);an die schleifenposition setzen
                EntityTexture objects(objektcounter),grundplatten_tex ;textur zuweien
               EntityType objects(objektcounter),1;KOLLISIONSGRUPPE 1
            End Select
      x_poss# = x_poss# + block_depth*2;Platz reservieren, egal ob Block oder leer!
   Next
   x_poss# = 0
   y_poss# = y_poss# + block_width*3;Platz reservieren, egal ob Block oder leer!
Next
y_poss# = 0
CloseFile(filein);datei schließen

If objektcounter = 0;wenn keine Objekte geladen!
   msg("Error 1!","Level hat keine Geometrie!","","")      
   If load_local = 1 Then
      DeleteFile(".\lev\preview.lev")
      start_editor()
   Else
      Return 0
   EndIf
EndIf

objektcounter = 0

If load_local = 1 Then DeleteFile(".\lev\preview.lev");preview-Datei wieder löschen (wenn es eine Leveledit-Datei ist!)!
Return laden
End Function

;START--(HAUPTMENÜ)-------------------------------------------------------------------------------->
Function start_menu()

start_mov=OpenMovie("start.avi")
   While Not KeyHit(1) Or KeyHit(57) Or KeyHit(28)
      If MoviePlaying(start_mov) = 0 Then Exit
      DrawMovie start_mov,0,0,1024,768
      Flip
   Wend
CloseMovie start_mov

While(1)
   If KeyHit(1) Then
      If janein("Sicher?","Sie möchten zu Windows","zurückkehren?") Then End
   EndIf
   Cls
   DrawImage bg,0,0
   ;menü mapping:   
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,250,575,29)) Then
      If MouseHit(1) Then
         If start_editor() = 1 Then ;Editor starten, er gibt zurück ob PREVIEW geladen werden soll!
            laden=load_level(1);Das Preview-Level laden
            If laden = 1 Then show_level();ab ins Spiel!
         EndIf
         bg=LoadImage("gfx\bg_2.png")   
             mouse_map = LoadImage("gfx\maus.png")
      EndIf
      DrawImage leveledit_but_on,232,250
   Else
      DrawImage leveledit_but ,232,250
   EndIf
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,285,575,29)) Then
      If MouseHit(1) Then
         laden=load_level();Das Level laden
            If laden = 1 Then show_level();ab ins Spiel!
      EndIf
      DrawImage levelload_but_on,232,285
   Else
      DrawImage levelload_but ,232,285
   EndIf
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,320,575,29)) Then
      If MouseHit(1) Then
         resu = janein("Sicher?","Sie möchten zu Windows","zurückkehren?")
         If resu = 1 Then End
      EndIf
      DrawImage exit_but_on,232,320
   Else
      DrawImage exit_but ,232,320
   EndIf   

   SetFont mega
   Color 200,200,0
   Text 283,40, "---> Hauptmenü <---"   

   DrawImage mouse_map,MouseX(),MouseY()
   FlushMouse()
   Flip
Wend   
End Function

;Spielernanimation:
Function animate_player()
   For i = 1 To 2
      If i = 1 Then
         keyy = 2 : blocksp = 2 : von_close = 2 : zu_close = 4 : von_open = 4 : zu_open = 5
      Else
         keyy = 3 : blocksp = 1 : von_close = 6 : zu_close = 7 : von_open = 8 : zu_open = 9
      EndIf         
      If KeyHit(keyy) And  is_animating = 0 And block_zu(blocksp) = 0 Then;a
         AnimateMD2 cube,3,0.02,von_close,zu_close
          If block_zu(i) = 0 Then;Block schließen (wenn geöffnet)
               AnimateMD2 cube,3,0.02,von_close,zu_close
            block_zu(i) = 1
         Else;Block öffnen (wenn geschlossen)
            AnimateMD2 cube,3,0.02,von_open,zu_open
         block_zu(i) = 0
         EndIf
      EndIf
   Next
   is_animating = MD2Animating(cube);animiert er?
End Function

Function spieler_steuerung()
   ; animate_player()

   ;Gasgeben/Bremsen:
   If KeyDown(200) And speed# < max_speed Then
      speed# = speed# + gasspeed
   ElseIf KeyDown(208) And speed# > 0.0 Then
      speed# = speed# - bremsspeed
   EndIf
   If speed# < 0.0 Then speed# = 0.0; wenn speed in den minus-Bereich übergehen will RESET2ZERO!
   MoveEntity cube,0,0,speed#;vorn/zurück
   

   
   ;rechts / links
   If KeyDown(205) And speed_leftright# < max_speed_leftright# Then
      speed_leftright# = speed_leftright# + left_right_faktor#
   ElseIf KeyDown(203) And speed_leftright# > -max_speed_leftright# Then
      speed_leftright# = speed_leftright# - left_right_faktor#
   Else
      If (speed_leftright# > 0) Then
         speed_leftright# = speed_leftright# - left_right_faktor#
         If speed_leftright# <= left_right_faktor# Then speed_leftright# = 0
      ElseIf (speed_leftright# < 0) Then
         speed_leftright# = speed_leftright# + left_right_faktor#
         
         If speed_leftright# >= -left_right_faktor# Then speed_leftright# = 0

      EndIf
      
   EndIf      
   MoveEntity cube,speed_leftright#,0,0;rechts (side)
   
   ;sprung+Gravitaion
   If KeyHit(57) And jumping_now = 0 Then jump = 1
   If (jump <> 0)  Then
      jumping_now = 1
      cube_y# = (Sin(winkel)) * jump_height#;Höhenfaktor

      ;Winkel bis 360 inkrementieren
      If (winkel < 270) Then
         winkel = winkel + jump_speed#;Gewschwindigkeitsfaktor
      Else
         winkel = 0
         jump = 0
         cube_y# = -jump_height#
      EndIf
      MoveEntity cube,0,cube_y#,0
   Else
      MoveEntity cube,0,cube_y#,0;Gravitation
      If EntityCollided(cube,1) <> 0 Then ;soll schnell abgefahren werden (im Falle eines Sprungs)?
         cube_y# = -jump_height#
         jumping_now = 0
      EndIf   
   EndIf      
End Function
 
;Level anzeigen (Hauptschleife)
Function show_level()

set_cam(1)
FlushKeys()
Color 128,128,200;lilaartige Farbe...
SetFont standart_font
While Not KeyHit(1)
   Cls
   ;steuerung:
   If fly_mode = 0 Then spieler_steuerung()

   ;Fly-Modus 1
   If KeyHit(2) Then
      If fly_mode = 0 Then
         fly_mode = 1
      ElseIf fly_mode = 1 Then;wieder an den würfel hängen
            set_cam(camera_mode);1 = 3rd Person Modus
        fly_mode = 0;camera wieder angehangen
      EndIf
   EndIf
   ;3rd Person 2
   If KeyHit(3) Then
      camera_mode = 1
      set_cam(camera_mode)
   EndIf
   ;Ego 3
   If KeyHit(4) Then
      camera_mode = 2
      set_cam(camera_mode)
   EndIf
   ;wireframe 4
   If KeyDown(5) Then
      WireFrame 1
   Else
      WireFrame 0
   EndIf
   
   ;reset
   If (KeyHit(19)) Then
      reset_player()   
   EndIf
   
   ;flymode
   If fly_mode <> 0 Then
      If KeyDown(200) Then MoveEntity camera,0,0,3;nach z+
      If KeyDown(208) Then MoveEntity camera,0,0,-3;nach z-
      If KeyDown(201) Then TurnEntity camera,-1,0,0;pgup
      If KeyDown(209) Then TurnEntity camera,1,0,0;pgdown
      If KeyDown(203) Then TurnEntity camera,0,1,0;links
      If KeyDown(205) Then TurnEntity camera,0,-1,0;rechts
      If KeyDown(199) Then MoveEntity camera,0,.2,0;hoch
      If KeyDown(207) Then MoveEntity camera,0,-.2,0;runtedr
   EndIf
   
   Collisions 2,1,2,3;KOLLISION prüfen
   UpdateWorld;alle Objekte animieren und geg. Koll. prüfen
   RenderWorld;Rendern und in BackBuffer zeichenen
   ;Panels anzeigen---->
   Text 10,10,"Sprunggeschwindigkeit (sinus * 8): " + cube_y
   Text 10,40,"Fallgeschwindikeit: " + cube_y#
   Text 10,70,"Speed#-->" + speed#
   Text 10,100,"checkpoint-->" + Str$(checkpoint)
   Text 10,130,"levelpercent-->" + Str$(level_percent)

   Text 10,750, error_tex$
   Flip;Doublebuffer!

   If reset <> 0 Then
      reset = 0
      EntityType cube,2
   EndIf
Wend
If globalreturn = 0 Then
   Return;back to the hauptmenü!
Else
   start_editor()
EndIf
End Function
start_menu();....STARTEN!!!



Der Leveleditor:Code: [AUSKLAPPEN]

;Alle initits und mousemaps und co in der haupt-Roomship Datei!
;------------------------Wenn allein gestartet!

;Ladezone:
;Ebenen-Bilder Automatisch laden (Die großen Iso-Ansicht Bilder)
Dim obj(300)
For i = 1 To 300 Step 1
   obj(i) = LoadImage("gfx\obj" + Str$(i) + ".png")
Next
;mini-Bilder für select_object()
Dim obj_mini(300)
For i = 1 To 300 Step 1
   obj_mini(i) = LoadImage("gfx\obj" + Str$(i) + ".png")

   If obj_mini(i) <> 0 Then ResizeImage obj_mini(i),50,50
Next
;-----------------------------------------------
Global item_map = LoadImage("gfx\item_map.png")
Global select_map = LoadImage("gfx\select.png")
;Global/Const/Dim:
Global ebene,activated,objektnr$,z_weite$,hintergrund$,beschl#,beschl2#,anz_tiles,gatter_x_pos#,candraw,ontime,tiles_counter
Const max_gatter_speed = 500
Dim raster$(4,10000)
;Include:
Include ".\tmode_lib\narichten.bb"
;----------------------------------------------------------------------------------------------------
Type tile
   Field nummer;für gfx_grafik Array
   Field xpos;die Position wo später das Preview-Bild steht!
   Field ypos
End Type

Function edit_load()
;wenn vorhanden alte teile löschen
For til.tile = Each tile
   If (obj(til\nummer) <> 0) Then Delete til.tile
Next   
;inhalte aus dem array löschen
For yy = 1 To 4
   For xx = 1 To 10000
      raster$(yy,xx) = ""
   Next
Next

;Level-Laden Screen:
resultat = 1
While (1)
   levelname$ = filelist$("An welchem Level weiterarbeiten?",".\lev")
      If levelname$ <> "esc" Then
      filein = OpenFile("lev\"+levelname$);Datei zum schreiben öffnen
      If filein <> 0 Then ;level erfolgreich geladen?
         Exit
      Else
         msg("Error!","Level: " +  levelname$,"konnte nicht","geladen werden")
         resultat = janein("Neu?","Neues Level laden?","")
         If resultat = 0 Then Return 0
      EndIf
   Else
         Return 0;escape
   EndIf
Wend
If resultat = 0 Then Return 0;wenn kein neuer ladeversuch gestartet


filedata$ =ReadString(filein);1. Datensatz enthält Magig Number ("TTL")
If filedata$ = "TTL" Then
   msg("Okay!","Das Level" + levelname$,"wurde erfolgreich","geladen!")
Else
   msg("Error 2!","Die Leveldatei ist","ungültig!","(Magic Number fehlerhaft!)")
   start_editor()
EndIf

;hintergrund laden
filedata$ =ReadString(filein);immer einen datensatz lesen
If (OpenFile(".\hintergrund\"+filedata$) <> 0) Then
   hintergrund$ = filedata$
Else
   error_tex$ = "Hintergrund existiert nicht, Default (sky.jpg) geladen!"
EndIf   

;Levellänge?
filedata$ =ReadString(filein);immer einen datensatz lesen
z_weite = Int(filedata$);levellänge ermitteln

filedata$ =ReadString(filein);leerlauf (Ehemals für ebene gedacht^^)

;laden der einzelnen Leveldaten:
For y = 1 To 4
   For x = 1 To z_weite
      count_dataset = count_dataset + 1 ; (1stes = Hitergrund, ab 2. Datensätze)
      filedata$ =ReadString(filein);immer einen datensatz lesen
      obejektnr$ = filedata$
      raster$(y,x) = obejektnr$;daten ins array legen
      If (obejektnr$) <> "0" Then; wenn kein leerfeld
         ;EIN EIGENSTÄNDIGES TILE CREATEN!                  
         tiles_count = tiles_count + 1
         til.tile = New tile   
         til\nummer = Int(obejektnr$)
         til\xpos# = x_pos
         til\ypos# = y_pos
      Else
         raster$(y,x) = ""
      EndIf
      x_pos = x_pos + 190
   Next
   x_pos = 0
   y_pos = y_pos + 190
Next
y_pos = 0

CloseFile(filein);datei schließen

FlushKeys()
Return 1
End Function

Function edit_neu()
   ;wenn vorhanden alte teile löschen
   For til.tile = Each tile
      If (obj(til\nummer) <> 0) Then Delete til.tile
   Next

   ;inhalte aus dem array löschen
   For yy = 1 To 4
      For xx = 1 To 10000
         raster$(yy,xx) = ""
      Next
   Next
z_weite$ = 0
;NEUES LEVEL
While (1)
   If (Int(z_weite$) >= 20) And (Int(z_weite$) < 10000) Then
      hintergrund$ = filelist$("Hintergrund für Level!",".\hintergrund")
      continue = 1;fortsetzten gestatten!
      Return 5
   Else
      z_weite$ = frage$("Länge des Levels!","Wie lang soll das Level sein?","Auswahl (min. 20):")
   EndIf
   If z_weite$ = "esc" Then
      Return 2;ok zurück
   EndIf
Wend

End Function

Global continue,save
Function start_editor();Returned eventuelles preview
bg_edit = LoadImage("gfx\bg.png")
bg = LoadImage("gfx\bg_edit.png")
levelnew_but = LoadImage("gfx\levelnew_but.png")
levelnew_but_on = LoadImage("gfx\levelnew_but_on.png")
save_but_on = LoadImage("gfx\save_but_on.png")
save_but = LoadImage("gfx\save_but.png")
levelcontinue_but = LoadImage("gfx\levelcontinue_but.png")
levelcontinue_but_on = LoadImage("gfx\levelcontinue_but_on.png")
back_but = LoadImage("gfx\back_but.png")
back_but_on = LoadImage("gfx\back_but_on.png")
   
;MAINMENÜ DES EDITORS->
While (1)
   Cls
   DrawImage bg,0,0;background zeichnen
   ;menü mapping:   
   ;ein neues Level...
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,250,575,29)) Then
      If MouseHit(1) Then
         res = edit_neu();Neues Level (länge, hintergrund eingeben..)!
         If res = 5 Then Exit;ok, ab ins baumenü
      EndIf
      DrawImage levelnew_but_on,232,250
   Else
      DrawImage levelnew_but ,232,250
   
   EndIf
   ;ein level laden
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,285,575,29)) Then
      If MouseHit(1) Then
         result = edit_load();Level für editor laden
         If result <> 0 Then
            continue = 1 ;nun isst der fortsetzen-Button da!
            msg("Ok!","Das Level wurde erfolgreich","geladen!","")
            Exit;AHA, ein level geladen...
         EndIf
      EndIf
   
      DrawImage levelload_but_on,232,285
   Else
      DrawImage levelload_but ,232,285
   EndIf

   ;ein level sichern
   If save <> 0 Then
      If  (RectsOverlap(MouseX(),MouseY(),1,1,232,320,575,29)) Then
         If MouseHit(1) Then
         
If (janein("Speichern?","Möchten Sie","speichern?") = 1) Then
   levelname$ = ".\lev\"+frage$("Speichern unter!","Wie lautet der Levelname?","Filename:")
   save_file(levelname$)
EndIf
      
         
         EndIf
      
         DrawImage save_but_on,232,320
      Else
         DrawImage save_but,232,320
      EndIf
   EndIf

   ;ein level fortsetzen
   If continue <> 0 Then
      If  (RectsOverlap(MouseX(),MouseY(),1,1,232,355,575,29)) Then
         If MouseHit(1) Then
            Exit;und weiter gehts
         EndIf
      
         DrawImage levelcontinue_but_on,232,355
      Else
         DrawImage levelcontinue_but,232,355
      EndIf
   EndIf
   ;zurück zum Hauptmenü
   If  (RectsOverlap(MouseX(),MouseY(),1,1,232,390,575,29)) Then
      If MouseHit(1) Then
         Return
      EndIf
      
      DrawImage back_but_on,232,390
   Else
      DrawImage back_but,232,390
   EndIf    

   If KeyHit(1) Then;zurück ins hauptmenü per escape
      FlushKeys()
      Return
   EndIf
   
   FlushMouse()
   
   SetFont mega
   Color 200,200,0
   Text 283,40, "---> Leveleditor <---"


   DrawImage mouse_map,MouseX(),MouseY();Maus einzeichnen


   Flip
Wend   

;Hauptschleife--------(geladenes Level anzeigen/erweitern, Neues Level)------------->
While Not KeyHit(1)
   DrawImage bg_edit,0,0;background zeichnen
   mouse_mapping();Raster bewegen...
   ;Menü durch Enter:
   If KeyHit(28) Then
      If activated = 0 Then
         activated = 1
         candraw = 0
         FlushMouse()
         objektnr$ = Str$(select_object())
         Delay 250;wegen mousedown von draw_grid( beim zeichnen der peviwe -tiles)
      EndIf
   EndIf
   
   set_pictures();macht die einzelnen preview-items auf der Map Sichtbar (2d-map)
   draw_grid(gatter_x_pos#,4,z_weite,190,190,0,62,60,255)
   
   

   DrawImage mouse_map,MouseX(),MouseY();Maus einzeichnen
   Flip
Wend
;WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND WEND

If (janein("Preview?","Wünschen Sie eine","Vorschau?") = 1) Then
   save_file(".\lev\preview.lev",1) ;preview.lev speichern (,1 = still (keine naricht))   
   save = 1   
   Return 1;PREVIW RETURN (teilt den Hauptprogramm mit das es ein preview zu laden hat!"   
EndIf   

save = 1;du darfst nun den speichern-Button freigeben!
start_editor(); rekursion!!
End Function

;----------------------------------------------------------------------------------------------------
Function save_file(levelname$,save_still = 0)
   fileout = WriteFile(levelname$);Datei zum schreiben anlegen (oder überschreiben) und den Stream öffnen

If save_still = 0 Then
   If (fileout = 0) Then
      msg("Error!","Die Datei " + levelname$,"konnte nicht","gespeichert werden!")
      Return
   Else
      msg("Okay!","Die Datei " + levelname$,"wurde erfolgreich","Gespeichert!")
   EndIf
EndIf
   
   WriteString(fileout,"TTL");Magic Number (Dateiidentifikator)
   WriteString(fileout,hintergrund$);bg speichern
   WriteString(fileout,z_weite$);Levellänge speichern
   WriteString(fileout,Str$(ebene));Ebene speichern


   ;array auslesen, für speichern
   For y = 1 To 4
         For x = 1 To z_weite
            ;Zeichnung darstellen->
            If raster$(y,x) <> "" Then;soll ein Objekt rein?
                  WriteString(fileout,raster$(y,x));werte hineinschreiben
            Else
               WriteString(fileout,"0");werte hineinschreiben
            EndIf
         x_pos# = x_pos# + 189;ein x feld nach vorn rücken
      Next
      x_pos# = 0;zurücksetzten, x von vorn beginnen
      y_pos# = y_pos# + 189;eine spalte tiefer
   Next
   y_pos# = 0
   
   CloseFile(fileout);datei schließen
End Function

;----------------------------------------------------------------------------------------------------
Function draw_grid(xposition,anz_zeilen,anz_spalten,breite,hohe,fill_mode,color_r,color_g,color_b)
   Color color_r,color_g,color_b
   For y = 1 To anz_zeilen
      For x = 1 To anz_spalten
         If RectsOverlap(MouseX(),MouseY(),.1,.1,x_pos#+xposition,y_pos,breite,hohe) Then
            fill_mode = 1
            Color 205,207,112;gelb
            If MouseHit(1) Or candraw = 1 Then
               ;wenn das Raster leer ist und dauerhaftes zeichnen erlaubt und ein Objekt (select_object) ausgewählt ist dann..   
               If MouseDown(1) And raster$(y,x) = "" And candraw = 1 And obj(Int(objektnr$)) <> 0 Then
                  raster$(y,x) = objektnr$;Objektnummer (für Dateispeichern) speichern!
               
                  ;EIN EIGENSTÄNDIGES TILE CREATEN!                  
                  tiles_count = tiles_count + 1
                  til.tile = New tile   
                  til\nummer = Int(objektnr$)
                  til\xpos# = x_pos
                  til\ypos# = y_pos
               EndIf
            EndIf
         
               
            If MouseDown(2) Then ;Objekt wieder löschen
               Color 0,0,255;blau
               raster$(y,x) = ""
               
               For til.tile = Each tile;jedes teil durchlaufen
                  If til\xpos = x_pos And til\ypos = y_pos Then ;wenn x und y position stimmen
                     Delete til ;lösche das angegebene Teil
                  EndIf
                  
               Next
            EndIf
            
         
            Color 0,0,128
            ;ein Panel...
            Text 10,50 ,"candraw->" + candraw
            Text 10,70 ,"Y->" + y
            Text 10,90 ,"X->" + x
            Text 10,110,"raster(y,x) Inhalt-> " + raster$(y,x)
            Text 10,130,"Anzahl der Teile-> " +   Str$(anz_tiles)
            Color 205,207,112;gelb

            anz_tiles = 0
         Else
            Color color_r,color_g,color_b

           fill_mode = 0
         EndIf
      
               
         Rect x_pos#+xposition,y_pos,breite,hohe,fill_mode
         x_pos# = x_pos# + breite
   
   

      Next
      x_pos# = 0
      y_pos = y_pos + hohe
   Next
   y_pos = 0


Return
End Function

;----------------------------------------------------------------------------------------------------
Global teilecounter
Function select_object()
   
   While Not KeyHit(1)
      Cls
      
      DrawImage item_map,0,0
      For y = 1 To 15
         For x = 1 To 20
            If RectsOverlap(x_pos,y_pos,50,50,MouseX(),MouseY(),1,1) Then
               For i = 1 To 15 Step 1
                  If y = i Then nummer = x + teilecounter
                  teilecounter = teilecounter + 20;20 teile pro Zeile
               Next
               teilecounter = 0
               DrawImage select_map,x_pos+2,y_pos+2
            
               If MouseHit(1) Or KeyHit(28) Then
                  activated = 0;darf menü wieder öffnen!
                  candraw = 1
                  FlushMouse()
                  Return nummer;Objekt ausgewählt, ID zurückgeben!!!
               EndIf
            EndIf

            ;rechteck + minibilder einzeichnen:            
            Color 0,0,0
            Rect x_pos,y_pos,50,50,0
            
            mini_count = mini_count + 1
            If obj_mini(mini_count) <> 0 Then DrawImage obj_mini(mini_count),x_pos+1,y_pos-1
            x_pos = x_pos + 50
         Next
         x_pos = 0
         y_pos = y_pos + 50
      Next
      y_pos = 0
      mini_count = 0   
      DrawImage mouse_map,MouseX(),MouseY()
         
      Flip
   Wend
   FlushMouse()
   candraw = 0
   ontime = 0
   activated = 0;darf menü wieder öffnen!   
End Function

Function mouse_mapping()
   ;bewegen der map (wenn ans ende des bildschirms)
   If MouseX() > 1020 And MouseX() > 20 Then
      If beschl# < max_gatter_speed Then  beschl# = beschl# + .3
      gatter_x_pos# = gatter_x_pos# - beschl#
   Else
      If beschl# > 0.0 Then  beschl# = beschl# - .3
      gatter_x_pos# = gatter_x_pos# - beschl#
   EndIf
   
   ;gegen
   If MouseX() < 20 And MouseX() < 1020 And gatter_x_pos# < 0 Then
         If beschl2# < max_gatter_speed Then  beschl2# = beschl2# + .3
      gatter_x_pos# = gatter_x_pos# + beschl2#
   Else
      If beschl2# > 0.0 Then  beschl2# = beschl2# - .3
      If gatter_x_pos# < 0.0 Then gatter_x_pos# = gatter_x_pos# + beschl2#
   EndIf    

   If beschl# < 0.0 Then beschl# = 0.0
   If beschl2# < 0.0 Then beschl2# = 0.0
   If gatter_x_pos# > 0.0 Then gatter_x_pos# = 0.0
End Function

Function set_pictures()
   For til.tile = Each tile
      anz_tiles = anz_tiles + 1
      
      If (obj(til\nummer) <> 0) Then DrawImage obj(til\nummer),til\xpos+gatter_x_pos#,til\ypos
   Next   
End Function

Delay 500
FlushMouse
FlushKeys

;start_editor()


Ausgabe der Narichten/Dateiwahl Fenster:
Code: [AUSKLAPPEN]
;Schriftarten
;Font Loading-->
Global titel_schrift = LoadFont("Times New Roman",18,1)
Global massage_schrift = LoadFont("Comic Sans",25)
Global gros_schrift = LoadFont("Comic Sans",28)

;Einfache Naricht ausgeben (Modales Fenster, mit Ok-Button)
Global frage_map = LoadImage(".\tmode_lib\frage.png")
Global ok = LoadImage(".\tmode_lib\ok.png")
Global janein_map = LoadImage(".\tmode_lib\janein.png")
Global filelist_map = LoadImage(".\tmode_lib\filelist.png")

Function msg(title$,msg1$,msg2$,msg3$,x_pos = 317,y_pos = 280)
   While not keyhit(1)
      Cls
      ;Zeichnen:
      DrawImage bg,0,0
      DrawImage frage_map,x_pos,y_pos
      DrawImage ok,143+x_pos,145+y_pos
         ;Titel ausgeben:
      SetFont titel_schrift
         Color 100,100,200
         Text 11+x_pos,1+y_pos, title$
         ;Meldung ausgeben:
         SetFont gros_schrift
         Color 0,0,0
         Text 18+x_pos,40+y_pos,msg1$
      Text  18+x_pos,65+y_pos, msg2$
      Text  18+x_pos,90+y_pos, msg3$

      ;OKAY EVENT-->
         If  RectsOverlap(MouseX(), MouseY(), 1,1, 143+x_pos,146+y_pos,345,36) Then
         If MouseHit(1) Then
            FlushMouse()
            Return
         EndIf
      Else
         FlushMouse()
      EndIf
      ;OKay-Event durch Enter   
      If KeyHit(28) Then
         Return
      EndIf
      ;Escape:
      If KeyHit(1) Then Return
      ;Mouse-->
      DrawImage mouse_map,MouseX(),MouseY()
      Flip
   Wend
End Function

;Frage stellen, welche per Texteingabe zu beantworten ist (Gibt Antwort (wenn Zahl) zurück!)
Function frage$(titel$,frage$,auswahl$,x_pos = 317,y_pos = 280)
   FlushKeys
      
   ;Sound abspielen
   chn = PlaySound(warnung_snd)
   temp = MilliSecs()
   If MilliSecs() - temp > 3000 Then StopChannel(chn)
 
   While (1)
      Cls
      ;zeichnen:
      DrawImage bg,0,0
      DrawImage frage_map,x_pos,y_pos
      DrawImage ok,143+x_pos,145+y_pos
      SetFont titel_schrift
      ;Titel
      Color 100,100,200
       Text 11+312,1+y_pos, titel$
       ;Frage ausgeben
       SetFont gros_schrift
       Color 0,0,0
       Text 18+x_pos,40+y_pos,frage$
      
      ;Backspace + Entf-->
      If KeyDown(14) And count > 0 Then
         Delay(100)
         count = count - 1
         txt$ = LSet$(txt$,count)
      EndIf   
      
      ;Tasteneingaben entgegennehmen   
      value = GetKey()
      If value <> 0 And value <> 8 And value <> 13  Then ;ungeich BS und CR
         txt$ = txt$ + Chr$(value)
         count = count + 1
         value = 0
      EndIf

      Text  18+x_pos,90+y_pos, auswahl$ + ": " + txt$   
      ;Okay-EVENT-->
      If  RectsOverlap(MouseX(), MouseY(), 1,1, 143+x_pos,146+y_pos,345,36) Then
         If MouseHit(1) Then
            Return txt$;Wenn zahl eingegeben, gebe Sie zurück
         EndIf
      EndIf
      ;OKay-Event durch Enter   
      If KeyHit(28) Then
         Return txt$;Wenn zahl eingegeben, gebe Sie zurück   
      EndIf
      ;Escape:
      If KeyHit(1) Then Return "esc"
      ;Maus:
      DrawImage mouse_map,MouseX(),MouseY()
      FlushMouse()
      Flip
   Wend
End Function

Function janein(titel$,frage$,frage2$,x_pos = 317,y_pos = 280)
   ;Frage stellen, welche mit Ja/Nein zu beantworten ist (gibt 1=ja/0=nein zurück)
   While (1)
      Cls
      ;Zeichnen:
      DrawImage bg,0,0
      DrawImage janein_map,x_pos,y_pos
      ;Titel:
      SetFont titel_schrift
      Color 100,100,200
      Text 11+x_pos,1+y_pos, titel$
      ;Meldung
      SetFont massage_schrift
      Color 0,0,0
      Text 18+x_pos,40+y_pos,frage$
      Text 18+x_pos,90+y_pos,frage2$
      If  RectsOverlap(MouseX(), MouseY(), 1,1, 63+x_pos, 146+y_pos, 117,36) Then
         If MouseHit(1)  Then
            FlushMouse()
            Return 1;Ja geklickt
         EndIf
      ElseIf  RectsOverlap(MouseX(), MouseY(), 1,1, 230+x_pos, 146+y_pos, 117,36) Then
         If MouseHit(1) Then
            FlushMouse()
            Return 0;Nein geklickt
         EndIf
      Else
         FlushMouse()      
      EndIf    
      ;Ja-Event durch Enter/j
      If KeyHit(28) Or KeyHit(36) Then
         FlushKeys()
         Return 1
      EndIf
      ;nein durch n
      If KeyHit(49) Then
         FlushKeys()
         Return 0
      EndIf
      
      ;Escape:
      If KeyHit(1) Then Exit
      ;Maus:      
      DrawImage mouse_map,MouseX(),MouseY()
      Flip
   Wend
End Function

;Dateiliste anzeigen
dim file_list$(500) ; max 500 Dateien im Ordner
Function filelist$(titel$,folder$,x_pos = 317,y_pos = 280)
For cle = 0 To 500
file_list$(cle) = ""
Next

;AUSLESEN:
root=ReadDir(folder$);root wählen (absoluter oder relativer Ordner)
While (1)
   file$=NextFile$(root);nächste Datei einlesen
   If file$="" Then Exit;bei letzter Datei aufhören
   If FileType(file$) <> 2 Then;keine Ordner anzeigen!
      i = i + 1   
      file_list$(i) = file$;Gültige Datei in file..1..2..3..4..5....speichern   
      anz_files# = anz_files# + 1;gesamtanzahl
   EndIf
Wend
i = 0

side_nr = 1 ;beginne bei seite 1
side_anz = Ceil#(anz_files# / 9) ;anzahl der seiten
While(1)
   Cls
   ;Zeichnen:
   DrawImage bg,0,0
   DrawImage filelist_map,x_pos,y_pos   
   ;Titel:
   SetFont titel_schrift
   Color 200,200,100
   Text 11+x_pos,1+y_pos, titel$
   
   Color 255,0,0;Dateien sollen rot sein!
   
   ;komplettes mapping
   x_offset = 427
   y_offset = 328
   ;seite vor
   If RectsOverlap(MouseX(),MouseY(),1,1,591,501,19,13) Then
      If MouseHit(1) Then
         FlushMouse()
         side_nr = side_nr + 1

         If side_nr > side_anz Then  side_nr = side_anz
      EndIf
   ;seite zurück
   ElseIf RectsOverlap(MouseX(),MouseY(),1,1,591,329,19,13) Then
       If MouseHit(1) Then
         FlushMouse()
         side_nr = side_nr - 1
         If side_nr < 1 Then   side_nr = 1
      EndIf
   ;abbrechen   
   ElseIf (RectsOverlap(MouseX(),MouseY(),1,1,325,324,92,39)) Then
      If MouseHit(1)
         FlushMouse()
         Return "esc"
      EndIf      
   ;wenn nicht im bereich wo die dateien angezeigt werden   
   ElseIf Not (RectsOverlap(MouseX(),MouseY(),1,1,427,324,164,193)) Then
      FlushMouse()
   EndIf

   ;dateimapping
   For a = 1 To side_anz
      num_to = num_to + 9
      Select side_nr;welche seite
         Case a
            For file_nr = num_to-8 To num_to;seite 1 geht von 1-9 / 10-19...usw.
               file_y = file_y + 21;immer 21 px abstand zur n. datei anzeigen
               
               ;dateiname zurechtschneiden und anzeigen
               If (Len(file_list$(file_nr)) > 21) Then;wenn text zu lang
                  text_of_file$ = LSet$(file_list$(file_nr),21)
               Else
                  text_of_file$ = file_list$(file_nr)
               EndIf
   
               Text 112+x_pos,28+y_pos+file_y,text_of_file$   
            
               ;prüfen welche der 9 Files angeklickt wurde!
               If (file_list$(file_nr)) <> "" And RectsOverlap(MouseX(),MouseY(),1,1,x_offset,y_offset,161,22) Then
                  Rect x_offset,y_offset,163,22,0;umrandung zeichenen
                  If MouseHit(1) Then
                     FlushMouse()
                     file_choose = file_nr;ok, dateiname steht fest
                     Exit
                  EndIf
               EndIf
               y_offset = y_offset + 21      
           Next
           file_y = 0
      End Select      
   Next
   num_to = 0

   ;auswahl speichern, bzw. Zurückgeben-->
   If (file_choose <> 0) Then;ist eine datei gewählt
      For ii = 1 To anz_files
         Select file_choose
            Case ii;eintrag finden
                die_datei$ = file_list$(ii)
         End Select
      Next
   EndIf   
   
   ;öffnen
   If (die_datei$ <> "") Then
      result = janein("Sicher?","Möchten Sie die Datei",die_datei$+" öffnen?")
         If result = 1 Then
            Return die_datei$
         ElseIf result = 0 Then
            FlushMouse()
            die_datei$ = ""   
            file_choose = 0
         EndIf
   EndIf

   ;Escape:
   If KeyHit(1) Then Return "esc"
   
   ;Maus:      
   DrawImage mouse_map,MouseX(),MouseY()
   
   Flip
Wend    
 
CloseDir Verz
End Function

Rongo Matane

Betreff: Re: Antwort

BeitragDi, Mai 22, 2007 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
tmode00 hat Folgendes geschrieben:
ich habe nicht einfachsten Programmieraufwand betrieben!!!!!!


ich glaub du fühlst dich zu unrecht angegriffen. Ich denke Hectic wollte nur sagen wies am wenigsten Aufwand is, sowas zu programmieren. Und das is doch immer das Ziel - wenig Aufwand, viel erreichen, oder? Also brauchst dich nicht gleich angegriffen zu fühlen, bloß weil jemand sagt, dass diese oder jene Variante wenig Programmieraufwand beudeutet.
 

tmode00

Betreff: ..

BeitragDi, Mai 22, 2007 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, entschuldigung, ja?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Mai 22, 2007 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wusste garnicht, dass man hier ein Kilometer lange Beiträge schreiben kann. Dachte, es gäbe ein Begrenzung, aber jetzt weiß ich es ja besser. Wink Deine Argumentation schien mir eher agressiv, daher habe auch ich mich nicht grad sehr fein ausgedrückt. Friede, Freude, Eierkuchen habe ich auch jetzt erst verstanden, was dein Problem ist. Und ja, ich habe mir davor dein Beitrag auch durchgelesen.

Um das Problem zu lösen, würde ich es entweder mit

ql:LinePick die an den Ecken des Spielers befestigt sind und mit geringem Abstand nach unten zeigen. Wenn Kollision, dann nach oben beschleunigen, ansonsten fallen lassen. Verschiedene Längen der LinePicks könnten dann dasn Abstoßverhalten des Gleiters beeinflussen. Oder

ql:MeshesIntersect eine Kollisions abrufen, was von der Geschwindigkeit bei nur einem Objekt kein Problem sein sollte aber eventuell könnte, wenn das abzufragende Mesh sehr groß ist (habs nicht ausprobiert).
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

tmode00

Betreff: ..

BeitragDi, Mai 29, 2007 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen dank,

ich werde das mit LinePick und/oder MeshIntersect probieren, entschuldigung nochmal für mein Kleinkindverhalten, manchmal fühle ich mich halt wirklich zu unrecht behandelt und wills dann allen beweisen, ich weis das das falsch ist.

Also ich werd mal an dem Spiel weiterarbeiten...

Danke!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group