KeepDistance funktio

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
Guest

KeepDistance funktio

Post by Guest » Sun Sep 16, 2007 2:56 pm

Tässä olis funktio joka pitää koordinaatit tietyllä etäisyydellä toisistaan.. ;)
Sopii esim. törmäykseen, vankiin, ym.
Function KeepDistance(x1,y1,x2,y2,dis,mode,ret)
x1,y1 piste jota tarkkaillaan
x2,y2 piste josta tarkkaillaan
dis etäisyys
mode
-1 ei päästä kauemmaksi (esim. vanki)
0 ehdoton etäisyys (esim. pyörivä moukari)
1 ei päästä lähelle (esim. törmäys)

Code: Select all

dis=30
x1=200
y1=150
Repeat
    x2=MouseX()
    y2=MouseY()
    Text 5,5,"Mode: "+mode
    Text 5,30,"Distance: "+dis
    Text 5,250,"UP/DOWN to change distance."
    Text 5,270,"LEFT/RIGHT To change mode."
    Circle x1-dis,y1-dis,dis*2,0
    Line x1,y1,keepdistance(x2,y2,x1,y1,dis,mode,0),keepdistance(x2,y2,x1,y1,dis,mode,1)
    DrawScreen
    dis=dis+UpKey()-DownKey()
    mode=mode+KeyHit(205)-KeyHit(203)
Forever

Function KeepDistance(x1,y1,x2,y2,dis,mode=0,ret=0)
    angle=GetAngle(x1,y1,x2,y2)
    If mode=>0 And Distance(x1,y1,x2,y2)<dis Then x1=x2-Cos(angle)*dis:y1=y2+Sin(angle)*dis
    If mode=<0 And Distance(x1,y1,x2,y2)>dis Then x1=x2-Cos(angle)*dis:y1=y2+Sin(angle)*dis
    If ret=0 Then
        Return x1
    Else
        Return y1
    EndIf
EndFunction

User avatar
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: KeepDistance funktio

Post by tuhoojabotti » Sun Sep 16, 2007 5:19 pm

en oikein tajunnut kuinka sen piti toimia viiva vain seurasi hiirtä ja oli joko ympyrässä tai kiinni hiiressä...

Guest

Re: KeepDistance funktio

Post by Guest » Sun Sep 16, 2007 5:27 pm

no tossa todella kamala esimerkki

Code: Select all

SCREEN 800,600,0,2
SetWindow "Lanka",3
FrameLimit 40
Const lenght=10
Type piste
    Field x
    Field y
EndType

foodx=Rand(0,ScreenWidth())
foody=Rand(0,ScreenHeight())

uusi.piste=New(piste)
uusi\x=MouseX()
uusi\y=MouseY()
piste2.piste=First(piste)
For i=1 To 8
    uusi.piste=New(piste)
    piste2=Before(uusi)
    uusi\x=keepdistance(uusi\x,uusi\y,piste2\x,piste2\y,lenght,0,0)
    uusi\y=keepdistance(uusi\x,uusi\y,piste2\x,piste2\y,lenght,0,1)
Next i

img=MakeImage(5,5)
DrawToImage img
Circle 0,0,5
DrawToScreen
ShowMouse img
Repeat
    piste2.piste=First(piste)
    Circle foodx-5,foody-5,10
    foodx=foodx+Rand(-1,1)
    foody=foody+Rand(-1,1)
    If foodx<0 Or foodx>ScreenWidth() Or foody<0 Or foody>ScreenHeight() Then foodx=Rand(0,ScreenWidth()):foody=Rand(0,ScreenHeight())
    i=1
    For piste1.piste = Each piste
        If i>1 Then
            i=i+1
            piste2=Before(piste1)
            piste1\x=keepdistance(piste1\x,piste1\y,piste2\x,piste2\y,lenght,0,0)
            piste1\y=keepdistance(piste1\x,piste1\y,piste2\x,piste2\y,lenght,0,1)
            Line piste1\x,piste1\y,piste2\x,piste2\y
            a=1
            For piste3.piste=Each piste
                a=a+1
                If Distance(piste1\x,piste1\y,piste3\x,piste3\y)<2 And a<i Then Delete piste3
            Next piste3
        ElseIf i=1
            i=i+1
            piste1\x=MouseX()
            piste1\y=MouseY()
        EndIf
            If Distance(piste1\x,piste1\y,foodx,foody)<5 Then
                For o=1 To 3
                    uusi.piste=New(piste)
                    piste2=Before(uusi)
                    uusi\x=keepdistance(uusi\x,uusi\y,piste2\x,piste2\y,lenght,0,0)
                    uusi\y=keepdistance(uusi\x,uusi\y,piste2\x,piste2\y,lenght,0,1)
                Next o
                DrawToImage img
                Color Rand(150,255),Rand(150,255),Rand(150,255)
                Circle 0,0,5
                DrawToScreen
                foodx=Rand(0,ScreenWidth())
                foody=Rand(0,ScreenHeight())
                Color Rand(150,255),Rand(150,255),Rand(150,255)
            EndIf
    Next piste1
    Text 1,1,i
    DrawScreen
Forever

Function KeepDistance(x1,y1,x2,y2,dis,mode=0,ret=0)
    angle=GetAngle(x1,y1,x2,y2)
    If mode=>0 And Distance(x1,y1,x2,y2)<dis Then x1=x2-Cos(angle)*dis:y1=y2+Sin(angle)*dis
    If mode=<0 And Distance(x1,y1,x2,y2)>dis Then x1=x2-Cos(angle)*dis:y1=y2+Sin(angle)*dis
    If ret=0 Then
        Return x1
    Else
        Return y1
    EndIf
EndFunction

User avatar
-Z-
Devoted Member
Posts: 682
Joined: Tue Aug 28, 2007 3:33 pm
Location: In ur danmaku, grazin ur bullets

Re: KeepDistance funktio

Post by -Z- » Mon Sep 17, 2007 2:09 pm

Wow! Todella hieno ja toimiva funktio! menee varmasti käyttöön lähitulevaisuudessa!
"Fallout 3 (#10) marked a shift in the industry, a move that saw the western RPG begin to surpass its Japanese counterparts." -IGN top 100 RPGs of all time

Post Reply