Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.01.2010, 18:46

Position Server übermitteln?

Hallo,

Nachdem ich soeben das Problem mit den Effekt gelöst
hab und es jetzt wunderbar funktioniert, habe ich jetzt sofort
wieder eine Frage parat, undzwar arbeite ich an einem Online-Mode,
hab schon einen kleinen Chat und sogar mit Mikro gebaut,
war ganz schön und hat funktioniert.

Jetzt ist aber das Problem das ich nicht weiß, ich die Position
des Charackters dem Server übermittle so das bei beiden
sich der Charackter bewegt, wenn man was drückt.

Ich weiß nur wie man Text übermittelt, beim Mikro hab ich
mir den Code von diesem voip programm angeschaut und dann
eingebaut.

Hat vielleicht jemand ein Beispiel-Code parat, oder kann man
mir sagen wie ich das hinbekomm?

So siehts in meinen Gedanken aus: ( :lol: )

C-/C++-Quelltext

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
42
43
44
45
46
47
48
49
50
void CMenue::DoClientUDP(unsigned short Port)
{
//Instanz...


    sf::IPAddress ServerAddress;
    do
    {
        std::cout << "Type address or name of the server to send the message to : ";
        std::cin  >> ServerAddress;
    }
    while (!ServerAddress.IsValid());

    sf::SocketUDP Client;
    sf::Packet CharPosition;
    CharPosition<<Jumper->OnlineModeSettings();

    if (Client.Send(CharPosition, ServerAddress, Port) != sf::Socket::Done)
        return;

    Client.Close();
}

void CMenue::DoServerUDP(unsigned short Port)
{
//Instanz...


    sf::SocketUDP Server;

    if (!Server.Bind(Port))
        return;

    sf::IPAddress ClientAddress;
    unsigned short ClientPort;
    sf::Packet CharPosition;
    CharPosition<<Jumper->OnlineModeSettings();

    std::size_t Received;
    if (Server.Receive(CharPosition, NULL, Received, ClientAddress, ClientPort) != sf::Socket::Done)
        return;

    Server.Close();
}

//.. Funktion:


float CJumper::OnlineModeSettings()
{
    Sprites[0].GetPosition();
//... hier sollte dann mehr stehen...

}


Nur so meine gedanken, ... ich weiß das funktioniert nicht
aber vielleicht versteht man in welche Richtung was ich machen
will.

Vielen dank schonmal im Vohrraus!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

30.01.2010, 18:57

Es heißt "voraus" nicht "vor raus" oder "vohrraus" ;) . Mit welcher Netzwerklib arbeitest du denn? Weil je nachdem ist das Problem sehr einfach zu handlen. Im Prinzip ist es aber ein umwandeln des Befehls/Position in ein char-array und senden von eben diesem.

P.S: deine Grundidee ist übrigens garnicht soo weit weg :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

30.01.2010, 19:05

Ich benutzte SFML, ob und welche Netzwerklib SFML benutzt
weiß ich nicht. Ich hab vohrraus so geschrieben weils irgendwie
immer zensiert wurde. Aber mit ein "r" gehts glaub ich, test: voraus. :D

Edit: Siehe nächster beitrag.

4

30.01.2010, 19:25

Hab grad das versucht:

C-/C++-Quelltext

1
2
3
    sf::Packet CharPosition;
    CharPosition<<Jumper->XPosition;
    CharPosition<<Jumper->YPosition;


Ich dachte vielleicht funktioniert es wenn ich die Positions
Variablen einzeln rübersende, da das float werte sind, geht
aber leider auch nicht.

Jedenfalls be

C-/C++-Quelltext

1
2
    std::size_t Received;
    if (Server.Receive(CharPosition, NULL, Received, ClientAddress, ClientPort) != sf::Socket::Done)


Bei Client.Send geht es.

Fehlermeldung:

Zitat

