(V)Server zum Ausprobieren?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

funkmaster5000

Betreff: (V)Server zum Ausprobieren?

BeitragMi, Dez 16, 2015 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Community,

hat jemand die Möglichkeit, eine Blitz Exe auf einem Server auszuführen, damit ich ein paar Verbindungstests machen kann? Über localhost bekomme ich nur Unsinn. Dieses Test stehen im Rahmen von Versuchen mit einer Netzwerklib (enet). Sofern die Möglichkeit dazu, ggf. längerfristig (mit geteilten Kosten), besteht, wäre ich für ein kurzes Hallo dankbar. Für die Tests möchte ich mir ungerne alleine einen mieten. Zu Hause aufsetzen ist auch keine Alternative.

IP und Port können in dem Programm frei definiert werden.

Ich weiß, dass es solche Threads schon in der Vergangenheit gab, aber wer will denn Leichen fleddern...

EDIT:
Es handelt sich um maximal 5 Testconnections gleichzeitig, dies auch nur im Zeitraum von ca. 30 Minuten.

Eingeproggt

BeitragMi, Dez 16, 2015 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Das setzt einen Windows-Server voraus, die meistens nochmal ein Stückchen teurer sind... und seltener nehme ich an?

Aber es würde mich interessieren wieso über localhost nur "Unsinn" rauskommt? Hast du das schon gründlich zurück verfolgt wieso und warum? Und zum Testen würde es ja reichen, wenn ein Kumpel von dir den Server auf seinem PC zu Hause laufen lässt oder umgekehrt?

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

funkmaster5000

BeitragMi, Dez 16, 2015 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, danke für die Rückmeldung. Das Grundproblem ist vermutlich(?) die Vergabe von IDs. Bei dem Beispiel soll ein Spieler als Client und Server gleichzeitig fungieren. Der Server bekommt von der Lib die User ID 0 zugewiesen - der erste Spieler der (sich selbst) joint aber auch. Da dem Server untersagt ist, sich selbst Daten weiterzuleiten, sind der Server und Spieler 1 aktuell - Spieler 0 fällt durchs Raster. Außerdem werden 3 Instanzen gezeichnet, obwohl der Server ja nur verwaltet. Das könnte ein Fehler meinerseits sein, da ich alle Spieler zeichnen lasse. Und Spieler 0 und der Server gelten leider als Spieler.

Die Architektur ist wie folgt vorgesehen:
Code: [AUSKLAPPEN]

Client ________NetPlayerType < verwaltet alle Mitspieler: xpos, ypos, Animationsframe
Client ________PlayerType < verwaltet lokale Var: Winkel und Geschwindigkeit, schickt diese an Server
.   |   
|   |
|   |
|   .
Server_______berechnet anhand der geschickten Variablen die Positionen und broadcastet sie an die NetPlayerTypes der Clients. Hierzu dient ihm die Player ID, die von der Lib vergeben werden.


Problem: in einem Fall haben Server und Client die selbe ID Confused Die IDs werden von der Lib fest vorgegeben. Also ich vergebe sie programmiertechnisch nicht. Auch im Debugger steht 2 Mal die ID 0 und einmal die 1, es müssten aber bei 3 Usern 1 und 2 sein (und 0 für den Server, den ich nicht anspreche im Broadcast). Ich habe diesbezüglich auch im Originalforum der Lib gepostet. Dort ist auch der Sourcecode zum Anschauen.

Hier habe ich nochmal ein Bild zur Veranschaulichung user posted image

Bewege ich das Auto im Fenster "Player1" fährt es im Fenster "Player 2" (wie es sein soll). Bewege ich das Auto im Fenster "Player 2" bewegt es sich nur im Fenster "Server".
  • Zuletzt bearbeitet von funkmaster5000 am Mi, Dez 16, 2015 22:21, insgesamt 2-mal bearbeitet
 

funkmaster5000

BeitragMi, Dez 16, 2015 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Dast ist mal mein Code, ohne die klaren Sachen (Backbuffer etc.)
Code: [AUSKLAPPEN]

;-------------------------------------------------------------------------

;networking stuff
Include "includes\enetlib.bb"
Global radial#
Local mode
Local ip$
Local portnumber=2400
Local maxplayers=24
Local playername$
Local BWO
Local BWI

