2 Anfängerfragen: internet-play und datenbanken

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Donald Agu

Betreff: 2 Anfängerfragen: internet-play und datenbanken

BeitragDi, Jan 31, 2006 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hoffe, ich verärgere jetzt niemanden, aber ich hab die alten threads sowie die onlinehilfe durchgeschaut und finde da keine richtige antwort...

und zwar hab ich wie gesagt 2 anfängerfragen.

1. Wie kann ich ausgelagerte dateien in bb verwenden? Ich meine, nehm ich da irgendwelche textdateien und geb da meine variablen ein oder wie mach ich das? Oder welches format ist dazu gut? Oder geht es nur mit einem? und wenn ich die datei hab, wie verwende ich dann die variablen aus der datei in meinem prog?
In der onlinehilfe steht zwar verschiedenes zeug von read- und write-befehlen, doch das beispiel versteh ich überhaupt net und ich weiß nicht mal, ob das die einfachste lösung ist. Ich möchte nämlich einfach nur variablen aus meinem prog auslagern...


2. ich hab absolut keinen plan, wie man netzwerk programmiert. Um mir da was anzueignen, müsste ich irgendwie dahinter kommen, wie das ganze überhaupt von statten geht. Hab ich da einfach mein spiel und schreib ein paar zeilen drum herum? Oder hängt das vom prog ab, wie die codestruktur dazu aussehen muss? Wäre toll, wenn mir jemand kurz erklären könnte, wie Netzwerk- bzw. Internetspiele überhaupt funktionieren Ich hoffe jetzt nur, dass ich meine Bitte einigermaßen verständlich formuliert habe Embarassed

Herzlichen Dank im Voraus

AGU

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 31, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Was willst du denn für 'Variablen' aus einer Datei auslesen... Integer? Dann beschreib die Datei mit WriteInt und beim lesen ReadInt. Ist am einfachsten... Wenn du aber die Dateien zB mit Notepad bearbeiten willst, die dann BB auslesen kann, kannst du ReadLine nehmen und einzelne Zeilen selber 'filtern'.

Netzwerk ist für jemand der grad mit programmieren anfängt, recht schwer... Will dir das jetzt auch nicht unterstellen... Bevor du überhaupt mit Netzwerk anfängst, würde ich dir raten erstmal sich mit Vektoren und Frameunabhängiges programmieren zu beschäftigen. Ausser du willst ein RPG etc machen.

tyty

BeitragDi, Jan 31, 2006 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
zu 1:
Es gibt da einen Befehlt, der sich "Include" nennt. Mit diesem weist man auf andere Dateien im .bb Format, die daraufhin in den Code eingebunden werden.[/code]
User posted image

Kaikille suomea puhuville ihmisille: tyty = tyty the technical youngster!!!
 

Donald Agu

BeitragDi, Jan 31, 2006 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das mit dem include kenn ich aus robs bb-kurs. Aber das ist bestimmt nicht die geläufige Art, ausgelagerte Dateien zu verwenden...

---
Es handelt sich bei den Variablen in der tat weitgehend um Integer. Aber kann ich mit diesem komischen writeint jetzt nur einen wer je datei schreiben? das kann ja nicht sein, da steh ich bestimmt auf dem schlauch, aber das ist unmöglich Shocked
Denn so, wie's in der onlinehilfe beschrieben ist, schreib ich:

Code: [AUSKLAPPEN]

fileout = WRITEFILE("mydata.dat")
WRITEFILE fileout,12345678
CLOSEFILE fileout
filein = READFILE("mydata.dat")
Wert = READINT(filein)
CLOSEFILE filein
PRINT Wert


ich schreibe also eine datei, die mit einer variable gekennzeichnet wird, in diesem fall fileout. Dann wird dort der Wert 12345678 eingespeichert. Was aber nun, wenn ich an eine andere "Stelle" in "mydata.dat" einen anderen wert setzen will? Muss ich da beispielsweise schreiben:
andererwert = WRITEFILE("mydata.dat")
WRITEINT andererwert,10
...wenn der wert 10 sein soll?

denn das ist mir noch nicht so ganz klar. Question
und wenn das dann so kompliziert ist, wieso lagert man dann überhaupt dateien aus (von savegames abgesehen) Question

---

ja, das mit dem netzwerk ist so ne geschichte: einerseits bin ich zwar anfänger und beherrsche nur ein äußerst beschränktes repertoire an befehlen (ich bin ja so stolz, dass ich inzwischen arrays verwenden kann Wink ), aber mein spiel, für das ich die internetoption möchte, ist ja eigentlich schon fertig. Es hat nur eine struktur wie ein ameisenhaufen und ist eben nicht netzwerkfähig (die übrigen wehwehchen nenne ich jetzt lieber nicht, die kann ich ertragen Wink )

