Toon posts:

[C#] Schrijven naar een tekstfile *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een game in C#. Nu wil ik de gespeelde game saven en kunnen 'replayen'
Daarvoor leek me het makkelijkst om de keys wie ingedrukt worden op teslaan in een tekst file. Met deze code hieronder schrijft hij de laatst gedrukte toets naar de tekstfile. Maar ik wil dus dat hij alle toetsen opslaat onder elkaar. Hoe pak ik dit aan?

C#: filename
1
2
3
4
5
6
7
8
9
// write a text file
            TextWriter tws = new StreamWriter(@"C:\save.txt");

            
            // write test strings to the stream
            
            tws.WriteLine("D" + e.KeyCode.ToString());
            
            tws.Close();   // close the stream

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23-09 22:06

TeeDee

CQB 241

Door de KeyCode / String te Appenden aan het tekstbestand.

[ Voor 36% gewijzigd door TeeDee op 10-04-2009 13:38 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 06:03
code:
1
e.KeyCode


Hint... dit in een loop afvangen en bij bepaalde keycode loop beeindigen
Edit: Koffie/lezen O-)

[ Voor 10% gewijzigd door asfaloth_arwen op 10-04-2009 13:45 ]

Specs


Acties:
  • 0 Henk 'm!

  • Forcepoint
  • Registratie: Januari 2007
  • Laatst online: 22-09 23:07
Wat voor soort spel maak je? Het opslaan van de toetsaanslagen is niet echt ideaal als savegame denk ik...

[ Voor 13% gewijzigd door Forcepoint op 10-04-2009 13:38 ]


Acties:
  • 0 Henk 'm!

  • Exterazzo
  • Registratie: Mei 2000
  • Laatst online: 12:37

Exterazzo

Qeasy

http://www.google.nl/search?q=C%23%20append%20to%20textfile

Daarnaast weet ik niet of het een goede oplossing is, maar kan zo 1,2,3 ook niks anders bedenken. Als je het op deze manier doet, zou ik ook een timestamp mee opslaan, anders weet je natuurlijk nooit wat voor periode er tussen de toetsaanslagen zit.

Audentia


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
TeeDee geeft inderdaad al het juiste antwoord. http://msdn.microsoft.com/en-us/library/36b035cb.aspx

Verder ben ik het eens dat het slimmer is om bijvoorbeel de acties die genomen worden d.m.v. een knop in te drukken op te slaan en niet de toets-aanslag zelf. Dan ben je later ook niet afhankelijk als iemand een andere besturing heeft, of als je zelf de besturing aanpast. Op die manier kun je ook makkelijker de acties van een computer speler op slaan.

Het ligt er natuurlijk aan wat voor spel je hebt of het ook belangrijk is om een time-stamp ( relatief vanaf de start van je spel ) op te slaan.

Ook is het slim om te zorgen dat je je resources weer opruimt nadat je ze gebruikt hebt. Als je je textwriter maar in een methode gebruikt kan je gebruik maken van het using statement
C#:
1
2
3
4
5
using(TextWriter tws = new StreamWriter(@"C:\save.txt"))
{
    //hier kun je tws gebruiken.
}
//Hier is tws netjes geclosed en gedisposed

Op deze manier weet je zeker dat je geen resources lekt als er bijvoorbeeld een exception optreed.

[ Voor 9% gewijzigd door Woy op 10-04-2009 13:48 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Forcepoint schreef op vrijdag 10 april 2009 @ 13:38:
Wat voor soort spel maak je? Het opslaan van de toetsaanslagen is niet echt ideaal als savegame denk ik...
Bedankt voor de snelle reacties.

Het gaat om pong, 2 bats en een bal over rs232.

De "D" staat voor key down en ik heb een "U" voor key up. Dus keycode is de toets wie ik op dat moment in druk, naar boven of beneden.

Dus als ik die waardes later weer als input gebruik kan ik als ware het spel laten herspelen.

Verder wil ik nog gebruik maken van de save en openfiledialog.

[ Voor 5% gewijzigd door Verwijderd op 10-04-2009 13:51 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Met een multiplayer zal je ws iets van locking / queue-ing nog moeten gebruiken. Een locked file levert anders een exception op en het openen en weer sluiten is relatief traag.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit verduidelijkt het denk ik een beetje.

C#: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 private void TinyTennis_KeyDown(object sender, KeyEventArgs e)
        {
            //Pass the key presses to the bats
            if (localplayer == 0)
            {
            _player1.KeyDown(e.KeyCode);
            }
            if (localplayer == 1)
            {
            _player2.KeyDown(e.KeyCode);
            }
            WritePort("D"+e.KeyCode.ToString());

            // write a text file
            TextWriter tws = new StreamWriter(@"C:\Users\Jelle\Documents\Pong Jelle en Tim\pongsave\tekst.txt");

            
            // write test strings to the stream
            
            tws.WriteLine("D" + e.KeyCode.ToString());
            
            tws.Close();   // close the stream

        
            
        }

        private void TinyTennis_KeyUp(object sender, KeyEventArgs e)
        {
            //Pass the key presses to the bats
            if (localplayer == 0)
            {
                _player1.KeyUp(e.KeyCode);
            }
            if (localplayer == 1)
            {
                _player2.KeyUp(e.KeyCode);
            }
            WritePort("U"+e.KeyCode.ToString());
            
        }


Zoals je kunt zien stuur ik de "besturing" door naar een compoort met behulp van WritePort

Maar nu wil ik ook dat ie het naar een tekstfile stuurd, hetzelfde dan als naar de poort

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Verwijderd schreef op vrijdag 10 april 2009 @ 13:48:
[...]


Bedankt voor de snelle reacties.

Het gaat om pong, 2 bats en een bal over rs232.

De "D" staat voor key down en ik heb een "U" voor key up. Dus keycode is de toets wie ik op dat moment in druk, naar boven of beneden.

Dus als ik die waardes later weer als input gebruik kan ik als ware het spel laten herspelen.

Verder wil ik nog gebruik maken van de save en openfiledialog.
Gebruik een simpele client-server architectuur:
  1. De client converteert de toetsaanslag naar een actie.
  2. De client stuurt de actie naar de server.
  3. De server en client muteren beiden, individueel de positie van de paddle(s).
  4. De server stuurt de gemuteerde positie naar de client.
  5. De client interpoleert tussen zijn eigen resultaat en het resultaat van de server voor het afbeelden van de positie van de paddle.
Op deze manier is het afspelen van een replay niets anders dan een gecachte versie van alle commando's die de server terug heeft gestuurd naar de client, met client-side interpolatie uitgeschakeld. Dit vereist uiteraard wel dat alle gameplay logica server-side afgehandeld wordt. De client wordt feitelijk niets anders dan een 'thin client' die alleen de grafische representatie en input conversie afhandelt (en daarnaast voor de gladheid en respons een eigen lokale versie van de mutaties van de eigen speler paddle runt, okee...)

Dit is hoe onder andere Quake 3 Arena werkt. Uitermate schaalbaar naar grotere situaties, dus.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
En wat lukt er niet met de antwoorden die je tot nu toe al gehad hebt?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Moet je niet perse aangeven dat je wilt appenden aan een textfile?

C#:
1
2
3
4
5
string path = @"c:\test.txt";
using (System.IO.TextWriter tw = System.IO.File.AppendText(path))
{
    tw.WriteLine("D" + e.KeyCode.ToString()); 
}


Anders wordt het bestand elke keer overschreven en zie je alleen de laatste write terug.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op vrijdag 10 april 2009 @ 14:18:
En wat lukt er niet met de antwoorden die je tot nu toe al gehad hebt?
Alvast bedankt iedereen.

Ik heb het voor elkaar gekregen dat hij alle commando's opslaat onder elkaar in een tekstfile wie ik nodig heb. De volgende stap is dat dat wat ik opgeslagen heb weer als input wil gebruiken.

Ook wil ik het zelf kunnen saven en open met behulp van de save/openfiledialog

Iemand wie mij weer opweg kan helpen?

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Heb je überhaupt zelf wel geprobeerd om die tekstfile weer in te lezen, of moeten we het helemaal voorkauwen? :?

In elk geval kun je hier lezen hoe je simpele tekstbestanden leest: http://www.csharp-station.com/HowTo/ReadWriteTextFile.aspx

Wat betreft het save/open filedialog, daar is echt de wereld aan voorbeelden van te vinden (net als over lezen/schrijven van tekstbestanden overigens) via Google.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 10 april 2009 @ 16:22:
[...]
Ook wil ik het zelf kunnen saven en open met behulp van de save/openfiledialog

Iemand wie mij weer opweg kan helpen?
Je bent een game aan het maken die over netwerk gespeeld zal worden (naar aanleiding van wat ik gelezen heb) maar bent niet instaat zelf te zoeken op save/opendialog? Dit komt op mij over alsof je kant en klare code zoekt voor een "plannetje". Bij een zoekopdracht bij Google op C# save dialog krijg ik ale 270K + hits... denk dat hier minstens 1 stukje code moet tussen zitten welke aan jou eisen voldoet, verder wil ik je als tip meegeven om eens te kijken naar de System.IO.BinaryWriter Class in het .NET framework voor het opslaan van games (bespaart ons weer een topic O-) )

[ Voor 11% gewijzigd door Verwijderd op 10-04-2009 18:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

waarom laat je de aanslagen niet eerst in een memory stream en dan pas als je helemaal klaar bent deze wegschrijven naar text file ?

qua performance zou dat ook sneller moeten zijn

Acties:
  • 0 Henk 'm!

Verwijderd

correct me if i'm wrong, maar is het bij pong toch ook wel erg belangrijk hoelang en wanneer een toets wordt ingedrukt? ben je er zeker van dat het balletje exact nagespeeld kan worden door de posities van de bats op te slaan. Wat als het traject van de bal net even anders is in de replay dan klopt het voor geen meter meer!
Pagina: 1