Code: Alles auswählen
Procedure BilligesNetzwerkSpiel()
InitNetwork()
Enumeration
#CONTAINER
#SERVER
#CLIENT
#HOST
#START
#FRAME
#PROCESSINFO
EndEnumeration
Enumeration
#BALLPOS
#BATPOS
#QUIT
EndEnumeration
Structure SendData
CMD.b
Data_.POINT
EndStructure
Structure POINTF
X.f
Y.f
EndStructure
Me.POINT
You.POINT
Ball.POINTF
BallSpeed.POINTF
Buffer.SendData
#BAT_WIDTH = 32
#BAT_HEIGHT = 128
#BALL_WIDTH = 16
#BALL_HEIGHT = 16
#WindowWidth = 640
#WindowHeight = 480
#WindowFlags = #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered
CreateImage(0, #WindowWidth, #WindowHeight)
hWnd = OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #WindowFlags, "PingPong")
CreateGadgetList(WindowID())
ContainerGadget(#CONTAINER, 0, 0, WindowWidth(), WindowHeight())
OptionGadget(#SERVER, 170, 200, 90, 20, "Server")
SetGadgetState(#SERVER, 1)
OptionGadget(#CLIENT, 170, 230, 90, 20, "Client")
StringGadget(#HOST, 270, 215, 200, 20, "Port")
ButtonGadget(#START, 160, 260, 320, 30, "Start", #PB_Button_Default)
TextGadget(#PROCESSINFO, 150, 320, 340, 20, "Created by Daniel B. http://www.bradan.net/", #PB_Text_Center | #PB_Text_Border)
Frame3DGadget(#FRAME, 150, 180, 340, 120, "Connection")
CloseGadgetList()
Me\Y = WindowHeight()/2
BallSpeed\X = Random(8)/4-1
BallSpeed\Y = Random(8)/4-1
If BallSpeed\X = 0 : BallSpeed\X = 0.5 : EndIf
Ball\X = WindowWidth()/2
Ball\Y = WindowHeight()/2
Repeat
Event = WindowEvent()
If ConnectionID <> 0
Select NEvent
Case 2
ReceiveNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
Select Buffer\CMD
Case #BALLPOS
CopyMemory(@Buffer\Data_, @Ball, SizeOf(POINT))
Case #BATPOS
CopyMemory(@Buffer\Data_, @You, SizeOf(POINT))
Case #QUIT
ConnectionID = 0
EndSelect
EndSelect
StartDrawing(ImageOutput())
Box(0, 0, ImageWidth(), ImageHeight(), 0)
FrontColor(255, 255, 255)
Box(Me\X-#BAT_WIDTH/2, Me\Y-#BAT_HEIGHT/2, #BAT_WIDTH, #BAT_HEIGHT)
Box(You\X-#BAT_WIDTH/2, You\Y-#BAT_HEIGHT/2, #BAT_WIDTH, #BAT_HEIGHT)
Ellipse(Ball\X, Ball\Y, #BALL_WIDTH, #BALL_HEIGHT)
StopDrawing()
StartDrawing(WindowOutput())
DrawImage(ImageID(), 0, 0, WindowWidth(), WindowHeight())
StopDrawing()
m - 1
If GetForegroundWindow_() = WindowID()
If GetAsyncKeyState_(#VK_UP)
Started = 1
Me\Y - 1
Buffer\CMD = #BATPOS
If m <= 0
CopyMemory(@Me, @Buffer\Data_, SizeOf(POINT))
SendNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
k = 2
EndIf
ElseIf GetAsyncKeyState_(#VK_DOWN)
Started = 1
Me\Y + 1
Buffer\CMD = #BATPOS
If m <= 0
CopyMemory(@Me, @Buffer\Data_, SizeOf(POINT))
SendNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
k = 2
EndIf
EndIf
EndIf
If GetGadgetState(#SERVER) = 1
If KeyboardPushed(#PB_KEY_ESCAPE)
Buffer\CMD = #QUIT
SendNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
CloseNetworkConnection(ConnectionID)
EndIf
If Started = 1
Ball\X + BallSpeed\X
Ball\Y + BallSpeed\Y
If Ball\Y <= #BALL_HEIGHT/2 Or Ball\Y >= ImageHeight()-(#BALL_HEIGHT/2)
BallSpeed\Y * -1
EndIf
If Abs(Ball\X-Me\X) < #BAT_WIDTH/2 And Abs(Ball\Y-Me\Y) < #BAT_HEIGHT/2
BallSpeed\X * -1
EndIf
If Abs(Ball\X-You\X) < #BAT_WIDTH/2 And Abs(Ball\Y-You\Y) < #BAT_HEIGHT/2
BallSpeed\X * -1
EndIf
If Ball\X < 0 Or Ball\X > ImageWidth()
Ball\X = WindowWidth()/2
Ball\Y = WindowHeight()/2
EndIf
Buffer\CMD = #BALLPOS
If m <= 0
CopyMemory(@Ball, @Buffer\Data_, SizeOf(POINT))
SendNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
k = 2
EndIf
EndIf
If k <> 0 : m = k : k = 0 : EndIf
NEvent = NetworkServerEvent()
If NEvent = 4
MessageRequester("ERROR", "Client has disconnected")
CloseNetworkServer()
ConnectionID = 0
Started = 0
EndIf
Else
NEvent = NetworkClientEvent(ConnectionID)
EndIf
Else
Select Event
Case #WM_KEYUP
If EventwParam() = #VK_RETURN
Host.s = GetGadgetText(#HOST)
If GetGadgetState(#SERVER) = 1
Me\X = #BAT_WIDTH/2
If CreateNetworkServer(Val(Host))
t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : SetGadgetText(#PROCESSINFO, StrF((ElapsedMilliseconds()-t)/1000)+" seconds til timeout") : Until NetworkServerEvent() = 1 Or ElapsedMilliseconds()-t >= 5000
If ElapsedMilliseconds()-t < 5000
ConnectionID = NetworkClientID()
Else
CloseNetworkServer()
EndIf
EndIf
Else
Me\X = ImageWidth()-#BAT_WIDTH/2
ConnectionID = OpenNetworkConnection(StringField(Host, 1, ":"), Val(StringField(Host, 2, ":")))
EndIf
EndIf
Case #PB_Event_Gadget
Select EventGadgetID()
Case #SERVER
SetGadgetText(#HOST, "Port")
Case #CLIENT
SetGadgetText(#HOST, "IP:Port")
Case #START
Host.s = GetGadgetText(#HOST)
If GetGadgetState(#SERVER) = 1
Me\X = #BAT_WIDTH/2
If CreateNetworkServer(Val(Host))
t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : SetGadgetText(#PROCESSINFO, StrF(5.0-(ElapsedMilliseconds()-t)/1000, 3)+" seconds til timeout") : Until NetworkServerEvent() = 1 Or ElapsedMilliseconds()-t >= 5000
If ElapsedMilliseconds()-t < 5000
ConnectionID = NetworkClientID()
Else
CloseNetworkServer()
EndIf
SetGadgetText(#PROCESSINFO, "Created by Daniel B. http://www.bradan.net/")
EndIf
Else
Me\X = ImageWidth()-#BAT_WIDTH/2
ConnectionID = OpenNetworkConnection(StringField(Host, 1, ":"), Val(StringField(Host, 2, ":")))
EndIf
If ConnectionID
Buffer\CMD = #BATPOS
CopyMemory(@Me, @Buffer\Data_, SizeOf(POINT))
SendNetworkData(ConnectionID, @Buffer, SizeOf(SendData))
EndIf
EndSelect
EndSelect
Delay(10)
EndIf
Until Event = #PB_Event_CloseWindow
FreeImage(0)
End
EndProcedure
BilligesNetzwerkSpiel()