Kollisionsproblem, bitte um Hilfe^^
Übersicht BlitzBasic Blitz3D
tmode00Betreff: Kollisionsproblem, bitte um Hilfe^^ |
So, Mai 20, 2007 8:41 Antworten mit Zitat |
|
---|---|---|
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): 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! ------> 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 |
So, Mai 20, 2007 9:25 Antworten mit Zitat |
|
---|---|---|
Collisions 2,1,3,3...
letzte 3 bedeutet "nur raufsliden" |
||
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. |
tmode00Betreff: Oh Oh Oh.. |
So, Mai 20, 2007 9:46 Antworten mit Zitat |
|
---|---|---|
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! |
||
tmode00Betreff: antwort? |
So, Mai 20, 2007 16:34 Antworten mit Zitat |
|
---|---|---|
bekomme ich noch ne Antwort, es funktioniert nämlich immer noch nicht! | ||
While (1) : Wend |
tft |
Mo, Mai 21, 2007 12:38 Antworten mit Zitat |
|
---|---|---|
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. Fiel spass |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
D2006Administrator |
Mo, Mai 21, 2007 12:49 Antworten mit Zitat |
|
---|---|---|
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 |
tmode00Betreff: kleinlich... |
Di, Mai 22, 2007 11:12 Antworten mit Zitat |
|
---|---|---|
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.... |
||
hecticSieger des IS Talentwettbewerb 2006 |
Di, Mai 22, 2007 12:45 Antworten mit Zitat |
|
---|---|---|
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 |
tmode00Betreff: Antwort |
Di, Mai 22, 2007 16:24 Antworten mit Zitat |
|
---|---|---|
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 MataneBetreff: Re: Antwort |
Di, Mai 22, 2007 16:48 Antworten mit Zitat |
|
---|---|---|
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. |
||
tmode00Betreff: .. |
Di, Mai 22, 2007 16:56 Antworten mit Zitat |
|
---|---|---|
ok, entschuldigung, ja? | ||
hecticSieger des IS Talentwettbewerb 2006 |
Di, Mai 22, 2007 19:46 Antworten mit Zitat |
|
---|---|---|
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. 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 |
tmode00Betreff: .. |
Di, Mai 29, 2007 9:02 Antworten mit Zitat |
|
---|---|---|
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! |
||
Übersicht BlitzBasic Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group