;=========================================================================

mode=SelectMode()

If mode=0
   ip=Input("Game IP: ")
   playername=Input("Your name: ")
EndIf

If mode=1
   BWO=0
   BWI=0
Else
   BWO=2000
   BWI=2000
EndIf

eNet_Start(mode,ip,portnumber,maxplayers,playername,BWI,BWO)

If mode=1
   AppTitle "Host"
Else
   AppTitle playername
EndIf

;-------------------------------------------------------------------------
;define player type
Type tplayer
   Field x# ;the players x position
   Field y# ;the players y position
   Field mx# ;the players movement in the x direction
   Field my# ;the players movement in the y direction
   Field futurex# ;the players future x position (x + move x)
   Field futurey# ; " "
   Field angle% ;the players angle (45 degree steps, cuz iso)
   Field speed# ;the players current speed
   Field maxforward# ;the players maximal speed forwards
   Field maxreverse# ;the players maximal speed reverse
   Field frame% ;which frame has to be shown?
   Field acc# = 0.01 ;the acceleration value
   Field deacc# = 0.015 ;the deacceleration value
End Type


Global player.tplayer = New tplayer
player\x = 0
player\y = 0
player\mx = 0
player\my = 0
player\futurex = player\x
player\futurey = player\y
player\angle = 0
player\speed = 0
player\maxforward = 3
player\maxreverse = -1.5
;=========================================================================

DebugLog eNetMyID

While Not KeyHit(1)
   
   CalcMovement() ;call the function to calc the mx and my movement
   PlayerInput() ;the function to handle all player input
   DrawPlayers() ;draw the players

   eNet_Update() ;update the networking func
   WaitTimer (takt)
   Flip 1
Wend

eNet_End() ;deinitailize networking func
EndGraphics ;deinitialize graphics
End ;end the program
;=========================================================================


;######################## F U N C T I O N S ###################################
;-------------------------------------------------------------------------
;this function draws all netplayers and the local player
Function DrawPlayers()
   ;first draw the local player
   
   DrawImage3D img_anim_car,player\x,player\y,0,0,1,player\frame
   
   ;then draw all netplayers
   For this.eNetUserStats = Each eNetUserStats ;loop thru them
      If this\id <> eNetMyID Then
         this\frame = AnimPlayer(this\angle) ;select the frame
         DrawImage3D img_anim_car,this\x,this\y,0,0,1,this\frame ;plot them
         Text3D(Font,this\x,this\y-20,this\name,1,0,0)
      End If
   Next
End Function
;=========================================================================


;-------------------------------------------------------------------------
;this function returns, if the player is a host or a client
Function SelectMode()
   
   Local sel$
   
   sel=Input("Host (H) or Client (C)?: ")
   
   If Lower(sel)="h"
      Return 1
   Else
      Return 0
   EndIf
   
End Function
;=========================================================================

----------------------------------
;calculate the players movement based on its angle and speed
Function CalcMovement()
   ;calculate the movement on the x and y axis
   player\mx = player\speed * Cos(player\angle)
   player\my = player\speed * Sin(player\angle)
   ;add them to the x and y values
   ;this is for DEBUG only, since we only move the player, if no collision
   ;occurs
   player\x = player\x + player\mx
   player\y = player\y + player\my
   
   ;calculate each movement for the netplayers
   ;we simulate their movement on our local machine (client side prediction)
   ;the formula stays the same
   For this.eNetUserStats = Each eNetUserStats
      this\mx = this\speed * Cos(this\angle)
      this\my = this\speed * Sin(this\angle)
      this\x = this\x + this\mx
      this\y = this\y + this\my
   Next
End Function
;=========================================================================


