Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Kumiankka
Member
Posts: 65
Joined: Wed May 18, 2011 5:17 pm
Location: Artjärvi

Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Post by Kumiankka »

Pahoittelen tuplapostia. Uusi versio ekassa viestissä. Suurin lisäys on "Palkintokaappi", jossa on listattuna saavutukset. Kommenttia, kehitysehdotuksia ja tietoa mahdollisista bugeista otetaan vastaan.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Post by MetalRain »

En tiedä mitä mieltä olet kuvien käytöstä tässä pelissä, mutta ainakin esipyöritetyt ja skaalatut kuvat ovat huomattavasti nopeampia itse pelissä kuin kaamea läjä piirtokomentoja. Pistetääs pieni esimerkki. Välilyönnistä voi vaihtaa piirtomoodia.

Code: Select all

SCREEN 1024,768

Const Creatures = 299

Const AmountOfRotation = 64
Global RotationRatio As Float

RotationRatio = 360.0/Float(AmountOfRotation)

Const AmountOfZoom = 30
Const ZoomMultiplier = 0.1
Const ZoomStartValue = 0.3

Global SH, SW, SW2, SH2

SH = ScreenHeight()
SW = ScreenWidth()
SH2 = SH/2.0
SW2 = SW/2.0

Dim ImageBox(AmountOfRotation,AmountOfZoom)

Type Creature
    Field x As Float
    Field y As Float
    Field speed As Float
    Field ang As Float
    Field size As Float
    Field r As integer
End Type

DrawToWorld ON,ON

pre$ = PreRender(LoadImage("media/cow.bmp"))

ShowMouse OFF

For i=0 To Creatures-1
    c.Creature = New (Creature)
    c\x = Rnd(-SW2,SW2)
    c\y = Rnd(-SH2,SH2)
    c\ang = Rnd(360.0)
    c\speed = Rnd(0.5,1.7)
    c\r = Rand(ConvertToInteger(c))
Next i

size#=1.0

rendermode = 1

