Slime 360 (Puoliympyrän piirto 360:llä eri asteella)

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
Kassu
Newcomer
Posts: 22
Joined: Wed Aug 29, 2007 5:32 pm

Slime 360 (Puoliympyrän piirto 360:llä eri asteella)

Post by Kassu »

Tuli vähän aikaa sitten mietittyä minkäläistä Slime-peliä voisi alkaa väsäämään, ja tuli mieleen, että olisi kiva jos Slimet voisivat kävellä seinillä yms. Ongelmana tuli vastaan että nykyisin 'Slime' piirretään puoliympyränä, joka aina on samaan suuntaan. Piti kehittää uusi funktio.

Pitämällä välilyöntiä pohjassa voi 'kääntää' slimen (LR määrittää mihin suuntaan slime katsoo, 0 - oikealle, 1 - vasemmalle)
Kysymyksiä saa esittää. En silti haluaisi ruveta selittämään kaikkia laskuja.
Funktiota saa käyttää vapaasti (silmillä ja ilman)

Code: Select all

//Slime 360

SCREEN 730,375,32
ClsColor 0,0,255

Repeat
    
    'SlimeAngle=GetAngle(100,100,MouseX(),MouseY())
    SlimeAngle=SlimeAngle+1
    If SlimeAngle>=360 Then SlimeAngle=SlimeAngle-360
    
    Color 255,255,255
    Text 0,0,"SlimeAngle: "+SlimeAngle
    Text 0,10,"MOD: "+(SlimeAngle Mod 90)
    
    Color 255,0,0
    Slime360(100,100,37,SlimeAngle,MouseX(),MouseY(),KeyDown(cbkeyspace))
    
    DrawScreen
    
Forever

//-------------------------------

