En passant, si tu pouvais me tester ce code : c'est le parking que le bourré d'architecte a construit sur le flanc de montagne. Génial pour tester les roues de Caddie.
Code : Tout sélectionner
EnableExplicit
Macro Display()
; Message = ""
; Message + ""
; Message + Str(PageTileW) + " ; "
; ClearScreen(0)
;UseBuffer(#DispMask)
DisplaySprite(Page0, PosX, PosY)
DisplaySprite(Page1, PosX - PageW, PosY)
DisplaySprite(Page2, PosX, PosY - PageH)
DisplaySprite(Page3, PosX - PageW, PosY - PageH)
;UseBuffer(-1)
; DisplayTransparentSprite(#DispMask, DispX1, DispY1)
; StartDrawing(ScreenOutput() )
; DrawText(0, 0, Message)
; StopDrawing()
FlipBuffers()
EndMacro
Macro SpriteDrawing()
For I = 0 To 3
CreateSprite(#Syst + I, 16, 16)
StartDrawing(SpriteOutput(#Syst + I) )
DrawText(0, 0, "P" + Str(I) )
StopDrawing()
Next I
CreateSprite(#Deco, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco) )
Box(0, 0, TileSize, TileSize, #White)
StopDrawing()
LoadFont(0, "verdana", 10)
CreateSprite(#Deco + 1, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 1) )
Box(0, 0, TileSize, TileSize, #Blue)
DrawingFont(FontID(0) )
DrawText(0, 2, "Pif", #Black, #Cyan)
StopDrawing()
CreateSprite(#Deco + 8, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 8) )
Box(0, 0, TileSize, TileSize, #Blue)
DrawingFont(FontID(0) )
DrawText(0, 2, "Pif", #Black, #Cyan)
Box(0, TileSize - 2, TileSize, 2, #Cyan)
StopDrawing()
CreateSprite(#Deco + 9, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 9) )
Box(0, 0, TileSize, TileSize, #Blue)
DrawingFont(FontID(0) )
DrawText(0, 2, "Pif", #Black, #Cyan)
Box(0, 0, TileSize, 2, #Cyan)
StopDrawing()
; Ombre de droite en haut
CreateSprite(#Deco + 2, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 2) )
Box(0, 0, TileSize, TileSize, #White)
For I = 0 To (TileSize / 2)
C = I * 255 / TileSize * 2
Box(1, I, (TileSize / 2) - I, (TileSize / 2) - I, RGB(255 - C, 255 - C, 255 - C) )
Box(I, TileSize / 2, 1, TileSize / 2, RGB(C, C, C) )
Next I
Box(0, 0, 1, TileSize, #Blue)
StopDrawing()
; Ombre du coin d'en bas à droite
CreateSprite(#Deco + 3, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 3) )
Box(0, 0, TileSize, TileSize, #White)
For I = 0 To (TileSize / 2)
C = I * 255 / TileSize * 2
Box(0, 0, (TileSize / 2) - I + 1, (TileSize / 2) - I, RGB(255 - C, 255 - C, 255 - C) )
Next I
StopDrawing()
; Ombre d'en bas à gauche
CreateSprite(#Deco + 4, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 4) )
Box(0, 0, TileSize, TileSize, #White)
For I = 0 To (TileSize / 2)
C = I * 255 / TileSize * 2
Box(I, 0, (TileSize / 2) - I, (TileSize / 2) - I, RGB(255 - C, 255 - C, 255 - C) )
Box(TileSize / 2, I - 1, TileSize / 2, 1, RGB(C, C, C) )
Next I
StopDrawing()
; Ombre de droite
CreateSprite(#Deco + 6, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 6) )
Box(0, 0, TileSize, TileSize, #White)
For I = 0 To (TileSize / 2)
C = I * 255 / TileSize * 2
Box(I, 0, 1, TileSize, RGB(C, C, C) )
Next I
Box(0, 0, 1, TileSize, #Black)
StopDrawing()
; Ombre du bas
CreateSprite(#Deco + 7, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 7) )
Box(0, 0, TileSize, TileSize, #White)
For I = 0 To (TileSize / 2)
C = I * 255 / TileSize * 2
Box(0, I - 1, TileSize, 1, RGB(C, C, C) )
Next I
StopDrawing()
; Bord gauche
CreateSprite(#Deco + 5, TileSize, TileSize)
StartDrawing(SpriteOutput(#Deco + 5) )
Box(0, 0, TileSize, TileSize, #White)
Box(TileSize - 1, 0, 1, TileSize, #Black)
StopDrawing()
For I = 0 To 3
CreateSprite(I, PageW, PageH)
Next I
EndMacro
Macro SetTile(X, Y, N)
If ((X) => 0) And (X) <= LevelTileMaxX
If ((Y) => 0) And (Y) <= LevelTileMaxY
Tile(X, Y) = N
EndIf
EndIf
EndMacro
Macro Netiquette(X, Y)
SetTile(X, Y, #Deco + 1)
SetTile(X + 1, Y, #Deco + 2)
SetTile(X + 1, Y + 1, #Deco + 3)
SetTile(X, Y + 1, #Deco + 4)
SetTile(X - 1, Y, #Deco + 5)
EndMacro
Macro Netiquette2(X, Y)
SetTile(X, Y, #Deco + 8)
SetTile(X + 1, Y, #Deco + 8)
SetTile(X, Y + 1, #Deco + 9)
SetTile(X + 1, Y + 1, #Deco + 9)
SetTile(X + 2, Y, #Deco + 2)
SetTile(X + 2, Y + 1, #Deco + 6)
SetTile(X + 2, Y + 2, #Deco + 3)
SetTile(X + 1, Y + 2, #Deco + 7)
SetTile(X, Y + 2, #Deco + 4)
SetTile(X - 1, Y, #Deco + 5)
SetTile(X - 1, Y + 1, #Deco + 5)
EndMacro
Macro LevelLoading()
For Y = 0 To LevelTileMaxY
For X = 0 To LevelTileMaxX
Tile(X, Y) = #Deco
Next X
Next Y
For Y = 0 To LevelTileMaxY Step 3
For X = 0 To LevelTileMaxX Step 3
If Random(9) = 0
NEtiquette(X, Y)
EndIf
Next X
Next Y
EndMacro
Macro GetPageNo(X, Y) ; Calcul de la page concernée
((X / PageW) & 1) + (((Y / PageH) & 1) << 1)
EndMacro
Macro GetXValue(X) ; Calcul de X dans la page
((X % PageW) - (X % TileSize) )
EndMacro
Macro GetYValue(Y) ; Calcul de Y dans la page
((Y % PageH) - (Y % TileSize) )
EndMacro
Macro GetTile(XX, YY)
Tile = -1
TempX = XX / TileSize
If (TempX => 0)
If (TempX <= LevelTileMaxX)
TempY = YY / TileSize
If (TempY => 0)
If (TempY <= LevelTileMaxY)
Tile = Tile(TempX, TempY)
EndIf
EndIf
EndIf
EndIf
EndMacro
Macro UpdateTile(XX, YY)
GetTile(XX, YY) ; Retourne le global Tile.I
If Tile <> -1
P = GetPageNo(XX, YY)
UseBuffer(P)
DisplaySprite(Tile, GetXValue(XX), GetYValue(YY) )
UseBuffer(-1)
EndIf
EndMacro
Macro UpdateTileLeftBorder()
For Y = (LevelY - TileSize) To (LevelY + PageH + TileSize) ; Rajouté +TileSize
UpdateTile((LevelX - TileSize), Y)
Y + TileSize
Y - 1
Next Y
EndMacro
Macro UpdateTileRightBorder()
For Y = (LevelY - TileSize) To (LevelY + PageH) ; Rajouté -TileSize
UpdateTile((LevelX + PageW), Y)
Y + TileSize
Y - 1
Next Y
EndMacro
Macro UpdateTileUpBorder()
For X = (LevelX - TileSize) To (LevelX + PageW + TileSize) ; Rajouté +TileSize
UpdateTile(X, (LevelY - TileSize) )
X + TileSize
X - 1
Next X
EndMacro
Macro UpdateTileDownBorder()
For X = (LevelX - TileSize) To (LevelX + PageW) ;Rajouté -TileSize
UpdateTile(X, (LevelY + PageH) )
X + TileSize
X - 1
Next X
EndMacro
Macro DrawVisibleTiles()
For Y = LevelY To LevelY + PageH
For X = LevelX To LevelX + PageW
UpdateTile(X, Y)
X + TileSize
X - 1
Next X
Y + TileSize
Y - 1
Next Y
EndMacro
Macro MoveLeft()
If LevelX > 0
If LevelX - VitX < 0 ; "Sort" du niveau?
VitX = LevelX
EndIf
PosX + VitX
If PosX => PageW
ShiftX + PageW
PosX - PageW
Page0 ! 1
Page1 ! 1
Page2 ! 1
Page3 ! 1
EndIf
LevelX = 0 - (ShiftX + PosX)
OldLevelTileX = LevelTileX
LevelTileX = LevelX / TileSize
If LevelTileX <> OldLevelTileX
UpdateTileLeftBorder()
EndIf
DisplayFlag = 1
EndIf
EndMacro
Macro MoveRight()
If LevelX < (LevelW - DispW)
If LevelX + VitX > (LevelW - DispW) ; "Sort" du niveau?
VitX = (LevelW - DispW) - LevelX
EndIf
PosX - VitX
If PosX < 0
ShiftX - PageW
PosX + PageW
Page0 ! 1
Page1 ! 1
Page2 ! 1
Page3 ! 1
EndIf
LevelX = 0 - (ShiftX + PosX)
OldLevelTileX = LevelTileX
LevelTileX = LevelX / TileSize
If LevelTileX <> OldLevelTileX
UpdateTileRightBorder()
EndIf
DisplayFlag = 1
EndIf
EndMacro
Macro MoveUp()
If LevelY > 0
If LevelY - VitY < 0 ; "Sort" du niveau?
VitY = LevelY
EndIf
PosY + VitY
If PosY => PageH
ShiftY + PageH
PosY - PageH
Page0 ! 2
Page1 ! 2
Page2 ! 2
Page3 ! 2
EndIf
LevelY = 0 - (ShiftY + PosY)
OldLevelTileY = LevelTileY
LevelTileY = LevelY / TileSize
If LevelTileY <> OldLevelTileY
UpdateTileUpBorder()
EndIf
DisplayFlag = 1
EndIf
EndMacro
Macro MoveDown()
If LevelY < (LevelH - DispH)
If LevelY + VitY > (LevelH - DispH) ; "Sort" du niveau?
VitY = (LevelH - DispH) - LevelY
EndIf
PosY - VitY
If PosY < 0
ShiftY - PageH
PosY + PageH
Page0 ! 2
Page1 ! 2
Page2 ! 2
Page3 ! 2
EndIf
LevelY = 0 - (ShiftY + PosY)
OldLevelTileY = LevelTileY
LevelTileY = LevelY / TileSize
If LevelTileY <> OldLevelTileY
UpdateTileDownBorder()
EndIf
DisplayFlag = 1
EndIf
EndMacro
#Syst = 4096
#DispMask = 16
#Deco = 256
;-______________
;- Globals...
;-¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Global TileSize.I ; Taille d'un Tile en pixels
Global ScrW.I ; Largeur de l'écran en pixels
Global ScrH.I ; Hauteur de l'écran en pixels
Global ScrD.I ; Profondeur de l'écran en bits par pixels
Global DispX1.I ; Coordonnée de la zone d'affichage
Global DispY1.I ; en pixels
Global DispX2.I ;
Global DispY2.I ;
Global DispW.I ; Dimensions de l'écran d'affichage
Global DispH.I ; en pixels
Global PageW.I ; Dimensions d'une page en pixels
Global PageH.I ;
Global PageTileW.I ; Dimensions d'une page en Tiles
Global PageTileH.I ;
Global C.I ; coefficient de couleur
Global I.I
Global P.I
Global X.I
Global Y.I
Global Tile.I
Global TempX.I
Global TempY.I
Global Message.S
Global Page0.I = 0
Global Page1.I = 1
Global Page2.I = 2
Global Page3.I = 3
;-Vitesse
Global Vit.I = 8
Global PosX.I ; Décalage dans une page
Global PosY.I ; en pixels
Global ShiftX.I ; Décalage page par page
Global ShiftY.I ; en pixels
Global LevelX.I ; Décalage total (page + position)
Global LevelY.I ; en pixels
Global LevelTileX.I ; Décalage total (page + position)
Global LevelTileY.I ; en Tiles
Global OldLevelTileX.I ; Dans la détection des mises à jour
Global OldLevelTileY.I ; Ancien décalage total en Tiles
Global LevelTileW.I ; Dimensions du niveau en Tiles
Global LevelTileH.I ;
Global LevelTileMaxX.I ; Limites du niveau en Tiles
Global LevelTileMaxY.I ;
Global LevelW.I ; Dimensions du niveau en pixels
Global LevelH.I ;
Global DisplayFlag.I
Global VitX.I
Global VitY.I
Global VitesseX.I
Global VitesseY.I
Global QuitGame.I
TileSize = 20
LevelTileW = 1024
LevelTileH = 1024
LevelW = LevelTileW * TileSize
LevelH = LevelTileH * TileSize
LevelTileMaxX = LevelTileW - 1
LevelTileMaxY = LevelTileH - 1
Global Dim Tile.I(LevelTileMaxX, LevelTileMaxY)
Delay(99)
InitSprite()
InitKeyboard()
ExamineDesktops()
ScrW = DesktopWidth(0)
ScrH = DesktopHeight(0)
ScrD = DesktopDepth(0)
DispX1 = 0
DispY1 = 0
DispX2 = ScrW - 1
DispY2 = ScrH - 1
DispW = (DispX2 - DispX1) + 1
DispH = (DispY2 - DispY1) + 1
PageW = DispW
PageH = DispH
PageW - (PageW % TileSize)
If PageW < DispW: PageW + TileSize: EndIf
PageH - (PageH % TileSize)
If PageH < DispH: PageH + TileSize: EndIf
PageTileW = PageW / TileSize
PageTileH = PageH / TileSize
OpenScreen(ScrW, ScrH, ScrD, "")
;OpenWindow(0, 0, 0, ScrW, ScrH, "", $80000000)
;OpenWindowedScreen(WindowID(0), 0, 0, ScrW, ScrH, 0, 0, 0)
SpriteDrawing()
LevelLoading()
DrawVisibleTiles()
Display()
;-______________
;- Repeat...
;-¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Define DividerX.I
Define DividerY.I
Repeat
;Delay(99)
Delay(1)
DisplayFlag = 0
VitX = Vit
VitY = Vit
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
If (VitesseX - 1) > (0 - TileSize)
VitesseX - 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
If (VitesseX + 1) < TileSize
VitesseX + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Up)
If (VitesseY - 1) > (0 - TileSize)
VitesseY - 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down)
If (VitesseY + 1) < TileSize
VitesseY + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Escape)
QuitGame = 1
EndIf
EndIf
If VitesseX < 0
VitX = -VitesseX
MoveLeft()
DividerX ! 1: If DividerX & 1: VitesseX + 1: EndIf
EndIf
If VitesseX > 0
VitX = VitesseX
MoveRight()
DividerX ! 1: If DividerX & 1: VitesseX - 1: EndIf
EndIf
If VitesseY < 0
VitY = -VitesseY
MoveUp()
DividerY ! 1: If DividerY & 1: VitesseY + 1: EndIf
EndIf
If VitesseY > 0
VitY = VitesseY
MoveDown()
DividerY ! 1: If DividerY & 1: VitesseY - 1: EndIf
EndIf
If DisplayFlag
Display()
EndIf
Until QuitGame
CloseScreen()
End