(V)Server zum Ausprobieren?
Übersicht

funkmaster5000Betreff: (V)Server zum Ausprobieren? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Hier habe ich nochmal ein Bild zur Veranschaulichung 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könnte dir meinen Server zur Verfügung stellen. | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Cykid |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! ![]() |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group