GRAPHICS 640,480,16,2 Const SM_CXSCREEN = 0 Const SM_CYSCREEN = 1 ;------------------------------------------------------------------------------ ; Globale Variablen ;------------------------------------------------------------------------------ Global Autor$ = "jk-spiele präsentiert :" Global Version$ = "Version: 1.0" Global DeskX = apiGetSystemMetrics(SM_CXSCREEN) Global DeskY = +apiGetSystemMetrics(SM_CYSCREEN) Global MaxX = DeskX Global MaxY = DeskY Global FT = +apiGetDeviceCaps(apiGetDC(0), 12) Global VB = 1 ; Vollbild = 1 ; Fenster = 2 Global MausX, MausY ; xPosition und yPosition der Maus Global x, y, mx, my ; xPos und yPos umgerechnet zur weiteren Verwendung Global vorhanden ; Merker ob Eintrag bereits in Liste ( 1= ja, 0 = nein) Global LZ ; Zähler für Anzahl der Listeneinträge Global Score, Anzahl ; Highscore und verbleibende Möglichkeiten Global StartX,StartY ; Felerd für Text- und Bubble-Start-Position Global Level=6 ; Schwierigkeitsgrad = Anzahl Bubbles Global Enter, Esc ; für Menüsteuerung Global Option ; Hilfsschalter Optionenmenü Global GR=36 ; Größe der Bubbles in Pixel Global BGR$ Global Pfad$ = "Marmor/" Global F1, Ende Global SpMaxX, SpMaxY, SpFT, SpVB, Sp Global MenueWahl = 1 Global antwort$, backtime = MilliSecs(),ccolor Global Name$ Global TextScore$ = "Score: " Global TextRest$ = " Verbleibende Möglichkeiten:" Global EndeText1$ = "Keine Möglichkeiten mehr vorhanden §" Global EndeText2$ = "Dein Score: " Global EndeText3$ = " Das reicht leider nicht zum eintragen §" Global laut#= 0.3 , channel Global SoundBlub = LoadSound("Sounds/bub.wav") Global SoundBravo = LoadSound("Sounds/bravo.wav") Global SoundOhoh = LoadSound("Sounds/ohoh.wav") Global SoundBlubR = LoadSound("Sounds/bub_rev.wav") global win = 0, Start GLOBAL LD , MM , SPP=1 GLOBAL LDMax = 68 ; wieviel Grafiken er laden soll insgesammt Global Hilfe = 0 Global MerkUndo = 0 Global TextFile, TextImg, FontBlau, FontSchwarz Dim TextAscii(255), TextChar(255) ;------------------------------------------------------------------------------ ; Desktopauflösung abfragen und einstellen ;------------------------------------------------------------------------------ Config() ;MaxX= 1280 MaxY= 1024 VB = 2 ;test !!!!!!!!!!!!!!! Endgraphics Graphics MaxX,MaxY,FT,VB SETBUFFER FRONTBUFFER() ;------------------------------------------------------------------------------ ; Grafiken definieren ;------------------------------------------------------------------------------ Global Hintergrund ; Hintergrundgrafik im Spiel Global Hintergrund2 ; Hintergrundgrafik Highscore Global HGHS ; Hintergrundgrafik der Highscoretabelle Global HS ; Logo Highscore Global ROL ; Eckgrafik im Spiel oben links Global ROR ; Eckgrafik im Spiel oben rechts Global RUL ; Eckgrafik im Spiel unten links Global RUR ; Eckgrafik im Spiel unten rechts Global ROLG ; Eckgrafik Highscore oben links Global RORG ; Eckgrafik Highscore oben rechts Global RULG ; Eckgrafik Highscore unten links Global RURG ; Eckgrafik Highscore unten rechts GLOBAL Rahmen, Fill, Logo ; Grafiken für Ladebalken Global Helper ; Grafik für Help-Funktion Global SScore ; Grafik für Savescore ;------------------------------------------------------------------------------ ; Bubble-Grafiken definieren ;------------------------------------------------------------------------------ Dim bubble(8) ;bubble(0) = frei --> Farbe 0 heißt "nicht mehr da" ;------------------------------------------------------------------------------ ; Cursor und Schriftart ;------------------------------------------------------------------------------ Global cursor global Font = LoadFont ("Arial",28,1,0,0) SetFont Font ;------------------------------------------------------------------------------ ; Menüfelder ;------------------------------------------------------------------------------ Global MenueFill, button Global Escape, EscapeFill Global Weiter Global OKI, EscHS, EscSp Global Mlaut, MlautF Global LautLinks, LautRechts Global Help, Undo, HelpFill Global Main[5] ; MainMenü Global MainHS, MainSP ; MainMenü Feld 2 Global Options[2] ; Optionen Global Levels[2] ; LevelOptions Global Grafik[2] ; GrafikOptions Global Aufloesung[8] ; Auflösung Global BubGr[2] ; Bubblegröße Global BubFarbe[2] ; BubbleFarbe Global Sounds[1] ; SoundOptions ;------------------------------------------------------------------------------ ; Bubble-Felder definieren ;------------------------------------------------------------------------------ Dim xPos(19,14), yPos(19,14), Farbe(19,14) Dim UndoFarbe(19,14) ;------------------------------------------------------------------------------ ; TopTen-Felder definieren ;------------------------------------------------------------------------------ Dim TopPunkte(11), TopName$(11) ;------------------------------------------------------------------------------ ; Liste der zu prüfenden Bubbles definieren ;------------------------------------------------------------------------------ Type Liste Field xPos Field yPos Field ok Field Anz End Type Global FPS,FPST,FPSC ;****************************************************************************** ; S T A R T ;****************************************************************************** SetBuffer BackBuffer() .start Cls Hidepointer GrafikLaden() Menue() ;****************************************************************************** ; E N D E ;****************************************************************************** ;****************************************************************************** ; F U N K T I O N E N ;****************************************************************************** ;------------------------------------------------------------------------------ ; Steuerung ;------------------------------------------------------------------------------ Function Steuerung() DeleteBubbles() Startspiel() Spiel() End Function ;------------------------------------------------------------------------------ ; Spiel ;------------------------------------------------------------------------------ Function Spiel() .main Enter = 0 Esc = 0 Ende = 0 ;TEST = 1 !!!!!!!!!!!!!!!!!!!!!!!!!! MenueWahl = 2 While Esc = 0 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) Anzahl = RestBubbles() KH1 = KeyHit(1) ; Esc If KH1 Or (ColliEsc And MH) Then Esc = 1 KH59 = KeyHit(59) ; F1 If KH59 > 0 and Score < TopPunkte(10) Then F1 = 1 KH65 = KeyHit(65) ; F7 If KH65 Or (ColliHelp And MH) Then If Hilfe = 0 Then Hilfe = 1 Else Hilfe = 0 End If End If If ColliUndo And MH Then Undoo() If MH > 0 And ColliUndo = False And ColliEsc = False And ColliHelp = False Then FlushMouse SaveUndo() mx = (MausX-StartX) /GR ; MausX umrechnen in xPos my = (MausY-StartY) /GR ; MausY umrechnen in yPos LZ = 0 ClearBubble() SchiebRunter() SchiebLinks() End If BildNeu() If Anzahl = 0 Then Ende = 1 Spielende() End If If Ende = 1 And F1 = 1 Then SaveScore() ViewScore() End If If ColliEsc Then DrawImage EscapeFill,20,MaxY/2-40 DrawImage EscSp,20,MaxY/2-40 colliEsc = Imagerectoverlap (EscSp,20,MaxY/2-40,MausX,MausY,1,1) If Ende = 0 Then If ColliHelp Then DrawImage HelpFill,MaxX/2-160,StartY+GR*15+30 If ColliUndo Then DrawImage HelpFill,MaxX/2+40,StartY+GR*15+30 DrawImage Help,MaxX/2-160,StartY+GR*15+30 DrawImage Undo,MaxX/2+40,StartY+GR*15+30 colliHelp = Imagerectoverlap (Help,MaxX/2-160,StartY+GR*15+30,MausX,MausY,1,1) colliUndo = Imagerectoverlap (Undo,MaxX/2+40,StartY+GR*15+30,MausX,MausY,1,1) End If DrawImage cursor,MausX,MausY FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If Flip Wend Menue() End Function ;------------------------------------------------------------------------------ ; Menü ;------------------------------------------------------------------------------ Function Menue() If MenueWahl = 1 Then Auswahl = MainMenue() Select Auswahl Case 1 Steuerung() Case 2 ViewScore() Case 3 Laden() Case 4 Optionen() Case 5 Beenden() End Select End If If MenueWahl = 2 Then Auswahl = EscMenue() Select Auswahl Case 0 Spiel() Case 1 Steuerung() Case 2 Speichern() Case 3 Laden() Case 4 Optionen() End Select End If End Function ;------------------------------------------------------------------------------ ; Main-Menü ;------------------------------------------------------------------------------ Function MainMenue() Flushkeys FlushMouse Main[2]= MainHS Auswahl = 1 Enter = 0 Esc = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls drawImage Logo, MaxX/2,MaxY/7 If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 5 Then Auswahl = 1 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 1 Then Auswahl = 5 If KH1 Then Frage() If ColliWeiter Then DrawImage EscapeFill,MaxX-150,MaxY-150 If mh Then Menuewahl = 2 : Menue() End If For A = 1 To 5 Colli = Imagerectoverlap (Main[A],MaxX/2-button,MaxY/4+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/4+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/4+A*80 End If drawimage Main[A],MaxX/2-button,MaxY/4+A*80 Next If Start = 1 Then DrawImage Weiter,MaxX-150,MaxY-150 colliWeiter = Imagerectoverlap (Weiter,MaxX-150,MaxY-150,MausX,MausY,1,1) End If DrawImage cursor,MausX,MausY ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- MyText MaxX/2,MaxY-40,Version$,1 Flip Wend FlushKeys FlushMouse Esc = 0 Enter = 0 Return Auswahl End Function ;------------------------------------------------------------------------------ ; Startspiel ;------------------------------------------------------------------------------ Function Startspiel() win = 0 Start = 1 Hilfe = 0 MerkUndo = 0 SeedRnd MilliSecs() ; Franzi-Mode ; entfernt Cls For xx = 0 to 19 for yy = 0 to 14 xPos(xx,yy) = xx*GR+StartX yPos(xx,yy) = yy*GR+StartY Farbe(xx,yy) = Rand(1,Level) DrawImage bubble(Farbe(xx,yy)), xPos(xx,yy), yPos(xx,yy) DrawImage cursor, MausX, MausY Next Next SaveUndo() flip Menuewahl = 2 End Function ;------------------------------------------------------------------------------ ; Undo speichern ;------------------------------------------------------------------------------ Function SaveUndo() For xx = 0 to 19 for yy = 0 to 14 UndoFarbe(xx,yy) = Farbe(xx,yy) Next Next End Function ;------------------------------------------------------------------------------ ; verbleibende Möglichkeiten berechnen ;------------------------------------------------------------------------------ Function RestBubbles() Delete Each Liste Anzahl = 0 LZ = 0 For xx = 0 to 19 For yy = 0 to 14 X = xx Y = yy LZ = 0 Anzahl = Anzahl + 1 If Farbe(x,y) > 0 Then For i = 0 To LZ Links() Rechts() Oben() Unten() If LZ = 1 Then Liste.Liste = New Liste Liste\xPos = x Liste\yPos = y Liste\ok = 1 Liste\Anz = Anzahl End If Liste.Liste = first Liste For Liste.Liste = Each Liste If Liste\xPos = x And Liste\yPos = y Then Liste\ok = 1 ;geprüften Eintrag markieren End If Next NextBubble() Next End if If LZ = 0 Then Anzahl = Anzahl - 1 End If Next Next Return Anzahl End Function ;------------------------------------------------------------------------------ ; Liste prüfen, ob Eintrag bereits vorhanden ;------------------------------------------------------------------------------ Function ListePruefen() Liste.Liste = First Liste For Liste.Liste = Each Liste If Liste\xPos = x And Liste\yPos = y Then vorhanden = 1 End If Next End Function ;------------------------------------------------------------------------------ ; Eintragen ;------------------------------------------------------------------------------ Function Eintragen() Liste.Liste = New Liste Liste\xPos = x Liste\yPos = y Liste\ok = 0 Liste\Anz = Anzahl LZ = LZ + 1 End Function ;------------------------------------------------------------------------------ ; nächsten Eintrag auswählen ;------------------------------------------------------------------------------ Function NextBubble() ;delay 2000 Liste.Liste = First Liste For Liste.Liste = Each Liste If Liste\ok = 0 Then x = Liste\xPos y = Liste\yPos End If Next End Function ;------------------------------------------------------------------------------ ; nach links prüfen ;------------------------------------------------------------------------------ Function Links() x = x - 1 If x => 0 And x < 19 And y => 0 And y <= 14 If Farbe(x,y) = Farbe(x+1,y) Then ListePruefen() If vorhanden = 0 Then Eintragen() Else vorhanden = 0 End If End If End If x = x + 1 End Function ;------------------------------------------------------------------------------ ; nach rechts prüfen ;------------------------------------------------------------------------------ Function Rechts() x = x + 1 If x > 0 And x <= 19 And y => 0 And y <= 14 If Farbe(x,y) = Farbe(x-1,y) Then ListePruefen() If vorhanden = 0 Then Eintragen() Else vorhanden = 0 End If End If End If x = x - 1 End Function ;------------------------------------------------------------------------------ ; nach unten prüfen ;------------------------------------------------------------------------------ Function Unten() y = y + 1 If y > 0 And y <= 14 And x => 0 And x <= 19 If Farbe(x,y) = Farbe(x,y-1) Then ListePruefen() If vorhanden = 0 Then Eintragen() Else vorhanden = 0 End If End If End If y = y - 1 End Function ;------------------------------------------------------------------------------ ; nach oben prüfen ;------------------------------------------------------------------------------ Function Oben() y = y - 1 If y => 0 And y < 14 And x => 0 And x <= 19 If Farbe(x,y) = Farbe(x,y+1) Then ListePruefen() If vorhanden = 0 Then Eintragen() Else vorhanden = 0 End If End If End If y = y + 1 End Function ;------------------------------------------------------------------------------ ; Listeneinträge für Löschung übernehmen ;------------------------------------------------------------------------------ Function ClearBubble() bub = 0 Liste.Liste = First Liste For Liste.Liste = Each Liste If Liste\xPos = mx And Liste\yPos = my Then Nummer = Liste\Anz End if Next Liste.Liste = First Liste For Liste.Liste = Each Liste If Liste\Anz = Nummer Then xx = Liste\xPos yy = Liste\yPos Farbe(xx,yy) = 0 bub = 1 End If Next If bub = 1 Then channel = PlaySound (SoundBlub) channelVolume channel,laut# MerkUndo = 1 End if bub = 0 End Function ;------------------------------------------------------------------------------ ;nach unten verschieben ;------------------------------------------------------------------------------ Function SchiebRunter() For j = 0 to 14 For xx = 0 to 19 yy = 14 While yy <> 0 If Farbe(xx,yy) = 0 then i = yy While i <> 0 Farbe(xx,i) = Farbe(xx,i-1) Farbe(xx,i-1) = 0 i = i - 1 Wend End if yy = yy - 1 Wend Next Next End Function ;------------------------------------------------------------------------------ ; nach links verschieben ;------------------------------------------------------------------------------ Function SchiebLinks() For i = 0 to 19 p = 0 For xx = 0 To 18 For yy = 0 To 14 If Farbe(xx,yy) = 0 Then p = p + 1 End If Next If p = 15 Then For yy = 0 To 14 Farbe(xx,yy) = Farbe(xx+1,yy) Farbe(xx+1,yy) = 0 Next End If p = 0 Next Next End Function ;------------------------------------------------------------------------------ ; Funktion Undo ;------------------------------------------------------------------------------ Function Undoo() If MerkUndo = 1 Then For xx = 0 to 19 for yy = 0 to 14 Farbe(xx,yy) = UndoFarbe(xx,yy) Next Next channel = PlaySound (SoundBlubR) channelVolume channel,laut# MerkUndo = 0 End If End Function ;------------------------------------------------------------------------------ ; Bild neu aufbauen ;------------------------------------------------------------------------------ Function BildNeu() Tileblock Hintergrund DrawImage ROL,0,0 DrawImage ROR,MaxX-ImageWidth(ROR),0 DrawImage RUL,0,MaxY-ImageHeight(RUL) DrawImage RUR,MaxX-ImageWidth(RUR),MaxY-ImageHeight(RUR) ; Franzi-Mode entfernt color 0,0,0 score = 0 for xx = 0 to 19 for yy = 0 to 14 if Farbe(xx,yy) > 0 Then score = score + 1 DrawImage bubble(Farbe(xx,yy)), xPos(xx,yy), yPos(xx,yy) endif next next If Hilfe = 1 Then Liste.Liste = First Liste For Liste.Liste = Each Liste xx = Liste\xPos*Gr+StartX yy = Liste\yPos*Gr+StartY drawimage Helper,xx,yy Next End If Color 0,128,255 MyText MaxX/2,(MaxY-15*GR)/4,TextScore +" "+ Score +" "+ TextRest +" "+ Anzahl,1 MyText MaxX/2,(MaxY-15*GR)/8,"FPS: "+FPS,1 End Function ;------------------------------------------------------------------------------ ; Spielende ;------------------------------------------------------------------------------ Function SpielEnde() Start = 0 Texthoehe = Stringheight(Endetext1$) Color 0,128,255 If Score < topPunkte(10) Then MyText MaxX/2+15,StartY+GR*15+25,EndeText1$,1 MyText MaxX/2+15,StartY+GR*15+25+ Texthoehe,EndeText2$ + score,1 MyText MaxX/2+15,StartY+GR*15+25+ Texthoehe*2,"Drücke F1 um den Highscore einzutragen.",1 If win = 0 Then channel = Playsound (SoundBravo) channelVolume channel,laut# Win = 1 End if MenueWahl = 1 Else MyText MaxX/2+15,StartY+GR*15+25,EndeText1$,1 MyText MaxX/2+15,StartY+GR*15+25+ Texthoehe,EndeText2$ + score + EndeText3$,1 MyText MaxX/2+15,StartY+GR*15+25+ Texthoehe*2,"Drücke Esc um zum Hauptmenü zu gelangen.",1 If win = 0 Then channel = PlaySound (SoundOhoh) ChannelVolume channel, laut# Win = 1 End If MenueWahl = 1 End If End Function ;------------------------------------------------------------------------------ ; Delete Bubbles ;------------------------------------------------------------------------------ Function DeleteBubbles() For xx = 0 to 19 for yy = 0 to 14 Farbe(xx,yy) = 0 Next Next End Function ;------------------------------------------------------------------------------ ; Highscore speichern ;------------------------------------------------------------------------------ Function SaveScore() Repeat Cls Tileblock Hintergrund KH28 = KeyHit(28) KH156 = KeyHit(156) If KH28 Or KH156 Then Enter = 1 DrawImage SScore, MaxX/2,MaxY/2 MyText MaxX/2-200+StringWidth("Dein Name: "),MaxY/2-25, Name$,0 Name$ = newinput$(MaxX/2-200,MaxY/2-25,400,50,"Dein Name: ", 10) Flip Until Enter = 1 If Name$ = "" Then Name$ = "Unknown" End if TopName$(11) = Name$ TopPunkte(11) = Score For I = 1 To 11 For J = I To 11 If TopPunkte(I) > TopPunkte(J) Then TempScore = TopPunkte(I) : TopPunkte(I) = TopPunkte(J) : TopPunkte(J) = TempScore TempName$ = TopName$(i) : TopName$(i) = TopName$(j): TopName$(j) = TempName$ EndIf Next Next Ende = 0 Esc = 1 Menuewahl = 1 End Function ;------------------------------------------------------------------------------ ; Escapemenü ;------------------------------------------------------------------------------ Function EscMenue() Flushkeys FlushMouse Main[2]= MainSP Auswahl = 0 Enter = 0 Esc = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 4 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 4 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Menuewahl = 1 : Menue() For A = 0 To 4 Colli = Imagerectoverlap (Main[A],MaxX/2-button,MaxY/4+A*80+80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/4+A*80+80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/4+A*80+80 End If drawimage Main[A],MaxX/2-button,MaxY/4+A*80+80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Flushkeys FlushMouse Esc = 0 Enter = 0 Return Auswahl End Function ;------------------------------------------------------------------------------ ; Highscore ansehen ;------------------------------------------------------------------------------ Function ViewScore() Flushkeys FlushMouse Esc = 0 TextImg = FontSchwarz max1 = textbreite("Platz",max1,0) ; Breite von "Platz" max4 = textbreite("Score:",max4,10) ; Breite von "Score:" For i = 1 to 10 Max5 = textbreite(Toppunkte(i),max5,0) ; Breite von Punkte max3 = textbreite(Topname$(i),max3,30) ; Breite von Name max2 = textbreite((i+":"),max2,20) ; Breite von Platznummer next maxG = max1+max2+max3+max4+max5 ; Gesamtbreite der Tabelle sx =(maxX-MaxG)/2 ; Startposition x sy = (MaxY - 10*30) / 2 ; Startposition y While Not Esc = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH1 = KeyHit(1) Tileblock Hintergrund2 Drawimage HGHS,(MaxX/2),(MaxY/2) Drawimage HS,(MaxX/2),(MaxY/8) Color 0,0,0 p = 0 ; Zeilenabstand For i = 1 to 10 Mytext(sx, sy+p, "Platz", 0) ; "Platz" Mytext(sx+max1+max2, sy+p, i+":", 2) ; Platznummer Mytext(sx+max1+max2, sy+p, " "+TopName$(i), 0) ; Name Mytext(sx+max1+max2+max3, sy+p, "Score:", 0) ; "Score" Mytext(sx+maxG, sy+p, TopPunkte(i), 2) ; Punkte p = p + 30 Next If ColliEsc Then DrawImage EscapeFill,MaxX/2-40,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 DrawImage ROLG,0,0 DrawImage RORG,MaxX-ImageWidth(RORG),0 DrawImage RULG,0,MaxY-ImageHeight(RULG) DrawImage RURG,MaxX-ImageWidth(RURG),MaxY-ImageHeight(RURG) DrawImage EscHS,MaxX/2-40,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (EscHS,MaxX/2-40,MaxY-150,MausX,MausY,1,1) Flip Wend TextImg = FontBlau Esc = 1 Enter = 0 Flushkeys FlushMouse End Function ;------------------------------------------------------------------------------ ; Spiel Speichern ;------------------------------------------------------------------------------ Function Speichern() Flushkeys FlushMouse Enter = 0 Esc = 0 datei = Writefile("save.dat") For i = 0 to 19 For j = 0 to 14 WriteInt datei, xPos(i,j) WriteInt datei, yPos(i,j) WriteInt datei, Farbe(i,j) Next Next WriteInt datei, MaxX Closefile datei While Not Enter = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) Color 0,128,255 MyText MaxX/2,MaxY/2,"Das Spiel wurde gespeichert.",1 MyText MaxX/2,MaxY/2+30,"Drücke ENTER um zurück zu kehren...",1 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH28 Or KH156 Or (colliEsc And MH) Then Enter = 1 DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) Flip Wend Enter = 0 Esc = 0 MenueWahl = 2 Flushkeys FlushMouse End Function ;------------------------------------------------------------------------------ ; Spiel Laden ;------------------------------------------------------------------------------ Function Laden() Flushkeys FlushMouse Enter = 0 datei = readfile("save.dat") If datei = 0 Then While Not Enter = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) Color 0,128,255 MyText MaxX/2,MaxY/2,"Kein gespeichertes Spiel gefunden... :(",1 MyText MaxX/2,MaxY/2+30,"Drücke ENTER um zurück zu kehren...",1 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH28 Or KH156 Or (colliEsc And MH) Then Enter = 1 DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) Flip Wend MenueWahl = 1 Else For i = 0 to 19 For j = 0 to 14 xPos(i,j) = ReadInt(datei) yPos(i,j) = ReadInt(datei) Farbe(i,j)= ReadInt(datei) Next Next MaxXalt = ReadInt(datei) Closefile datei If MaxXalt <> MaxX Then For xx = 0 to 19 for yy = 0 to 14 xPos(xx,yy) = xx*GR+StartX yPos(xx,yy) = yy*GR+StartY Next Next End If While Not Enter = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) Color 0,128,255 MyText MaxX/2,MaxY/2,"Das Spiel wurde geladen.",1 MyText MaxX/2,MaxY/2+30,"Drücke ENTER um zurück zu kehren...",1 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH28 Or KH156 Or (colliEsc And MH) Then Enter = 1 DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) Flip Wend Start = 1 MenueWahl = 2 End If Enter = 0 Esc = 0 Flushkeys FlushMouse End Function ;------------------------------------------------------------------------------ ; Frage ;------------------------------------------------------------------------------ Function Frage() FlushKeys FlushMouse Esc = 0 Enter = 0 Auswahl = 5 While Not Enter = 1 B = 0 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 5 If Auswahl > 5 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 5 If Auswahl < 0 Then Auswahl = 5 If KH28 Or KH156 Or MH Then Enter = 1 If KH1 Then Esc = 1 If Esc = 1 Then Menue() For A = 0 To 5 Step 5 If A = 5 Then B = 1 Colli = Imagerectoverlap (Main[A],MaxX/2-button,MaxY/2+B*80,MausX,MausY,1,1) If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+B*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+B*80 End If drawimage Main[A],MaxX/2-button,MaxY/2+B*80 Next Color 0,128,255 MyText MaxX/2,MaxY/4, "Ist das dein Ernst ?",1 DrawImage cursor,MausX,MausY Flip Wend Select Auswahl Case 0 Menue() Case 5 Beenden() End Select Esc = 0 Enter = 0 FlushKeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; Beenden ;------------------------------------------------------------------------------ Function Beenden() datei = writefile("highscore"+Level+".dat") For i = 1 To 11 Writestring datei , TopName$(i) WriteInt datei, TopPunkte(i) Next CloseFile datei config = WriteFile("config.dat") WriteInt(config), MaxX WriteInt(config), MaxY WriteInt(config), FT WriteInt(config), VB WriteString(config), Pfad$ WriteInt(config), GR WriteInt(config), Level WriteFloat(config), laut# CloseFile config For i = 1 to 8 FreeImage(bubble(i)) Next End End Function ;------------------------------------------------------------------------------ ; Menü Optionen ;------------------------------------------------------------------------------ Function Optionen() Flushkeys FlushMouse Esc = 0 Enter = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 2 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 2 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then Menue() For A = 0 To 2 Colli = Imagerectoverlap (Options[A],MaxX/2-button,MaxY/2+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH and Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 End If drawimage Options[A],MaxX/2-button,MaxY/2+A*80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 LevelOptions() Case 1 GrafikOptions() Case 2 Lautstaerke() End Select Enter = 0 Esc = 0 Flushkeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; Level-Options ;------------------------------------------------------------------------------ Function LevelOptions() Flushkeys FlushMouse Esc = 0 Enter = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 2 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 2 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then Optionen() For A = 0 To 2 Colli = Imagerectoverlap (Levels[A],MaxX/2-button,MaxY/2+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 End If drawimage Levels[A],MaxX/2-button,MaxY/2+A*80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 NewLevel = 4 Case 1 NewLevel = 6 Case 2 NewLevel = 8 End Select Enter = 0 If NewLevel <> Level Then If Start = 1 Then While Enter = 0 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH1 = Keyhit(1) Color 0,128,255 MyText MaxX/2,MaxY/2,"Um den neuen Level zu aktivieren, starte bitte ein neues Spiel.",1 MyText MaxX/2,MaxY/2+40,"Wenn du dein aktuelles Spiel fortsetzen möchtest,",1 MyText MaxX/2,MaxY/2+70,"drücke ESC um den Vorgang abzubrechen...",1 MyText MaxX/2,MaxY/2+110,"Drücke ENTER um den neuen Level zu aktivieren...",1 colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) colliOK = Imagerectoverlap (OKI,MaxX/2-40,MaxY/2+150,MausX,MausY,1,1) If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If ColliOK Then DrawImage EscapeFill,MaxX/2-40,MaxY/2+150 DrawImage Escape,70,MaxY-150 DrawImage OKI, MaxX/2-40,MaxY/2+150 DrawImage cursor,MausX,MausY If KH28 Or KH156 Or (ColliOK And MH) Then Enter = 1 If KH1 Or (ColliEsc And MH) Then Esc = 1 If Esc = 1 Then Menue() Flip Wend Else Enter = 1 End If If Enter = 1 Then datei = writefile("highscore"+Level+".dat") For i = 1 To 11 Writestring datei , TopName$(i) WriteInt datei, TopPunkte(i) Next CloseFile datei Level = NewLevel datei = ReadFile("Highscore"+Level+".dat") For i = 1 To 11 TopName$(i) = Readstring(datei) TopPunkte(i) = ReadInt(datei) Next CloseFile datei MenueWahl = 1 Start = 0 End If End If Enter = 0 Esc = 0 FlushKeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; Grafik-Options ;------------------------------------------------------------------------------ Function GrafikOptions() FlushKeys FlushMouse Esc = 0 Enter = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 2 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 2 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then Optionen() For A = 0 To 2 Colli = Imagerectoverlap (Grafik[A],MaxX/2-button,MaxY/2+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 End If drawimage Grafik[A],MaxX/2-button,MaxY/2+A*80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend if Enter = 1 Then Select Auswahl Case 0 Aufloesung() Case 1 BubGroesse() Case 2 Bubfarbe() End Select End If Esc = 0 Enter = 0 FlushKeys FlushMouse Optionen() End Function ;------------------------------------------------------------------------------ ; Menü Auflösung ;------------------------------------------------------------------------------ Function Aufloesung() FlushKeys FlushMouse Esc = 0 Enter = 0 maxm = 7 If SpMaxX = MaxX And SpMaxY = MaxY And SpFT = Ft And SpVB = VB Then Sp = 0 If Sp = 1 Then maxm = 8 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > maxm Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = maxm If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then GrafikOptions() If SpMaxX = 0 Then SpMaxX = MaxX SpMaxY = MaxY End If If SpFT = 0 Then SpFT = FT End If If SpVB = 0 Then SpVB = VB End If For A = 0 To 3 B = A - 1 Colli = Imagerectoverlap (Aufloesung[A],MaxX/4-button,MaxY/2+B*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/4-button,MaxY/2+B*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/4-button,MaxY/2+B*80 End If drawimage Aufloesung[A],MaxX/4-button,MaxY/2+B*80 Next For A = 4 To 7 B = A - 5 Colli = Imagerectoverlap (Aufloesung[A],MaxX/4*3-button,MaxY/2+B*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/4*3-button,MaxY/2+B*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/4*3-button,MaxY/2+B*80 End If drawimage Aufloesung[A],MaxX/4*3-button,MaxY/2+B*80 Next If maxm = 8 Then Colli = Imagerectoverlap (Aufloesung[8],MaxX/2-button,MaxY/2+4*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = 8 drawimage MenueFill,MaxX/2-button,MaxY/2+4*80 Else If Auswahl = 8 Then drawimage MenueFill,MaxX/2-button,MaxY/2+4*80 End If drawimage Aufloesung[8],MaxX/2-button,MaxY/2+4*80 End If DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) Color 0,128,255 MyText MaxX/2,MaxY/4-60, "aktuelle Auflösung: "+ MaxX+ " x "+ MaxY+" & "+FT+" Bit",1 If Sp = 1 Then Select SpVB Case 1 aktVB$ = "Vollbild" Case 2 aktVB$ = "Fenstermodus" End Select MyText MaxX/2,MaxY/4, "Zum speichern ausgewählt: ",1 MyText MaxX/2,MaxY/4 +30, SpMaxX+" x "+SpMaxY+" & "+SpFT+" Bit "+aktVB$,1 End If ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 SpMaxX=1024 : SpMaxY=768 Case 1 SpMaxX=1152 : SpMaxY=864 Case 2 SpMaxX=1280 : SpMaxY=1024 Case 3 SpMaxX=1600 : SpMaxY=1200 Case 4 SpFT=16 Case 5 SpFT=32 Case 6 SpVB=2 Case 7 SpVB=1 Case 8 AuflSpeichern() End Select Enter = 0 Esc = 0 Sp = 1 FlushKeys FlushMouse Aufloesung() End function ;------------------------------------------------------------------------------ ; Funktion Auflösung speichern ;------------------------------------------------------------------------------ Function AuflSpeichern() Enter = 0 Esc = 0 FlushKeys FlushMouse If SpMaxX < DeskX And SpVB < 2 Then While Not Enter = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH1 = Keyhit(1) Color 0,128,255 MyText MaxX/2,MaxY/2,"Die gewählte Auflösung entspricht nicht der Desktopauflösung.",1 MyText MaxX/2,MaxY/2+30,"Für eine optimale Darstellung wird daher der Fenstermodus empfohlen.",1 MyText MaxX/2,MaxY/2+70,"Drücke ENTER um den Fenstermodus zu wählen.",1 MyText MaxX/2,MaxY/2+110,"Drücke ESC um zurück zu kehren...",1 colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) colliOK = Imagerectoverlap (OKI,MaxX/2-40,MaxY/2+150,MausX,MausY,1,1) If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If ColliOK Then DrawImage EscapeFill,MaxX/2-40,MaxY/2+150 DrawImage Escape,70,MaxY-150 DrawImage OKI, MaxX/2-40,MaxY/2+150 DrawImage cursor,MausX,MausY If KH28 Or KH156 Or (ColliOK And MH) Then Enter = 1 If KH1 Or (ColliEsc And MH) Then Esc = 1 If Esc = 1 Then SpVB = 1 : Aufloesung() Flip Wend SpVB = 2 End If If SpMaxX > DeskX While Not Esc = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH1 = Keyhit(1) Color 0,128,255 MyText MaxX/2,MaxY/2,"Die gewählte Auflösung ist höher als die Desktopauflösung.",1 MyText MaxX/2,MaxY/2+30,"Um Schäden an deiner Hardware zu vermeiden, wähle",1 MyText MaxX/2,MaxY/2+70,"bitte eine andere Auflösung.",1 colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) colliOK = Imagerectoverlap (OKI,MaxX/2-40,MaxY/2+150,MausX,MausY,1,1) If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If ColliOK Then DrawImage EscapeFill,MaxX/2-40,MaxY/2+150 DrawImage Escape,70,MaxY-150 DrawImage OKI, MaxX/2-40,MaxY/2+150 DrawImage cursor,MausX,MausY If KH28 Or KH156 Or (ColliOK And MH) Then Esc = 1 If KH1 Or (ColliEsc And MH) Then Esc = 1 Flip Wend End If If Esc = 1 Then Aufloesung() Enter = 0 Esc = 0 While Not Enter = 1 Cls MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH1 = Keyhit(1) Select SpVB Case 1 aktVB$ = "Vollbild" Case 2 aktVB$ = "Fenstermodus" End Select MyText MaxX/2,MaxY/4, "Zum speichern ausgewählt: ",1 MyText MaxX/2,MaxY/4 +30, SpMaxX+" x "+SpMaxY+" & "+SpFT+" Bit "+aktVB$,1 MyText MaxX/2,MaxY/2,"Die Auflösung wird nun geändert. Noch kannst du es",1 MyText MaxX/2,MaxY/2+30,"Dir anders überlegen $",1 MyText MaxX/2,MaxY/2+70,"Drücke ESC um den Vorgang abzubrechen oder weitere",1 MyText MaxX/2,MaxY/2+100,"Einstellungen vorzunehmen.",1 MyText MaxX/2,MaxY/2+140,"Drücke ENTER zum speichern...",1 colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) colliOK = Imagerectoverlap (OKI,MaxX/2-40,MaxY/2+180,MausX,MausY,1,1) If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If ColliOK Then DrawImage EscapeFill,MaxX/2-40,MaxY/2+180 DrawImage Escape,70,MaxY-150 DrawImage OKI, MaxX/2-40,MaxY/2+180 DrawImage cursor,MausX,MausY If KH28 Or KH156 Or (ColliOK And MH) Then Enter = 1 If KH1 Or (ColliEsc And MH) Then Esc = 1 If Esc = 1 Then Aufloesung() Flip Wend If Enter = 1 Then MaxX = SpMaxX MaxY = SpMaxY FT = SpFT VB = SpVB If MaxX = 1024 And GR = 40 Then GR = 36 datei = writefile("highscore"+Level+".dat") For i = 1 To 11 Writestring datei , TopName$(i) WriteInt datei, TopPunkte(i) Next CloseFile datei Graphics MaxX,MaxY,FT,VB SETBUFFER BackBUFFER() LD = 0 SPP = 1 MM = 0 Cls GrafikLaden() For xx = 0 to 19 for yy = 0 to 14 xPos(xx,yy) = xx*GR+StartX yPos(xx,yy) = yy*GR+StartY Next Next End If Esc = 0 Enter = 0 FlushKeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; BubbleGröße ;------------------------------------------------------------------------------ Function BubGroesse() FlushKeys FlushMouse Esc = 0 Enter = 0 if MaxX = 1024 Then MaxGr = 1 Else MaxGr = 2 End If While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > MaxGr Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = MaxGr If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then GrafikOptions() For A = 0 To MaxGr Colli = Imagerectoverlap (BubGr[A],MaxX/2-button,MaxY/2+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 End If drawimage BubGr[A],MaxX/2-button,MaxY/2+A*80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 GR = 32 Case 1 GR = 36 Case 2 GR = 40 End Select For i = 1 To 8 FreeImage bubble(i) Next For i = 1 To 8 bubble(i) = LoadImage("Grafik/"+Pfad$+GR+"/bubble"+i+".png") Next Helper = LoadImage("Grafik/"+Pfad$+Gr+"/"+Gr+".png") StartX = (MaxX - GR*20)/2 StartY = (MaxY - GR*15)/2 For xx = 0 to 19 for yy = 0 to 14 xPos(xx,yy) = xx*GR+StartX yPos(xx,yy) = yy*GR+StartY Next Next Esc = 0 Enter = 0 FlushKeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; BubbleFarbe ;------------------------------------------------------------------------------ Function BubFarbe() FlushKeys FlushMouse Esc = 0 Enter = 0 While Not Enter = 1 MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH28 = KeyHit(28) KH156 = KeyHit(156) KH208 = KeyHit(208) KH200 = KeyHit(200) KH1 = Keyhit(1) Cls If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 2 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 2 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And mh) Then Esc = 1 If Esc = 1 Then GrafikOptions() For A = 0 To 2 Colli = Imagerectoverlap (BubFarbe[A],MaxX/2-button,MaxY/2+A*80,MausX,MausY,1,1) If KH28 Or KH156 Or (MH And Colli) Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80 End If drawimage BubFarbe[A],MaxX/2-button,MaxY/2+A*80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 Pfad$ = "Standard/" Case 1 Pfad$ = "Marmor/" Case 2 Pfad$ = "Pastell/" End Select For i = 1 To 8 FreeImage bubble(i) Next For i = 1 To 8 bubble(i) = LoadImage("Grafik/"+Pfad$+GR+"/bubble"+i+".png") Next Esc = 0 Enter = 0 FlushKeys FlushMouse Menue() End Function ;------------------------------------------------------------------------------ ; Lautstärke ;------------------------------------------------------------------------------ Function Lautstaerke() FlushKeys FlushMouse Esc = 0 Enter = 0 LL#= laut#*300 Auswahl = 0 While Not Enter = 1 Cls KHLinks = KeyHit(203) KHRechts = KeyHit(205) MausX = MouseX() MausY = MouseY() MH = Mousehit(1) KH208 = KeyHit(208) KH200 = KeyHit(200) KH28 = KeyHit(28) KH156 = KeyHit(156) KH1 = Keyhit(1) If KHRechts Or (ColliRechts And MH) Then LL = (LL + 30) If LL > 300 Then LL = 300 If KHLinks Or (ColliLinks And MH) Then LL = (LL - 30) If LL < 0 Then LL = 0 If KH208 Then Auswahl = Auswahl + 1 If Auswahl > 1 Then Auswahl = 0 If KH200 Then Auswahl = Auswahl - 1 If Auswahl < 0 Then Auswahl = 1 If KH28 Or KH156 Then Enter = 1 If ColliEsc Then DrawImage EscapeFill,70,MaxY-150 If KH1 Or (ColliEsc And MH) Then Esc = 1 If Esc = 1 Then Optionen() Color 0,128,255 MyText MaxX/2,(MaxY/4),"Lautstärke : "+laut#,1 MyText MaxX/2,(MaxY/4+50),"Drücke Links oder Rechts um die Lautstärke zu ändern.",1 MyText MaxX/2,(MaxY/4+100),"Zum Testen ENTER drücken. Mit ESC gehts zurück.",1 laut# = LL#/300 DrawblockRect MlautF, MaxX/2-150,MaxY/2, 0, 0, LL, 30 drawimage Mlaut,MaxX/2-150,MaxY/2 drawimage LautLinks,MaxX/2-200,MaxY/2 drawimage LautRechts,MaxX/2+170,MaxY/2 For A = 0 To 1 Colli = Imagerectoverlap (Sounds[A],MaxX/2-button,MaxY/2+A*80+80,MausX,MausY,1,1) If Colli And MH Then Enter = 1 If colli Then Auswahl = A drawimage MenueFill,MaxX/2-button,MaxY/2+A*80+80 Else If Auswahl = A Then drawimage MenueFill,MaxX/2-button,MaxY/2+A*80+80 End If drawimage Sounds[A],MaxX/2-button,MaxY/2+A*80+80 Next DrawImage Escape,70,MaxY-150 DrawImage cursor,MausX,MausY colliEsc = Imagerectoverlap (Escape,70,MaxY-150,MausX,MausY,1,1) colliLinks = Imagerectoverlap (LautLinks,MaxX/2-200,MaxY/2,MausX,MausY,1,1) colliRechts = Imagerectoverlap (LautRechts,MaxX/2+170,MaxY/2,MausX,MausY,1,1) ;-FPS-Anzeige----------------------- FPSC = FPSC + 1 If FPST + 1000 < MilliSecs() FPS = FPSC FPSC = 0 FPST = MilliSecs() End If MyText MaxX/2,MaxY/12,"FPS: "+FPS,1 ;-FPS-Anzeige----------------------- Flip Wend Select Auswahl Case 0 channel = PlaySound (SoundBlub) ChannelVolume channel, laut# Case 1 laut# = 0 End Select Esc = 0 Enter = 0 FlushKeys FlushMouse Lautstaerke() End Function ;------------------------------------------------------------------------------ ; Input ;------------------------------------------------------------------------------ Function newinput$(x1,y1,x2,y2,frage$,maxl) a = GetKey() If a => 32 And a <= 255 And Len(antwort$) <= maxl-1 Then antwort$ = antwort$ + Chr$(a) End If If KeyDown(28) Or KeyDown(156) Then F1 = 0: Return antwort$ : Esc = 1 If KeyDown(14) Or KeyDown(203) And Len(antwort$) > 0 And MilliSecs()-backtime > 125 Then antwort$ = Left(antwort$,(Len(antwort$)-1)) backtime = MilliSecs() End If ;Color 25,100,200 ; Rect x1, y1,x2, y2,1 ;Color 10,50,150 ; Rect x1, y1,x2, y2,0 lText = StringWidth(antwort$) ;Blinkender Cursor hText = StringHeight(antwort$) lFrage = StringWidth(frage$) Color 0,50,ccolor Rect x1+lText+lFrage+16,y1+4,10,hText-1,1 ccolor = ccolor + 5 If ccolor = 255 Then ccolor = 100 Color 255,255,255 MyText x1+3,y1+3, frage$ + " " + antwort$,0 End Function ;------------------------------------------------------------------------------ ; Config ;------------------------------------------------------------------------------ Function Config() Config = ReadFile("config.dat") If Config <> 0 Then MaxX = ReadInt(config) MaxY = ReadInt(config) FT = ReadInt(config) VB = ReadInt(config) Pfad$ = ReadString(config) GR = ReadInt(config) Level = ReadInt(config) laut# = ReadFloat(config) CloseFile config End If If MaxX = 0 Or MaxY = 0 Then MaxX = apiGetSystemMetrics(SM_CXSCREEN) MaxY = +apiGetSystemMetrics(SM_CXSCREEN) FT = 32 VB = 1 End If End Function ;------------------------------------------------------------------------------ ; Funktion Printtext ;------------------------------------------------------------------------------ ; Parameter align : 1, 2 oder 3 angeben ; Parameter mittig : 1 = vertikal mittig, 0 = normal ;------------------------------------------------------------------------------ Function PrintText( text1$, x, y, align, mittig ) select align case 1 ; linksbündig text x, y, text1, 0, mittig case 2 ; rechtsbündig text x - StringWidth( text1 ), y, text1, 0, mittig case 3 ; zentriert text x - StringWidth( text1 )/2, y, text1, 0, mittig end select end function ;------------------------------------------------------------------------------ ; Funktion Textbreite ;------------------------------------------------------------------------------ ; Parameter max : zur Ermittlung der maximalen Breite ; Parameter leer$ : gewünschter Leerraum zwischen den Spalten ;------------------------------------------------------------------------------ function textbreite(Txt$, max, leer) For i=1 To Len(txt$) p=Asc(Mid(txt$,i,1)) If p=32 Then maxneu=maxneu+8 Else maxneu=maxneu+(TextChar(p)-1) End If Next If Maxneu + leer > max Then Max = Maxneu + leer Return Max End function ;------------------------------------------------------------------------------ ; Funktion Laden ;------------------------------------------------------------------------------ Function GrafikLaden() Rahmen = LoadImage("Grafik/lade.png") Fill = LoadImage("Grafik/ladefill.png") Logo = LoadImage("Grafik/logo.png") midhandle Rahmen midhandle Fill MidHandle Logo TextFile = ReadFile("Grafik/Font.txt") While Not Eof(TextFile) TextMain$=ReadLine$(TextFile) TextAscii(Asc(Left$(TextMain$,1)))=TextID TextChar(Asc(Left$(TextMain$,1)))=Right$(TextMain$,Len(TextMain$)-2) TextID=TextID+1 Wend FontBlau = LoadAnimImage("Grafik/Font_b.png",25,31,0,82) MaskImage FontBlau,0,0,0 TextImg = FontBlau LadeBalken() FontSchwarz = LoadAnimImage("Grafik/Font_s.png",25,31,0,82) MaskImage FontSchwarz,225,106,0 LadeBalken() cursor = LoadImage("Grafik/maus.png") Font = LoadFont ("Arial",28,1,0,0) SetFont Font StartX = (MaxX - GR*20)/2 StartY = (MaxY - GR*15)/2 LadeBalken() ; Hintergrundgrafiken laden Hintergrund = LoadImage("Grafik/back.png") LadeBalken() ; 5 Hintergrund2 = LoadImage("Grafik/backhs.png") LadeBalken() HGHS = LoadImage("Grafik/hs.png") LadeBalken() HS = Loadimage("Grafik/score.png") LadeBalken() MidHandle HGHS MidHandle HS ; Eckgrafiken laden If MaxX < 1280 Then Ecke = 1024 Else Ecke = 1280 End if ROL = LoadImage("Grafik/"+Ecke+"/ol.png") LadeBalken() ROR = LoadImage("Grafik/"+Ecke+"/or.png") LadeBalken() RUL = LoadImage("Grafik/"+Ecke+"/ul.png") LadeBalken() ; 10 RUR = LoadImage("Grafik/"+Ecke+"/ur.png") LadeBalken() ROLG = LoadImage("Grafik/"+Ecke+"/olg.png") LadeBalken() RORG = LoadImage("Grafik/"+Ecke+"/org.png") LadeBalken() RULG = LoadImage("Grafik/"+Ecke+"/ulg.png") LadeBalken() RURG = LoadImage("Grafik/"+Ecke+"/urg.png") LadeBalken() ; 15 ; MenüButtons laden Main[0]=LoadImage("Grafik/Buttons/fortsetzen.png") LadeBalken() Main[1]=LoadImage("Grafik/Buttons/neues-Spiel.png") LadeBalken() Main[2]=LoadImage("Grafik/Buttons/Highscore.png") LadeBalken() Main[3]=LoadImage("Grafik/Buttons/laden.png") LadeBalken() Main[4]=LoadImage("Grafik/Buttons/Optionen.png") LadeBalken() ; 20 Main[5]=LoadImage("Grafik/Buttons/beenden.png") LadeBalken() MainHS=LoadImage("Grafik/Buttons/Highscore.png") MainSP=LoadImage("Grafik/Buttons/speichern.png") Options[0]=LoadImage("Grafik/Buttons/Level.png") LadeBalken() Options[1]=LoadImage("Grafik/Buttons/Grafik.png") LadeBalken() Options[2]=LoadImage("Grafik/Buttons/Sound.png") LadeBalken() Levels[0]=LoadImage("Grafik/Buttons/Leicht.png") LadeBalken() ; 25 Levels[1]=LoadImage("Grafik/Buttons/Normal.png") LadeBalken() Levels[2]=LoadImage("Grafik/Buttons/Schwer.png") LadeBalken() Grafik[0]=LoadImage("Grafik/Buttons/Aufloesung.png") LadeBalken() Grafik[1]=LoadImage("Grafik/Buttons/groesse.png") LadeBalken() Grafik[2]=LoadImage("Grafik/Buttons/farbe.png") LadeBalken() ; 30 Aufloesung[0]=LoadImage("Grafik/Buttons/1024x768.png") LadeBalken() Aufloesung[1]=LoadImage("Grafik/Buttons/1152x864.png") LadeBalken() Aufloesung[2]=LoadImage("Grafik/Buttons/1280x1024.png") LadeBalken() Aufloesung[3]=LoadImage("Grafik/Buttons/1600x1200.png") LadeBalken() Aufloesung[4]=LoadImage("Grafik/Buttons/16Bit.png") LadeBalken() ; 35 Aufloesung[5]=LoadImage("Grafik/Buttons/32Bit.png") LadeBalken() Aufloesung[6]=LoadImage("Grafik/Buttons/Fenster.png") LadeBalken() Aufloesung[7]=LoadImage("Grafik/Buttons/Vollbild.png") LadeBalken() Aufloesung[8]=LoadImage("Grafik/Buttons/speichern.png") LadeBalken() BubGr[0]=LoadImage("Grafik/Buttons/Klein.png") LadeBalken() ; 40 BubGr[1]=LoadImage("Grafik/Buttons/Mittel.png") LadeBalken() BubGr[2]=LoadImage("Grafik/Buttons/Gross.png") LadeBalken() BubFarbe[0]=LoadImage("Grafik/Buttons/Standard.png") LadeBalken() BubFarbe[1]=LoadImage("Grafik/Buttons/Marmor.png") LadeBalken() BubFarbe[2]=LoadImage("Grafik/Buttons/Pastell.png") LadeBalken() ; 45 Sounds[0]=LoadImage("Grafik/Buttons/Lautstaerke.png") Sounds[1]=LoadImage("Grafik/Buttons/Soundaus.png") LadeBalken() EscapeFill = LoadImage("Grafik/Buttons/esc-fill.png") OKI = LoadImage("Grafik/Buttons/ok.png") Escape = LoadImage("Grafik/Buttons/esc.png") Weiter = LoadImage("Grafik/Buttons/weiter.png") MenueFill = LoadImage("Grafik/Buttons/fill.png") button = imagewidth(MenueFill)/2 LadeBalken() EscHS = LoadImage("Grafik/Buttons/esc-hs.png") EscSP = LoadImage("Grafik/Buttons/esc-spiel.png") Mlaut = Loadimage("Grafik/Buttons/laut.png") MlautF = Loadimage("Grafik/Buttons/laut-fill.png") LautLinks = Loadimage("Grafik/Buttons/lautlinks.png") LautRechts = Loadimage("Grafik/Buttons/lautrechts.png") LadeBalken() Help = Loadimage("Grafik/Buttons/help.png") Undo = Loadimage("Grafik/Buttons/undo.png") HelpFill = Loadimage("Grafik/Buttons/helpfill.png") SScore = LoadImage("Grafik/savescore.png") LadeBalken() ; 49 MidHandle SScore ; Bubblegrafiken laden For i = 1 To 8 bubble(i) = LoadImage("Grafik/"+Pfad$+GR+"/bubble"+i+".png") LadeBalken() ; 57 Next Helper = LoadImage("Grafik/"+Pfad$+Gr+"/"+Gr+".png") ; TopTen laden datei = ReadFile("Highscore"+Level+".dat") For i = 1 To 11 TopName$(i) = Readstring(datei) TopPunkte(i) = ReadInt(datei) LadeBalken() ; 68 Next CloseFile datei ; kleine Pause While wait < 500 drawImage Logo, MaxX/2,MaxY/8*3 drawImage Fill, MaxX/2,MaxY/8*5 MyText MaxX/2,30,Autor$,1 wait = wait + 1 Flip Cls Wend End Function ;------------------------------------------------------------------------------ ; Funktion Ladebalken ;------------------------------------------------------------------------------ FUNCTION LadeBalken() TextImg = FontBlau LD = LD + 1 PP = LD * 100 / LDMax SP = PP * 800 / 100 ; Breite Ladegrafik = 800 WHILE MM < SP cls MM = MM + SPP drawImage Logo, MaxX/2,MaxY/8*3 DrawImage Rahmen,MaxX/2,MaxY/8*5 DrawblockRect Fill, MaxX/2,MaxY/8*5, 0, 0, MM, 250 ; Höhe Ladegrafik = 250 Color 0,128,255 MyText MaxX/2,30,Autor$,1 flip WEND END FUNCTION ;------------------------------------------------------------------------------ ; FontFunction ;------------------------------------------------------------------------------ Function MyText(x,y,txt$,z) If z > 0 Then For i=1 To Len(txt$) p=Asc(Mid(txt$,i,1)) If p=32 Then maxoffset=maxoffset+8 Else maxoffset=maxoffset+(TextChar(p)-1) End If Next End If For i=1 To Len(txt$) p=Asc(Mid(txt$,i,1)) If p=32 Then offset=offset+8 Else Select z Case 0 DrawImage TextImg,x+offset,y,TextAscii(p) ; linksbündig case 1 DrawImage TextImg,(x-maxoffset/2)+offset,y,TextAscii(p) ; zentriert case 2 DrawImage TextImg,(x-maxoffset)+offset,y,TextAscii(p) ; rechtsbündig End Select offset=offset+(TextChar(p)-1) End If Next End Function ; -----------------------------------------------------