;-------------------------------------------------------------------------
;this function handels all player input
Function PlayerInput()
   If KeyHit(key_left) Then
      player\angle = player\angle + angle_increase
   End If
   
   If KeyHit(key_right) Then
      player\angle = player\angle + angle_decrease
   End If
   
   If player\angle = 360 Then
      player\angle = 0
   End If
   
   If player\angle < 0 Then
      player\angle = 315
   End If
   
   eNet_SendMessage(message_angle,player\angle,0,0,True)
   
   If KeyDown(200) Then
      player\speed = player\speed + 0.01
      If player\speed > player\maxforward Then player\speed = player\maxforward
      eNet_SendMessage(message_speed,player\speed,0,0,True)
   End If
   
   If KeyDown(208) Then
      player\speed = player\speed - 0.015
      If player\speed < player\maxreverse Then player\speed = player\maxreverse
      eNet_SendMessage(message_speed,player\speed,0,0,True)
   End If
   
   
   player\frame = AnimPlayer(player\angle)
   
   If KeyDown(key_handbreak) Then
      If player\speed < 0 Then player\speed = player\speed + 0.025
      If player\speed > 0 Then player\speed = player\speed - 0.025
      If player\speed = 0 Then player\speed = 0
      eNet_SendMessage(message_speed,player\speed,0,0,True)
   End If
End Function
;=========================================================================


Das ist der Code der Lib

Code: [AUSKLAPPEN]

Const message_angle% = 5
Const message_speed% = 6
; BB file by Sake906, based on Xaron and Mahan's wrapper for eNet

Const ENET_EVENT_TYPE_NONE       = 0
Const ENET_EVENT_TYPE_CONNECT    = 1
Const ENET_EVENT_TYPE_DISCONNECT = 2
Const ENET_EVENT_TYPE_RECEIVE    = 3

Global Bank = CreateBank(128)
Global PeerId = CreateBank(4)
Global DataSize = CreateBank(4)


Global eNet_CompressBank = CreateBank(4);Bank used for converting Floats to Strings


Global eNetStarted
Global eNetMode

Global eNetDisplayPackets=0

Global eNetMyID%
Global eNetMyName$



Type eNetUserStats
   Field ID
   Field Name$
   Field x#
   Field y#
   Field mx#
   Field my#
   Field angle%
   Field speed#
   Field frame%
End Type

Function eNet_Client_Store(ID)
   
   Local this.eNetUserStats
   
   For this.eNetUserStats=Each eNetUserStats
      If this\ID=ID
         PrintLog "User ID duplicate found ("+ID+","+this\Name+") when trying To store a newcoming user. Deleting old..."
         Delete this
      EndIf
   Next
   
   this.eNetUserStats=New eNetUserStats
   this\ID=ID
   PrintLog "Newcoming user ID stored ("+this\ID+")"
   
   
End Function


Function eNet_Client_Delete(ID)
   
   Local this.eNetUserStats
   
   For this.eNetUserStats=Each eNetUserStats
      If this\ID=ID
         PrintLog "User quit ("+ID+","+this\Name+"). Deleting data."
         Delete this
      EndIf
   Next
   
   
End Function


Function eNet_Client_GetName$(ID)
   
   Local this.eNetUserStats
   
   For this.eNetUserStats=Each eNetUserStats
      If this\ID=ID
         Return this\Name
      EndIf
   Next
   
   
End Function


Function eNet_Client_UpdateName(ID,name$)
   
   Local this.eNetUserStats
   
   For this.eNetUserStats=Each eNetUserStats
      If this\ID=ID
         this\Name=name
         PrintLog "User name for "+this\ID+" updated. Player name is "+this\Name
      EndIf
   Next
   
   
End Function


Function eNet_Start(host,address$,port,maxclients,myname$,IBW=0,OBW=0)
   If eNetStarted=0
      
      ENetInitialize()
      
      If host=1 ; host
         eNetStarted=ENetCreate(host,"any",port,maxclients,IBW,OBW)
      Else; client
         ENetCreate(host,"",port,maxclients,IBW,OBW)
         eNetStarted=ENetConnect(address, port)
      EndIf
      
      If eNetStarted=-1
         PrintLog "Failed to initialize network"
         eNet_End()
      Else
         If host=1
            PrintLog "Host ready "+eNetStarted
         Else
            PrintLog "Connected to host at "+address+" "+eNetStarted
         EndIf
         eNetMode=host
         eNetMyName=myname
      EndIf
      
   EndIf
End Function

Function eNet_Client_PurgeAll()
   
   Local this.eNetUserStats
   
   For this.eNetUserStats=Each eNetUserStats
      Delete this
   Next
   
   PrintLog "All Player data deleted"
   
End Function

