Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
Pahoittelen tuplapostia. Uusi versio ekassa viestissä. Suurin lisäys on "Palkintokaappi", jossa on listattuna saavutukset. Kommenttia, kehitysehdotuksia ja tietoa mahdollisista bugeista otetaan vastaan.
Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
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
Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
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...
Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
Kai muuten lukitset näyttöpuskurin, kun piirrät viivat? Line on paljon nopeampi, kun sitä käytetään lukittuun puskuriin.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...
Re: Solupeli - ohjaa kulmikas solusi ravintoketjun huipulle!
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.
Koodi on moninpaikoin sekavaa ja vähäisesti kommentoitua, mutta toivottavasti siitä on jollekkin jotain iloa.