Function Slime360(x,y,Radius,Angle,BallX,BallY,LR=0)
    
    //Katsotaan josko kulma on 0, 90, 180 tai 270 (tai 360)
    If Angle Mod 90 = 0 Then
        If Angle = 0 Or Angle = 360 Then //jos kulma on 0 (tai 360)
            For i=1 To Radius
                ang#=ASin(Float(i)/Float(Radius))
                Box x-Cos(ang#)*Radius,y-i,Int(Cos(ang#)*Radius)*2,1
            Next i
        EndIf
        If Angle = 180 Then //jos kulma on 180
            For i=1 To Radius
                ang#=ASin(Float(i)/Float(Radius))
                Box x-Cos(ang#)*Radius,y+i,Int(Cos(ang#)*Radius)*2,1
            Next i
        EndIf
        If Angle = 90 Then //jos kulma on 90
            'For i=1 To Radius
            '    ang#=ASin(Float(i)/Float(Radius))
            '    Box x-i,y-Cos(ang#)*Radius,1,Int(Cos(ang#)*Radius)*2
            'Next i
            For i=0 To Radius
                ang#=ASin(Float(i)/Float(Radius))
                Box x-Cos(ang#)*Radius,y-i,Cos(ang#)*Radius,1
                Box x-Cos(ang#)*Radius,y+i,Cos(ang#)*Radius,1
            Next i
        EndIf
        If Angle = 270 Then //jos kulma on 270
            'For i=1 To Radius
            '    ang#=ASin(Float(i)/Float(Radius))
            '    Box x+i,y-Cos(ang#)*Radius,1,Int(Cos(ang#)*Radius)*2
            'Next i
            For i=0 To Radius
                ang#=ASin(Float(i)/Float(Radius))
                Box x,y-i,Cos(ang#)*Radius,1
                Box x,y+i,Cos(ang#)*Radius,1
            Next i
        EndIf
    Else //jos kulma EI ole 0, 90, 180 tai 270 (tai 360)
        If Angle < 90 Then //jos kulma on 0-90
            Highest=y-Radius
            Lowest=y+Sin(Angle)*Radius
            Middle=y-Sin(Angle)*Radius
            For i=0 To Lowest-Highest
                ang#=ASin(Float(Radius-i)/Float(Radius))
                If Highest+i<=Middle Then
                    Box x-Cos(ang#)*Radius,Highest+i,Int(Cos(ang#)*Radius)*2,1 
                Else
                    Box x-Cos(ang#)*Radius,Highest+i,Int(Cos(ang#)*Radius)+((y-Highest)-i)/Tan(Angle),1
                EndIf
            Next i
        EndIf
        If Angle > 90 And Angle < 180 Then //jos kulma on 90-180
            Highest=y-Sin(Angle)*Radius
            Lowest=y+Radius
            Middle=y+Sin(Angle)*Radius
            For i=Radius-(y-Highest) To Radius*2
                ang#=ASin(Float(Radius-i)/Float(Radius))
                If y-Radius+i>=Middle Then
                    Box x-Cos(ang#)*Radius,y-Radius+i,Int(Cos(ang#)*Radius)*2,1 
                Else
                    Box x-Cos(ang#)*Radius,(y-Radius)+i,Int(Cos(ang#)*Radius)+(Radius-i)/Tan(Angle),1
                EndIf
            Next i
        EndIf
        If Angle > 180 And Angle < 270 Then //jos kulma on 180-270
            Highest=y+Sin(Angle)*Radius
            Lowest=y+Radius
            Middle=y-Sin(Angle)*Radius
            For i=Radius-(y-Highest) To Radius*2
                ang#=ASin(Float(Radius-i)/Float(Radius))
                If y-Radius+i>=Middle Then
                    Box x-Cos(ang#)*Radius,y-Radius+i,Int(Cos(ang#)*Radius)*2,1 
                Else
                    Box x+(Radius-i)/Tan(Angle),(y-Radius)+i,Int(Cos(ang#)*Radius)-(Radius-i)/Tan(Angle),1
                EndIf
            Next i
        EndIf
        If Angle > 270 Then //jos kulma on 270-360
            Highest=y-Radius
            Lowest=y-Sin(Angle)*Radius
            Middle=y+Sin(Angle)*Radius
            For i=0 To Lowest-Highest
                ang#=ASin(Float(Radius-i)/Float(Radius))
                If Highest+i<=Middle Then
                    Box x-Cos(ang#)*Radius,Highest+i,Int(Cos(ang#)*Radius)*2,1 
                Else
                    Box x+((y-Highest)-i)/Tan(Angle),Highest+i,Int(Cos(ang#)*Radius)-((y-Highest)-i)/Tan(Angle),1
                EndIf
            Next i
        EndIf
    EndIf
    

    //SILMÄ - Ilman tätä tavallinen puoliympyrä
    eyesize=Radius/2.5

    Color 255,255,255
    Circle x+Cos(Angle+45+90*LR)*(Radius-eyesize/2)-eyesize/2,y-Sin(Angle+45+90*LR)*(Radius-eyesize/2)-eyesize/2,eyesize,1
    
    Color 0,0,0
    Circle x+Cos(Angle+45+90*LR)*(Radius-eyesize/2)+Cos(GetAngle(x+Cos(Angle+45+90*LR)*(Radius-eyesize/2),y-Sin(Angle+45+90*LR)*(Radius-eyesize/2),BallX,BallY))*eyesize/4-eyesize/4,y-Sin(Angle+45+90*LR)*(Radius-eyesize/2)-Sin(GetAngle(x+Cos(Angle+45+90*LR)*(Radius-eyesize/2),y-Sin(Angle+45+90*LR)*(Radius-eyesize/2),BallX,BallY))*eyesize/4-eyesize/4,eyesize/2,1

EndFunction

Highest on korkein y-kordinaatti piirrettävässä puoliympyrässä
Middle on y-kordinaatti, jossa 'tasainen osuus' muuttuu 'kaartevakis osuudeksi', ei matalin eikä korkein kohta
Lowest on matalin y-kordinaatti piirrettävässä puoliympyrässä
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: Slime 360 (Puoliympyrän piirto 360:llä eri asteella)

Post by TheDuck »

Aika hieno. Onko sulla muten käyny mielessä tehä Custom Soccer Slimestä koripalloversio? Ois aika makeeta pelata koripalloa limaklönteillä :D
^^
Kassu
Newcomer
Posts: 22
Joined: Wed Aug 29, 2007 5:32 pm

Re: Slime 360 (Puoliympyrän piirto 360:llä eri asteella)

Post by Kassu »

TheDuck wrote:Aika hieno. Onko sulla muten käyny mielessä tehä Custom Soccer Slimestä koripalloversio? Ois aika makeeta pelata koripalloa limaklönteillä :D
Joo, onhan se käynyt mielessä, mutta haluaisin ensin kehittää jalkapallon "loppuun". Koodaamiselle ei vain tahdo löytyä niin paljon aikaa kun aina pitää bootata kone Windowsille (käytän macciä).
Ja koripalloversion nimeksi tulisi luultavasti Custom Basketball Slime - CBBS :)
Post Reply