Hier ein Beispiel zum zerflücken, mit Grafik und Text der TCP-ID 1, 9 und 51.
Die Bewegung der Instrumente wird dargestellt mit Sprite in Purebasic.
Ist einfach gehalten, es geht wie immer bei mir am Anfang nur um die Funktion.
Die Schaltbewegung verzögert immer wenn der Zug vom Stand anfahren soll, während der Fahrt geht er normal, weiss nicht woran das liegt, vielleicht am Event...
Mit der Purebasicdemo kann man es compilieren.
Da ich kein "C" kann hatte ich mir das Purebasic schon vor 4 Jahren angeschafft.
Hat sich bei mir schon bewährt, ich hatte viele Sprachen ausprobiert, aber nichts entsprach meinen Stand über Programmiersprachen.
Code: Alles auswählen
; Sprite - Nummer des Anzuzeigenen Sprite
; x - X-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
; y - Y-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
; xx - Breite des Sprite
; yy - Höhe des Sprite
; w - Rotationswinkel des Sprite (in Grad, wobei 0° Richtung Osten ist)
; dx - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
; auf dem Sprite in X-Richtung
; dy - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
; auf dem Sprite in Y-Richtung
; h - Transparenz des Sprite (0 Transparent, 255 voll sichtbar)
Procedure sprite_neu(Sprite, x, y, xx, yy, w.f, dx, dy, h)
w = w * (#PI/180)
r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
t.f = ATan(xx/yy)
w1.f = w - t : w2.f = w + t : w3.f = w + #PI - t : w4.f = w + #PI + t
TransformSprite3D(Sprite, Cos(w1)*r, Sin(w1)*r, Cos(w2)*r, Sin(w2)*r, Cos(w3)*r, Sin(w3)*r, Cos(w4)*r, Sin(w4)*r)
Start3D()
DisplaySprite3D(Sprite, x-Cos(w)*dy+Sin(w)*dx, y-Sin(w)*dy-Cos(w)*dx, h)
Stop3D()
EndProcedure
Global Quit.l, Port.l, conID.l, status.l, cEvent.l, EventID.l
Global sData.l,rData.l,offs.l,geschw.l, motor.l , fahrst.l,fahrst_n.l
Global *buffer.l, *sbuffer.l, *rbuffer.l
Declare daten_send_empf()
Declare daten_empf()
Declare zusi_hello()
Declare zeige_daten()
Enumeration
#Window_0
#Button_0
#Button_1
#Button_2
#String_0
#String_1
#String_2
#String_3
#zeiger1
#anzeiger1
#zeiger2
#anzeiger2
#platte1
#hebel1
EndEnumeration
*buffer = AllocateMemory(256)
*sbuffer = AllocateMemory(256)
*rbuffer = AllocateMemory(256)
InitSprite()
InitSprite3D()
OpenWindow(#Window_0,0,0,420,780,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window_0),5,200,400,560,0,0,0)
SetCurrentDirectory("d:\purebasic\pebi-pure\data\")
CreateSprite(#zeiger1,200,200, #PB_Sprite_Texture)
CreateSprite3D(#zeiger1, #zeiger1)
CreateSprite(#anzeiger1, 200,200, #PB_Sprite_Texture)
CreateSprite3D(#anzeiger1, #anzeiger1)
CreateSprite(#zeiger2,200,200, #PB_Sprite_Texture)
CreateSprite3D(#zeiger2, #zeiger2)
CreateSprite(#anzeiger2, 200,200, #PB_Sprite_Texture)
CreateSprite3D(#anzeiger2, #anzeiger2)
CreateSprite(#platte1,150,100, #PB_Sprite_Texture)
CreateSprite3D(#platte1, #platte1)
CreateSprite(#hebel1, 150,100, #PB_Sprite_Texture)
CreateSprite3D(#hebel1, #hebel1)
StartDrawing(SpriteOutput(#anzeiger1))
Box(0,0,200,200,RGB(255,0,255))
Circle(100,100,90,RGB(180,180,180))
StopDrawing()
StartDrawing(SpriteOutput(#zeiger1))
Box(0,0,200,200,RGB(255,0,255))
RoundBox(100,100,85,6,3,3,RGB(0,255,0))
StopDrawing()
StartDrawing(SpriteOutput(#anzeiger2))
Box(0,0,200,200,RGB(255,0,255))
Circle(100,100,90,RGB(180,180,180))
StopDrawing()
StartDrawing(SpriteOutput(#zeiger2))
Box(0,0,200,200,RGB(255,0,255))
RoundBox(100,100,85,6,3,3,RGB(255,0,0))
StopDrawing()
StartDrawing(SpriteOutput(#platte1))
Box(0,0,150,100,RGB(255,0,255))
Box(0,0,150,100,RGB(90,90,90))
StopDrawing()
StartDrawing(SpriteOutput(#hebel1))
Box(0,0,150,100,RGB(255,0,255))
RoundBox(20,50,100,10,5,5,RGB(0,0,0))
StopDrawing()
TransparentSpriteColor(#zeiger1, RGB(255, 0, 255))
TransparentSpriteColor(#anzeiger1, RGB(255, 0, 255))
TransparentSpriteColor(#zeiger2, RGB(255, 0, 255))
TransparentSpriteColor(#anzeiger2, RGB(255, 0, 255))
TransparentSpriteColor(#platte1, RGB(255, 0, 255))
TransparentSpriteColor(#hebel1, RGB(255, 0, 255))
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering )
ButtonGadget(#Button_0,5, 10,60, 20, "Ende")
ButtonGadget(#Button_1,70, 10, 60, 20, "verbinden")
ButtonGadget(#Button_2,135, 10, 60, 20, "trennen")
StringGadget(#String_0, 200, 10, 100, 20, "")
StringGadget(#String_1, 5, 80, 80, 30, "")
StringGadget(#String_2, 100, 80, 80, 30, "")
StringGadget(#String_3, 5, 150, 80, 30, "")
Quit = 0
Port = 1435
status = 0
ClearScreen(RGB(140,140,140))
If InitNetwork() = 0
MessageRequester("Info", "Kein Netzwerk !", #PB_MessageRequester_Ok)
End
EndIf
sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
sprite_neu(#zeiger2,300,100,200,200,motor/10,0,-3,255)
sprite_neu(#platte1,100,260,150,100,90,0,0,255)
sprite_neu(#hebel1,150,260,150,100,fahrst*6-115,45,-5,255)
Repeat
EventID = WaitWindowEvent(5)
Select EventID
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_0
Quit = 1
Case #Button_1
If Not status
conID = OpenNetworkConnection("127.0.0.1", Port)
If conID
status = 1
zusi_hello()
SetGadgetText(#String_0,"verbunden")
EndIf
EndIf
Case #Button_2
If status <> 0
CloseNetworkConnection(conID)
status = 0
SetGadgetText(#String_0,"getrennt")
EndIf
EndSelect
EndSelect
If status
cEvent = NetworkClientEvent(conID)
Select cEvent
Case #PB_NetworkEvent_Data
daten_empf()
EndSelect
EndIf
FlipBuffers()
Until Quit = 1 Or EventID = #PB_Event_CloseWindow
FreeMemory(*sbuffer)
FreeMemory(*rbuffer)
FreeMemory(*buffer)
End
Procedure zeige_daten()
sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
sprite_neu(#zeiger2,300,100,200,200,motor/10,0,-3,255)
sprite_neu(#platte1,100,260,150,100,90,0,0,255)
sprite_neu(#hebel1,150,260,150,100,fahrst_n*6-115,45,-5,255)
FlipBuffers()
SetGadgetText(#String_3,Str(geschw))
SetGadgetText(#String_2,Str(motor))
SetGadgetText(#String_1,Str(fahrst_n))
EndProcedure
Procedure daten_send_empf()
sData = SendNetworkData(conID, *sbuffer, offs)
rData = ReceiveNetworkData(conID, *rbuffer, 256)
EndProcedure
Procedure daten_empf()
rData = ReceiveNetworkData(conID, *rbuffer, 256)
If PeekA(*rbuffer+6) = 1
PokeA(*buffer + 0, PeekA(*rbuffer+7))
PokeA(*buffer + 1, PeekA(*rbuffer+8))
PokeA(*buffer + 2, PeekA(*rbuffer+9))
PokeA(*buffer + 3, PeekA(*rbuffer+10))
geschw=Int(PeekF(*buffer))
Goto weiter
EndIf
If PeekA(*rbuffer+6) = 9
PokeA(*buffer + 0, PeekA(*rbuffer+7))
PokeA(*buffer + 1, PeekA(*rbuffer+8))
PokeA(*buffer + 2, PeekA(*rbuffer+9))
PokeA(*buffer + 3, PeekA(*rbuffer+10))
motor=Int(PeekF(*buffer))
Goto weiter
EndIf
If PeekA(*rbuffer+6) = 51
PokeA(*buffer + 0, PeekA(*rbuffer+7))
PokeA(*buffer + 1, PeekA(*rbuffer+8))
PokeA(*buffer + 2, PeekA(*rbuffer+9))
PokeA(*buffer + 3, PeekA(*rbuffer+10))
fahrst_n=Int(PeekF(*buffer))
EndIf
weiter:
If PeekA(*rbuffer+11) = 1
PokeA(*buffer + 0, PeekA(*rbuffer+12))
PokeA(*buffer + 1, PeekA(*rbuffer+13))
PokeA(*buffer + 2, PeekA(*rbuffer+14))
PokeA(*buffer + 3, PeekA(*rbuffer+15))
geschw=Int(PeekF(*buffer))
Goto weiter1
EndIf
If PeekA(*rbuffer+11) = 9
PokeA(*buffer + 0, PeekA(*rbuffer+12))
PokeA(*buffer + 1, PeekA(*rbuffer+13))
PokeA(*buffer + 2, PeekA(*rbuffer+14))
PokeA(*buffer + 3, PeekA(*rbuffer+15))
motor=Int(PeekF(*buffer))
Goto weiter1
EndIf
If PeekA(*rbuffer+11) = 51
PokeA(*buffer + 0, PeekA(*rbuffer+12))
PokeA(*buffer + 1, PeekA(*rbuffer+13))
PokeA(*buffer + 2, PeekA(*rbuffer+14))
PokeA(*buffer + 3, PeekA(*rbuffer+15))
fahrst_n=Int(PeekF(*buffer))
EndIf
weiter1:
If PeekA(*rbuffer+16) = 1
PokeA(*buffer + 0, PeekA(*rbuffer+17))
PokeA(*buffer + 1, PeekA(*rbuffer+18))
PokeA(*buffer + 2, PeekA(*rbuffer+19))
PokeA(*buffer + 3, PeekA(*rbuffer+20))
geschw=Int(PeekF(*buffer))
Goto weiter2
EndIf
If PeekA(*rbuffer+16) = 9
PokeA(*buffer + 0, PeekA(*rbuffer+17))
PokeA(*buffer + 1, PeekA(*rbuffer+18))
PokeA(*buffer + 2, PeekA(*rbuffer+19))
PokeA(*buffer + 3, PeekA(*rbuffer+20))
motor=Int(PeekF(*buffer))
Goto weiter2
EndIf
If PeekA(*rbuffer+16) = 51
PokeA(*buffer + 0, PeekA(*rbuffer+17))
PokeA(*buffer + 1, PeekA(*rbuffer+18))
PokeA(*buffer + 2, PeekA(*rbuffer+19))
PokeA(*buffer + 3, PeekA(*rbuffer+20))
fahrst_n=Int(PeekF(*buffer))
EndIf
weiter2:
zeige_daten()
EndProcedure
Procedure zusi_hello()
offs = 0 ; HELLO-Befehl
PokeL(*sbuffer + 0, $0D) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $01) : offs + 1
PokeA(*sbuffer + 6, $01) : offs + 1
PokeA(*sbuffer + 7, $02) : offs + 1
client$ = "Fahrpult"
PokeA(*sbuffer + 8, Len(client$)) : offs + 1
PokeS(*sbuffer + 9, client$,-1, #PB_Ascii) : offs + Len(client$)
daten_send_empf()
offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 0A Geschwindigkeit/Motordrehzahl/Fahrstufe
PokeL(*sbuffer + 0, $07) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $03) : offs + 1
PokeA(*sbuffer + 6, $00) : offs + 1
PokeA(*sbuffer + 7, $0A) : offs + 1
PokeA(*sbuffer + 8, $01) : offs + 1
PokeA(*sbuffer + 9, $09) : offs + 1
PokeA(*sbuffer + 10, $33) : offs + 1
daten_send_empf()
offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 00
PokeL(*sbuffer + 0, $04) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $03) : offs + 1
PokeA(*sbuffer + 6, $00) : offs + 1
PokeA(*sbuffer + 7, $00) : offs + 1
daten_send_empf()
EndProcedure