[/code][/syntax]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 31, 2006 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
nix nur eine Zahl in einer Datei... Bis 2GB große Dateien kannst du erzeugen...

speichern:Code: [AUSKLAPPEN]
datei=WriteFile("datei.dat")

a=13
b=17
c=42

WriteInt datei,a
WriteInt datei,b
WriteInt datei,c

CloseFile datei


lesen:Code: [AUSKLAPPEN]
datei=ReadFile("datei.dat")

a=ReadInt(datei)
b=ReadInt(datei)
c=ReadInt(datei)

CloseFile datei

Print a
Print b
Print c

WaitKey
 

Donald Agu

BeitragDi, Jan 31, 2006 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaah ja! Idea Jetzt hab ich das verstanden. Da macht es dann wohl Sinn, den Include-Befehl mit den Write und Read-Befehlen zu kombinieren, oder?

Bleibt noch die Geschichte mit dem Netzwerk... Sad

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 01, 2006 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, Netzwerk... Habe mal sowas gemacht... Können bis zu 99 Spieler am Spiel beitreten... Läuft allerdings auf TCP und ist eigentlich für derartigen Spiele nicht grad die beste Wahl... Wenn man keine Info von anderen Spielern kommt, wird weiterhin eine Berechnungsformel angewand, die angibt wo sich vermutlich jetzt der Gegenspieler befinden könnte/sollte. Um alleine den Spaß zu haben kannst du es auch über 127.0.0.1 laufen lassen. Dann sendet die Netzwerkkarte sich selber die Daten und verarbeitet sie... Zuerst immer den Host starten und dann die Clients. Wenn irgendein Client läuft kann der Host auch ausgeschaltet werden. Alle weiteren Clients melden sich dann an den vorhandenen Clients an. Also bleibt das Spiel bestehen.Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer BackBuffer()

nettyp%=0
netfrm%=0
netabc$=""
td#=0
tp#=0

Type pos
 Field xp#
 Field yp#
 Field xg#
 Field yg#
 Field id%
 Field nm$
End Type

Print "1-Host"
Print "2-Client"
wahl=Input()
If wahl=1 Then spiel=HostNetGame("IDKFA")
If wahl=2 Then spiel=JoinNetGame("IDKFA","127.0.0.1")

sp.pos=New pos
sp\xp=20
sp\yp=20
sp\xg=0
sp\yg=0
sp\nm=Input("Spielername: ")
sp\id=CreateNetPlayer(sp\nm)

td=1
tp=MilliSecs()




;Hauptschleife
While Not KeyHit(1)

 For sp.pos=Each pos
  sp\xg=sp\xg/((0.0002*td)+1)
  sp\yg=sp\yg/((0.0002*td)+1)
  sp\xp=sp\xp+sp\xg*td
  sp\yp=sp\yp+sp\yg*td
  If sp\xp<000 Then sp\xp=sp\xp+400
  If sp\xp>400 Then sp\xp=sp\xp-400
  If sp\yp<000 Then sp\yp=sp\yp+400
  If sp\yp>400 Then sp\yp=sp\yp-400
  Rect sp\xp-4,sp\yp-4,9,9,1
  Text sp\xp+6,sp\yp-6,sp\nm
 Next

 ;Nachricht empfangen
 If RecvNetMsg()=1 Then
  nettyp=NetMsgType()
  netfrm=NetMsgFrom()
  ;NachrichtTyp Neu
  If nettyp=100 Then
   sp.pos=New pos
   sp\xp=20
   sp\yp=20
   sp\xg=0
   sp\yg=0
   sp\id=netfrm
   sp\nm=NetPlayerName$(netfrm)
  End If
  ;NachrichtTyp Weg
  If nettyp=101 Then
   For sp.pos=Each pos
    If netfrm=sp\id Then Delete sp
   Next
  End If
  ;NachrichtTyp Info
  If nettyp=1 Then
   For sp.pos=Each pos
    If netfrm=sp\id Then
     sp\xp=NetMsgData()
     sp\yp=NetMsgData()
     sp\xg=NetMsgData()
     sp\yg=NetMsgData()
    End If
   Next
  End If
 Else
  ;Zeitschuld
  Delay 10
 EndIf

 sp.pos=First pos
 If KeyDown(203) Then sp\xg=sp\xg-0.001*td
 If KeyDown(205) Then sp\xg=sp\xg+0.001*td
 If KeyDown(200) Then sp\yg=sp\yg-0.001*td
 If KeyDown(208) Then sp\yg=sp\yg+0.001*td

 td=MilliSecs()-tp
 tp=MilliSecs()

 ;Alle 200ms
 ;Info senden
 If tp>ts Then
  SendNetMsg 1,sp\xp,sp\id,0
  SendNetMsg 2,sp\yp,sp\id,0
  SendNetMsg 3,sp\xg,sp\id,0
  SendNetMsg 4,sp\yg,sp\id,0
  ts=tp+200
 End If

 If KeyHit(57) Then w=1-w
 If w=1 Then Delay 80

 Flip
 Cls
