Okay, it seems to be working now.
For anyone who's interested here is the code I came up with. Cursors move and rotate.
Any suggestions on improvements so far welcome.
[CODE]
;;;;;;;;;;;;;;;;;;;;
; ;
; Main starts here ;
; ;
;;;;;;;;;;;;;;;;;;;;
Dim Grid(11,20)
; Cube,Gridx,Gridy,Left,Right,Down,Rotate,Realx,Realy
Dim Block(4,9)
Timer = InitGame()
While Not KeyHit(1)
Frames = WaitTimer(Timer)
For k = 1 To Frames
MoveShape()
UpdateWorld
Next
RenderWorld
Flip
Wend
;;;;;;;;;;;;;;;;;;;;
; ;
; Main ends here ;
; ;
;;;;;;;;;;;;;;;;;;;;
Function InitGame()
Graphics3D 800,600
SetBuffer BackBuffer()
Camera = CreateCamera()
CameraViewport Camera,0,0,GraphicsWidth(),GraphicsHeight()
Light = CreateLight()
For a = 0 To 20 Step 2
x = -10 + a
BottomWall = CreateCube()
PositionEntity BottomWall,x,-20,30
Next
For a = 0 To 40 Step 2
y = 20 - a
LeftWall = CreateCube()
PositionEntity LeftWall,-12,y,30
RightWall = CreateCube()
PositionEntity RightWall,12,y,30
Next
NewShape()
Timer = CreateTimer(5)
Return Timer
End Function
Function NewShape()
SeedRnd = MilliSecs()
ShapeType = Rnd(1,7)
For a = 1 To 4
Block(a,1) = NewBlock(ShapeType,a)
Next
End Function
Function NewBlock(ShapeType,BlockNo)
If BlockNo = 1
aBlock = CreateCube()
PositionEntity aBlock,0,22,30
EntityColor aBlock,150,100,100
Else
aBlock = CreateCube(Block(1,1))
EntityColor aBlock,100,100,100
Select ShapeType
Case 1
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,0,4,0
Case 4
PositionEntity aBlock,0,6,0
End Select
Case 2
Select BlockNo
Case 2
PositionEntity aBlock,2,0,0
Case 3
PositionEntity aBlock,0,2,0
Case 4
PositionEntity aBlock,0,4,0
End Select
Case 3
Select BlockNo
Case 2
PositionEntity aBlock,-2,0,0
Case 3
PositionEntity aBlock,0,2,0
Case 4
PositionEntity aBlock,0,4,0
End Select
Case 4
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,0,4,0
Case 4
PositionEntity aBlock,2,2,0
End Select
Case 5
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,2,2,0
Case 4
PositionEntity aBlock,2,0,0
End Select
Case 6
Select BlockNo
Case 2
PositionEntity aBlock,2,0,0
Case 3
PositionEntity aBlock,2,2,0
Case 4
PositionEntity aBlock,4,2,0
End Select
Case 7
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,-2,2,0
Case 4
PositionEntity aBlock,2,0,0
End Select
End Select
End If
Return aBlock
End Function
Function MoveShape()
LBlocked = 0
RBlocked = 0
DBlocked = 0
;Rotate
If KeyHit(200)
TurnEntity Block(1,1),0,0,90
TurnBack = 0
For a = 1 To 4
TranslateToGrid(a)
CheckRotate(a)
If Block(a,7) = 1
TurnBack = 1
End If
Next
If TurnBack = 1
TurnEntity Block(1,1),0,0,-90
End If
End If
;CheckMovement
For a = 1 To 4
TranslateToGrid(a)
CheckMovement(a)
If Block(a,4) = 1
LBlocked = 1
End If
If Block(a,5) = 1
RBlocked = 1
End If
If Block(a,6) = 1
DBlocked = 1
End If
Next
x=0
y=-2
If KeyHit(203)
If Not LBlocked = 1
x = -2
End If
End If
If KeyHit(205)
If Not RBlocked = 1
x = 2
End If
End If
If DBlocked = 1
MoveToGrid()
CheckFull()
NewShape()
Else
TranslateEntity Block(1,1),x,y,0
End If
End Function
Function TranslateToGrid(BlockNo)
x = EntityX(Block(BlockNo,1),True)
y = EntityY(Block(BlockNo,1),True)
a = x/2 + 6
b = y/2 + 10
Block(BlockNo,2) = a
Block(BlockNo,3) = b
Block(BlockNo,8) = x
Block(BlockNo,9) = y
End Function
Function CheckMovement(BlockNo)
Blockx = Block(BlockNo,2)
Blocky = Block(BlockNo,3)
For a = 4 To 6
Block(BlockNo,a) = 0
Next
;CheckLeft
If Blockx = 1
Block(BlockNo,4) = 1
Else
If Blocky <= 20
If Not Grid(Blockx-1,Blocky-1) = 0
Block(BlockNo,4) = 1
End If
End If
End If
;CheckRight
If Blockx = 11
Block(BlockNo,5) = 1
Else
If Blocky <= 20
If Not Grid(Blockx+1,Blocky-1) = 0
Block(BlockNo,5) = 1
End If
End If
End If
;CheckDown
If Blocky = 1
Block(BlockNo,6) = 1
Else
If Blocky <= 21
If Not Grid(Blockx,Blocky-1) = 0
Block(BlockNo,6) = 1
End If
End If
End If
End Function
Function MoveToGrid()
For a = 1 To 4
If Not Block(a,3) > 20
Grid( Block(a,2),Block(a,3) ) = CreateCube()
PositionEntity Grid( Block(a,2),Block(a,3) ),Block(a,8),Block(a,9),30
EntityColor Grid( Block(a,2),Block(a,3) ),100,100,100
Else
GameOver()
End If
Next
FreeEntity Block(1,1)
End Function
Function CheckFull()
For r = 1 To 20
Full = 1
For c = 1 To 11
If Grid(c,r) = 0
Full = 0
End If
Next
If Full = 1
For c = 1 To 11
FreeEntity Grid(c,r)
Grid(c,r) = 0
Next
For s = r + 1 To 20
For c = 1 To 11
If Not Grid(c,s) = 0
TranslateEntity Grid(c,s),0,-2,0
Grid(c,s-1) = Grid(c,s)
Grid(c,s) = 0
End If
Next
Next
CheckFull()
End If
Next
End Function
Function GameOver()
ClearWorld
Stop
End Function
Function CheckRotate(BlockNo)
Blockx = Block(BlockNo,2)
Blocky = Block(BlockNo,3)
Block(BlockNo,7) = 0
If Blockx < 1 Or Blockx > 11 Or Blocky < 2
Block(BlockNo,7) = 1
End If
If Blocky < 20
If Not Grid(Blockx,Blocky) = 0
Block(BlockNo,7) = 1
End If
End If
End Function
[/CODE]
For anyone who's interested here is the code I came up with. Cursors move and rotate.
Any suggestions on improvements so far welcome.
[CODE]
;;;;;;;;;;;;;;;;;;;;
; ;
; Main starts here ;
; ;
;;;;;;;;;;;;;;;;;;;;
Dim Grid(11,20)
; Cube,Gridx,Gridy,Left,Right,Down,Rotate,Realx,Realy
Dim Block(4,9)
Timer = InitGame()
While Not KeyHit(1)
Frames = WaitTimer(Timer)
For k = 1 To Frames
MoveShape()
UpdateWorld
Next
RenderWorld
Flip
Wend
;;;;;;;;;;;;;;;;;;;;
; ;
; Main ends here ;
; ;
;;;;;;;;;;;;;;;;;;;;
Function InitGame()
Graphics3D 800,600
SetBuffer BackBuffer()
Camera = CreateCamera()
CameraViewport Camera,0,0,GraphicsWidth(),GraphicsHeight()
Light = CreateLight()
For a = 0 To 20 Step 2
x = -10 + a
BottomWall = CreateCube()
PositionEntity BottomWall,x,-20,30
Next
For a = 0 To 40 Step 2
y = 20 - a
LeftWall = CreateCube()
PositionEntity LeftWall,-12,y,30
RightWall = CreateCube()
PositionEntity RightWall,12,y,30
Next
NewShape()
Timer = CreateTimer(5)
Return Timer
End Function
Function NewShape()
SeedRnd = MilliSecs()
ShapeType = Rnd(1,7)
For a = 1 To 4
Block(a,1) = NewBlock(ShapeType,a)
Next
End Function
Function NewBlock(ShapeType,BlockNo)
If BlockNo = 1
aBlock = CreateCube()
PositionEntity aBlock,0,22,30
EntityColor aBlock,150,100,100
Else
aBlock = CreateCube(Block(1,1))
EntityColor aBlock,100,100,100
Select ShapeType
Case 1
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,0,4,0
Case 4
PositionEntity aBlock,0,6,0
End Select
Case 2
Select BlockNo
Case 2
PositionEntity aBlock,2,0,0
Case 3
PositionEntity aBlock,0,2,0
Case 4
PositionEntity aBlock,0,4,0
End Select
Case 3
Select BlockNo
Case 2
PositionEntity aBlock,-2,0,0
Case 3
PositionEntity aBlock,0,2,0
Case 4
PositionEntity aBlock,0,4,0
End Select
Case 4
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,0,4,0
Case 4
PositionEntity aBlock,2,2,0
End Select
Case 5
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,2,2,0
Case 4
PositionEntity aBlock,2,0,0
End Select
Case 6
Select BlockNo
Case 2
PositionEntity aBlock,2,0,0
Case 3
PositionEntity aBlock,2,2,0
Case 4
PositionEntity aBlock,4,2,0
End Select
Case 7
Select BlockNo
Case 2
PositionEntity aBlock,0,2,0
Case 3
PositionEntity aBlock,-2,2,0
Case 4
PositionEntity aBlock,2,0,0
End Select
End Select
End If
Return aBlock
End Function
Function MoveShape()
LBlocked = 0
RBlocked = 0
DBlocked = 0
;Rotate
If KeyHit(200)
TurnEntity Block(1,1),0,0,90
TurnBack = 0
For a = 1 To 4
TranslateToGrid(a)
CheckRotate(a)
If Block(a,7) = 1
TurnBack = 1
End If
Next
If TurnBack = 1
TurnEntity Block(1,1),0,0,-90
End If
End If
;CheckMovement
For a = 1 To 4
TranslateToGrid(a)
CheckMovement(a)
If Block(a,4) = 1
LBlocked = 1
End If
If Block(a,5) = 1
RBlocked = 1
End If
If Block(a,6) = 1
DBlocked = 1
End If
Next
x=0
y=-2
If KeyHit(203)
If Not LBlocked = 1
x = -2
End If
End If
If KeyHit(205)
If Not RBlocked = 1
x = 2
End If
End If
If DBlocked = 1
MoveToGrid()
CheckFull()
NewShape()
Else
TranslateEntity Block(1,1),x,y,0
End If
End Function
Function TranslateToGrid(BlockNo)
x = EntityX(Block(BlockNo,1),True)
y = EntityY(Block(BlockNo,1),True)
a = x/2 + 6
b = y/2 + 10
Block(BlockNo,2) = a
Block(BlockNo,3) = b
Block(BlockNo,8) = x
Block(BlockNo,9) = y
End Function
Function CheckMovement(BlockNo)
Blockx = Block(BlockNo,2)
Blocky = Block(BlockNo,3)
For a = 4 To 6
Block(BlockNo,a) = 0
Next
;CheckLeft
If Blockx = 1
Block(BlockNo,4) = 1
Else
If Blocky <= 20
If Not Grid(Blockx-1,Blocky-1) = 0
Block(BlockNo,4) = 1
End If
End If
End If
;CheckRight
If Blockx = 11
Block(BlockNo,5) = 1
Else
If Blocky <= 20
If Not Grid(Blockx+1,Blocky-1) = 0
Block(BlockNo,5) = 1
End If
End If
End If
;CheckDown
If Blocky = 1
Block(BlockNo,6) = 1
Else
If Blocky <= 21
If Not Grid(Blockx,Blocky-1) = 0
Block(BlockNo,6) = 1
End If
End If
End If
End Function
Function MoveToGrid()
For a = 1 To 4
If Not Block(a,3) > 20
Grid( Block(a,2),Block(a,3) ) = CreateCube()
PositionEntity Grid( Block(a,2),Block(a,3) ),Block(a,8),Block(a,9),30
EntityColor Grid( Block(a,2),Block(a,3) ),100,100,100
Else
GameOver()
End If
Next
FreeEntity Block(1,1)
End Function
Function CheckFull()
For r = 1 To 20
Full = 1
For c = 1 To 11
If Grid(c,r) = 0
Full = 0
End If
Next
If Full = 1
For c = 1 To 11
FreeEntity Grid(c,r)
Grid(c,r) = 0
Next
For s = r + 1 To 20
For c = 1 To 11
If Not Grid(c,s) = 0
TranslateEntity Grid(c,s),0,-2,0
Grid(c,s-1) = Grid(c,s)
Grid(c,s) = 0
End If
Next
Next
CheckFull()
End If
Next
End Function
Function GameOver()
ClearWorld
Stop
End Function
Function CheckRotate(BlockNo)
Blockx = Block(BlockNo,2)
Blocky = Block(BlockNo,3)
Block(BlockNo,7) = 0
If Blockx < 1 Or Blockx > 11 Or Blocky < 2
Block(BlockNo,7) = 1
End If
If Blocky < 20
If Not Grid(Blockx,Blocky) = 0
Block(BlockNo,7) = 1
End If
End If
End Function
[/CODE]