Page 1 of 2

Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 12:47 pm
by CCE
Kyseessä on siis taskulamppumainen valaistus joka tehdään piirtämällä kolmiota ukosta poimittujen "näkösäteiden" mukaan. Tämä kyseinen efekti on tehty CoolBasicilla aikaisemminnkin samalla periaatteella, mutta siinä valaistun alueen täyttämiseen käytettiin yksittäisiä kuvia toisin kuin tässä versiossa jossa täyttö tapahtuu kolmioita piirtelemällä.

Tässä kuvankaappaus efektistä toiminnassa
Image

Ja tässä koodi

Code: Select all

'Täytettyihin kolmiohin ja poimintaan perustuva valoefekti CoolBasicille
'koodaillut cce 13.11.2010
'kiitokset koodajalle trifilleristä

FrameLimit 40 'rajoita nopeutta

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1
ObjectPickable kartta, ON

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

DrawToWorld False, False, False

imgMask = MakeImage(ScreenWidth(), ScreenHeight())
MaskImage imgMask, 255, 255, 255
imgDither = CreateDitherImage(ScreenWidth(), ScreenHeight())

Repeat

    'Ukon ohjaus
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,3
    If DownKey() Then MoveObject ukko,-3

    UpdateGame

    CloneCameraPosition ukko

   DrawGame
   
   fov# = 90   ' valaistuksen leveys asteina
   quality# = 20 ' kuinka monta kolmiota piirretään, enempi parempi
   turn# = fov / quality
   old_angle# = ObjectAngle(ukko)
   circle_size = 40 ' ukkoa ympäröivän valoympyrän koko
   
   DrawToImage imgMask
   ' Täytetään maski aluksi mustalla
   Color cbBlack
   Box 0, 0, ImageWidth( imgMask ), ImageHeight( imgMask ), 1
   Color cbWhite
   DrawImage imgDither, 0,0 ' Lisätään "läpinäkyvyys"
   
   Circle 200-circle_size/2, 150-circle_size/2, circle_size, 1
   
	Lock()

   For i=-quality/2 To quality/2
      RotateObject ukko, old_angle + i * turn
      ObjectPick ukko
      cam_x = -CameraX()
      cam_y = CameraY()
      pos_x = cam_x + 200 + PickedX()
      pos_y = cam_y + 150 - PickedY()
      
      'Line cam_x + 200 + ObjectX(ukko), cam_y + 150 -ObjectY(ukko), pos_x, pos_y
      If i>(-quality/2) Then
         ' koodajan vauhdikas kolmiontäyttö
         filltriangle( cam_x + 200 + ObjectX(ukko), cam_y + 150 - ObjectY(ukko), pos_x, pos_y, old_pos_x, old_pos_y )
      EndIf
      
      old_pos_x = pos_x ' tallennetaan nykyisen poiminnan tiedot seuraavalle kierrokselle
      old_pos_y = pos_y
   Next i

	Unlock()
   
   RotateObject ukko, old_angle
   
   DrawToScreen
   DrawImage imgMask, 1, 1

   Text 0,0, "FPS: "+FPS()
    DrawScreen

Forever

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#)
    //If x1<0 Or y1<0 Or x2<0 Or y2<0 Or x3<0 Or y3<0 Or x1>kgl_scrwidth Or x2>kgl_scrwidth Or x3>kgl_scrwidth Or y1>kgl_scrheight Or y2>kgl_scrheight Or y3>kgl_scrheight Then Return 0
    Dim tmpx, tmpy, slp1#, slp2#, slp3#, i
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    For i = y1 To y2
        Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
    Next i
    For i = y2 To y3
        Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
    Next i
EndFunction

'simppeli funktio joka luo kuvan ja täyttää sen 1x1 mustavalko shakkiruudukolla
Function CreateDitherImage( w, h )
   img = MakeImage( w, h )
   temp = MakeImage( w, 2)
   DrawToImage temp
   Color cbWhite
   For y = 0 To 2 
   For x = 0 To w Step 2
      Dot x+(y Mod 2), y
   Next x
   Next y
      DrawToImage img
   For y = 0 To h Step 2
      DrawImage temp, 0, y
   Next y
   DrawToScreen
   Return img
EndFunction
Kiitokset koodajalle erinomaisesta kolmiontäyttöfunktiostaan.

Edit: Koodia optimoitu.

Re: Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 4:44 pm
by Kille
Minulla ei ukko ja kartta näkyneet, oli vain valkoista ja ruudukkoa. Mitään virheilmoituksia ei tullut.

Re: Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 4:56 pm
by Viltzu
Kille wrote:Minulla ei ukko ja kartta näkyneet, oli vain valkoista ja ruudukkoa. Mitään virheilmoituksia ei tullut.
Rivi "DrawImage imgMask, 0, 0" -> "DrawImage imgMask, 1, 1"

Re: Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 5:54 pm
by Koodiapina
FPS pysytteli alle kymmenen. Muuta ei varmaan tarvitse sanoakaan.

Re: Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 6:48 pm
by koodaaja
Eihän se kovin eeppisesti pyörinyt, mutta efekti oli varsin komea o/

Re: Taskulamppuefekti tilekarttaan

Posted: Sat Nov 13, 2010 7:03 pm
by CCE
Lisäsin koodin hieman unhoittuneen optimoinnin, fps:än pitäisi olla nyt merkittävästi korkeampi.
Edit: Lisäsin myös DrawImage imgMask, 1, 1 muutoksen.

Re: Taskulamppuefekti tilekarttaan

Posted: Sun Nov 14, 2010 10:40 am
by Character
FPS oli 40 hyvin pyörii :P Hieno

