Das ist mein 1. Codeschnipsel, welchen ich hier im Forum veröffentliche:
Eine InGame Konsole, welche es erlaubt Befehle,Chat u. Werte zu den Befehlen farblich zu trennen.
Man kann z.B. komfortabel die Framerate ändern mit /fps dann Leerzeichen u. dann die Anzahl der Bilder pro Sekunde(z.B. /fps 33)
Allerdings lässt sich sicher vieles noch verbessern, deswegen stelle ich den Code hier Online, damit wir den Code gemeinsam(wer möchte) verbessern können.
Ihr könnt mit dem Code machen was ihr wollt, außer wenn ihr den Code wiederveröffentlicht, dann sollte zumindest mein Name genannt werden

Dank an Benubi, denn der Beitrag InGameConsole im CodeArchiv hat mir sehr geholfen.
Viel Spaß beim ausprobieren

------------------Updates---------------------
1. Hoch&Runter Funktion hinzugefügt@SLC_KeysAndActions()
2. Bugfix:zu viele Konsoleneinträge @SLC_PrintN()|KeysAndActions()
3. zu Moks Scripter Kompatibel gemacht: Auskopplung der Befehle in SLC_Commands u. anpassung der Variablennamen
-----------------------------------------------
Screenshots:



Exe zum Ausprobieren: http://em.q-soft.ch/files/get/CqYSnHEPS6/slc.exe[updated]
Lol den Code vergessen xD
Code:
Code: Alles auswählen
;-Konstante
#SLC_EntryLimit = 18;Max. Anzahl an Konsolen-Einträgen(!-Wichtig)
#SLC_ChatEntryLimit = 5;Max. Anzahl an Chatbeiträgen(!-Wichtig)
#SLC_TextLimit = 30
#SLC_ChatTextLimit = 40
#SLC_Return = Chr(13);Zeichen welches einen Zeilenumbruch auslöst
#SLC_Whitespace = " ";Zeichen welches als Seperator von Befehl u. dazugehörigem Wert (z.B. /FPS 125) dient
#SLC_StartOperator = "/";Zeichen welches einen Befehl einleitet
Enumeration
#SLC_ConsoleSprite
#SLC_ChatSprite
EndEnumeration
;-Listen
Global NewList SLC_Buffer.s();Liste der Konsoleneinträge
AddElement(SLC_Buffer())
Global NewList SLC_ChatBuffer.s();Liste der Chateinträge
AddElement(SLC_ChatBuffer())
;- Variablen
Define.l SLC_BGColor = RGB(0,0,0);HG-Farbe
Define.l SLC_InputBGColor = RGB(35,35,35);HG-Farbe des Eingabefeldes
Define.l SLC_CursorColor = RGB(255,0,0)
Define.l SLC_X = 0;X Position der Konsole
Define.l SLC_Y = 0;Y Position der Konsole
Define.l SLC_Width = 800;Breite der Konsole
Define.l SLC_Height = 300;Höhe der Konsole(Bitte #SLC_EntryLimit anpassen)
Define.l SLC_ChatX = 10;X Position des Chats
Define.l SLC_ChatY = 400;Y Position des Chats
Define.l SLC_ChatWidth = 600;Breite des Chats(Muss in DrawChatSprite überarbeitet werden)
Define.l SLC_ChatHeight = 300;Höhe des Chats(Bitte #SLC_ChatEntryLimit anpassen)
Define.l SLC_Visible = #True;Konsole An/Aus
Define.l SLC_ChatVisible = #False;Chat An/Aus
;Textausgabe
Define.l SLC_ChatTextColor = $FFFFFF;Chattextfarbe
Define.l SLC_MainTextColor = $C3C53C;Farbe von z.B. /FPS
Define.l SLC_SubTextColor = $B8F0D5;Farbe von 125 bei /FPS 125
Define.l SLC_SubTextColor = $B8F0D5;Farbe von 125 bei /FPS 125
;Eingabefeld
Define.l SLC_ChatTextColor2 = $FFFFFF
Define.l SLC_MainTextColor2 = $C3C53C
Define.l SLC_SubTextColor2 = RGB(234, 68, 21)
Define.l SLC_PreColor = RGB(204, 134, 51); Ist der Text, welcher vor dem eingegebenen Text steht
;Chat
Define.l SLC_ChatTextColor3 = $701F08
Define.l SLC_ChatPersonColor = RGB(255, 0, 0);Unused
Define.l SLC_PreChatColor = $701F08
Declare SCR_ExecFile(FileName$)
Procedure SLC_Init();Bilder erstellen
Shared SLC_Width,SLC_Height,SLC_ChatWidth,SLC_ChatHeight
CreateSprite(#SLC_ConsoleSprite,SLC_Width,SLC_Height);Bild wo die Konsole gerendert wird
CreateSprite(#SLC_ChatSprite,SLC_ChatWidth,SLC_ChatHeight);Bild wo der Chat gerendert wird
TransparentSpriteColor(#SLC_ChatSprite, RGB(193, 8, 62));damit der Chat keinen HG hat
EndProcedure
Procedure SLC_CheckAndDelete(Buffer.l,Limit.l = 4,LastElement.l = #True);Prüfen ob eines der Entrylimits überschritten wurde u. ggf. löschen
If Buffer = 0;Konsole
If ListSize(SLC_Buffer()) > Limit+1;wenn das Limit erreicht wurde
FirstElement(SLC_Buffer())
DeleteElement(SLC_Buffer());wird das letzte Element gelöscht
If LastElement = #True;weil manchmal schon ein Lastelement vorhanden ist
LastElement(SLC_Buffer())
EndIf
EndIf
ElseIf Buffer = 1;Chat
If ListSize(SLC_ChatBuffer()) > Limit+1
FirstElement(SLC_ChatBuffer())
DeleteElement(SLC_ChatBuffer())
If LastElement = #True
LastElement(SLC_ChatBuffer())
EndIf
EndIf
EndIf
EndProcedure
Procedure SLC_Chat(text.s);Neuer Chat-Eintrag
;z.B. Netzwerk...mist,...
AddElement(SLC_Buffer());Chateintrag wird auch in der Konsole angezeigt
LastElement(SLC_ChatBuffer())
SLC_ChatBuffer() = text
AddElement(SLC_ChatBuffer());Chatelement hinzufügen
SLC_CheckAndDelete(0,#SLC_EntryLimit);Limits prüfen
SLC_CheckAndDelete(1,#SLC_ChatEntryLimit,#False)
EndProcedure
Procedure SLC_PrintN(text.s);Neuer Konsolen-Eintrag
Protected Output.s,NumOfReturns,x.l
NumOfReturns = CountString(text,#SLC_Return)+1;Anzahl der Zeilenumbrüche
For x = 1 To NumOfReturns Step 1;Zeile für Zeile durchgehen
Output = StringField(text,x,#SLC_Return)
SLC_Buffer() = Output
AddElement(SLC_Buffer());Konsolenelement hinzufügen
SLC_CheckAndDelete(0,#SLC_EntryLimit)
Next
EndProcedure
Procedure SLC_Commands(RawCommand$,Check$,Argument$,Argument2$="") ;Befehle!
;RawCommand$ is unused at present
Select Check$;Befehl only^^ z.B. fps
Case "exec"
SLC_PrintN("Plugin wurde nicht installiert! Siehe Pure-Board.de")
Case "help"
SLC_PrintN("Nobody"+#SLC_Return+"Can"+#SLC_Return+"Help"+#SLC_Return+"You"+#SLC_Return+"Anymore!")
Case "quit"
StartDrawing(ScreenOutput())
DrawText(100,100,"Shutdown...")
StopDrawing()
Delay(1000)
End
Case "fps"
If Val(Argument$) > 200
SLC_PrintN("The framerate "+Argument$+" is above the limit(200)")
Else
SetFrameRate(Val(Argument$))
SLC_PrintN("Framerate was changed to "+Argument$)
EndIf
Case "zahl"
SLC_PrintN("Die Zahl heißt "+Argument$)
Case "name"
SLC_PrintN("Dein neuer Name ist "+Argument$)
Case "message"
MessageRequester("Message",Argument$)
SLC_PrintN(Argument$)
Default
DeleteElement(SLC_Buffer());keine Ausgabe bei falschem Befehl
EndSelect
EndProcedure
Procedure SLC_KeysAndActions();Tastenbelegung
Shared SLC_Visible,SLC_ChatVisible
Protected RawArgument$,Argument$,Check$
Protected PreviousElement$:Static PreviousElements,KeyUpPressed;Um vorige Befehle anzuzeigen(mittels Pfeil-Hoch-Taste)
;Konsole&Chat ein/ausschalten
If KeyboardReleased(#PB_Key_F1) And SLC_ChatVisible = #False
SLC_Visible!1
EndIf
If KeyboardReleased(#PB_Key_T) And SLC_Visible = #False
SLC_ChatVisible = #True
EndIf
;Hoch und Runter Funktionen
If SLC_Visible = #True
If KeyboardReleased(#PB_Key_Up)
If KeyUpPressed = 0;Wenn Enter gedrückt wurde muss es zurückgesetzt werden
PreviousElements = 0;Zurücksetzten
KeyUpPressed = 1;signalisiert, dass es beim nächsten mal nicht zurückgesetzt wird
EndIf
If ListSize(SLC_Buffer())-PreviousElements-1 > 0 ;Prüfen ob das ganze innerhalb des ListenIndexes ist um Fehler zu vermeiden
PreviousElements + 1;ein LinkedList Element niedriger
SelectElement(SLC_Buffer(),ListSize(SLC_Buffer())-PreviousElements-1);das vorherige Element wird ausgewählt
PreviousElement$ = SLC_Buffer();in Variable gespeichert
LastElement(SLC_Buffer())
SLC_Buffer() = PreviousElement$;und in das Aktuelle übertragen
EndIf
ElseIf KeyboardReleased(#PB_Key_Down)
If KeyUpPressed = 1 And PreviousElements > 1;prüfen ob überhaupt ein vorheriges ausgewählt wurde
PreviousElements -1;Ein LinkedList Element höher
SelectElement(SLC_Buffer(),ListSize(SLC_Buffer())-PreviousElements-1)
PreviousElement$ = SLC_Buffer()
LastElement(SLC_Buffer())
SLC_Buffer() = PreviousElement$
EndIf
EndIf
EndIf
;Letztes Zeichen löschen
If KeyboardReleased(#PB_Key_Back)
If SLC_Visible = #True
SLC_Buffer()=Left(SLC_Buffer(),Len(SLC_Buffer())-1)
ElseIf SLC_ChatVisible = #True
SLC_ChatBuffer()=Left(SLC_ChatBuffer(),Len(SLC_ChatBuffer())-1)
EndIf
EndIf
;Befehl Ausführen&Chatten
If KeyboardReleased(#PB_Key_Return)
If SLC_Visible = #True;Bei der Konsole
If KeyUpPressed = 1;Setzt die Hoch und Runter Funktion(Pfeil rauf u. runter Tasten) zurück
KeyUpPressed = 0
EndIf
;Eventuell Case #SLC_StartOperator + <Ausdruck> verwenden
If SLC_Buffer() = "":Else; Wenn nichts eingegeben wurde, wird auch nichts hinzugefügt
If LastElement(SLC_Buffer()) And LSet(SLC_Buffer(),1) = #SLC_StartOperator; Auf befehle prüfen
RawArgument$ = SLC_Buffer(); z.B. '/fps 125'
Check$ = StringField(ReplaceString(LCase(RawArgument$),#SLC_StartOperator,""),1,#SLC_Whitespace);den Befehl herausfiltern z.B. fps
Argument$ = StringField(SLC_Buffer(),2,#SLC_Whitespace); z.B. '125' bei '/fps 125'
AddElement(SLC_Buffer())
SLC_Commands(RawArgument$,Check$,Argument$);Befehle
Else
SLC_Chat(SLC_Buffer());Wenn kein Befehl benutzt wurde z.B. kein '/', dann wird das ganze im Chat ausgegeben
EndIf
SLC_CheckAndDelete(0,#SLC_EntryLimit)
EndIf
ElseIf SLC_ChatVisible = #True;Im Chat
If SLC_ChatBuffer() = "":SLC_ChatVisible = 0:Else ;Wenn nichts eingegeben wurde, wird auch nichts hinzugefügt
SLC_PrintN(SLC_ChatBuffer());
DeleteElement(SLC_Buffer())
SLC_Chat(SLC_ChatBuffer());
SLC_ChatVisible = 0;Chat wird automatisch geschlossen
EndIf
EndIf
EndIf
EndProcedure
Procedure SLC_DrawConsoleSprite();Konsole erstellen
Shared SLC_MainTextColor,SLC_SubTextColor,SLC_ChatTextColor,SLC_MainTextColor2,SLC_SubTextColor2,SLC_ChatTextColor2,SLC_CursorColor,SLC_PreColor
Shared SLC_Width,SLC_Height
Shared SLC_BGColor,SLC_InputBGColor
Protected Pre$,Pre,OverallTextHeight,TextHeight,A$,B$
Pre$ = "Command:"
Pre = 5
LastElement(SLC_Buffer())
If StartDrawing(SpriteOutput(#SLC_ConsoleSprite))
TextHeight = TextHeight("A")
OverallTextHeight = SLC_Height-TextHeight-2
Box(0,0,SLC_Width,SLC_Height,SLC_BGColor);BG
Box(0,SLC_Height-TextHeight,SLC_Width,TextHeight,SLC_InputBGColor);InputBG
DrawingMode(#PB_2DDrawing_Transparent);Transparente Text-Mode
DrawText(Pre,SLC_Height-TextHeight,Pre$,SLC_PreColor)
;Input field
If LSet(SLC_Buffer(),1) = #SLC_StartOperator
A$ = StringField(SLC_Buffer(), 1,#SLC_Whitespace)
B$ = StringField(SLC_Buffer(), 2,#SLC_Whitespace)
DrawText(Pre*2+TextWidth(Pre$),SLC_Height-TextHeight,A$,SLC_MainTextColor2);text
DrawText(Pre*2+TextWidth(Pre$)+TextWidth(A$)+Pre,SLC_Height-TextHeight,B$,SLC_SubTextColor2);text
Else
DrawText(Pre*2+TextWidth(Pre$),SLC_Height-TextHeight-1,SLC_Buffer(),SLC_ChatTextColor2);text
EndIf
;Ausgabe
If ListSize(SLC_Buffer()) > 1
While PreviousElement(SLC_Buffer()) ;Die Liste mit den Konsoleneinträgen durchgehen.
OverallTextHeight - TextHeight
If LSet(SLC_Buffer(),1) = #SLC_StartOperator
A$ = StringField(SLC_Buffer(), 1, #SLC_Whitespace)
B$ = StringField(SLC_Buffer(), 2, #SLC_Whitespace)
DrawText(Pre,OverallTextHeight,A$,SLC_MainTextColor);text
DrawText(Pre+TextWidth(A$)+Pre,OverallTextHeight,B$,SLC_SubTextColor);text
Else
DrawText(Pre,OverallTextHeight,SLC_Buffer(),SLC_ChatTextColor);text
EndIf
Wend
EndIf
LastElement(SLC_Buffer())
If Date()&1:Line(Pre+2+TextWidth(SLC_Buffer())+TextWidth(Pre$)+2,SLC_Height-2,TextWidth(" "),0,SLC_CursorColor):EndIf;Cursor
StopDrawing():EndIf
EndProcedure
Procedure SLC_DrawChatSprite(activated = #False);Chat erstellen
Protected OverallTextHeight,TextHeight,Pre$,Pre,A$,B$
Shared SLC_ChatTextColor3,SLC_ChatPersonColor,SLC_CursorColor,SLC_PreChatColor
Shared SLC_ChatWidth,SLC_ChatHeight
Pre$ = "Chat:"
Pre = 5
LastElement(SLC_ChatBuffer())
If StartDrawing(SpriteOutput(#SLC_ChatSprite))
Box(0,0,SLC_ChatWidth,SLC_ChatHeight,RGB(193, 8, 62));BG
TextHeight = TextHeight("A")
OverallTextHeight = SLC_ChatHeight-TextHeight*2
DrawingMode(#PB_2DDrawing_Transparent);Transparente Text-Mode
If activated = #True:DrawText(Pre,SLC_ChatHeight-TextHeight*2,Pre$,SLC_PreChatColor):EndIf; Pre$ anzeigen, wenn Chat aktiviert
DrawText(Pre*2+TextWidth(Pre$),SLC_ChatHeight-TextHeight*2,SLC_ChatBuffer(),SLC_ChatTextColor3)
If ListSize(SLC_ChatBuffer()) > 1
While PreviousElement(SLC_ChatBuffer());Die Liste mit den Chatelementen durchgehen.
OverallTextHeight - TextHeight
DrawText(Pre,OverallTextHeight,SLC_ChatBuffer(),SLC_ChatTextColor3);text
Wend
EndIf
LastElement(SLC_ChatBuffer())
If Date()&1 And activated = #True:Line(Pre+TextWidth(SLC_ChatBuffer())+TextWidth(Pre$)+2,SLC_ChatHeight-TextHeight,TextWidth(" "),0,SLC_CursorColor):EndIf
StopDrawing():EndIf
EndProcedure
Procedure SLC_Render();Konsole&Chat Darstellen;
Shared SLC_Visible,SLC_ChatVisible
Shared SLC_X,SLC_Y,SLC_ChatX,SLC_ChatY
If SLC_ChatVisible = #True;Wenn der Chat Aktiviert wurde,
If Len(SLC_ChatBuffer()) < #SLC_ChatTextLimit:SLC_ChatBuffer() + KeyboardInkey():EndIf;werden neue Texteingaben hinzugefügt
SLC_DrawChatSprite(1);der Chat wird mit Cursor gezeichnet
DisplayTransparentSprite(#SLC_ChatSprite,SLC_ChatX,SLC_ChatY);und dargestellt
Else ;Wenn der Chat nicht aktiviert wurde
SLC_DrawChatSprite(0);wird der Chat ohne Cursor gezeichnet
DisplayTransparentSprite(#SLC_ChatSprite,SLC_ChatX,SLC_ChatY);und dargestellt
EndIf
If SLC_Visible = #True;Wenn die Konsole aktiviert wurde
If Len(SLC_Buffer()) < #SLC_TextLimit:SLC_Buffer() + KeyboardInkey():EndIf;;werden neue Texteingaben hinzugefügt
SLC_DrawConsoleSprite();wird die Konsole gezeichnet
DisplaySprite(#SLC_ConsoleSprite,SLC_X,SLC_Y);und dargestellt
EndIf
SLC_KeysAndActions();Hier werden Tastendrücke registriert und Aktionen umgestetzt
EndProcedure
;-Scripter Prozeduren############################################
;Platzhalter für das Plugin von Mok
;bitte auch über den Prozeduren z.B. Declare SCR_ExecFile(FileName$) um die Prozedur nutzbar zu machen
;außerdem noch in SLC_Commands() die exec funktion ergänzen
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"[S]hot[l]oad [C]onsole")
SLC_Init()
SLC_PrintN("==========================================")
SLC_PrintN("= (c) Shadow-Gamer 2010 =")
SLC_PrintN("==========================================")
SLC_PrintN("= F1 = Öffnen/Schließen =")
SLC_PrintN("= T = Chat öffnen =")
SLC_PrintN("= Pfeil Hoch/Runter = vorherige Einträge =")
SLC_PrintN("==========================================")
SLC_PrintN("Type in:"+#SLC_Return+"/quit"+#SLC_Return+"/help "+#SLC_Return+"/name <yourname>" +#SLC_Return+"/fps <yourFramesPerSecond>"+#SLC_Return+"/zahl <zahl>"+#SLC_Return+"/exec <Dateiname>(Plugin erforderlich!)")
SLC_PrintN("-----------------------------------------------------------------------------------")
Repeat
ExamineKeyboard()
ClearScreen(RGB(200,200,200))
SLC_Render()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
