eigentlich wollte ich ein Minigame schreiben (PureSnake), doch leider hab ich die lust verloren.
Damit der Code für die Schlangensimulation aber nicht verloren geht, möchte ich ihn mit euch teilen:

Die Schlange bewegt sich immer zur Maus.
Code: Alles auswählen
;- Vector-Include
Structure Vector
X.f : Y.f
EndStructure
Procedure.i V_Set(*Use.Vector, X.f, Y.f)
*Use\X = X
*Use\Y = Y
ProcedureReturn *Use
EndProcedure
Procedure.i V_Copy(*Use.Vector, *Source.Vector)
*Use\X = *Source\X
*Use\Y = *Source\Y
ProcedureReturn *Use
EndProcedure
Procedure.i V_Add(*Use.Vector, *Source.Vector, Factor.f=1.0)
*Use\X + *Source\X*Factor
*Use\Y + *Source\Y*Factor
ProcedureReturn *Use
EndProcedure
Procedure.i V_Multiply(*Use.Vector, Value.f)
*Use\X * Value
*Use\Y * Value
ProcedureReturn *Use
EndProcedure
Procedure.i V_Addition(*Destination.Vector, *Source1.Vector, *Source2.Vector)
*Destination\X = *Source1\X + *Source2\X
*Destination\Y = *Source1\Y + *Source2\Y
ProcedureReturn *Destination
EndProcedure
Procedure.i V_Subtraction(*Destination.Vector, *Source1.Vector, *Source2.Vector)
*Destination\X = *Source1\X - *Source2\X
*Destination\Y = *Source1\Y - *Source2\Y
ProcedureReturn *Destination
EndProcedure
Procedure.f V_Length(*Source.Vector)
ProcedureReturn Sqr(*Source\X * *Source\X + *Source\Y * *Source\Y)
EndProcedure
Procedure.i V_Normalize(*Use.Vector)
Protected Length.f = V_Length(*Use)
If Length
*Use\X / Length
*Use\Y / Length
EndIf
ProcedureReturn *Use
EndProcedure
Procedure V_Orthogonalize(*Use.Vector)
V_Normalize(*Use)
Swap *Use\X, *Use\Y
*Use\X = -*Use\X
EndProcedure
Procedure.i V_SetLength(*Use.Vector, Length.f)
V_Normalize(*Use)
V_Multiply(*Use, Length)
ProcedureReturn *Use
EndProcedure
;- Snake
#SnakeLength = 20 ; Schlagenteile
#SnakeVelocity = 100 ; Geschwindigkeit
Structure Snake
Sprite.i
Array Node.Vector(2)
Velocity.Vector
EndStructure
Global TimeFactor.f, Time.i = ElapsedMilliseconds()
Procedure MoveSnake(*Snake.Snake, TargetX.f, TargetY.f)
Protected I.i, Last.i = ArraySize(*Snake\Node())
Protected Line.Vector
With *Snake
; Kopf bewegen
V_Set(\Velocity, TargetX-\Node(0)\X, TargetY-\Node(0)\Y)
V_SetLength(\Velocity, 24)
V_Subtraction(Line, \Node(0), \Node(1))
V_Add(\Velocity, Line, 4)
V_SetLength(\Velocity, #SnakeVelocity)
; Schlagenteile hinterher ziehen
V_Add(\Node(0), \Velocity, TimeFactor)
For I = 1 To Last
V_Subtraction(Line, \Node(I-1), \Node(I))
V_SetLength(Line, V_Length(Line)-16)
V_Add(\Node(I), Line)
Next
EndWith
EndProcedure
Procedure DisplaySnake(*Snake.Snake)
Protected I.i, Last.i = ArraySize(*Snake\Node())
Protected Line.Vector, Line2.Vector, Orth.Vector, Orth2.Vector
Protected Dim Node.Vector(Last)
With *Snake
CopyArray(\Node(), Node())
For I = 1 To Last-1
V_Normalize(V_Subtraction(Line, Node(I-1), Node(I+1)))
V_Add(Node(I), Line, Sin(I-ElapsedMilliseconds()*0.005)*5)
Next
; Kopf
ClipSprite(\Sprite, 80, 0, 48, 64)
V_Normalize(V_Subtraction(Line, Node(0), Node(1)))
V_Normalize(V_Subtraction(Line2, Node(1), Node(2)))
V_Orthogonalize(V_Copy(Orth, Line))
V_Orthogonalize(V_Addition(Orth2, Line, Line2))
TransformSprite(\Sprite,
Node(1)\X-Orth2\X*16, Node(1)\Y-Orth2\Y*16,
Node(0)\X-Orth\X*16+Line\X*24, Node(0)\Y-Orth\Y*16+Line\Y*24,
Node(0)\X+Orth\X*16+Line\X*24, Node(0)\Y+Orth\Y*16+Line\Y*24,
Node(1)\X+Orth2\X*16, Node(1)\Y+Orth2\Y*16)
DisplayTransparentSprite(\Sprite, 0, 0)
; Schwanz
ClipSprite(\Sprite, 0, 0, 40, 64)
V_Normalize(V_Subtraction(Line, Node(Last-1), Node(Last)))
V_Normalize(V_Subtraction(Line2, Node(Last-2), Node(Last-1)))
V_Orthogonalize(V_Copy(Orth, Line))
V_Orthogonalize(V_Addition(Orth2, Line, Line2))
TransformSprite(\Sprite,
Node(Last)\X-Orth\X*16-Line\X*16, Node(Last)\Y-Orth\Y*16-Line\Y*16,
Node(Last-1)\X-Orth2\X*16, Node(Last-1)\Y-Orth2\Y*16,
Node(Last-1)\X+Orth2\X*16, Node(Last-1)\Y+Orth2\Y*16,
Node(Last)\X+Orth\X*16-Line\X*16, Node(Last)\Y+Orth\Y*16-Line\Y*16)
DisplayTransparentSprite(\Sprite, 0, 0)
; Mittelteil
ClipSprite(\Sprite, 40, 0, 16, 64)
For I = 1 To Last-2
V_Normalize(V_Subtraction(Line, Node(I), Node(I+1)))
V_Normalize(V_Subtraction(Line2, Node(I+1), Node(I+2)))
V_Orthogonalize(V_Addition(Orth, Line, Line2))
V_Normalize(V_Subtraction(Line2, Node(I-1), Node(I)))
V_Orthogonalize(V_Addition(Orth2, Line, Line2))
TransformSprite(\Sprite,
Node(I+1)\X-Orth\X*16, Node(I+1)\Y-Orth\Y*16,
Node(I)\X-Orth2\X*16, Node(I)\Y-Orth2\Y*16,
Node(I)\X+Orth2\X*16, Node(I)\Y+Orth2\Y*16,
Node(I+1)\X+Orth\X*16, Node(I+1)\Y+Orth\Y*16)
DisplayTransparentSprite(\Sprite, 0, 0)
Next
EndWith
EndProcedure
InitSprite()
InitKeyboard()
UsePNGImageDecoder()
Enumeration
#Window
#Sprite_Snake
EndEnumeration
OpenWindow(#Window, 0, 0, 800, 600, "Pure Snake", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 0, 0, 0)
SpriteQuality(#PB_Sprite_BilinearFiltering)
CatchSprite(#Sprite_Snake, ?Snake, #PB_Sprite_AlphaBlending)
Define Snake.Snake, I.i
ReDim Snake\Node(#SnakeLength)
Snake\Sprite = #Sprite_Snake
For I = 0 To #SnakeLength
V_Set(Snake\Node(I), 400-I*16, 100)
V_Set(Snake\Velocity, 20, 0)
Next
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #Null
Break
EndSelect
ForEver
TimeFactor = (ElapsedMilliseconds()-Time)/1000
Time = ElapsedMilliseconds()
ClearScreen($E0E0E0)
MoveSnake(Snake, WindowMouseX(#Window), WindowMouseY(#Window))
DisplaySnake(Snake)
FlipBuffers()
ForEver
DataSection
Snake:
Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000080000000,$7022DA0000000608,$4942730400000025
Data.q $64087C0808080854,$5948700900000088,$1B0000AF1B000073,$00001C911A5E01AF,$6F53745845741900
Data.q $7700657261777466,$63736B6E692E7777,$9B67726F2E657061,$49310E00001A3CEE,$6D5BED9C78544144
Data.q $BF74FA7E95C59590,$C3B0CC0CEE6BF71F,$2446E1289DD1A8CC,$9A5B535B1650AE0B,$FF1258C62823F32C
Data.q $4DC4D64FE4D92668,$36B18A98881A5AC9,$CA8B446D49553465,$540CA4525C4D71AE,$02C9658A4A76B661
Data.q $066218D65D64E085,$3F7AFDCB99981818,$BDCEE6778FECFBBA,$BAA9E1015D9820C0,$7DDDBF774F3BEF35
Data.q $33305A7DD39F774E,$F87C82E21084042E,$3E4D0DF686DAC303,$874A943EBEBE8A8F,$5A14EC308B8C1045
Data.q $309B6D6115D68497,$44C532913EC676A6,$F58A99338654ACE3,$60E0F00EE5CE36FD,$C02030D606050307
Data.q $66015AFFE29843EF,$E85487E6F8032C16,$340032169AED0D43,$5A26A6325C8A3A0A,$C9975A45638A1D5B
Data.q $8C2D662494A94518,$0000B56B0AECC491,$A56FA52C508588A2,$71A575D6355AB6B4,$B2375C65254B6D1C
Data.q $605A8D0D0EC54C99,$1FC228F9F2D6194A,$D3C0553EC2CD00A5,$31D5329D8D000F5A,$EFFF93CB0C332A67
Data.q $24753810BAF5DF7D,$6B49161844E7B7B7,$E38A4B4E9496B487,$D6A5638E4736B492,$2D6A5871D2C3195A
Data.q $0415AC89992C5295,$10ACA44C303EC9D8,$631B5A94B4A31AD6,$98E38831B178E3B4,$E9D19AB5740FDF63
Data.q $C1C19B667A7A67B4,$698056F38452F3A1,$05C052687C094FA1,$A29D530006D4D331,$0091B585098C2075
Data.q $77FE99C66DFC90DA,$8B1CC1236B0F22F1,$966B48D4C617C64C,$94AE31A42EB910C6,$632A52928C632B52
Data.q $244384631D8A22A4,$38C88A4B58E0211C,$040209110404B2D6,$5ADA444B60196B5B,$1B010C94A44599AB
Data.q $8086C002006B210A,$5CE266AD51918D0E,$65AC0B008A2755AE,$CE0149CE1A5D6700,$1D1D1882BEBEF424
Data.q $7142304114EC30A2,$188754DB53A9D3EC,$4F3C2D662218C923,$011B3112D611B312,$B3069E7922B66078
Data.q $CD16FBDE00079E11,$612B3056DEA48107,$44490B5A58A54B0C,$4C18C70910ED18CA,$2E4108E16B5D9B0A
Data.q $5D6AE402EC109EC0,$3E0DADF3E3C30F6B,$9D7A4A5B3367ACC2,$085141B5B49C211C,$DACD4A903A944235
Data.q $52D62A644A3D9445,$AB888550C6CA8899,$E2010615398D5144,$5EF304343D71B6B6,$6BF05A601559C1B3
Data.q $3356A864A95E849B,$FBE57C0832B39732,$9A6FC71CAC71C656,$49F9243B27718CDA,$0D9882CC965AC829
Data.q $60024CC160082949,$FBD4C28015A87491,$92829480AEA48CC5,$4250AD656224B136,$4DC089BB37464DC0
Data.q $47EAA28BAEC78E2A,$8210EE36B2AE0DAD,$69FBE73665D9985B,$64CB6ECCA595042B,$454CCE392247FEAE
Data.q $6A0CA4941C72516B,$7EDF8CA18416D38E,$304A4CECFA01BF7B,$68BF044FC22402A3,$134A951E8B151B51
Data.q $5294A6185409932A,$8E371C211C9295D6,$344DD610AEC44BAD,$F254888AB36A6A7E,$3241274956664A57
Data.q $02529BBA72633243,$F93B26800B3C1120,$5998244416045762,$C70C2ABA5B5A4332,$30E78DAC7B0DAD7B
Data.q $AD9E58029B66169B,$B3A0B7CF9071C714,$513130089C4E0E73,$57307D5B5A04649B,$CD4E8A2881363630
Data.q $F3CF7EF8DFBC896A,$551C731E0086E54A,$3B5AAB8A9594C634,$704A4CF50783C1D1,$681F5F7E12980546
Data.q $2A5426952C84F878,$01E4442794211D25,$C692A6D98A5599F0,$A992F084252807C1,$8F6298DA4D6B5C8D
Data.q $3D01DB0E38AEB531,$A7332C9802DD5ACB,$D6648401C201EB01,$5FBFE4614BD8D53C,$1CBCF0F94A902108
Data.q $161E441F4A424082,$3D52FA9EA7879C2E,$7D1F478DFFDDEEDD,$4BD2F0A5CB9EFEA1,$73B10820894A418F
Data.q $7063AF57EAFC2EE7,$F2F94371C711DFF0,$EDB74E9E3F77EF98,$452A4E23198EDAD5,$9E216F6F612BAD15
Data.q $120149A0951A0BB2,$6D45A2D2CF8033C1,$6CC387DF1C08E474,$2889A53334C36B7D,$66D99652D6B3644B
Data.q $91952AB336619089,$D65D44C60DEA819B,$2F3FB9FFEAC01C9A,$C0C9C70BAEB80852,$05D6F5B87A520718
Data.q $74D735C4EFE7FCF8,$C0C0C51A1D0E0003,$FFD7EB0210E74FDF,$18C60001DABABA2D,$7AB54A943AEF7BDC
Data.q $37C5E2C01EEB759A,$BC15E4FC9FB5F69C,$553631389C46E2F8,$E7BF7DE7B6BCF59A,$75DC78E6519D6B25
Data.q $2560F07851B5B2FD,$420CE0151B667E06,$35C3C3900A152CFA,$B32318C803E12947,$6ADC03C8913C8842
Data.q $FC32A56E7081E52D,$67D38DAC0B6B6B29,$5294142105220AEA,$6D05BE7C832B3598,$8E0F07199728AD6D
Data.q $1F19322421050841,$C2C9696803D6FADF,$FCBC4EEAFABC5D75,$4B9720440B1220F2,$007DA748D586C361
Data.q $E3FC7E2BFD2F4BC0,$6F5BFCEC5CEFF5AD,$777BFAECC747471D,$DFEC3AF1BC6E0777,$F379B19980000EFF
Data.q $5290000FD03031AF,$55DD6EB602D2E962,$C02A33BEDB6DB3CF,$C19F55AAC19F55AA,$26FF5FEBE06F3D9E
Data.q $B417D8E1852A952A,$663BFFCECD94DCAE,$50B6BBEFAD54C6C1,$6F4C42CB5A1A1D80,$9BBFE8C94154D11A
Data.q $D2A72E6E0048050A,$6EE01DB231BCAA52,$8C106F44211AE821,$E2626A7BEE2C51DC,$7C2249727D68D6BF
Data.q $DB85D3D3D0F1C701,$685DC771DC0BFB6E,$969680BE7C805B6B,$BE060629FF4E901B,$5E9FA78FBE1B0D8C
Data.q $73ADAD14799E6787,$8B356A2E440A6520,$745CF77745DF7BBD,$7225FCF73DC6CC74,$6A952801259234B9
Data.q $562BD1BD7B69B4D8,$D4BF7F55366C8ADC,$FDE9A5BFEFE80078,$C18DA78E2176D7B5,$0C763BF13416CB65
Data.q $D58639191F84DAC1,$F7F45EFFBFA1D7AB,$6BABA1D7ABD58BDF,$F79BCC67F96CB62E,$8B179FE131800051
Data.q $55295AE5442CBC6F,$20C0908B15E6B996,$68BF9AF4C04B9635,$98613BEE3F1D1B51,$220EE2279C41054D
Data.q $8B8BAA6311F006EE,$CC3DC8C104D737C5,$DD3A4195286005A6,$FBCAE5618FD6D68D,$1E2789E02F2BCAF0
Data.q $9A9BA6E00F0FC3C1,$D1D18CDFAFD67237,$C562B1F69D200022,$A950DB8DC6FC4DAD,$C356A82E7F059704
Data.q $6BCF26D6082177A6,$1B18EDC1C1853CD6,$B7070638D8D8C71B,$D8BAEB871F87E1E3,$242EEAB558FBE1B0
Data.q $17FDBF8B17B6C783,$A7264CBC70166C63,$D06EA6DC6A0E850A,$8E395C747A3A4186,$036AAEBACEB1C5EB
Data.q $0F3BDAB5D5F009D0,$0EDC6D66BE074A94,$FF07C1E2D7BDBD00,$421DAF3C2F5CB906,$C998C60863B1D838
Data.q $3536D7E3FC7C0ACA,$D3EDC5CC990871C0,$FBD36779BCD8907F,$FE06C8E3862FB7ED,$F66CF84A95E34E3F
Data.q $F3FACEDCEE7715F4,$3AF4FD3C05F2BE57,$185F1F5ABB3C5E24,$9D861502D5ABCA04,$C3FE8F4D5AEB71A2
Data.q $9E91932AD7BFF7E2,$ACE803662D6B3294,$0025C9F1C4578756,$0D7E8FA3C392D2D0,$6FAC8F23C12D96CB
Data.q $7C8072E516D680AA,$D17E2FC0356A833E,$1AFAB2E779DDE53C,$572B894DA706AD59,$0E87F0797326432E
Data.q $7E5F2C29FFD7D68D,$B7D8E3E1F0F9FD73,$EF1C7DDFBBFE666F,$8725A5A3174BA585,$C997D8A8A224F162
Data.q $8EAD5959BAE1D9CC,$2890E04693012D34,$7910248D9B293B16,$17470C35A00322D6,$FCFE6000DB89E187
Data.q $B44802CF0BC2F1EB,$30383E9BB7DEEF73,$B4D800033E7C8FD0,$9AA6CD9B05937B69,$BE5CA3B69B4DC4A6
Data.q $B88D13FE5B2DF97C,$C0D1DDDDD0EBC6F1,$AE7F2A7677A344EF,$D61278B142E9E9E8,$AD2B6389C1123746
Data.q $025F4E077D7D136D,$08054A52497BBD92,$FDD0ED5ADCEA98CF,$D1FA3F1E6B6B4400,$7EB026C7638000D3
Data.q $8BD85C2D0FA6E6FD,$B00952A6A313CBE5,$5B8AC57E26B6E371,$E0D8E3E772FFA3EB,$61068DF13576D7B5
Data.q $FE467BBADD6C1B1C,$6B580003CC28507C,$009AC713C9A662AE,$9853BC866869EAFA,$E1F057A05BA84C3A
Data.q $C652B1CA94015D42,$C39994A1C034631A,$F162E003CFD5F4E9,$60DAD0CBEFBBEE24,$BD853ABFBAD69CCE
Data.q $9351892D96C6DF7B,$BF135972B958F8C9,$1E15C1AB5476D369,$26E2FB7EDC48E380,$7E4F891C7420D1BE
Data.q $E86860F9FC8CD172,$D61083FC9100002D,$69EB06062905B126,$2B687CF9C0A01526,$002A1121D666B495
Data.q $F9CDE78F75AF3C26,$76DC21EEFBBC0025,$97CB05B4DA6C4ADB,$8AF3774F0B8582DF,$A6E5CBCA64800AC5
Data.q $E5F27EECF972E0FD,$FF7FB000741A37C6,$05BF81B46874383B,$E18AE7F2A716A18D,$B5BF77220000C3E1
Data.q $2464F8D10C871D88,$EEF2D684764A0251,$5CE66AA9933807DD,$46001388C64A2D60,$6FF6D38ECDEEA952
Data.q $CFDBFB7C42083800,$7F79BCC7EEBBAEE0,$B26CD908A531F4D2,$66E9FD3E3ED3A5CE,$051F56DF3FE7F83F
Data.q $4ED4FCD0BF0FDA17,$76AEAEC30D1A2360,$13F57ABF3330582C,$3D0F7E9AAFE4B258,$C2EC763BF4A68DF4
Data.q $07E6EB80002593C9,$3BF7C6CA0828A5AD,$CECFA01B06BA636D,$894A472C309AED9E,$1FC2211E01C6600A
Data.q $786EE5CC5FABE9D2,$4787C380011DC892,$01D2A500FE1FC3F0,$D2E9611B5831C104,$9BC66654FC4CA402
Data.q $516C7142A9AEFE6F,$AF78CE5C6E6F34A9,$5AF1A725FEFEC09D,$5795A7232391FC27,$1CFB3ECFCFEB572E
Data.q $11093D26C7D5FABE,$4A9875F7D7BED529,$1286232646F3DAF9,$F760421118892028,$0D401880A16DBBEE
Data.q $B6663805A58E22C8,$BAFE6E5CE5D32935,$60AC8E18737E3A28,$B50D75A0D75A6DB6,$FEBC5BF8DC6C11DA
Data.q $9B21D7F5FD712FFA,$D31083BFBDDEC76D,$3C8E8E8FD03035FA,$5CFE685F87EF0B80,$D05B319A6F374E90
Data.q $F7C0DF3BE77E7764,$0037EFB7D80FF7BE,$FF07C1E3E60B0580,$087C5F8BE114511A,$78E8B9933FF5BD6F
Data.q $08195252FDDD7F3E,$27478787A6A54AC3,$9A0C386800D68523,$050A3774343B0254,$7DF58CA56692A544
Data.q $88422A2001B6B5A9,$77B3FBE138EBCF09,$5A53F870C3DBAD68,$08E38D9D5ACCFED7,$1210A769348C8E47
Data.q $FB9EE7851C703842,$59ACC27FD3FA7E01,$61D378C4C4D061C9,$23A1D0E35785C2D0,$1874DAA952A0C3F5
Data.q $F781E352FB3F3674,$BF135F6DB6DC09DE,$39D9DF0944016974,$67BF1358F93E4F07,$4A84BEE7DCF81BCF
Data.q $1C9D7EF4A4099925,$A4E3B2E8C6A3D906,$6CFB878664BE7CC2,$A1D4C03C5A7811A3,$B8E8F4746D45A2D0
Data.q $8C679A885736DD72,$B5AC9A52D22B5B4C,$319089645848F272,$5C7145B1D146B746,$CCF2601761B598F9
Data.q $3C1C7E25C4B2E0EC,$038196BDDEEC1335,$4E9AA54B69DBDBDC,$B28B32AE8E3910A5,$98A5042F8667C694
Data.q $DB7CEBCF7CA44539,$D6AEC10BE003C9F7,$1EB08847A575AFB1,$D673A10BCE8C6210,$0FA007003EC014DA
Data.q $D144428A23084059,$BAD8BBEB75B3BDB4,$1F094C8406B3D5F5,$2972E7E146EADC48,$013E75D78913E27C
Data.q $4512A8A549F1CC21,$083C1F416F6F51E3,$090AF3DB54D67E06,$AD54574E994356AB,$42BAC88721C71D26
Data.q $225D88971D8E3758,$A0E99C244BB35A38,$2575084290CC5248,$4D6121545C666C24,$A142882801141A09
Data.q $A7AEBA588A342839,$CE76B4AC54A966B4,$1412B8B310D42821,$1F7A25368507317A,$E92D3A44A6D6E161
Data.q $C67E161C25F8584A,$B581E8043179E70C,$317C25C862E57115,$380C3574E7CCC664,$25D86AE5701CBEF5
Data.q $3972BC0B3DEC357B,$CAE0C7FA1CB9F2F4,$02FFF87AE38BF0F5,$3646C3E924DA3596,$444E454900000000
Data.q $00000000826042AE
EndDataSection