Verzeihen Sie die Englisch Kommentare.
Code: Alles auswählen
Procedure rotateGrid(Array grid(2), quarterTurns = 0) ;1 quarterTurns = 90 degrees clockwise, -1 quarterTurns = -90 degrees clockwise
Protected Dim gridCopy(0, 0), i, j, x = ArraySize(grid(), 1), y = ArraySize(grid(), 2)
If x <> y: ProcedureReturn: EndIf ;grid is not square
CopyArray(grid(), gridCopy())
Select quarterTurns % 4
Case 0 ; no change
ProcedureReturn
Case 1, -3 ;90 degree clockwise (also 270 degree counter-clockwise)
For i = 0 To x
For j = 0 To x
grid(i, j) = gridCopy(j, x - i)
Next
Next
Case 2, -2 ;180 degree clockwise (also 180 degree counter-clockwise)
For i = 0 To x
For j = 0 To x
grid(i, j) = gridCopy(x - i, x - j)
Next
Next
Case 3, -1 ;270 degree clockwise (also 90 degree counter-clockwise)
For i = 0 To x
For j = 0 To x
grid(i, j) = gridCopy(x - j, i)
Next
Next
EndSelect
EndProcedure
InitSprite()
OpenWindow(0, 0, 0, 500, 200, "Rotate", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 200, 200)
ButtonGadget(0, 250, 20, 220, 20, "Rotate 90 degrees clockwise")
ButtonGadget(1, 250, 60, 220, 20, "Rotate 90 degrees counter-clockwise")
ButtonGadget(2, 250, 100, 220, 20, "Rotate 180 degrees")
rot = CreateSprite(#PB_Any, 20, 20)
gruen = CreateSprite(#PB_Any, 20, 20)
StartDrawing(SpriteOutput(rot))
Box(0, 0, 20, 20, RGB(255, 0, 0))
StopDrawing()
StartDrawing(SpriteOutput(gruen))
Box(0, 0, 20, 20, RGB(0, 255, 0))
StopDrawing()
Dim spritePos(9, 9)
For y = 0 To 9
For x = 0 To 9
If Random(1)
spritePos(x, y) = rot
Else
spritePos(x, y) = gruen
EndIf
Next
Next
Repeat
Repeat
event = WindowEvent()
If event = #PB_Event_Gadget
Select EventGadget()
Case 0 ;rotate clockwise 90 degrees
rotateGrid(spritePos(), 1)
Case 1 ;rotate counter-clockwise 90 degrees
rotateGrid(spritePos(), -1)
Case 2 ;rotate 180 degrees
rotateGrid(spritePos(), 2)
EndSelect
EndIf
Until event = 0 Or event = #PB_Event_CloseWindow
ClearScreen(0)
For y = 0 To 9
For x = 0 To 9
DisplaySprite(spritePos(x, y), x * 20, y * 20)
Next
Next
FlipBuffers()
Delay(10)
Until event = #PB_Event_CloseWindow