Function eNet_End()
   
   Local this.eNetUserStats
   
   If eNetStarted<>0
      If eNetMode=0
         ENetDisconnect(0)
         eNet_Client_PurgeAll()
      Else
         For this.eNetUserStats=Each eNetUserStats
            ENetDisconnect(this\ID)
            Delete this
         Next
      EndIf
      eNet_Update()
      ENetDeInitialize()
      eNetStarted=0
      eNetMode=0
      eNetMyID=0
      PrintLog "eNet terminated"
   EndIf
   
End Function


Function eNet_Update()
   
   Local Evt%
   
   Local all$
   Local DT$
   Local mtype
   Local mfrom
   Local mto ; host only
   Local mrel; host only, tells the host if the use has sent a reliable message so whenever it is sent to another peer, it is also set to reliable
   Local endnet
   
   Local eu.eNetUserStats
   
   If eNetStarted=1
      
      While( ENetDoEventCheck(0) > 0 )
         
         PokeInt(DataSize, 0, 128) ; Poke the Banksize. This will protect against buffer overflow
         
         Evt = ENetCheckEventsSafe(PeerId, DataSize, Bank)
         
         If eNetMode=1; host
            
            
            If Evt=ENET_EVENT_TYPE_CONNECT ; someone joined
               
               ; store this user, even If we don't know their name yet
               
               eNet_Client_Store(PeekInt(PeerId,0))
               
               ; send them their ID so they know who they are
               
               eNet_SendMessage(1,PeekInt(PeerId,0),PeekInt(PeerId,0),-1,True)
               
            Else If Evt=ENET_EVENT_TYPE_DISCONNECT; someone left
               
               eNet_Client_Delete(PeekInt(PeerId,0))
               
               ; Tell your clients that this user quit
               
               For eu.eNetUserStats=Each eNetUserStats
                  
                  eNet_SendMessage(4,"",eu\ID,PeekInt(PeerId,0),True)
                  
               Next
               
            Else If Evt=ENET_EVENT_TYPE_RECEIVE
               
               all=eNet_ComposeFromBank$(PeekInt(DataSize, 0)-1)
               
               mtype=eNet_StrToInt(Mid(all,1,1))
               mto=eNet_StrToInt(Mid(all,2,1))
               
               If mtype=>5 ; if message type is part of the range for internal stuff, we wont read the reliable flag notification since it is always set to 1 for these
                  mrel=Int_ReadBit(eNet_StrToInt(Mid(all,3,1)),8)
                  DT=Mid(all,4)
               Else ; otherwise.....
                  DT=Mid(all,3)
               EndIf
               
               mfrom=PeekInt(PeerId,0)
               
               If mtype<5 ; internal message types
                  
                  If mtype=2 ; player has sent you their name after being notified of their ID
                     
                  ; update the name for the previously stored player
                     
                     eNet_Client_UpdateName(mfrom,DT)
                     
                  ; after that, we notify everyone about this (even to the newcomer so they have their own data too)
                     
                     PrintLog "Telling other players (and the newcomer likewise) about the newcomer"
                     
                     For eu.eNetUserStats=Each eNetUserStats
                        
                     ; first we update everyone (and the newcomer himself) about the new player
                        eNet_SendMessage(3,DT,eu\ID,mfrom,True)
                        
                     Next
                     
                     PrintLog "Telling the newcomer about the other players"
                     
                     For eu.eNetUserStats=Each eNetUserStats
                        
                     ; then we send the already-connected player data to the newcomer
                        If eu\ID<>mfrom
                           eNet_SendMessage(3,eu\Name,mfrom,eu\ID,True)
                        EndIf
                        
                     Next
                     
                  EndIf
                  
               Else If mtype => 5 ;if we receive a non internal message
                  If mtype = message_angle Then ;if a player sends us his updated angle
                     For this.eNetUserStats = Each eNetUserStats ;loop thru each networking user
                        If this\id = mfrom Then ;if we find the user, who sent us the message
                           this\angle = DT  ;update his angle
                        End If
                     Next
                     
                     ;next send the message to all the other players
                     For this.eNetUserStats = Each eNetUserStats
                        If this\ID <> mfrom Then ;if the message didn't come from this player
                           eNet_SendMessage(mtype,DT,this\ID,0,rel) ;send him the new angle too
                        EndIf
                     Next
                  End If
                  
                  If mtype = message_speed Then
                     For this.eNetUserStats = Each eNetUserStats
                        If this\id = mfrom Then
                           this\speed = DT
                        End If
                     Next
                     
                     For this.eNetUserStats = Each eNetUserStats
                        If this\ID <> mfrom Then
                           eNet_SendMessage(mtype,DT,this\ID,0,rel)
                        EndIf
                     Next
                  End If
               EndIf
               
            EndIf
            
            
         Else ; client
            
            If Evt=ENET_EVENT_TYPE_RECEIVE
               
               all = eNet_ComposeFromBank$(PeekInt(DataSize, 0)-1)
               
               mtype = eNet_StrToInt(Mid(all,1,1))
               mfrom = eNet_StrToInt(Mid(all,2,1))
               DT = Mid(all,3)
               
               If mtype=1 ; host has sent you your ID number, because you are just too dumb to know it yourself right after joining
                  
                  PrintLog "Welcome. Your player ID is: " + DT
                  eNetMyID=Int(DT)
                  ; now you should perhaps tell the host what your name is.
                  eNet_SendMessage(2,eNetMyName,0,0,True)
                  
               Else If mtype=3 ; You have been sent "new player" data
                  
                  eNet_Client_Store(mfrom)
                  eNet_Client_UpdateName(mfrom,DT)
                  
               Else If mtype=4 ;someone quit
                  
                  eNet_Client_Delete(mfrom)
                  
               Else If mtype = message_angle Then
                  For this.eNetUserStats = Each eNetUserStats
                     If this\id = mfrom Then
                        this\angle = DT
                     End If
                  Next
               
               ElseIf mtype = message_speed Then
                  For this.eNetUserStats = Each eNetUserStats
                     If this\id = mfrom Then
                        this\speed = DT
                     End If
                  Next
               EndIf
               
            Else If Evt=ENET_EVENT_TYPE_DISCONNECT
               
               PrintLog "Game session ended. Host either kicked you or they quit"
               
               endnet = 1
               
            EndIf
            
         EndIf
         
      Wend
      
      If endnet=1
         eNet_End()
      EndIf
      
   EndIf
   