Repeat 

    SetWindow pre$+" FPS: "+FPS()+" with "+Int(Creatures+2)+" creatures."
    
    If KeyHit(cbkeyspace) Then rendermode = Not rendermode

    If Not rendermode Then Lock()
    
    For c.Creature = Each Creature
    
        c\size = Abs(Sin((Float(Timer()+c\r)/50.0)))
        
        c\x = c\x + Cos(c\ang) * c\speed
        c\y = c\y + Sin(c\ang) * c\speed
        
        rot=0
        
        If Abs(c\x)>SW2 Then 
            c\x=(c\x/Abs(c\x))*SW2
            rot=1
        EndIf 
            
        If Abs(c\y)>SH2 Then 
            c\y=(c\y/Abs(c\y))*SH2
            rot=1
        EndIf 
        
        If rot Then c\ang# = c\ang + Rnd(160,200)
        
        If rendermode Then 
            ImageBox2(c\x,c\y,c\ang,c\size)
        Else 
            Box2(c\x,c\y,90*c\size,90*c\size,c\ang)
        EndIf 
    Next c
    

    size# = Min(Max(size# + Float(MouseMoveZ())*0.1,0.0),1.0)
    
    ang# = Timer()/50.0

    If rendermode Then 
        ImageBox2(MouseWX(),-MouseWY(),ang#,size#)
    Else 
        Box2(MouseWX(),MouseWY(),90*size#,90*size#,ang#)
    EndIf 
        
    If Not rendermode Then Unlock()

    DrawScreen 

Forever

Function PreRender(MasterImage)

    t=Timer()
    
    For rot = 0 To AmountOfRotation-1
    
        ImageBox(rot,0) = CloneImage(MasterImage) 
        
        w = ImageWidth(ImageBox(rot,0))
        h = ImageHeight(ImageBox(rot,0))
    
        For zoom = 1 To AmountOfZoom
            
            z# = (ZoomStartValue+zoom*ZoomMultiplier)
        
            ImageBox(rot,zoom) = ScaleImage(ImageBox(rot,0),w*z#,h*z#)
            RotateImage ImageBox(rot,zoom),RotationRatio*Float(rot)
        Next zoom
    
    Next rot 
    
    t=Timer()-t
    
    Return "Prerendering with "+AmountOfRotation+" rotations And "+AmountOfZoom+" zoom levels took "+t+" ms."

End Function 

Function ImageBox2(x#,y#,ang#,size#)
    iSize = Min(Max(RoundDown(size#*AmountOfZoom),1),AmountOfZoom)
    iAng = RoundDown(WrapAngle(ang#)/RotationRatio)
    DrawImage ImageBox(iAng,iSize),x#,y#
End Function 

Function ScaleImage(_image, _width, _height)

   _image_width = ImageWidth(_image)
   _image_height = ImageHeight(_image)

   
   // Tehdään temppikuva johon skaalataan ensin vain leveys
   lTempImage = MakeImage(_width, ImageHeight(_image))
   DrawToImage lTempImage
   For x = 0 To _width - 1
      sx# = Float(_image_width) / Float(_width) * Float(x)
      DrawImageBox _image, x, 0, sx, 0, 1, _image_height, OFF,OFF
   Next x
   lTempImage_width = ImageWidth(lTempImage)
   DrawToScreen
   
   _image = MakeImage(_width, _height)

   // Skaalataan myös pystysuunnassa
   DrawToImage _image
   For y = 0 To _height - 1
      sy# = Float(_image_height) / Float(_height) * Float(y)
      DrawImageBox lTempImage, 0, y, 0, sy, lTempImage_width, 1, OFF,OFF
   Next y
   DrawToScreen
   DeleteImage lTempImage
   
   Return _image
End Function

Function Box2(_x#, _y#, _hsize#, _vsize#, _angle#)
    
    //nää tarttee laskea vain kerran
    h2# = _hsize / 2.0 
    v2# = _vsize / 2.0

    xx1# = Cos(_angle)*v2       //laatikon x-suunnan x koordinaatti
    xy1# = Cos(_angle+90.0)*h2  //laatikon y-suunnan x koordinaatti
    
    yx1# = - Sin(_angle)*v2     //laatikon x-suunnan y koordinaatti
    yy1# = - Sin(_angle+90.0)*h2 //laatikon y-suunnan y koordinaatti

    x1 = _x + xx1 + xy1      //oikea yläkulma
    y1 = _y + yx1 + yy1
    
    x2 = _x - xx1 + xy1   //vasen yläkulma
    y2 = _y - yx1 + yy1
    
    x3 = _x - xx1 - xy1   //vasen alakulma
    y3 = _y - yx1 - yy1
    
    x4 = _x + xx1 - xy1       //oikea alakulma
    y4 = _y + yx1 - yy1
    
    trifiller(x1 , y1 , x2 , y2 , x3 , y3 )
    trifiller(x1 , y1 , x3 , y3 , x4 , y4 )
    
    Line x1,y1,x2,y2
    Line x2,y2,x3,y3
    Line x3,y3,x4,y4
    Line x4,y4,x1,y1
    
End Function

Function trifiller(x1,y1,x2,y2,x3,y3) 'kolmion kärkipisteet p1, p2, p3
   'järjestetään pisteet y koordinaatin perusteella
   If y2<y1 Then 'jos p2 on ylempänä kuin p1 vaihdetaan niiden paikkaa
       tmp=y1
       y1=y2
       y2=tmp
       
       tmp=x1
       x1=x2
       x2=tmp
   EndIf
   
   If y3<y1 Then 'jos p3 on ylempänä kuin p1 vaihdetaan niiden paikkaa
       tmp=y1
       y1=y3
       y3=tmp
       
       tmp=x1
       x1=x3
       x3=tmp
   EndIf
   
   If y3<y2 Then 'jos p3 on lempänä kuin p2 vaihdetaan niiden paikkaa
       tmp=y2
       y2=y3
       y3=tmp
       
       tmp=x2
       x2=x3
       x3=tmp
   EndIf
   
   'pisteet ovat nyt järjestyksessä
   'ylhäältä alas p1(x1,y1), p2(x2,y2), p3(x3,y3)
   
   dy1=y2-y1'pystysuora matka p1:sta p2:seen
   dx1=x2-x1'vaakasuora matka p1:sta p2:seen
   
   dy2=y3-y1'pystysuora matka p1:sta p3:meen
   dx2=x3-x1'vaakasuora matka p1:sta p3:meen
   
   If dy1 Then 'jos kolmion yläosa on pidempi kuin 0
       'käydään läpi kaikki vaakaviivat kolmion yläosassa(p1-p2)
       For i = y1 To y2
           'lasketaan seuraava x-koordinaatti p1:stä p2:seen
           ax=x1+((i-y1)*dx1)/dy1
           'lasketaan seuraava x-koordinaatti p1:stä p3:meen
           bx=x1+((i-y1)*dx2)/dy2
           
           Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
       Next i
   EndIf
   
   dy1=y3-y2'pystysuora matka p2:sta p3:meen
   dx1=x3-x2'vaakasuora matka p2:sta p3:meen
   
   If dy1 Then 'jos kolmion alaosa on pidempi kuin 0
       'käydään läpi kaikki vaakaviivat kolmion alaosassa(p2-p3)
       For i = y2 To y3
           'lasketaan seuraava x-koordinaatti p2:stä p3:meen
           ax=x2+((i-y2)*dx1)/dy1
           'lasketaan seuraava x-koordinaatti p1:stä p3:meen
           bx=x1+((i-y1)*dx2)/dy2
           
           Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
       Next i
   EndIf
End Function
Kumiankka
Member
Posts: 65
Joined: Wed May 18, 2011 5:17 pm
Location: Artjärvi

Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Post by Kumiankka »

Muuten varmaan käyttäisin esirenderöityä, mutta kun täytyisi tehdä kuvat leveys- ja pystysuuntaiselle koolle ja niiden pyörityksille niin nykyisellä maksimikoolla ja vain kahdeksallakin pyörityssuunnalla se olisi 100 * 100 * 8 = 80 000. Kahdeksankymmenentuhannen kuvan esirenderöinti kestäisi kyllä aika reilusti, varsinkin kun cb:n rotateimage on niin järkyttävän hidas...
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Post by Latexi95 »

Kumiankka wrote:Muuten varmaan käyttäisin esirenderöityä, mutta kun täytyisi tehdä kuvat leveys- ja pystysuuntaiselle koolle ja niiden pyörityksille niin nykyisellä maksimikoolla ja vain kahdeksallakin pyörityssuunnalla se olisi 100 * 100 * 8 = 80 000. Kahdeksankymmenentuhannen kuvan esirenderöinti kestäisi kyllä aika reilusti, varsinkin kun cb:n rotateimage on niin järkyttävän hidas...
Kai muuten lukitset näyttöpuskurin, kun piirrät viivat? Line on paljon nopeampi, kun sitä käytetään lukittuun puskuriin.
Kumiankka
Member
Posts: 65
Joined: Wed May 18, 2011 5:17 pm
Location: Artjärvi

Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!

Post by Kumiankka »

Projekti on vaipunut syväjäähän... Saatan joskus vielä ruveta jatkamaan, mutta nyt ei ainakaan enää mielenkiinto jaksa riittää... Jos jotakuta kiinnostaa tutustua pelin lähdekoodiin niin annan sen nyt vapaaseen jakoon/käyttöön.
Solupeli_sorsapaketti.zip
(478.86 KiB) Downloaded 395 times
Koodi on moninpaikoin sekavaa ja vähäisesti kommentoitua, mutta toivottavasti siitä on jollekkin jotain iloa.
Post Reply