"Peileistä Kimpoileva Lazer säde"
Code: Select all
SCREEN 800,600
Type Mirror
Field x1 As Float
Field y1 As Float
Field x2 As Float
Field y2 As Float
EndType
// globaalit LinerRay funktiolle
Global IntersX as Float,IntersY As Float
//Näitä Käytetään Peilien muokkauksessa
SMD.Mirror=NULL
SLP=0
// lisätään 5 peiliä
For i=1 To 5
Mir.Mirror=New(Mirror)
mir\x1=Rand(800)
mir\y1=Rand(600)
mir\x2=Rand(800)
mir\y2=Rand(600)
Next i
//säteen sijainti, suunta
RayX#=0
RayY#=300
RayA#=0
Repeat
//Peilien kääntely
If MouseHit(1)
For m.Mirror=Each Mirror
If Distance(MouseX(),MouseY(),m\x1,m\y1)<10
SMD=m
SLP=1
Exit
ElseIf Distance(MouseX(),MouseY(),m\x2,m\y2)<10
SMD=m
SLP=2
Exit
Else
SMD=NULL
SLP=0
EndIf
Next m
EndIf
If MouseUp(1) Then SMD=NULL:SLP=0
If SMD<>NULL And SLP<>0
If SLP=1
m\x1=MouseX()
m\y1=MouseY()
ElseIf SLP=2
m\x2=MouseX()
m\y2=MouseY()
EndIf
EndIf
//pirretään peilit
Color cbblue
For mir.Mirror=Each Mirror
Line mir\x1,mir\y1,mir\x2,mir\y2
Circle mir\x1-3,mir\y1-3,6
Circle mir\x2-3,mir\y2-3,6
Next mir
iRayX#=RayX#
iRayY#=RayY#
iRayA#=RayA#
CountedHits=0
//Säteen väritys (!!HIENO!! efekti !!)
iColX=iColX+5
If iColX<100
ColX=iColX
ElseIf iColX>100 And iColX<200
ColX=0
ElseIf iColX>200
iColX=0
EndIf
ColorTriBlend(ColX,255,0,0, 0,0,10, 255,0,0)
//Käydään Peilejä läpi, kunnes säde ei osu mihinkään.
Repeat
FoundHit=0
Nearest#=-1
nMir.Mirror=NULL
//Etsitään lähin peili.
For mir.Mirror=Each Mirror
//Tarkistetaan törmäys.
If LineRay_Intersect(mir\x1,mir\y1,mir\x2,mir\y2, iRayX+Cos(iRayA)*0.1, iRayY-Sin(iRayA)*0.1, iRayX+Cos(iRayA), iRayY-Sin(iRayA))
FoundHit=1
Dist#=Distance(IntersX,IntersY,iRayX,iRayY)
If Nearest#>Dist# Or Nearest#=-1
Nearest#=Dist#
nMir=mir
HitX#=IntersX
HitY#=IntersY
EndIf
EndIf
Next mir
//jos löytyi, asetetaan uusi kulma ja paikka.
If nMir<>NULL
HitAngle#=GetAngle(HitX,HitY,iRayX,iRayY)
MirAngle#=GetAngle(nmir\x1,nmir\y1,nmir\x2,nmir\y2)
iRayA=MirAngle*2-180-HitAngle
Line iRayX,iRayY,HitX,HitY
iRayX=HitX
iRayY=HitY
CountedHits=CountedHits+1
EndIf
Until FoundHit=0
Text 0,0,"FPS:"+FPS()
Text 0,12,"Reflections: "+CountedHits
DrawScreen
Forever
// "muokattu" versio SDK:n Line_Intersect funktiosta.
//( Intersection_CD#>1 ehto jätetty pois, funktion toiminta muuttui radikaalisti :) )
Function LineRay_Intersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)
Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)
If Rd# = 0
Return False
Else
Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)
Intersection_AB# = Rn# / Rd#
Intersection_CD# = Sn# / Rd#
If Intersection_AB#>1 Or Intersection_AB#<0 Or Intersection_CD#<0 Then Return False
IntersX = Ax# + Intersection_AB#*(Bx#-Ax#)
IntersY = Ay# + Intersection_AB#*(By#-Ay#)
Return True
EndIf
End Function
Function ColorTriBlend(pros#, r1,g1,b1, r2,g2,b2, r3,g3,b3)
p#=Float(pros)/100.0
If 50.0<pros
Color (1-p)*r1+p*r2, (1-p)*g1+p*g2, (1-p)*b1+p*b2
Else
p=1.0-p
Color (1-p)*r3+p*r2, (1-p)*g3+p*g2, (1-p)*b3+p*b2
EndIf
EndFunction
PS: Kokeilkaa tehdä peileistä "laatikko" jonka nurkasta säde menee sen sisään, tämä todistaa että cb EI ole HIDAS, Ennätys: 600 Heijastusta