Wend
StopNetGame
End
 

Ava

Gast

BeitragMi, Feb 01, 2006 1:59
Antworten mit Zitat
Wenn Du Leveldaten oder Speicherstände sichern möchtest, dann ist das mit Write / Read direkt aus dem Programm die richtige Lösung. Wenn Du Dir aber Deine Einstellungen auslagern möchtest, ist eine Ini-Datei meist die bessere Wahl (d.h. dass Du Dir selbst eine txt Datei mit dem Editor anlegst, dort die Werte hineinschreibst und sie im Programm mit Read ausliesst).

Netzwerk ist eine schwierige Sache, vorallem für Neueinsteiger. Ich habe mich vor drei Wochen selbst erst das erste Mal an ein kleines Netzwerk herangewagt (sprich nach etwa 4-5 Jahren Blitz-Erfahrung). Es ist nicht soo schwierig, wie ich es mir vorgestellt habe, aber es ist schon eine recht nervenaufreibende Sache. Confused Wenn Du in der Forensuche nach TCP oder UDP schaust, dürftest Du einige hilfreiche Themen dazu finden, die Dir zumindest ein paar Grundlagen verdeutlichen sollten. Bei Rob's Tutoriels gibt es auch eine Einführung in Netzwerke, vielleicht hilft Dir das.
 

Donald Agu

BeitragMi, Feb 01, 2006 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Ava (netzwerk)
Danke schön. ich werd mich mal umsehen, ob ich da was find.

---

(data)
Mit bleibt jedoch die Frage, WIE ich dann letztendlich die Werte ausgelagerter Dateien in eine Datei schreiben kann. Muss ich dann in die Textdatei in eine beliebige Zeile Variablennamen und Wert schreiben? Kommt mir spanisch vor...

Wenn ich da x = 3 reinschreibe und das dann mit x = READINT (dateiname) lese, dann soll im hauptprogramm x = 3 sein? Kann ich kaum glauben. Aber ich werd's ausprobieren.

ich melde mich wieder, wenns damit probleme gibt, hoffe aber, dass ich einigermaßen klar komme... Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 01, 2006 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du in eine Datei x=3 schreibst wirst du mir ReadInt nicht weit kommen, da ReadInt eine Integer-Zahl ausliest und die ist 4 Bytes lang. Du kannst per WriteInt eine Zahl mit dem Wert 3 schreiben. Diese wird dann 4 Byte in Anspruch nehmen. Das x dabei wird nicht mitgespeichert. Du muß nur wissen das die erste Zahl in der Datei die x-Variable ist etc... Dateien wo WriteInt drin rumgeschrieben hat, sind keine Textdateien, da sie auch die ASCII-Steuercodes beinhalten können.
 

Donald Agu

BeitragMi, Feb 01, 2006 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hää?? Aber Ava hat doch was von "in eine txt-Datei schreiben" gesagt. Wie mach iach denn das dann?
Außerdem stell ich mir folgende Frage:
Code: [AUSKLAPPEN]

datei = WriteFile("datei.txt")
WriteInt datei,1
WriteInt datei,2
WriteInt datei,3
CloseFile datei
h = ReadFile("datei.txt")
a = ReadInt(h)
b = ReadInt(h)
c = ReadInt(h)
CloseFile h
Print a
Print b
Print c


Wieso erscheint beim Ausführen des Programms auf dem Screen:
1
2
3

Woher weiß BB, an welcher Stelle es den Wert aus der Datei auslesen muss? Mir fehlt hier nämlich sehnsüchtigst ein Parameter, mit dem ich eben genau DAS bestimmen kann. Confused
Denn so wüsste ich nicht, wie ich sinnvoll Schleifen zum Einlesen von Data bauen könnte. Was ist denn z.B., wenn ich gar nicht den zuerst gespeicherten Wert, sondern z.B. den zweiten auslesen will?

Das ist irgendwie ziemlich konfus. Hilfe! Crying or Very sad
 

Roseman

BeitragMi, Feb 01, 2006 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal die Befehle SeekFile und FilePos an, wenn du die aktuelle Zeigerposition in der Datei verändern willst.

Allgemein solltest du dir aufschreiben, wie dein Dateiformat aussehen soll.

Beispielsweise stehen dann folgende Wert in der Datei:
100
23
55
1222

Diese haben dann folgende z.B. folgende Bedeutung (genau in dieser Reihenfolge):
Lebenspunkte
Magiepunkte
Stärke
Geld