Re: Taskulamppuefekti tilekarttaan

Posted: Sun Nov 14, 2010 10:54 am
by MrMonday
Ihan tyylikäs efekti :) fps oli 41 koko testauksen ajan.

Re: Taskulamppuefekti tilekarttaan

Posted: Sun Nov 14, 2010 7:37 pm
by naputtelija
Tosi kiva efekti, tosin olisi vieläkin parempi, jos "valoa tilen sisällä" bugi korjattaisiin... Hyvä silti. :D
FPS 37-40 hitaan koneen takia.

Re: Taskulamppuefekti tilekarttaan

Posted: Sun Nov 14, 2010 9:47 pm
by Koodiapina
No nyt pyörii tosiaan järkevillä nopeuksilla. Muikea efekti; hyvää työtä.

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 11:28 am
by Koodari
Miten tuota saa käyttää omissa peliprojekteissaan? :D
Maininta tekijästä riittää?

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 11:36 am
by Awaclus
Hyvin pyörii Aspire 5520:llakin, FPS oli tasaisesti 32 huolimatta siitä, että auki oli CB-foorumin lisäksi myös toinen, erittäin raskas sivu. Tosin satunnaisesti mustia pisteitä ilmestyi myös sille alueelle, missä niitä ei olisi pitänyt olla.

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 2:29 pm
by MaGetzUb
Ehkä näkökenttä efekti olisi parempi tehä tuosta. :D Näkökentän ulkopuolel pelkkää mustaa sit "harmaalla" alueella ois tuota ditheriä. :D

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 8:57 pm
by CCE
Koodari wrote:Miten tuota saa käyttää omissa peliprojekteissaan? :D
Maininta tekijästä riittää?
Sen kuin käyttää, se on vapaassa jaossa täällä eikä mitään nimiä tarvitse pistää esille.

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 9:12 pm
by Kille
Hieno efekti, fps 40 koko ajan, kun otin framelimitin pois, niin 60. Kone noin kuukauden vanha tehokone.

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 9:58 pm
by esa94
Kille wrote:Kone noin kuukauden vanha tehokone.
Ei kerro mitään. Speksejä?

Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 11:30 pm
by JATothrim
60FPS kuten sanottu muikea efekti. Olisimpa itsekkin älynnyt trifillin mahdollisuuden, sillä kehittelin joskus itsekkin saman kaltaista systeemiä. :)

PS: Onko DrawImageBox:lla piirretyn 500x1 kuvan piirtäminen nopeampaa, kuin Line 0,0,500,0:an? Tällä olisi mahdollista yrittää puristaa vieläkin enemmän tehoa wanhasta CB:stä.
EDIT:

Tullut tänä vuonna kummasti enemmän rautaista OpenGL piirtoa, kuin wanhalla CB:llä kyhäilyä... :P yksittäisiä viivoja. hyhhyh... GPU rasteroi 100000 lineä samassa ajassa kun wanha CB vasta kolmannessatoista linessä. Alphablendattuna.


Re: Taskulamppuefekti tilekarttaan

Posted: Mon Nov 15, 2010 11:59 pm
by MetalRain
Jäin vielä kaipaamaan jotain etäisyyskikkailua ja eri tason tummennuksia tuohon, mutta sitten ei välttämättä olisikaan reaaliaikainen.
JATothrim wrote:60FPS kuten sanottu muikea efekti. Olisimpa itsekkin älynnyt trifillin mahdollisuuden, sillä kehittelin joskus itsekkin saman kaltaista systeemiä. :)

PS: Onko DrawImageBox:lla piirretyn 500x1 kuvan piirtäminen nopeampaa, kuin Line 0,0,500,0:an? Tällä olisi mahdollista yrittää puristaa vieläkin enemmän tehoa wanhasta CB:stä.
Viivojen piirto on reilusti (noin 1½-2 kertaa) DrawImageBoxia nopeampaa, kunhan muistaa lukita piirtopuskurin. Drawimageboxilla toki saa teksturoitua kolmioita ja muita viritelmiä.

Nopeustestausta:

Code: Select all

Const amount =1000000
Const testamount = 10

Dim results(testamount,1)

SetWindow "Testing.. please wait"

map = LoadImage("Media/map.bmp")

For o=1 To testamount

    t=Timer()
    Lock()
    For i=1 To amount
        Line 0,0,400,0
    Next i
    Unlock()
    results(o,0)=Timer()-t
    
    
    t=Timer()
    For i=1 To amount 
        DrawImageBox map,0,0,0,0,400,1
    Next i
    results(o,1)=Timer()-t
    

    AddText "Test "+o+" Lines: "+results(o,0)+"ms  Vs. DrawImageBox: "+results(o,1)+" ms"
    
    DrawScreen 

Next o

WaitKey 

Re: Taskulamppuefekti tilekarttaan

Posted: Tue Nov 16, 2010 7:52 am
by Kille
esa94 wrote:
Kille wrote:Kone noin kuukauden vanha tehokone.
Ei kerro mitään. Speksejä?
Tossa tärkeimmät:

prossu: intel i7 2.93 Ghz
RAM: 4Gb DDR3
Näyttis: MSI GeForce GTX 460
Emo: Asus LGA 1156 (jotainnumeroitaenmuista)

Re: Taskulamppuefekti tilekarttaan

Posted: Tue Nov 16, 2010 5:20 pm
by tuhoojabotti
Kyllä se vielä quality 60:llä pyöri mukavan sulavasti, ellei pick mennyt liian pitkälle, jolloin se tökki hieman. i7 ftw.