End Function


Function eNet_SendMessage(mtype,mdata$,mto,mfrom,rel=False)
   
   Local packet$
   Local hostpacket$
   
   Local sendrel%
   
   If eNetStarted<>0
      
      If rel=False  ; yes stupid I know but maybe in the future, other bits might be placed in this byte.
         sendrel=%00000000
      Else
         sendrel=%00000001
      EndIf
      
      ; The reliable flag is sent to the host so they know when a user has sent a message that was supposed to be reliable. Currently with this wrapper,
      ; there is no way to tell if a message was sent with a reliable flag, so don't blame me. The reliable flag notification is only sent with message types above 5, which are
      ; user message types. Anything below that is assumed to always be set to reliable (which are basic connectivity message types)
      
      
      hostpacket=eNet_IntToStr(mtype,1)+eNet_IntToStr(mfrom,1)+mdata
      If mtype<5
         packet=eNet_IntToStr(mtype,1)+eNet_IntToStr(mto,1)+mdata
      Else
         packet=eNet_IntToStr(mtype,1)+eNet_IntToStr(mto,1)+sendrel+mdata
      EndIf
      
      
      If eNetMode=1; host
         ENetSendData(hostpacket,Len(hostpacket)-1,mto,rel)
         If eNetDisplayPackets=1 Then PrintLog "Host packet sent: "+hostpacket
      Else
         ENetSendData(packet,Len(packet)-1,0,rel)
         If eNetDisplayPackets=1 Then PrintLog "Client packet sent: "+packet
      EndIf
      
   EndIf
   
End Function

Function eNet_Client_BroadcastMessage(mtype,mdata$,rel=False)
   
   Local this.eNetUserStats
   
   For this.eNetUserStats = Each eNetUserStats
      
      If this\ID <> eNetMyID Then
         eNet_SendMessage(mtype,mdata$,this\ID,0,rel)
      EndIf
      
   Next
   
End Function

Function eNet_ComposeFromBank$(size)
   
   Local c
   Local result$
   
   For c=0 To size
      result=result+Chr$(PeekByte(Bank, c))
   Next
   
   Return result$
   
End Function



