Seite 1 von 1

programm hängt rechner auf

Verfasst: 06.08.2005 15:29
von ThomasT
Hi

ich hab mir ein Programm kopiert, um in einem Spiel den Highscore eingeben zu können.
Das kopierte Programm funktioniert auch astrein.

Wenn ich es aber in mein Programm integrieren will, hängt sich bei jedem Versuch mein Rechner auf und ich muss neu booten. :-( extrem lästig.

Jetzt 2 Fragen:

1. Was ist an meinem Programm falsch? siehe unten (Wahrscheinlich irgendein bescheuerter Anfängerfehler.)

2. Wie kann man verhindern, dass man bei solchen Fehlern ständig neu booten muss?


Danke
Thomas

Code: Alles auswählen

#Nein = 0
#Ja = 1
#False = 0
#True = 1
;- Geometrie #############################################################
#Bildschirm_hoehe = 600
#Spielfeld_x = 0
#Spielfeld_y = 0
#Spielfeld_hoehe = 500
#Spielfeld_breite = 800

level=2

; -------------------------------------------------------------------------------
Procedure OEscapeKeyHit()
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape)
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
  
EndProcedure


; -------------------------------------------------------------------------------
Procedure.s InputProcedure(x,y)
  Static Name$, LastCursorTime, ShowCursor, BackPushed
  
  While 1
    ; Input holen
    Name$ + KeyboardInkey()
    
    ; Backspace erlauben zum loeschen
    If KeyboardPushed(#PB_Key_Back) And BackPushed=0
      Name$ = Left(Name$,Len(Name$)-1)
      BackPushed=ElapsedMilliseconds()
    ElseIf BackPushed
      If ElapsedMilliseconds() >= BackPushed+150
        BackPushed=0
      EndIf
    EndIf
    
    ; Laenge begrenzen
    len=Len(Name$)
    If len>25
      Name$ = Left(Name$,len-1)
    EndIf
    
    ; Fenster zeichnen
    If StartDrawing(ScreenOutput())
      Box(x+5,y+5,300,100,$404040)
      Box(x,y,300,100,$D7D628)
      Box(x,y,300,22,$579FA8)
      Line(x    ,y,300,  0,$FFFFFF):Line(x,y    ,  0,100,$FFFFFF)
      Line(x+300,y,  0,100,$000000):Line(x,y+100,300,  0,$000000)
      Locate(x+2,y+2)
      DrawingMode(1)
      DrawText("Bitte Name eingeben")
      Box(x+09,y+29,282,24,$000000)
      Box(x+10,y+30,280,22,$FFFFFF)
      Locate(x+13,y+33)
      DrawText(Name$)
      
      ; cursor blinken lassen
      time = ElapsedMilliseconds()
      If time >= LastCursorTime+500
        LastCursorTime=time
        ShowCursor ! 1
      EndIf
      ; cursor zeichnen
      If ShowCursor
        ;Line(x+13+TextLength(Name$),y+32,0,18,$000000)
        Line(x+13+TextLength(Name$),y+50,10,0,$000000)
      EndIf
      
      StopDrawing()
    EndIf
    
    If KeyboardReleased(#PB_Key_Return) And Name$
      ProcedureReturn Name$
    EndIf
  Wend
EndProcedure
; 
; -------------------------------------------------------------------------------
Procedure OShowFinishScreen()
  Shared Gesamtzeit
  
  StartDrawing(ScreenOutput())
  DrawingMode(1)   
  Box(0, 0, #Spielfeld_breite, #Bildschirm_hoehe)     
  
  Locate(360, #Bildschirm_hoehe/2 ): DrawText("Geschafft..")
  Locate(360, #Bildschirm_hoehe/2+30 ): DrawText("Verbrauchte Zeit:  " + Str(Gesamtzeit) + " Sekunden" )
  
  StopDrawing()
  FlipBuffers() 
  
EndProcedure

; -------------------------------------------------------------------------------
Procedure OCheckIfGameFinished()
  Shared Startzeit, Gesamtzeit, level
  Protected Name$, Status
  
    Repeat
      ExamineKeyboard()
      If IsScreenActive()
        FlipBuffers()
        ClearScreen($3A,$65,$98)
        If Status = 0
          Name$ = InputProcedure(#Spielfeld_breite/2-150,#Spielfeld_hoehe/2-50)
          If Name$
            Status+1
          EndIf
        Else
          If StartDrawing(ScreenOutput())
            FrontColor($FF,$FF,$FF)
            DrawingMode(1)
            Locate(100,100): DrawText("Ihre Eingabe:")
            Locate(100,130): DrawText("Vielen Dank! Bitte drcken sie eine Taste...")
            FrontColor($00,$00,$00)
            Locate(200,100): DrawText(Name$)
            StopDrawing()
          EndIf
          If KeyboardPushed(#PB_Key_All)
            Quit=#True
          EndIf
        EndIf
      EndIf
    Until Quit     
    
    CloseScreen()
    
    End  ; Programm beenden
  
EndProcedure



If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize game engine!"):End
EndIf

OpenScreen(1024,768,16,"Ballerkurs")  

OCheckIfGameFinished()
[/code]

Verfasst: 06.08.2005 16:16
von Batze
Benutz doch bitte Codetags. :allright:
Aber so sollte es besser gehen (auch wenn ich keinen echten Fehler gefunden habe)

Code: Alles auswählen



#Nein = 0
#Ja = 1
#False = 0
#True = 1
;- Geometrie #############################################################
#Bildschirm_hoehe = 600
#Spielfeld_x = 0
#Spielfeld_y = 0
#Spielfeld_hoehe = 500
#Spielfeld_breite = 800

level=2

; -------------------------------------------------------------------------------
Procedure OEscapeKeyHit()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
ProcedureReturn 1
EndIf
ProcedureReturn 0

EndProcedure


; -------------------------------------------------------------------------------
Procedure.s InputProcedure(x,y)
Static Name$, LastCursorTime, ShowCursor, BackPushed

While 1

If OEscapeKeyHit() = 1 : End : EndIf  ; Sehr wichtig
; Input holen
Name$ + KeyboardInkey()

; Backspace erlauben zum loeschen
If KeyboardPushed(#PB_Key_Back) And BackPushed=0
Name$ = Left(Name$,Len(Name$)-1)
BackPushed=ElapsedMilliseconds()
ElseIf BackPushed
If ElapsedMilliseconds() >= BackPushed+150
BackPushed=0
EndIf
EndIf

; Laenge begrenzen
len=Len(Name$)
If len>25
Name$ = Left(Name$,len-1)
EndIf

; Fenster zeichnen
If StartDrawing(ScreenOutput())
Box(x+5,y+5,300,100,$404040)
Box(x,y,300,100,$D7D628)
Box(x,y,300,22,$579FA8)
Line(x ,y,300, 0,$FFFFFF):Line(x,y , 0,100,$FFFFFF)
Line(x+300,y, 0,100,$000000):Line(x,y+100,300, 0,$000000)
Locate(x+2,y+2)
DrawingMode(1)
DrawText("Bitte Name eingeben")
Box(x+09,y+29,282,24,$000000)
Box(x+10,y+30,280,22,$FFFFFF)
Locate(x+13,y+33)
DrawText(Name$)

; cursor blinken lassen
time = ElapsedMilliseconds()
If time >= LastCursorTime+500
LastCursorTime=time
ShowCursor ! 1
EndIf
; cursor zeichnen
If ShowCursor
;Line(x+13+TextLength(Name$),y+32,0,18,$000000)
Line(x+13+TextLength(Name$),y+50,10,0,$000000)
EndIf

StopDrawing()
EndIf


flipbuffers() ; <<< NEU !!!!

If KeyboardReleased(#PB_Key_Return) And Name$
ProcedureReturn Name$
EndIf
Wend
EndProcedure
;
; -------------------------------------------------------------------------------
Procedure OShowFinishScreen()
Shared Gesamtzeit

StartDrawing(ScreenOutput())
DrawingMode(1)
Box(0, 0, #Spielfeld_breite, #Bildschirm_hoehe)

Locate(360, #Bildschirm_hoehe/2 ): DrawText("Geschafft..")
Locate(360, #Bildschirm_hoehe/2+30 ): DrawText("Verbrauchte Zeit: " + Str(Gesamtzeit) + " Sekunden" )

StopDrawing()
FlipBuffers()

EndProcedure

; -------------------------------------------------------------------------------
Procedure OCheckIfGameFinished()
Shared Startzeit, Gesamtzeit, level
Protected Name$, Status

Repeat
ExamineKeyboard()
If IsScreenActive()
FlipBuffers()
ClearScreen($3A,$65,$98)
If Status = 0
Name$ = InputProcedure(#Spielfeld_breite/2-150,#Spielfeld_hoehe/2-50)
If Name$
Status+1
EndIf
Else
If StartDrawing(ScreenOutput())
FrontColor($FF,$FF,$FF)
DrawingMode(1)
Locate(100,100): DrawText("Ihre Eingabe:")
Locate(100,130): DrawText("Vielen Dank! Bitte drcken sie eine Taste...")
FrontColor($00,$00,$00)
Locate(200,100): DrawText(Name$)
StopDrawing()
EndIf
If KeyboardPushed(#PB_Key_All)
Quit=#True
EndIf
EndIf
EndIf
Until Quit

CloseScreen()

End ; Programm beenden

EndProcedure



If InitSprite()=0 Or InitKeyboard()=0
MessageRequester("ERROR","Cant initialize game engine!"):End
EndIf

OpenScreen(1024,768,16,"Ballerkurs")

OCheckIfGameFinished()
Edit: Doch examineKeyboard() vergessen :wink:

Danke Batze

Verfasst: 06.08.2005 22:12
von ThomasT
Mit deiner Version funktioniert es, auch wenn ich noch nicht verstehe warum - ich werds schon noch kapieren.

Kannst du mir vielleicht einen Tip zur 2. Frage geben? Wie verhindere ich, dass sich der Rechner aufhängt wenn ich was falsch programmiere?

Und was sind Codetags? Wie verwende ich die? Wo steht was dazu?

Meinst du das? :|

Code: Alles auswählen

#Konstante = 1

Re: Danke Batze

Verfasst: 06.08.2005 22:19
von Andre
ThomasT hat geschrieben:Wie verhindere ich, dass sich der Rechner aufhängt wenn ich was falsch programmiere?
Auf jeden Fall den Debugger einschalten.
Sollte erstmal viele Probleme abfangen...
ThomasT hat geschrieben: Und was sind Codetags? Wie verwende ich die? Wo steht was dazu?

Meinst du das? :|

Code: Alles auswählen

#Konstante = 1
Du bringst es ja. :)

Verfasst: 06.08.2005 23:10
von Batze
Tja, ich glaube dein Rechner hat sich garnicht aufgehängt, sondern er hing in einer Endloschleife fest.

Code: Alles auswählen

While 1 
;...
wend

; <- schlecht da endlosschleife

repeat
until keyboardpushed(#PB_Key_Escape)

; <- gut, da man immer abbrechen kann
Das ist übrigens eins der wenigen Dinge was der Debugger nicht erkennt.
:allright: :freak:

Danke für die Tips

Verfasst: 07.08.2005 21:56
von ThomasT
Ich hab jetzt verstanden warum es sich aufhängt.
Allerdings hätte ich erwartet, dass ich wenigstens mit Strg+Alt+Entf
das wild gewordene Programm abschießen kann.

Warum geht das hier nicht? :|

Gruß Thomas

Verfasst: 07.08.2005 22:15
von Batze
Mit Alt + Strg + Entf wird der Taskmanager zwar aufgerufen, aber der Screen liegt davor, weshalb man ihn nicht sehen kann. :freak:

Verfasst: 07.08.2005 22:16
von sen-me
gehen schon, blos bei ner unendlichschleife und nehzm von haus aus lahmen pc kanns da schon ne halbestunde dauern biste im taskmanager bist ^^
darum würde ich in endlosschleifen immer ne notbremse einbaun (ne taste drücken und er bricht ab)

Verfasst: 07.08.2005 22:19
von Batze
Dafür muss der PC nicht lahm sein.
Das Problem ist, dass das Programm nicht wirklich abgestürzt ist, sondern einfach nur nichts zu sehen ist, wenn man flipbuffers vergisst.