 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 15.05.2011, 11:55 Titel: X-the forgotten battles |
|
|
Auf Bitte eines Forenmitglieds erstelle ich diesen Thread zu meinem unfertigen Spiel, welches ich bereits auf freebasic-portal.de vorgestellt habe.
- X-the forgotten battles -
- Kurzinfo
X-the forgotten battles ist eine 3D-Spacesimulation, welche im X-Universum der X-Spiele von Egosoft stattfindet. Dabei konzentriere ich mich auf die aus den X-Spielen bekannten Themen:
-Trade-
Handel in über 80 Sektoren mit 6 verschiedenen Alienrassen.
-Fight-
Kämpfe gegen 2 feindliche Alienrassen oder gegen die Piraten und werde so zum Held der Gemeinschaft der Planeten.
-Build-
Baue dir eigene Stationen, wie zum Beispiel Sonnenkraftwerke, Waffenfabriken oder gehe ein Risiko ein und produziere das illegal Raumkraut oder gebrannten Raumsprit/Whisky.
-Think-
Tune dein Raumschiff, um den ständigen Angriffen der Piraten standzuhalten. Neue Waffen,Schilde oder Antriebe.
- Programmiertechnisches
Der für euch wahrscheinlich wichtigere Teil.
Das Spiel wird in, wer hätte es gedacht, FreeBasic programmiert. Zur Realisierung der 3D-Spielwelt wird dafür die minib3d-Bibliothek genutzt.
Sobald das Spiel fertig ist, wird es für euch OpenSource sein und steht unter der WTFPL(Do what the fuck you want to Public License).
Momentan ist der Code 2290 Zeilen reinen FB-Codes groß, welcher rasch steigt.
- Screenshots
(Klicken zum vergrößern)
- Aktueller Stand
Folgendes funktioniert bereits:
-Fliegen
-Maps laden
-In externen Dateien definierte Raumschiffe und Waren laden und anzeigen in der Map
-Bordcomputer
-Container aufsammeln
-Ansatz einer Scriptenginge
-Sprungtore, verschiedene Sektoren
-Asteroiden
-Logbuch
-Funktionierende Laser
(Das klingt jetzt nicht viel, aber dadurch, dass alles über externe Dateien modifiziert werden kann, ist die Programmierarbeit zum Großteil getan)
Das wird als nächstes fertiggestellt, bis es zur (zweiten) Demo kommt:
-Stationen
-Mit Stationen handeln
- Credits
Konzept, Ideen:
-Westbeam aka Aletes
-So ziemlich alle der Xfans-Community
-Yomyo aus dem Egosoft-Forum
-Egosoft
Programmierung:
-Westbeam aka Aletes
(-Hilfe bei Probleme: Die FreeBasic-Community, also ihr )
Modellierung:
-Westbeam aka Aletes mit Wings3D
-Texturen von Egosoft
2D-Grafik:
-Westbeam aka Aletes mit GIMP
Music:
-Delois aus dem Xfans-Forum
- Hilfe
Hilfe kann ich immer gerne gebrauchen, besonders bei meiner unfertigen Scriptengine und bei der Modellierung könnte ich Hilfe gebrauchen.
Wer also gerne Helfen möchte, der kann sich melden. Dementsprechend bekommt er natürlich einen Crediteintrag im Spiel.
- Changelog
-23.5.11
-"Supersonnen"
-Asteroiden
-funktionierende Sprungtore
-Mehrere Sektoren
mfg, Westbeam aka Aletes
Zuletzt bearbeitet von Westbeam am 29.05.2011, 16:30, insgesamt 5-mal bearbeitet |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 15.05.2011, 12:40 Titel: |
|
|
Das sieht verdammt gut aus, was man so auf den Screenshots sehen kann.
Zu deiner Hilfe-Anfrage: Wie ist denn deine Scripting-Engine grundsätzlich aufgebaut? Vielleicht könnte ich dir dabei ein wenig unter die Arme greifen. Für einen Bekannten habe ich schon mal so eine Art Ingame-Terminal (so wie man es z.B. bei Source-Spielen findet) gerade gerückt, als der Bekannte nicht mehr weiter wusste. _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 15.05.2011, 12:45 Titel: |
|
|
Mein Scripsystemansatz schaut so aus:
Code: | Sub LoadScript(file As String)
Dim As Integer scriptfile=Freefile
Dim As Integer i,durch,zy=10
Open file For Input As scriptfile
Input #scriptfile,durch
For i=1 To durch
Line Input #scriptfile, Zeil
aZeile=stringPutz(Zeil,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.,:;-_!§$%&/()=?ß*'+# ")
If Instr(aZeile,";") Then
Dim As Integer possem=Instr(aZeile,";")
Zeile=Left(aZeile,possem-1)
Else
Zeile=aZeile
End If
If Instr(Lcase(Zeile),"message ") Then
If Mid(Zeile,9)="%FPS%" Then
Draw String(10,zy),""&FPS
Else
Draw String(10,zy),Mid(Zeile,9)
End If
zy+=15
End If
Next
Close scriptfile
End Sub |
Allerdings weiß ich nicht so richtig, wie ich Variablen oder die Grundrechenarten realisieren soll. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 15.05.2011, 12:49 Titel: |
|
|
Das sieht... bescheiden aus
Wenn du mir die Spezifikationen der Scriptsprache gibst, kann ich dir vielleicht etwas daraus bauen... aber: In letzter Zeit komme ich eher wenig zum Programmieren, es könnte also ein Weilchen dauern. _________________ Milch ftw  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.05.2011, 12:57 Titel: |
|
|
Wie wär's mit Lua/Python/etc.? Dafür gibt's doch bestimmt auch FB-Bindings, oder man kann sie aus C übersetzen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 15.05.2011, 13:05 Titel: |
|
|
Ja. Aber ich versuche eine ähnliche Scriptsprache wie die aus den X-Spielen zu schaffen, damit Fans der Reihe nichts großartig neues lernen müssen.
@MilkFreeze:
Ich benötige das Definieren von Variablen(String und Integer), If-Abfragen, die 4 Grundrechenarten und das Anzeigen der Variablen. Alles andere kriege ich hin.  |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 15.05.2011, 13:51 Titel: |
|
|
Ohne die Syntax deiner gewünschten Skriptsprache anzugeben wird niemand eine Skriptsprache nach deinen Wünschen kreieren (außer demjenigen wären die genannten Spiele und deren Skriptsprache bekannt).
Schon allein bei der Definition von Variablen gibt es z.B. schon deutlich verschiedene Ansätze. Gleiches gilt für den Abschluss von Befehlen, IF-Statements, usw. usf.
Um ein Beispiel anzuführen: Für die Definition von Variablen gibt es verschiedenste Konstrukte:
Code: | var
myVar: Integer;
|
Code: | dim myVar as Integer |
Oder - wie aus VB bekannt - können diese auch implizit definiert werden.
Nebenbei genannt sei, dass eine Skriptsprache selbst ordentlich zu implementieren schon fast ein eigenes großes Projekt ist - je nachdem wie umfangreich die Skriptsprache werden soll. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 15.05.2011, 13:57 Titel: |
|
|
Die Syntax hatte ich mir so vorgestellt:
Code: | start {
%intvar=0
$stringvar="test"
}
always {
message "Test: "+$stringvar
%intvar=15+310
if (intvar=325) {
message %intvar
} else {
message "Fail"
}
} |
Der Codeblock "start" wird nur einmal beim Starten des Spiels ausgeführt. Der Codeblock "always" wird immer ausgeführt, während des gesammten Spiels. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 15.05.2011, 16:32 Titel: |
|
|
Kleine Bemerkung am Rande: Zum Parsen und Berechnen von mathematischen Termen gibt es bereits was fertiges. Ich habe dazu fbeval genommen; das liegt z. B. meinem monopolZ bei. Die reicht für alle Berechnungen, mit denen man "normalerweise" zu tun hat (inklusive aber nicht ausschließlich Grundrechenarten, Potenz, Klammern und logischen Operatoren). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 15.05.2011, 16:58 Titel: |
|
|
Von der Architektur her ist so ein Parser auch nicht sehr Komplex. Du brauchst nur:
* Eine Struktur für die verschiedenen Codeblöcke
* Einen "Vor-Parser", der dir
- die Blöcke zerlegt und sortiert
- Die Variablen deklariert (inklusive initialwert)
* Einen Parser der
- Anweisungen in Befehl und Parameter zerlegt
- Werte-Zuweisungen und Rechnungen erkennt
- Variablen in Berechnungen durch die Werte ersetzt¹
- Rekursionen händelt²
- IF-Statements prüft
- Die Anweisungen an den Ausführenden Teil weiter reicht
* Den "Ausführer":
- Nimmt die Befehle + Parameterliste entgegen
- "Übersetzt" die Befehle in reale Aktionen im programm -> Select Case ist da sehr hilfreich
Ist nur eine sehr sehr grobe Architektur und ich würde das bei Performance-Kritischen dingen nicht unbedingt so umsetzen, da der Komplette Code immer wieder neu geparsed werden muss, sofern nicht weitere Optimierungen erfolgen, die ich hier bewusst nicht erwähnt habe.
Aber ich denke für deine Anforderungen sollte das reichen.
Tante Edit erinnert mich gerade daran das du auch eine Struktur (Linkedlist?) für die Variablen brauchst.
-------------
Fußnoten:
¹: Vorrausgesetzt die Lib die Nemored erwähnt hat tut dies nicht automatisch
²: Wenn benötigt _________________ Milch ftw  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 15.05.2011, 19:29 Titel: |
|
|
Variablen kann man mit fbeval verwenden, aber ich habe das noch nie probiert; ich habe die Variablen "per Hand" ersetzt, weil das in meinem Fall leichter war. Ich kann daher nicht sagen, wie gut der Einsatz von Variablen umgesetzt ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 16.05.2011, 16:33 Titel: |
|
|
Zur Scriptsprache,
ich habe mich gestern mal hingehockt und was zusammengeschrieben.
Die syntaxen sehen so aus:
Code: | intvar=0;
stringvar="test";
always {
message("Test: "+stringvar);
intvar=15+310;
if (intvar=325) {
message(intvar);
} else {
message("Fail");
}
return = "OK";
} |
eine variable kann einen String oder einen Double speichern.
variablen, die auserhalb einer function declarirt werden sind global,
am ende jedes befehls wird ein ; benoetigt,
Rekursionen werden unterstuetzt.
Im Program mueste man fuer dieses script dann folgendes schreiben:
Code: | Sub Script_Message(byval In as SIVariant)
print "Message: "+In
end Sub
Register("message",1,0,@Script_Message)
Dim FF as Integer
Dim as String D,L
open "Script.txt" for input as #FF
do
line input #FF,L
D += L
loop until eof(FF)
close(FF)
Compile(D)
print GetVar("stringvar")
SetVar("stringvar","Veraendert")
print CallFunc("always","")
CloseScript()
|
Zu den Functionen:
Register:
Parameter 1 = Name der Function im Script
Parameter 2 = Anzahl der parameter der Function
Parameter 3 = 1 = Function, 0 = Sub
Parameter 4 = Zeiger zur Function
Return = -1 wenn erfolgreich, 0 wenn gescheitert
Compile:
Parameter 1 = Script
Return = -1 wenn erfolgreich, 0 wenn gescheitert
GetVar:
Parameter 1 = Name der Variable im Script (nur Globale variablen)
return = Variable wert
SetVar:
Parameter 1 = Name der Variable im Script (nur Globale variablen)
Parameter 2 = Neuer wert
CallFunc:
Parameter 1 = Name der Function im Script
Parameter 2 = FormatString = "%s"and"%d"and"%i"
Parameter ... = Eingabewert X, soll mit FormatString uebereinstimmen
return = return wert
wenn du interresse hast kannst kann ich mal den code hochladen. ein paar kleine verbesserungen muss ich aber noch machen.
Variablen werder uebrigens bei mir in Tabellen gespeichert.
Terme werden korrekt aufgeloest.
Noch ein beispiel zu einer Rekursionen:
Code: | Rekursion(i)
{
if (i<=1)
{
return = 1;
}
else
{
return = Rekursion(i-1)*i;
}
}
|
|
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 16.05.2011, 17:07 Titel: |
|
|
Das sieht super aus, danke.
Ich wäre dir sehr verbunden, wenn du es hochladen kannst. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 16.05.2011, 17:11 Titel: |
|
|
Werde ich nach der Schule machen.
So habe die datein mal hochgeladen.
Du brauchst die beiden: Tabelle.bi und Script.bi
Hier ein beispiel:
Script:
Code: | Set(i)
{
if(i=1)
{
return = 1;
}
else
{
return = Set(i-1)*i;
}
}
WriteZahlen(l,h)
{
do(l<=h)
{
write(l);
l = l + 1;
}
}
testprom
{
write(prom(1,3));
} |
bas:
Code: | #Include "Script.bi"
Dim FF As Integer
Dim As String D,L
FF = FreeFile
Open "Script.txt" For Input As #FF
Do
Line Input #FF,L
D += L
Loop Until Eof(FF)
Close(FF)
Sub Script_Write ( ByVal In As SIVariant )
Print "write: "+In
End Sub
Function Script_Prom ( ByVal In1 As SIVariant, ByVal In2 As SIVariant ) As SIVariant
Return (In1+In2)/2
End Function
Register ( "write" , 1 , 0 , @Script_Write )
Register ( "prom" , 2 , 1 , @Script_Prom )
Compile ( D )
Print CallFunc ( "Set","%i",4 )
Print CallFunc ( "WriteZahlen","%i %i",4,10 )
Print CallFunc ( "testprom","" )
Close_Script ()
Sleep |
es kann noch fehler geben. Wenn man mir sagt was falsch leuft, kann ich schauen dass ich das verbessere.
Ich hoffe das hat geholfen.
Edit:
Habe noch ein bischen am Script gearbeitet.
Hier ist die Neue version.
Bsp:
Code: | #Include "Script.bi"
Dim S As SCRIPT
Sub Script_Write ( ByVal In As SCRIPT_VARIANT )
Print "write: "+In
End Sub
Function Script_Prom ( ByVal In1 As SCRIPT_VARIANT, ByVal In2 As SCRIPT_VARIANT ) As SCRIPT_VARIANT
Return (In1+In2)/2
End Function
S.Create()
S.Register ( "write" , 1 , 0 , @Script_Write )
S.Register ( "prom" , 2 , 1 , @Script_Prom )
S.CompileFromFile ( "Script.txt" )
Print S.CallFunc ( "Set","%i",4 )
S.CallSub ( "WriteZahlen","%i %i",4,10 )
S.CallSub ( "testprom","" )
S.Destroy ()
Sleep
|
Functionen die man im SCRIPT type hat:
Function SCRIPT.Create () As Integer
Function SCRIPT.Register ( ByVal As String, ByVal As Integer, ByVal As Integer, ByVal As Any Ptr ) As Integer
Property SCRIPT.GlobalVar ( ByVal As String, ByVal As SCRIPT_VARIANT )
Property SCRIPT.GlobalVar ( ByVal As String ) As SCRIPT_VARIANT
Function SCRIPT.CompileFromString ( ByVal As String ) As Integer
Function SCRIPT.CompileFromFile ( ByVal As String ) As Integer
Function SCRIPT.CallFunc Cdecl ( ByVal As String, ByVal As String, ... ) As SCRIPT_VARIANT
Sub SCRIPT.CallSub Cdecl ( ByVal As String, ByVal As String, ... )
Sub SCRIPT.Destroy ()
Sub SCRIPT.Undef ( ByVal As String )
eigentlich selbstklaerend.
Neu im Script:
for(i=1,i>3,i=i+1) Parameter1 = wir dam start gemacht, Wenn Parameter2 = true beenden, Paremeter3 immer am ende von einer schleife. for kann nicht mit undef geloescht werden.
| = or
& = and
! = not
!= ungleich
das wars auch schon. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 23.05.2011, 18:29 Titel: |
|
|
*Update*
Neu hinzugekommen:
-"Supersonnen"
-Asteroiden
-funktionierende Sprungtore
-Mehrere Sektoren
2 neue Screenshots, welche in der Screenshotliste oben zu sehen sind.
Feedback bitte.
@XOR
Habe eben erst gesehen, dass du es hochgeladen hast. Ich schaue es mir mal an. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 23.05.2011, 20:42 Titel: |
|
|
@XOR ... du hast n bug im source:
Code: | Case "A" To "Z","A" To "Z","0" To "9","_" |
soll wohl heißen:
Code: | Case "a" To "z","A" To "Z","0" To "9","_" |
und, wenn du stat
Code: | Select Case Mid(S,i,1) |
folgendes nutzt, gehts auch etwas schneller mit der abarbeitung:
Code: | Select Case S[i - 1] |
entsprechend stat obriger zeile folgendes nutzen:
Code: | Case 97 to 122, 65 to 90, 48 to 57, 95 'Case "a" To "z","A" To "Z","0" To "9","_" |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 23.05.2011, 21:15 Titel: |
|
|
Zitat: | @XOR ... du hast n bug im source:
Code:
Case "A" To "Z","A" To "Z","0" To "9","_"
soll wohl heißen:
Code:
Case "a" To "z","A" To "Z","0" To "9","_"
und, wenn du stat |
im quellcode ist es richtig, da scheint die erweiterun fuer FBEdit nicht rivhtig zu functioniren, wenn ich mir aber von FBEdit aus das anschaure ists korrect. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 23.05.2011, 21:36 Titel: |
|
|
Ich nehme mal an es geht um meine Erweiterung "fb:porticula NoPaste" für FBedit.
Dabei muss ich meine Erweiterung verteidigen
Die Erweiterung funktioniert, wie sie soll und der Quellcode wird auch richtig gespeichert. Schuld ist allein das Portal-Skript, das die Zeichen zur Anzeige in Großbuchstaben umwandelt. Wenn man die Datei herunterlädt (Dateidownload Button im Portal) sind die Zeichen korrekt.
Vielleicht hat Sebastian einmal Zeit das zu beheben? _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 23.05.2011, 21:38 Titel: |
|
|
ok .. dann nehme ich die schuldzuweisung an XOR zurück und übertrage sie an den coder des Porticular-Code's
Sorry @XOR
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Zuletzt bearbeitet von ThePuppetMaster am 23.05.2011, 21:39, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|