Function eNet_IntToStr$(Num%, StrLen% = 4)
;-=-=-=Take an Integer and compress it to a string, of "strlen" bytes long.
   Local shiftin%
   Local st$ = Chr$(Num And 255)
   For shiftin = 1 To (StrLen - 1)
      st$ = st$ + Chr$(Num Sar (8 * shiftin))
   Next
   Return st
End Function

Function eNet_FloatToStr$ (num#)
;-=-=-=Convert a floating point number to a 4 byte string
   Local st$ = "",i%
   PokeFloat eNet_CompressBank,0,num
   For i = 0 To 3
      st$ = st$ + Chr$(PeekByte(eNet_CompressBank,i))
   Next
   Return st$
End Function

Function eNet_StrToInt%(st$)
;-=-=-=Take a String of any length and turn it into an integer again.
   Local shiftin%
   Local num%
   For shiftin = 0 To (Len (st$) - 1)
      num = num Or (Asc (Mid$ (st$, shiftin + 1, 1)) Shl shiftin * 8)
   Next
   Return num
End Function

Function eNet_StrToFloat#(st$)
;-=-=-=Take a 4 byte string and turn it back into a floating point #.
   Local num#,i%
   For i = 0 To 3
      PokeByte eNet_CompressBank,i,Asc(Mid$(st$,i+1,1))
   Next
   num# = PeekFloat(eNet_CompressBank,0)
   Return num
End Function


Function PrintLog(p$)
   Print p
   DebugLog p
End Function


Function Int_ReadBit(num%,loc%)
   
   Local work%=Abs(num)
   Local st$
   
   If work>255
      work=255
   EndIf
   
   If loc>8
      loc=8
   EndIf
   
   st=Bin(work)
   
   Return Int(Mid(st,(Len(st)-8)+loc,1))
End Function

Holzchopf

Meisterpacker

BeitragMi, Dez 16, 2015 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich nicht weiss, was ENet so alles macht:

Taucht beim Client im DebugLog die Ausgabe von Code: [AUSKLAPPEN]
PrintLog "Welcome. Your player ID is: " + DT
überhaupt mal auf?

Verbindet eNet_Start() automatisch mit dem Server und wird da die Datenübertragung auch ausgelöst? Oder musst du dafür eNet_Update() selbst aufrufen?

So beim überfliegen des Codes habe ich das Gefühl, dass die Debug-Ausgaben von eNet eigentlich ziemlich gut das Problem isolieren sollten. Also das ID-Problem.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

funkmaster5000

BeitragMi, Dez 16, 2015 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, die PlayerIDs werden korrekt vergeben, nur die Null eben doppelt (einmal für Spieler 1 und einmal für den Server). eNet_Update() muss nur in der Hauptschleife aufgerufen werden.

Cykid

BeitragDo, Dez 17, 2015 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte dir meinen Server zur Verfügung stellen.

DAK

BeitragDo, Dez 17, 2015 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Verbindungen debuggen willst, und dabei Localhost nicht verwenden möchtest, dann kannst du dafür einfach zum Testen eine VM aufsetzen und zwischen der und deinem Host-Betriebssystem hin und her spielen. Ist zum Debuggen auch eventuell einfacher, da du so nicht jede Version jemandem anderen zum Testen schicken musst. Ansonsten: kann es sein, das die Lib einen dedizierten Server erwartet und dem Server somit eigentlich keine ID gibt? Und 0 ist hald blöderweise zufällig der Standardwert für uninitialisierte Variablen?
Gewinner der 6. und der 68. BlitzCodeCompo

Silver_Knee

BeitragFr, Dez 18, 2015 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Manchmal hilft es auch nicht die lokale IP 127.0.0.1 sondern einfach die IP aus Sicht des lokalen Netzes (meistens 192.168...) zu nehmen. Vielleicht hast du auch einen alten Rechner zuhause und kannst den ins LAN schmeißen.
 

funkmaster5000

BeitragFr, Dez 18, 2015 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Cykid hat Folgendes geschrieben:
Könnte dir meinen Server zur Verfügung stellen.

Das würde ich gerne annehmen.

DAK hat Folgendes geschrieben:
Ansonsten: kann es sein, das die Lib einen dedizierten Server erwartet und dem Server somit eigentlich keine ID gibt? Und 0 ist hald blöderweise zufällig der Standardwert für uninitialisierte Variablen

So habe ich das jetzt auch gelöst. Wenn ich ein Spiel hosten möchte, muss ich erst den Server starten, öffne dann das Spiel an sich, wo ich beitreten kann. Das klappt (localhost). Meinen Mitspielern würde ich dann die externe IP zur Verfügung stellen. Wie würde ich denn in diesem Fall "mich" joinen? Über localhost oder über die externe IP?

Silver_Knee hat Folgendes geschrieben:
Vielleicht hast du auch einen alten Rechner zuhause und kannst den ins LAN schmeißen.

Habe ich, aber auf dem läuft leider Lubuntu Rolling Eyes

Cykid

BeitragFr, Dez 18, 2015 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Also in der Theorie kannst du über beide IPS Joinen. Lokal würde für mich sogar mehr Sinn machen. Warum die Daten erst ins Netz schießen, um sich dann doch wieder auf den eigenen Rechner zu schicken.
 

hairy_potter

BeitragFr, Feb 12, 2016 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Thread verwirrt mich bisschen, deswegen erlaube ich mir mal, meine Frage einfach hier zu stellen.
Also: Ich hatte bisher gedacht, dass spätestens, wenn man anfängt, ein Spiel/Programm zu schreiben, es empfehlenswert wäre, einen Server zu haben, um da bequem alles testen zu können. Da zumindest funkmaster5000 keinen zu haben scheint, wollte ich mal fragen, wie es bei euch anderen aussieht. Braucht man überhaupt einen?
Außerdem wollte ich fragen, welchen Typ man wählen sollte. Hier habe ich gelesen, dass es, wenn man einen Server mieten will, darauf ankommt, wofür man ihn braucht. Dann hat man wiederum die Wahl zwischen cloud, dedicated oder virtual servern. Sollte man einen von diesen Typen nehmen oder gibt es noch andere? Und worauf sollte man denn noch achten? Danke schonmal für alle, die versuchen, meine Verwirrung aufzulösen! Wink

Holzchopf

Meisterpacker

BeitragFr, Feb 12, 2016 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, man braucht keinen Server um Spiele zu entwickeln. Dieser macht frühestens dann Sinn, wenn du ein Online-Spiel fertig hast, das von vielen Leuten gleichzeitig (also zur selben Zeit auf dem selben Server) gespielt wird. Für kleinere Online-Spiele reichten schon vor 10 Jahren übliche PCs und Internetleitungen. Und zum Testen ist alles lokal sowieso die einfachste Lösung. Wenn du Spiele mit einer Online-Highscore-Liste machst, reicht einfacher Webspace mit PHP (Datenbankanbindung ist kein muss).

Solange du darauf verzichten kannst, kannst du auf Server verzichten.

MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

DAK

BeitragFr, Feb 12, 2016 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Beachte erstmal die Trennung zwischen einem Server im Sinne von Hardware, also einem Computer, der dauerhaft rennt, der speziell auf diese Aufgabe hingetrimmt ist (z.B. viel Festplattenspeicher, schnelle CPU, viel RAM, keine Grafikkarte) und Server im Sinne von Software, also ein Programm, das die Verwaltung der spielrelevanten Daten für alle anderen Leute im Spiel übernimmt.

Also, der Server (Hardware) ist der Computer, auf dem der Server (Software) läuft.

Einen Hardware-Server brauchst du nur dann, wenn dein Server (Software) mehr Leistung frisst, als dein Computer zuhause hergibt, oder wenn der Server (Software) auch rennen soll, wenn du nicht am Computer bist. Der erste Punkt wird bei einem kleinen, selbstgebastelten Spiel nicht erreicht werden. Der zweite Punkt kommt auch seltener vor. Also brauchst du wahrscheinlich keinen eigenen Server (Hardware).

All das trifft sowieso nur auf Multiplayer-Spiele über Netzwerk zu. Also Single-Player-Spiele oder lokale Multiplayer-Spiele (Spiele wo mehrere Leute an einem Computer spielen) brauchen gar keinen Server, weder in Hardware noch in Software.

Während der Entwicklung testet man Netzwerk-Spiele üblicherweise mit mehreren Computern im gleichen LAN. Da brauchst du kein Geld für einen Server ausgeben.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group