Hey Leute.
Da ich über das Thema mit den 3D MMORPG gestolpert bin, dachte ich mir gleich:
ZitatHey, du bist fast jeden Tag bei deinen Freund, und er hat eh so einen schwachen PC, zauber doch ein lustiges, kleines 2D Spiel.
So, da ich ja jetzt nicht vorhabe Es gleich auf einen Server zu geben, und einen Ansturm von 500 Spielern will, sondern einfach so um mal ne kleine Runde zu 2,3,4 zu Spielen (Spielkonzept ist noch unklar, zurzeit sind es Tests mit den Bewegen eines Balles).
So, nun zur Frage:
Mein Script sieht bis jetzt so aus:
Spoiler anzeigen
#include <GuiConstants.au3>
#include <GdiPlus.au3>;das include
#include <Misc.au3>
OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
[/autoit] [autoit][/autoit] [autoit]$x = 0;x und y deklarieren
$y = 0
$Gui = GUICreate("Beispiel", 600, 600, 100, 100)
GUISetState(@SW_SHOW)
_GDIPlus_Startup() ;Gdi starten
[/autoit] [autoit][/autoit] [autoit]$figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Pics\Spieler1.png")
$bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Pics\Hintergrund.png")
$height = _GDIPlus_ImageGetHeight($figur)
$width = _GDIPlus_ImageGetWidth($figur)
$verhaelnis = $height / $width
$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(600, 600, $graphic);----------------- geändert ----------------------
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap);----------------- geändert ----------------------
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Select
Case _IsPressed(25) ; Links
$x -= 3
Case _IsPressed(26) ; Rauf
$y -= 3
Case _IsPressed(27) ; Rechts
$x += 3
Case _IsPressed(28) ; Runter
$y += 3
EndSelect
If (_IsPressed(27) And _IsPressed(28)) Then ; Rechts + Runter
$x += 3
$y += 3
EndIf
If (_IsPressed(25) And _IsPressed(28)) Then ; Links + Runter
$x -= 3
$y += 3
EndIf
If (_IsPressed(25) And _IsPressed(26)) Then ; Links + Rauf
$x -= 3
$y -= 3
EndIf
If (_IsPressed(27) And _IsPressed(26)) Then ; Rechts + Rauf
$x += 3
$y -= 3
EndIf
_GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 600, 600);----------------- geändert ----------------------
_GDIPlus_GraphicsDrawImageRect($buffer, $figur, $x, $y, 20, 20 * $verhaelnis);----------------- geändert ----------------------
_GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0);----------------- geändert ----------------------
Sleep(30)
WEnd
[/autoit] [autoit][/autoit] [autoit]Func _end();die Exit funktion
_GDIPlus_GraphicsDispose($graphic);Grafik Objekt freigeben
_GDIPlus_GraphicsDispose($buffer);----------------- geändert ----------------------
_GDIPlus_BitmapDispose($bitmap);----------------- geändert ----------------------
_GDIPlus_ImageDispose($figur);Bild Objekt 1 freigeben
_GDIPlus_ImageDispose($bk);Bild Objekt 2 freigeben
_GDIPlus_Shutdown();Ressourcen freigeben
EndFunc ;==>_end
Spieler 1 kann sich schon super bewegen.
So, da es ja nicht dynamisch ist, sondern eig. immer durchlauft und Fragt was ich gerade drücke, würde ich diese Datei ein zweitesmal erstellen, nur mit den $X und $y für Spieler 2, und dann bei Beiden Exen, je nachdem ob der andewre Spieler das Spiel auch gestartet hat, den anderen SPieler zu zeichnen. Ob der Spieler gestartet hat, und wo er gerade ist (x und y) würde ich per TCP senden, da es ja bei so kleinen Bytemengen eigentlich ziemlich schnell gehen sollte.
Nun habe ich aber das Problem, dass ich keinen Ansatz für das TCP habe, weil eigentlich funktioniert es ja so, dass es auf eine Antwort wartet, und dann was tut, es soll aber in meinen Beispiel nichgt warten, sondern nur dann was machen, wenn etwas kommt.
Wie stelle ich das am besten an? Es muss jeder senden und jeder empfangen können.