Taskulamppuefekti tilekarttaan

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Taskulamppuefekti tilekarttaan

Post 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.
Last edited by CCE on Sat Nov 13, 2010 7:09 pm, edited 2 times in total.
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Taskulamppuefekti tilekarttaan

Post by Kille »

Minulla ei ukko ja kartta näkyneet, oli vain valkoista ja ruudukkoa. Mitään virheilmoituksia ei tullut.
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Taskulamppuefekti tilekarttaan

Post 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"
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Taskulamppuefekti tilekarttaan

Post by Koodiapina »

FPS pysytteli alle kymmenen. Muuta ei varmaan tarvitse sanoakaan.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Taskulamppuefekti tilekarttaan

Post by koodaaja »

Eihän se kovin eeppisesti pyörinyt, mutta efekti oli varsin komea o/
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Taskulamppuefekti tilekarttaan

Post 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.
Character
Active Member
Posts: 113
Joined: Thu Nov 27, 2008 2:16 pm

Re: Taskulamppuefekti tilekarttaan

Post by Character »

FPS oli 40 hyvin pyörii :P Hieno
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Taskulamppuefekti tilekarttaan

Post by MrMonday »

Ihan tyylikäs efekti :) fps oli 41 koko testauksen ajan.
naputtelija
Devoted Member
Posts: 718
Joined: Wed Nov 03, 2010 7:56 pm
Location: Joku piste pohjoisessa.

Re: Taskulamppuefekti tilekarttaan

Post 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.
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Taskulamppuefekti tilekarttaan

Post by Koodiapina »

No nyt pyörii tosiaan järkevillä nopeuksilla. Muikea efekti; hyvää työtä.
User avatar
Koodari
Active Member
Posts: 201
Joined: Wed Nov 18, 2009 9:01 pm
Contact:

Re: Taskulamppuefekti tilekarttaan

Post by Koodari »

Miten tuota saa käyttää omissa peliprojekteissaan? :D
Maininta tekijästä riittää?
Alussa oli asiakas, projekti ja Koodari...

Code: Select all

[23:36:33] <Minixmix> jos nyt viel yhen lastin heittäis
[23:36:48] <Minixmix> Sit loput vois hoitaa kännyllä :/
[00:14:49] <Minixmix> mutta nyt tyhjennykselle ->
[/size]
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Taskulamppuefekti tilekarttaan

Post 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.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Taskulamppuefekti tilekarttaan

Post 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
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Taskulamppuefekti tilekarttaan

Post 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.
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Taskulamppuefekti tilekarttaan

Post by Kille »

Hieno efekti, fps 40 koko ajan, kun otin framelimitin pois, niin 60. Kone noin kuukauden vanha tehokone.
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Taskulamppuefekti tilekarttaan

Post by esa94 »

Kille wrote:Kone noin kuukauden vanha tehokone.
Ei kerro mitään. Speksejä?
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Taskulamppuefekti tilekarttaan

Post 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.

Last edited by JATothrim on Tue Nov 16, 2010 1:22 am, edited 1 time in total.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Taskulamppuefekti tilekarttaan

Post 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 
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Taskulamppuefekti tilekarttaan

Post 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)
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Taskulamppuefekti tilekarttaan

Post 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.
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
Post Reply