Tulipa taas päivä hukattua... mutta tervetuloa tulevaisuuteen! (tai ehkä nykyaikaan
Code: Select all
Const SW = 800
Const SH = 600
Const SpyOverlayQ = 32 //Kiikarikuvan laatu, suurempi huonompi (eroa ei juurikaan huomaa, kun Smooth2D on päällä)
Const NightOverlayQ = 2 //Yökiikarikuvan laatu, tässä eron huomaa selvemmin
Const MaxZoom = 2 //Tämä määrää, kuinka kauaksi voidaan zoomata (2 = ruudulla voi näkyä 2x tavalliseen nähden)
Const NormZoom = 1 //Kuinka zoomattu ruutu on tavallisesti
Const SpyZoom = 2 //Kuinka zoomattu ruutu on kiikareilla
Const NormLookForward = 100 //Kuinka kauaksi eteenpäin katsotaan tavallisesti
Const SpyLookForward = 500 //Kuinka kauaksi eteenpäin katsotaan kiikareilla
Const DayLenght = 90000 //Päivän pituus millisekunneissa (90000 = puolitoista minuuttia)
Smooth2D ON
SCREEN SW, SH
SetWindow "cbe Tech Demo by aXu"
Print "Screen size: " + SW + "x" + SH
Font = LoadFont("Arial", 20, True)
SetFont Font
Map = LoadMap("Media/cdm2.til", "Media/tileset.bmp")
PlayObject Map, 0, 0, 0.5
ObjectPickable Map, ON
Guy = LoadObject("Media/soldier.bmp")
TurnObject Guy, 90
SetupCollision Guy, map, 2, 4, 2
GuyImg = LoadImage("Media/soldier.bmp")
Crosshair = LoadImage("Media/target.bmp")
DefaultMask OFF
sx = RoundUp(Float(SW) / SpyOverlayQ)
sy = RoundUp(Float(SH) / SpyOverlayQ)
SpyOverlay = MakeImage(sx, sy)
Print "SpyOverlay size: " + sx + "x" + sy
DrawToImage SpyOverLay
cbeClsColor(0, 0, 0, 0)
Cls
For x = 0 To SW - 1
For y = 0 To SH - 1
dst1# = Distance(x, y, SW / 2 - 150 * (SW / 800.0), SH / 2)
dst2# = Distance(x, y, SW / 2 + 150 * (SW / 800.0), SH / 2)
gamma = Min(255, Min(dst1, dst2) / (SW / 800.0))
cbeColor(255 - gamma, 255 - gamma, 255 - gamma, gamma)
Dot x / SpyOverlayQ, y / SpyOverlayQ
y = Min(SH - 1, y + SpyOverlayQ - 1)
Next y
x = Min(SW - 1, x + SpyOverlayQ - 1)
Next x
DrawToScreen
sx = RoundUp(Float(SW) / NightOverlayQ)
sy = RoundUp(Float(SH) / NightOverlayQ)
NightOverlay = MakeImage(sx, sy)
Print "NightOverlay size: " + sx + "x" + sy
DrawToImage NightOverlay
cbeClsColor(0, 0, 0, 0)
Cls
For x = 0 To SW - 1
For y = 0 To SH - 1
gamma = y Mod 10
ran = Rand(70)
cbeColor(gamma * 10 + ran, gamma * 25 + ran, gamma * 10 + ran, 40 + gamma * 10 + ran / 2)
Dot x / NightOverlayQ, y / NightOverlayQ
y = Min(SH - 1, y + NightOverlayQ - 1)
Next y
x = Min(SW - 1, x + NightOverlayQ - 1)
Next x
DrawToScreen
ScreenSize = Sqrt(SW^2 + SH^2) * MaxZoom
Buffer = MakeImage(ScreenSize, ScreenSize)
Print "Image buffer size: " + ScreenSize + "x" + ScreenSize + " (maximum scaling: " + MaxZoom + ")"
Dim NewCamX#, NewCamY#, NewCamA#, NewCamZ#, SpyingOpacity#
Global Zoom#
Zoom = 0.5
DrawRotated = True
CurrentFrame = Timer()
Repeat
Color 64, 64, 64
cbeColor(0, 0, 0, 0)
CenterText SW/2, SH/2, "Use cbEnchanted to see this demo properly"
Repeat
//Pelimekaniikka:
If KeyHit(cbKeyZ) Then OldAngle# = ObjectAngle(Guy)
If KeyDown(cbKeyZ) Then //Kiikarit
vx# = Max(-150, Min(150, vx + (KeyDown(cbKeyRight) - KeyDown(cbKeyLeft)) * 2))
vy# = Max(-150, Min(150, vy + (KeyDown(cbKeyUp) - KeyDown(cbKeyDown)) * 2))
CamOffSetX = Cos(CameraAngle()) * vx - Sin(CameraAngle()) * vy
CamOffSetY = Sin(CameraAngle()) * vx + Cos(CameraAngle()) * vy
RotateObject Guy, GetAngle(ObjectX(Guy), -ObjectY(Guy), CameraX(), -CameraY())
ObjectPick Guy
If PickedObject() Then
TargetX = WToSX(PickedX(), PickedY())
TargetY = WToSY(PickedX(), PickedY())
ShowLaser = True
EndIf
SpyingOpacity = CurveValue(255, SpyingOpacity, 30)
NewCamX = ObjectX(Guy) + Cos(OldAngle) * SpyLookForward + CamOffSetX
NewCamY = ObjectY(Guy) + Sin(OldAngle) * SpyLookForward + CamOffSetY
NewCamA = OldAngle - 90
NewCamZ = SpyZoom
ElseIf KeyDown(cbKeyX) //Uloszoomaaminen
vx# = (KeyDown(cbKeyRight) - KeyDown(cbKeyLeft))
vy# = (KeyDown(cbKeyUp) - KeyDown(cbKeyDown))
an# = GetAngle(0, 0, vx, -vy)
sp# = Min(0.4, Distance(0, 0, vx, vy))
TranslateObject guy, Cos(an) * sp, Sin(an) * sp
ObjectPick Guy
If PickedObject() Then
TargetX = WToSX(PickedX(), PickedY())
TargetY = WToSY(PickedX(), PickedY())
ShowLaser = False
EndIf
SpyingOpacity = CurveValue(0, SpyingOpacity, 30)
NewCamX = ObjectX(Guy)
NewCamY = ObjectY(Guy)
NewCamA = 0
NewCamZ = 1.0 / MaxZoom
Else //Tavallinen
vx# = 0
vy# = 0
TurnObject guy, (KeyDown(cbKeyLeft) - KeyDown(cbKeyRight)) * 1
MoveObject guy, KeyDown(cbKeyUp) - KeyDown(cbKeyDown) * 0.7
ObjectPick Guy
If PickedObject() Then
TargetX = WToSX(PickedX(), PickedY())
TargetY = WToSY(PickedX(), PickedY())
ShowLaser = False
EndIf
SpyingOpacity = CurveValue(0, SpyingOpacity, 30)
NewCamX = ObjectX(Guy) + Cos(ObjectAngle(Guy)) * NormLookForward
NewCamY = ObjectY(Guy) + Sin(ObjectAngle(Guy)) * NormLookForward
NewCamA = ObjectAngle(Guy) - 90
NewCamZ = NormZoom
EndIf
PositionCamera CurveValue(NewCamX, CameraX(), 40), CurveValue(NewCamY, CameraY(), 40)
RotateCamera CurveAngle2(NewCamA, CameraAngle(), 20)
Zoom = CurveValue(NewCamZ, Zoom, 50)
CurrentFrame = CurrentFrame + 5
Until CurrentFrame > Timer()
TimeOfDay# = Float((Timer() + DayLenght / 2) Mod DayLenght) / DayLenght * 24
DrawToImage Buffer
ClsColor 0, 0, 0
Cls
GhostObject Guy, 0
DrawGame
cbeColor(255, 255, 255, 255)
cbeDrawTintedScaledRotatedImage(GuyImg, ScreenSize/2 + ObjectX(Guy) - CameraX(), ScreenSize/2 + CameraY() - ObjectY(Guy), 1, 1, -ObjectAngle(Guy))
DrawToScreen
//Taustavalaistus, riippuu vuorokaudenajasta:
AmbiR = 255
AmbiG = 255
AmbiB = 255
AmbiA = 255
//Yön pimeys (ilta 6 - aamu 6)
If Abs(TimeOfDay - 12) > 6 Then
tmp = 100 + Cos((12 - Abs(TimeOfDay - 12)) * 30) * 100
AmbiR = AmbiR - tmp
AmbiG = AmbiG - tmp
AmbiB = AmbiB - tmp / 1.5
EndIf
//Illankajo (ilta 5 - ilta 11)
If Abs(TimeOfDay - 20) < 3 Then
tmp = 50 + Cos(Abs(TimeOfDay - 20) * 60) * 50
AmbiR = AmbiR + tmp / 4
AmbiG = AmbiG - tmp / 2
AmbiB = AmbiB - tmp
EndIf
//Aamuhämärä (aamu 6 - aamu 12)
If Abs(TimeOfDay - 9) < 3 Then
tmp = 20 + Cos(Abs(TimeOfDay - 9) * 60) * 20
AmbiR = AmbiR - tmp
AmbiG = AmbiG - tmp
AmbiB = AmbiB - tmp
AmbiA = AmbiA - tmp
EndIf
NightLook# = CurveValue((SpyingOpacity > 200) * Abs(TimeOfDay - 12) > 9, NightLook, 20)
AmbiG = AmbiG + NightLook * 100
AmbiA = AmbiA - NightLook * 100
//Piirretään maailma värjättynä ambientilla valolla (läpinäkyvyys aiheuttaa valkoista, tausta on valkoinen
cbeColor(AmbiR, AmbiG, AmbiB, AmbiA)
cbeDrawTintedScaledRotatedImage(Buffer, SW/2, SH/2, Zoom, Zoom, CameraAngle())
//Laser
cbeColor(255, 0, 0, 32)
FatLine(WToSX(ObjectX(Guy), ObjectY(Guy)), WToSY(ObjectX(Guy), ObjectY(Guy)), TargetX, TargetY, Zoom + .5)
//Tähtäin
cbeColor(255, 255, 255, 192)
cbeDrawTintedScaledRotatedImage(Crosshair, TargetX, TargetY, 1, 1, Timer() / 10)
//Yökiikarin raidat
cbeColor(0, NightLook * 255, 0, SpyingOpacity * NightLook)
cbeDrawTintedScaledRotatedImage(NightOverlay, SW/2, SH/2, NightOverlayQ)
//Kiikari
cbeColor(0, NightLook * 255, 0, SpyingOpacity)
cbeDrawTintedScaledRotatedImage(SpyOverlay, SW/2, SH/2, SpyOverlayQ)
cbeColor(255, 255, 255, 192)
Text 0, 0, "Use arrows to move around, Z to spy, X to zoom out."
Text 0, 20, "FPS: " + FPS() + " (max 200)"
Text 0, 40, "Clock: " + RoundDown(TimeOfDay) + ":" + RoundDown(TimeOfDay Mod 1 * 60)
ClsColor 255, 255, 255
Wait CurrentFrame - Timer()
DrawScreen
Forever
Function WToSX(X#, Y#)
X = (X - CameraX()) * Zoom
Y =-(Y - CameraY()) * Zoom
A# = GetAngle(0, 0, X, Y) - CameraAngle()
D# = Distance(0, 0, X, Y)
Return Cos(A) * D + SW/2
EndFunction
Function WToSY(X#, Y#)
X = (X - CameraX()) * Zoom
Y =-(Y - CameraY()) * Zoom
A# = GetAngle(0, 0, X, Y) - CameraAngle()
D# = Distance(0, 0, X, Y)
Return -Sin(A) * D + SH/2
EndFunction
Function CurveAngle2(newA#, oldA#, smooth#)
newA = WrapAngle(newA + 180)
ADiff# = oldA - newA + 180
While ADiff > 180
ADiff - 360
Wend
While ADiff < -180
ADiff + 360
Wend
Return (oldA - ADiff / smooth)
EndFunction
Function FatLine(X1#, Y1#, X2#, Y2#, Thickness#)
For x = -RoundDown(Thickness / 2) To RoundUp(Thickness / 2)
For y = -RoundDown(Thickness / 2) To RoundUp(Thickness / 2)
Line X1 + x, Y1 + y, X2 + x, Y2 + y
Next y
Next x
EndFunction
Function cbeColor(r, g, b, a)
group = 1
funcId = 2
EndFunction
Function cbeClsColor(r, g, b, a)
group = 1
funcId = 3
EndFunction
Function cbeDrawTintedScaledRotatedImage(img, toX#, toY#, scaleX# = 1, scaleY# = 0, angle# = 0)
If scaleY = 0 Then scaleY = scaleX
cbeDrawTintedScaledRotatedImageBox(img, 0, 0, ImageWidth(img), ImageHeight(img), toX, toY, scaleX, scaleY, angle)
EndFunction
Function cbeDrawTintedScaledRotatedImageBox(img, startX As Float, startY As Float, width As Float, height As Float, toX As Float, toY As Float, scaleX As Float, scaleY As Float, angle As Float)
group = 1
funcId = 6
End Function