error C2664: 'sf::Socket::Status sf::SocketUDP::Receive(char *,size_t,size_t &,sf::IPAddress &,unsigned short &)': Konvertierung des Parameters 1 von 'sf::Packet' in 'char *' nicht möglich


:?

Ich habs mir so gedacht, das der Server dann halt die
Variablen abfängt und sich sozusagen die Werte vom Clienten
nimmt, so das halt dann die Position sich auch beim
anderen gleich ändert.

Irgend ein Denkanstoss vielleicht?[/cpp]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

30.01.2010, 19:55

du benutzt sf::Packet... les dir das tutorial doch nochmal durch.
XPosition ist ein als public deklariertes datenelement...?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

6

30.01.2010, 20:42

Ja, und was ist daran der Fehler, habs mir nochmal durchgelesen,
und sf::Packet kann ich doch benutzen um float daten zu senden,
oder?

Hab jetzt beim Server, die Operatoren umgedreht, also
das hier: >>. Immer aber noch das gleiche problem mit
dem Konventieren, es verlangt ein char variable, aber
ich muss eine float variable übergeben...

XPosition ist ein public element, weil ich ansonsten kein Zugriff
hab...

Ich steh echt auf nem Schlauch.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

30.01.2010, 21:14

Zitat von »"Genro"«

XPosition ist ein public element, weil ich ansonsten kein Zugriff hab...

dir scheint es noch an grundlagen zu fehlen. einen spiele server+client zu schreiben ist kein zuckerschlecken.
was ist das denn für ein spiel? gibts ne spielbare version die du hochladen könntest?

übrigens gibt es zwei versionen von receive/send ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

31.01.2010, 00:11

Zitat

error C2664: 'sf::Socket::Status sf::SocketUDP::Receive(char *,size_t,size_t &,sf::IPAddress &,unsigned short &)': Konvertierung des Parameters 1 von 'sf::Packet' in 'char *' nicht möglich

Dieser Fehler sagt eig schon was Sache ist. Anscheinend kannst du die Daten nicht direkt in ein Paket speichern, sondern musst es erst über ein char buffer realisieren (oder ggf die Parameterliste anpassen).
Bei meiner Netzwerklib funktioniert das ganze noch ein bisschen anders. Da ruft man kein recv auf sondern bekommt das Paket direkt per Callback geliefert :) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

31.01.2010, 10:04

Einmal für TCP und einmal für UDP oder wie?

Wie soll ich es denn das über einen char buffer machen...
ich kann doch keinen char buffer float variablen übergeben, oder?

Wenn man Spiel erstmal die grunfunktion hat, kann ich es mir
mit einer Spielbaren Demo überlegen. :D

Aber zum Problem jetzt, meinste mit Parameter liste das ich es so
machen soll: char FloatVarSend(XPosition) ?

10

31.01.2010, 11:40

@Genro: Hast du dir das Tutorial überhaupt durchgelesen?
Denn du vermischst 2 verschiedene Dinge.

1. Daten aus einem Char Array senden

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Create the UDP socket

sf::SocketUDP Socket;

// Create bytes to send

char Buffer[] = "Hi guys !";

// Send data to "192.168.0.2" on port 4567

if (Socket.Send(Buffer, sizeof(Buffer), "192.168.0.2", 4567) != sf::Socket::Done)
{
    // Error...

}


und 2. die Klasse Packet verwenden

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sf::Packet Packet;

// Fill Packet




// With TCP sockets


Socket.Send(Packet);
Socket.Receive(Packet);


// With UDP sockets


Socket.Send(Packet, Address, Port);
Socket.Receive(Packet, Address);

Lesen hätte hier echt alle Unklarheiten beseitigt und erst gar nicht zu deinem Problem geführt!

Btw. Deine Fehlermeldung hat schon gesagt was Sache ist, wenn du das schon nicht interpretieren kannst, solltest du dich erstmal mit den absoluten Grundlagen weiter beschäftigen. In diesem Fall Überladen von Funktionen/Methoden

Werbeanzeige