So ähnlich kannst du dir dein Format aufbauen, wenn du nur mit Integer arbeiten willst, und nicht erst deine Datei parsen willst.
 

Ava

Gast

BeitragMi, Feb 01, 2006 19:04
Antworten mit Zitat
Donald Agu hat Folgendes geschrieben:
Wieso erscheint beim Ausführen des Programms auf dem Screen:
1
2
3


*grins* Das ist doch eigentlich ganz einfach: weil in die Datei geschrieben wurde: erst 1, dann 2, dann 3. Genau in dieser Reihenfolge wird es später auch wieder ausgelesen! Wink

Zu dem was ich Dir schrieb ... Du hast natürlich recht, dass Blitz nicht selbstständig Dein x auf 3 setzt, wenn Du in eine Textdatei "X=3" hineinschreibst und dieses einfach nur ausliesst! Da muss man schon ein kleines bisschen selbst Hand anlegen! Um Dein Beispiel aufzugreifen, Du schreibst "X=3" in Deine Textdatei und möchtest anschliessend diese Datei interpretieren, dann musst Du sie Zeile für Zeile mit ReadLine auslesen (anstatt mit ReadInt oder ähnlichem). Anschliessend musst Du die eingelesene Zeile analysieren und zerpflücken. Der Aufbau "x=3" ist recht einfach: "x" ist die Variable, "=" ist das Trennzeichen und "3" ist der Wert. Du suchst also in dem ausgelesenen String nach dem "=" (der Befehl ist InStr), dieser gibt Dir dann die Position des "=" im String zurück. Mit dieser Position kannst Du in dann in Variable und Wert aufteilen. Für ersteres musst Du den Left Befehl verwenden, letzteres kannst Du mit dem Mid Befehl extrahieren. Dann nimmst Du die ausgelesene Variable und setzt sie am besten in eine Select / Case Struktur zur Auswahl. In der Select / Case Struktur richtest Du dann einen Case "x" an und als Befehl dorthin x = int(wert). Du kannst dann für jede Variable, die in Deiner Textdatei enthalten ist, einen entsprechenden Case anlegen und die Zuweisung dort umsetzen. Fertig. Klingt kompliziert und aufwendig, ist eigentlich aber gar nicht schwierig und in vielen Situationen sehr hilfreich! Dieses System lässt sich ja auch noch sehr weit ausbauen. Je nach individuellem Bedürfnis muss man es halt entsprechend anpassen. Zb. mehrere Befehle in einer einzigen Zeile unterbringen und auch mehrere und unterschiedlich viele Parameter pro Befehl, dass ist mit etwas Geschick alles umzusetzen. Wink
 

Donald Agu

BeitragDo, Feb 02, 2006 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber ich verstehe lider echt nur Bahnhof. Crying or Very sad

Da bräucht ich schon ein Beispiel, um das zu kapieren...
und ist das dann die bessere (bzw. geläufigere oder praktischere oder schnellere oder wasweißichwas) Methode, mit Readline zu arbeiten? Oder ist Readint besser? Oder gar Sekfile und Filepos, wie Roseman vorgeschlagen hat? Question Question Question
 

Ava

Gast

BeitragDo, Feb 02, 2006 16:04
Antworten mit Zitat
Auf Deine Frage gibt es keine pauschale Antwort. Es kommt immer darauf an, was genau Du vorhast und dem entsprechend musst Du Dir dann Deine Lösung auswählen.

Schneller ist es natürlich immer, wenn Du Dir ein eigenes Dateiformat anlegst und es direkt ausliesst (mit ReadByte, ReadInt, ReadFloat, ReadString...)


Das Beispiel. was Du verlangt hast....Code: [AUSKLAPPEN]
f = readFile("dateiname.txt")

while not eof(f)

ausgelesener_string$ = ReadLine(f)
trenn_position = InStr(ausgelesener_string, "=")
variable_name$ = trim(left(ausgelesener_string, trenn_position - 1))
variable_wert$ = trim(mid(ausgelesener_string, trenn_position + 1))

select lower(variable_name)

case "name" : spieler_name = variable_wert
case "x" : spieler_x = int(variable_wert)
case "y" : spieler_y = int(variable_wert)

end select

wend


Code: [AUSKLAPPEN]
name=noob
x=5
y=10


Das untere ist der Inhalt der Textdatei.
Den Code habe ich nicht getestet! Es ist nur ein ganz spontanes Beispiel und dient lediglich der Veranschaulichung meines vorherigen Posts. Rolling Eyes
 

Donald Agu

BeitragDo, Feb 02, 2006 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank fürs Beispiel, Ava. Muss ja gar nicht funktionieren, ich hab's ja verstanden Smile

Gar nicht so leicht, aber mit der ganzen Hilfe werd ich das wohl irgendwie auf die Reihe bringen...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group