Tyhmät kysymykset (I/2012)

Voit pyytää apua ohjelmointiongelmiin täältä.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by axu »

Käsittääkseni tiedostopäätteet ovat olemassa lähinnä vain käyttöjärjestelmää varten: näin käyttis osaa näyttää oikean kuvakkeen eri tiedostoille ja ne avautuvat oikeissa ohjelmissa. Itse tiedoston tunnistaminen tapahtuu yleensä tiedoston ensimmäisten tavujen sisällön perusteella (jonkinlaiset headerit kuuluvat useimpiin tiedostomuotoihin).
Yleensä ohjelma, joka osaa käsitellä png-tiedostoja taitaa myös bmp:n. Tästä syystä väärällä tiedostopäätteellä tallennettu kuva todennäköisesti aukeaa vaivatta. Jos ohjelma kuitenkin tunnistaa tiedostomuodon sen nimen (päätteen) perusteella, ei avaaminen onnistu (harvoin, mutta joskus törmää näihinkin).
Muistaakseni (ei ole nyt käsillä) kuitenkin manuaalissa nimenomaan sanottiin, että saveimage tallentaa vain .BMP -päätteisiä kuvia, joten huomiosi on ihan oikea; kyllä sille muutkin päätteet kelpaavat.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

axu wrote:Käsittääkseni tiedostopäätteet ovat olemassa lähinnä vain käyttöjärjestelmää varten: näin käyttis osaa näyttää oikean kuvakkeen eri tiedostoille ja ne avautuvat oikeissa ohjelmissa. Itse tiedoston tunnistaminen tapahtuu yleensä tiedoston ensimmäisten tavujen sisällön perusteella (jonkinlaiset headerit kuuluvat useimpiin tiedostomuotoihin).
Yleensä ohjelma, joka osaa käsitellä png-tiedostoja taitaa myös bmp:n. Tästä syystä väärällä tiedostopäätteellä tallennettu kuva todennäköisesti aukeaa vaivatta. Jos ohjelma kuitenkin tunnistaa tiedostomuodon sen nimen (päätteen) perusteella, ei avaaminen onnistu (harvoin, mutta joskus törmää näihinkin).
Muistaakseni (ei ole nyt käsillä) kuitenkin manuaalissa nimenomaan sanottiin, että saveimage tallentaa vain .BMP -päätteisiä kuvia, joten huomiosi on ihan oikea; kyllä sille muutkin päätteet kelpaavat.
Eli CB:n manuaalissa on virhe, .Png - tiedostopääte käy myös, ei virheellisesti vain .BMP.

Tuosta pitäisi kertoa Zerolle, että korjaavat CBC:n manuaaliin oikean tiedon :P
Konstaduck.net
<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...
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

Konstaduck wrote: Eli CB:n manuaalissa on virhe, .Png - tiedostopääte käy myös, ei virheellisesti vain .BMP.

Tuosta pitäisi kertoa Zerolle, että korjaavat CBC:n manuaaliin oikean tiedon :P
Se ei ole virhe. On virhe tallentaa BMP tiedosto .png pääteiseen tiedostoon. Se onnistuu, mutta ei ole suositeltavaa.
Pettis
The Evil Admin
The Evil Admin
Posts: 1044
Joined: Sun Aug 26, 2007 5:08 pm
Location: Rovaniemi
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Pettis »

Tiedostojen nimet ovat vain nimiä. Mikäli tallennat bmp-kuvan tiedosto.exe nimiseen tiedostoon, niin et saa suoritettavaa ohjelmaa, vaan kyseisen nimisen tiedoston jossa oikeasti on vain bmp-kuva.

Päätteet on sitä varten, että tiedoston nimestä voisi esittää edes jonkinlaista arvausta sen sisällöstä.
CB Repository .com - Sinne ne kaikki koodit menneet on!
MunVerkko - Ilmaisia foorumeita ja blogeja
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

Latexi95 wrote:
Konstaduck wrote: Eli CB:n manuaalissa on virhe, .Png - tiedostopääte käy myös, ei virheellisesti vain .BMP.

Tuosta pitäisi kertoa Zerolle, että korjaavat CBC:n manuaaliin oikean tiedon :P
Se ei ole virhe. On virhe tallentaa BMP tiedosto .png pääteiseen tiedostoon. Se onnistuu, mutta ei ole suositeltavaa.
Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna :)

Uutta kysymystä heti kehiin: Voiko latexi tuolla sinun Savesettings & Parsesettings:sillä käsitellä muita kuin .INI - tiedostopäätteitä? Entä voiko arvoksi tallentaa merkkijonon?
Konstaduck.net
<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...
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

Konstaduck wrote: Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna :)
Aloittelijoihin katsottuna tuo toimii oikein hyvin juuri tuolla tavalla. Tuskin siitä kenellekään mitään hyötyä on, että bmp-kuvan tiedostopääte on png kun se ei kuitenkaan kuvan formaattia muuta miksikään, ja se vain sekoittaisi Tommin pään, jos siellä sanottaisiin että niin voi tehdä muttei kannata. Manuaalissahan sanotaan myös esim., ettei loopeissa saa ikinä ladata mitään tiedostoja koneelta, mutta kyllä niin voi ihan hyvin tehdä.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by axu »

Konstaduck wrote:Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna :) ?
Miksi sekoittaa aloittelijoita sanomalla, että siihen käy .PNG, .PSD tai vaikkapa .TXT tai ilman mitään päätettä, kun se kuitenkin tallentaa bmp-muodossa sen kuvan? Parempi olisi sanoa jotenkin näin: "SaveImage tallentaa kuvia vain bmp-muodossa. Siksi on hyvä lisätä tiedostonimen perään pääte .BMP" tai jtn.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
User avatar
aloittelijamies
Newcomer
Posts: 45
Joined: Fri Nov 18, 2011 9:55 pm

Re: Tyhmät kysymykset (I/2011)

Post by aloittelijamies »

Onko Coolbasicissa mahdollista tehdä ns. mäkeä peliin jota voi kävellä vaikka ylä ja alaviistoon tai vaikka halutessaan käyttää liukumäkenä yms

Kuva selventämään.

Image
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2011)

Post by esa94 »

On.
User avatar
aloittelijamies
Newcomer
Posts: 45
Joined: Fri Nov 18, 2011 9:55 pm

Re: Tyhmät kysymykset (I/2011)

Post by aloittelijamies »

esa94 wrote:On.
löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?

Kiitos
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

aloittelijamies wrote:
esa94 wrote:On.
löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?

Kiitos
Ei. Tuo on kuitenkin sen verran monimutkaisempi juttu, että se luultavammin kannattaa yritä tajuta itse kuin katsoa koodiesimerkkiä ja olla tajuamatta siitä mitään. Samalla se on myös sen verran monimutkaista, että mie en pysty sitä ihan tuosta vain hatusta heittämään, vaan manuaalia ja ajatustakin tarvittaisiin.
User avatar
aloittelijamies
Newcomer
Posts: 45
Joined: Fri Nov 18, 2011 9:55 pm

Re: Tyhmät kysymykset (I/2011)

Post by aloittelijamies »

Chaosworm wrote:
aloittelijamies wrote:
esa94 wrote:On.
löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?

Kiitos
Ei. Tuo on kuitenkin sen verran monimutkaisempi juttu, että se luultavammin kannattaa yritä tajuta itse kuin katsoa koodiesimerkkiä ja olla tajuamatta siitä mitään. Samalla se on myös sen verran monimutkaista, että mie en pysty sitä ihan tuosta vain hatusta heittämään, vaan manuaalia ja ajatustakin tarvittaisiin.
ok, ei se mitään. Ei se pelintekeminen tähän kaadu.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

Tässä esimerkkikoodi. Älä kopioi suoraan peliisi vaan opettele siitä. Tuo on muutenkin huono koodi mihinkään peliin laitettavaksi, mutta hyvä juuri siihen mitä se tällä hetkellä tekee.

Code: Select all

FrameLimit 40

//tehdään kuva mäestä
mäki = MakeImage(100, 100)

DrawToImage mäki
For x = 1 To ImageWidth(mäki)
    For y  = 1 To ImageHeight(mäki)
        If x <= y
            Dot x, y
        EndIf
    Next y
Next x
DrawToScreen

//ja lattiasta
lattia = MakeImage(ScreenWidth(), 10)
DrawToImage lattia
ClsColor cbwhite
Cls
ClsColor cbBlack

DrawToScreen

//piirretään kaikki taustaan
tausta = MakeImage(ScreenWidth(), ScreenHeight())
DrawToImage tausta
    DrawImage mäki, 0, ScreenHeight() - 110
    DrawImage lattia, 0, ScreenHeight() - 10
DrawToScreen

//näitä kuvia ei tarvitse enää
DeleteImage mäki
DeleteImage lattia

//pallon muuttujia. Huomaa, tarvitsemme liukulukuja
pallox# = ScreenWidth() / 2
palloy# = ScreenHeight() / 2
pallomx# = 0
pallomy# = 0

//gravitaatio
gravity# = 0.1

Repeat

    //pallon liikutus nuolinäppäimillä
    pallomx = pallomx + (RightKey() - LeftKey() ) * 0.1
    
    //törmäys seiniin
    If pallox < 0 Then
        pallox = 0
        pallomx = pallomx * -0.5
    ElseIf pallox > ScreenWidth() - 20 Then
        pallox = ScreenWidth() - 20
        pallomx = pallomx * -0.5
    EndIf

    //katsotaan pallon alla olevan pikselin väri. Musta on tyhjää, muu väri maata
    PickImageColor tausta, (pallox + 10), (palloy + 20) 

    //Jos oli maata
    If getRGB(RED) <> 0 Or getRGB(GREEN) <> 0 Or getRGB(BLUE) <> 0 Then
        maassa = True // pallo törmäsi lattiaan
        
        //niin kauan kuin pallo on maassa, liikutetaan sitä ylöspäin. 
        //Vaikka pallo olisi kuinka syvällä, tämä liikutus tapahtuu silmänräpäyksessä,
        //ja näyttää siltä kuin pallo törmäysi maan pintaan
        While (getRGB(RED) <> 0 Or getRGB(GREEN) <> 0 Or getRGB(BLUE) <> 0)
            PickImageColor tausta, (pallox + 10), (palloy + 20)
            palloy - 1
        Wend
    Else
        //jos löytyi täysin mustaa väriä, ollaan ilmassa
        maassa = False
    EndIf
    
    //jos ollaan ilmassa
    If not maassa Then
        pallomy + gravity //gravitaatio vaikuttaa palloon
    Else
        //muussa tapauksessa pallo pomppaa takaisin
        If pallomy > 0 Then pallomy = pallomy * -0.5
    EndIf
    
    //itse pallon liike
    pallox + pallomx
    palloy + pallomy
  
    //piirretään pallo
    Color cbRed
    Circle pallox, palloy, 20
    
    //piirretään tausta
    DrawImage tausta, 0, 0
    DrawScreen
Forever
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
aloittelijamies
Newcomer
Posts: 45
Joined: Fri Nov 18, 2011 9:55 pm

Re: Tyhmät kysymykset (I/2011)

Post by aloittelijamies »

kiitos tästä
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

axu wrote:
Konstaduck wrote:Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna :) ?
Miksi sekoittaa aloittelijoita sanomalla, että siihen käy .PNG, .PSD tai vaikkapa .TXT tai ilman mitään päätettä, kun se kuitenkin tallentaa bmp-muodossa sen kuvan? Parempi olisi sanoa jotenkin näin: "SaveImage tallentaa kuvia vain bmp-muodossa. Siksi on hyvä lisätä tiedostonimen perään pääte .BMP" tai jtn.
No tuolla logiikalla se on kyllä yksinkertaisinta :D
Konstaduck.net
<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...
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

Miten voisi yksinkertaisimmin tehdä ns. Ikkunan häivytys/palautus efektin? Eli kuva palautuisi vähitellen mustasta normaaliksi kuvaksi. Tiedän, että cbSDK:ssa on tällainen funktio, mutta en halua käyttää tätä kokoruudun tilassa. Tulisi meinaan muuten huimat resoluutiokorjaukset, ja sitähän en halua :)
Konstaduck.net
<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...
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

Konstaduck wrote:Miten voisi yksinkertaisimmin tehdä ns. Ikkunan häivytys/palautus efektin? Eli kuva palautuisi vähitellen mustasta normaaliksi kuvaksi. Tiedän, että cbSDK:ssa on tällainen funktio, mutta en halua käyttää tätä kokoruudun tilassa. Tulisi meinaan muuten huimat resoluutiokorjaukset, ja sitähän en halua :)
Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.

No voit tietysti käyttää GetPixeliä ja PutPixeliä ja muuttaa kaikkien ruudun pikselien väriä. Se on toimii missä ruututilassa tahansa, mutta on todella hidas ja toimii oikeastaan ainoastaan paikallaan pysyvälle kuvalle, koska FPS tippuu todella alas.

Sitten voit värjätä osan pikseleistä mustaksi ja aina lisätä mustien pikselien osuutta. Tämä on edellistä taktiikkaa nopeampi, mutta ei ehkä niin hienon näköinen.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Tyhmät kysymykset (I/2011)

Post by MetalRain »

aloittelijamies wrote:Onko Coolbasicissa mahdollista tehdä ns. mäkeä peliin jota voi kävellä vaikka ylä ja alaviistoon tai vaikka halutessaan käyttää liukumäkenä yms

Kuva selventämään.
Image
Mäkiä tosiaan saa näkymään kivasti kuvien avulla, mutta itse toiminallisuuden toteuttaminen voikin olla hieman hankalampaa. Tein aikoinani pöytälaatikkoon tälläisen systeemin tasohyppelypelejä varten joka auttaa vinojen kulmien törmäystarkistusten kanssa. Käytännössä ukkeli voi olla aivan normaali kuva/objekti, mutta törmäykset tarkistetaan kentän törmäysviivojen (rails) ja ukon liikesuunnan perusteella. Törmäysviivoja voi sitten ketjuttaa toisiinsa kiinni, lisäillä, poistaa tai muuttaa lennossa. Näin saadaan esim. tilekarttoihin verrattuna huomattavasti enemmän ominaisuuksia kuten maasta nousevia pylväitä, hissejä, katkeavia siltoja, yms.

Tässä vielä testikoodi jossa voi nuolinäppäimillä hyppiä pallolla dynaamisesti muuttuvassa maastossa. Hiirellä voi luoda paikallaan pysyviä viivoja.

Code: Select all

SCREEN 1024,768

//Rail MemoryMap

Const RailStartX        = 0
Const RailStartY        = 4
Const RailEndX          = 8
Const RailEndY          = 12
Const RailLenght        = 16
Const RailAngle         = 20
Const PreviousRail      = 24
Const NextRail          = 28
Const RailMemorySize    = 32
Const RailMemoryType    = "ffffffii"

Global RailMap
Global RailMapSize

Railmap = MakeMEMBlock(4)
RailMapSize = 4

//CBSDK FUNCTION
Global IntersX#, IntersY#
Global LinesOnTop

//game 

Const railamount = 50
railMargin = 1024/railamount
Dim rails(railamount)

For i=0 To railamount
    If (i>0) Then 
        rails(i) = AddRail(i*railMargin,PeekFloat(rails(i-1),RailEndY),(i+1)*railMargin,Min(Max(PeekFloat(rails(i-1),RailEndY)+Rand(-50,50),50),700),rails(i-1))
    Else 
        rails(0) = AddRail(i*railMargin,350,(i+1)*railMargin,Rand(50,700))
    EndIf 

Next i

GuyRail=rails(0)
GuyPosition#=0.0
speed# = 2.0

guyYSpeed# = 0.0

Repeat

    If MouseHit(1) Then 
        If Not railstart Then 
            railsx=MouseX()
            railsy=MouseY()
            railstart =1
            ClearMouse
        Else
            AddRail(railsx,railsy,MouseX(),MouseY())
            railstart=0
        EndIf
    EndIf
    
    
    //deform rails
    
    deformAmount# = 0.2
 
    For i=0 To railamount
    
        deformTime = (Timer()/10)+i*30
        If (i = 0) Then DeformRail(rails(i),PeekFloat(rails(i),RailStartX),PeekFloat(rails(i),RailStartY)+Sin(deformTime)*deformAmount#,PeekFloat(rails(i),RailEndX)+Sin(deformTime)*deformAmount#,PeekFloat(rails(i),RailEndY)+Sin(deformTime)*deformAmount#)
        If (i <> 0) Then  DeformRail(rails(i),PeekFloat(rails(i-1),RailEndX),PeekFloat(rails(i-1),RailEndY),PeekFloat(rails(i),RailEndX)+Sin(deformTime)*deformAmount#,PeekFloat(rails(i),RailEndY)+Sin(deformTime)*deformAmount#)

    Next i
  
    
    If GuyRail>0 Then 
    
        speedPros# = (speed#/PeekFloat(GuyRail,RailLenght))
    
    
        If LeftKey() Then
            If inverted Then GuyPosition#=Min(GuyPosition#+speedPros#,1.0) Else GuyPosition#=Max(GuyPosition#-speedPros#,0.0)
            
            If Guyposition# = 0.0 And PeekInt(GuyRail,PreviousRail) Then 
                GuyRail=PeekInt(GuyRail,PreviousRail) 
                GuyPosition# = 1.0
            EndIf
        ElseIf RightKey()
        
            If inverted Then GuyPosition#=Max(GuyPosition#-speedPros#,0.0) Else GuyPosition#=Min(GuyPosition#+speedPros#,1.0)
            
            If Guyposition#=1.0 And PeekInt(GuyRail,NextRail) Then 
                GuyRail=PeekInt(GuyRail,NextRail) 
                GuyPosition = 0.0
                
            EndIf
        EndIf
        
        guyx# = GetRailFloatPointX(GuyRail,GuyPosition#) 
        guyy# = GetRailFloatPointY(GuyRail,GuyPosition#) 
        
        If UpKey() Then GuyRail = 0 : guyYSpeed# = -5.0 
    EndIf 

    If GuyRail = 0
    
        oldx# = guyx# 
        oldy# = guyy#

        guyYSpeed# = guyYSpeed# + 0.3
        guyXSpeed# = (RightKey()-LeftKey())*speed#
    
        guyx=guyx + guyXSpeed#
        guyy=guyy + guyYSpeed#
        
        If (notCollided) Then 
            GuyRail = RailIntersectingLine(oldx#-guyXSpeed#,oldy#-guyYSpeed#,guyx#+guyXSpeed#,guyy#+guyYSpeed#)
        Else 
            GuyRail = RailIntersectingLine(oldx#,oldy#,guyx#+guyXSpeed#,guyy#+guyYSpeed#)
        EndIf 
        
        If GuyRail Then
            GuyPosition# = (Distance(PeekFloat(GuyRail,RailStartX),PeekFloat(GuyRail,RailStartY),IntersX,IntersY)/PeekFloat(GuyRail,RailLenght))
            guyx# = GetRailFloatPointX(GuyRail,GuyPosition) 
            guyy# = GetRailFloatPointY(GuyRail,GuyPosition) 
            ClearKeys
            notCollided=0
        Else 
            notCollided=1
        EndIf 

    EndIf 
    
    DrawRails()
    
    Color cbred
    Circle guyx#-5,guyy#-10,10

    Color cbwhite
    
    If (guyrail) Then Text 0,0,guyx#+","+guyy#+" "+GuyPosition#+" "+PeekFloat(GuyRail,RailAngle)

    DrawScreen

Forever

//Rails lib 

Function DrawRails()

    If Railmap And RailMapSize>4 Then 

        For i=4 To RailMapSize-1 Step 4
            
            rail = PeekInt(Railmap,i)
                
            For o=0 To MEMBlockSize(rail)-1 Step RailMemorySize
            
                Color cbwhite
                
                Line PeekFloat(rail,o+RailStartX),PeekFloat(rail,o+RailStartY),PeekFloat(rail,o+RailEndX),PeekFloat(rail,o+RailEndY)
                
                'Text (PeekFloat(rail,o+RailEndX)+PeekFloat(rail,o+RailStartX))/2,(PeekFloat(rail,o+RailEndX)+PeekFloat(rail,o+RailStartX))/2,PeekFloat(rail,o+RailAngle)
                //MakeError PeekFloat(rail,o+RailStartX)+","+PeekFloat(rail,o+RailStartY)+","+PeekFloat(rail,o+RailEndX)+","+PeekFloat(rail,o+RailEndY)
                
            Next o
        
        Next i
    
    Else
    
        Return 0
    
    EndIf

End Function 

Function AddRail(x1#,y1#,x2#,y2#,p=0,n=0,stopinvert=1)
    //Makes Rail, adds pointer to Railmap and returns pointer

    rail = MakeMEMBlock (RailMemorySize)
    
    ang# = GetAngle(x1#,y1#,x2#,y2#)
    
    If stopinvert = 1 Then 
        If ang#>90.0 And ang#<270.0 Then 
            temp# = x1#
            x1# = x2#
            x2# = temp#
            temp# = y1#
            y1# = y2#
            y2# = temp#
            ang# = WrapAngle(ang#+180.0)
        EndIf
    EndIf
    
    PokeFloat rail,RailStartX,x1#
    PokeFloat rail,RailStartY,y1#
    PokeFloat rail,RailEndX,x2#
    PokeFloat rail,RailEndY,y2#
    PokeFloat rail,RailLenght,Distance(x1#,y1#,x2#,y2#)
    PokeFloat rail,RailAngle, ang#
    
    PokeInt rail,PreviousRail,p
    PokeInt rail,NextRail,n
    
    If p Then PokeInt p,NextRail,rail
    If n Then PokeInt n,PreviousRail,rail
    
    oldsize = RailMapSize
    
    ResizeMEMBlock Railmap,RailMapSize+4
    RailMapSize = oldsize+4
    
    PokeInt Railmap,oldsize,rail
    
    Return rail

End Function 

Function DeformRail(rail,x1#,y1#,x2#,y2#,p=0,n=0)
    //Changes rail properties
    // use -1 to remove rail pointers (next and previous)

    If rail Then

        ang# = GetAngle(x1#,y1#,x2#,y2#)

        If ang#>90.0 And ang#<270.0 Then 
            temp# = x1#
            x1# = x2#
            x2# = temp#
            temp# = y1#
            y1# = y2#
            y2# = temp#
            ang# = WrapAngle(ang#+180.0)
        EndIf

        PokeFloat rail,RailStartX,x1#
        PokeFloat rail,RailStartY,y1#
        PokeFloat rail,RailEndX,x2#
        PokeFloat rail,RailEndY,y2#
        PokeFloat rail,RailLenght,Distance(x1#,y1#,x2#,y2#)
        PokeFloat rail,RailAngle, ang#
        
        If p Then 
            PokeInt rail,PreviousRail,p 
        ElseIf p=-1 Then 
            PokeInt rail,PreviousRail,0
        EndIf
        
        If n Then 
            PokeInt rail,NextRail,n 
        ElseIf n=-1 Then 
            PokeInt rail,NextRail,0
        EndIf
    
    Else 
        MakeError "Trying to deform nonexisting rail: "+rail
    EndIf

End Function 


Function DeleteRail(rail)
    //Deletes rail and erases pointers from Railmap and adjecant rails
    
    If rail Then 

        For i=4 To RailMapSize-1 Step 4
                
            iRail = PeekInt(Railmap,i)
            
            If iRail = rail Then 
                
                If RailMapSize>i+4 Then MemCopy Railmap,i+4,Railmap,i,RailMapSize-(i+4)
                
                ResizeMEMBlock Railmap,RailMapSize-4
                RailMapSize = RailMapSize-4
                
                Exit
            EndIf 
                
        Next i
        
        p = PeekInt(rail,PreviousRail)
        n = PeekInt(rail,NextRail)
        
        If p Then PokeInt p,NextRail,0
        If n Then PokeInt n,PreviousRail,0
        
        DeleteMEMBlock rail

    Else
        MakeError "Trying to delete nonexisting rail: "+rail
    EndIf 

End Function 

//returns point just a little over line
Function GetRailFloatPointX(rail,position#) 

    railangle# = PeekFloat(rail,RailAngle)
    
    If (railangle# <= 90 ) Then Return PeekFloat(rail,RailStartX)+position#*PeekFloat(rail,RailLenght)*Cos(railangle#) - Cos(railangle#)*0.1
    If (railangle# >= 270) Then Return PeekFloat(rail,RailStartX)+position#*PeekFloat(rail,RailLenght)*Cos(railangle#) + Cos(railangle#)*0.1

End Function 

//returns point just a little over line
Function GetRailFloatPointY(rail,position#) 

    railangle# = PeekFloat(rail,RailAngle)

    Return PeekFloat(rail,RailStartY)+position#*PeekFloat(rail,RailLenght)*-Sin(railangle#) - 0.1

End Function 

Function DistanceToRail(rail,x#,y#) 
    ' Modified from Jonhu´s MinDistToLine 
    
    If rail Then 
    
        lx1# = PeekFloat(rail,RailStartX) 
        ly1# = PeekFloat(rail,RailStartY)
        lx2# = PeekFloat(rail,RailEndX)
        ly2# = PeekFloat(rail,RailEndX)
    
        // järjestetään, että (lx1, ly1) on pienempi
        If lx1 > lx2 Then
            mx1# = lx1 : my1# = ly1
            lx1 = lx2  : ly1 = ly2
            lx2 = mx1  : ly2 = my1
        EndIf
    
        // lasketaan muutama kulma
        line_ang# = GetAngle(lx1#,ly1#, lx2#,ly2#)
        ang1# = Abs( GetAngle(x#,y#, lx1#,ly1#) - line_ang# ) + 90
        ang2# = Abs( GetAngle(x#,y#, lx2#,ly2#) - line_ang# ) + 90
    
        If WrapAngle( ang1# ) <= 180
            dist# = Distance(x#,y#, lx1#,ly1#) ' abs(px#-lx1#) + abs(py#-ly1#)
        ElseIf WrapAngle( ang2# ) => 180
            dist# = Distance(x#,y#, lx2#,ly2#)
        Else // jos lähin etäisyys ei ole päätepisteissä joudutaan hieman laskea..
            dist# = ( Abs( (lx2-lx1)(ly1-y)-(lx1-x)(ly2-ly1) ) / Sqrt( (lx2-lx1)^2.0 + (ly2-ly1)^2.0 ) )
        EndIf
    
        Return dist#
    Else
        MakeError "Trying to measure distance to nonexisting rail: "+rail
    EndIf 

EndFunction

Function RailIntersectingLine(x1#,y1#,x2#,y2#)
    For i=4 To RailMapSize-1 Step 4
                
        rail = PeekInt(Railmap,i)
        
        lx1# = PeekFloat(rail,RailStartX) 
        ly1# = PeekFloat(rail,RailStartY)
        lx2# = PeekFloat(rail,RailEndX)
        ly2# = PeekFloat(rail,RailEndY)
        
        If LinesIntersect(x1#,y1#,x2#,y2#, lx1#,ly1#,lx2#,ly2#) Then Return rail
    
    Next i
    
    Return 0

End Function 

Function LinesIntersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)

    LinesOnTop = False
    // Tarkastetaan ovatko suorat toistensa päällä yhdensuuntaisina
   If Collinear(Ax#,Ay#,Bx#,By#,Cx#,Cy#) = True And Collinear(Ax#,Ay#,Bx#,By#,Dx#,Dy#) = True Then 'ovatko yhdensuuntaisia
        If Between(Ax#,Ay#,Bx#,By#,Cx#,Cy#) = True Or Between(Ax#,Ay#,Bx#,By#,Dx#,Dy#) = True Or Between(Cx#,Cy#,Dx#,Dy#,Ax#,Ay#) = True Or Between(Cx#,Cy#,Dx#,Dy#,Bx#,By#) = True Then  'ovatko sisäkkäin
            IntersX# = 0
            IntersY# = 0
           LinesOnTop = True
            Return True
        EndIf
    EndIf

    Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
    Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)
    If Rd# = 0
        Return False
    Else
        Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)
        Intersection_AB# = Rn# / Rd#
        Intersection_CD# = Sn# / Rd#
        If Intersection_AB# > 1 Or Intersection_CD# > 1 Or Intersection_AB# < 0 Or Intersection_CD# < 0 Then Return False
        IntersX = Ax# + Intersection_AB#*(Bx#-Ax#)
        IntersY = Ay# + Intersection_AB#*(By#-Ay#)
        Return True
    EndIf
End Function 

// Tarkastaa onko jokin piste kahden pisteen määrittämällä suoralla
Function Collinear(x1#,y1#,x2#,y2#,x3#,y3#)
    If x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2) = 0 Then Return True Else Return False
End Function

// Tarkastaa onko jokin piste kahden pisteen määrittämällä janalla
Function Between(x1#,y1#,x2#,y2#,x3#,y3#)
    If Collinear(x1#,y1#,x2#,y2#,x3#,y3#) = False Then Return False
    If Distance(x1,y1,x3,y3) + Distance(x3,y3,x2,y2) = Distance(x1,y1,x2,y2) Then Return True Else Return False
End Function
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

Latexi95 wrote:
Konstaduck wrote:Miten voisi yksinkertaisimmin tehdä ns. Ikkunan häivytys/palautus efektin? Eli kuva palautuisi vähitellen mustasta normaaliksi kuvaksi. Tiedän, että cbSDK:ssa on tällainen funktio, mutta en halua käyttää tätä kokoruudun tilassa. Tulisi meinaan muuten huimat resoluutiokorjaukset, ja sitähän en halua :)
Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.

No voit tietysti käyttää GetPixeliä ja PutPixeliä ja muuttaa kaikkien ruudun pikselien väriä. Se on toimii missä ruututilassa tahansa, mutta on todella hidas ja toimii oikeastaan ainoastaan paikallaan pysyvälle kuvalle, koska FPS tippuu todella alas.

Sitten voit värjätä osan pikseleistä mustaksi ja aina lisätä mustien pikselien osuutta. Tämä on edellistä taktiikkaa nopeampi, mutta ei ehkä niin hienon näköinen.
Ei näytä CB:ssä olevan ikkunassa toimivaa "ScreenGammaa". Minähän voisin sen kyhätä, ettei aloittelijat sitä tule aika ajoin kysymään. Sitä voisin sitten käyttää pelissäni.
Konstaduck.net
<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...
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2011)

Post by legend »

Konstaduck wrote:
Latexi95 wrote:
Konstaduck wrote:Miten voisi yksinkertaisimmin tehdä ns. Ikkunan häivytys/palautus efektin? Eli kuva palautuisi vähitellen mustasta normaaliksi kuvaksi. Tiedän, että cbSDK:ssa on tällainen funktio, mutta en halua käyttää tätä kokoruudun tilassa. Tulisi meinaan muuten huimat resoluutiokorjaukset, ja sitähän en halua :)
Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.

No voit tietysti käyttää GetPixeliä ja PutPixeliä ja muuttaa kaikkien ruudun pikselien väriä. Se on toimii missä ruututilassa tahansa, mutta on todella hidas ja toimii oikeastaan ainoastaan paikallaan pysyvälle kuvalle, koska FPS tippuu todella alas.

Sitten voit värjätä osan pikseleistä mustaksi ja aina lisätä mustien pikselien osuutta. Tämä on edellistä taktiikkaa nopeampi, mutta ei ehkä niin hienon näköinen.
Ei näytä CB:ssä olevan ikkunassa toimivaa "ScreenGammaa". Minähän voisin sen kyhätä, ettei aloittelijat sitä tule aika ajoin kysymään. Sitä voisin sitten käyttää pelissäni.
Löysinpäs joskus tekemäni läpinäkyvyys efektin... joillakin heittää mav, joillakin ei. Teimpäs pienen häivtys esimerkin, joka ei ole realiaikainen :D

Code: Select all

   
    //By legends
    
    
    ///käyttö ohjeet
    //käytä ExploreImage haluamassasi kohdassa, ennen drawscreen komentoa, mutta älä silmukan sisällä
    //ExploreImage(kuva, aloitus kohta x, aloitus kohta y)
    //tee taulukko johon tulet tallettamaan läpinäkyvän kuvan
    //taulukko(0) = OpacityImage(kuva, läpinäkyvyys)
    //OpacityImage on todella hidas komento
    
    //DrawImage taulukko(0...Tarkkuus)
    //esim. drawimage taulukko(5)

    
    Dim Colour(10,10,2,1)//kuvien tiedot
    
    //esivalmistellaan kuvaa...
    //tausta on piirrettävä ennen komentoa!
    Function ExploreImage(pic,picX,picY)
        picX + 1
        picY + 1
        picW = ImageWidth(pic)-1
        picH = ImageHeight(pic)-1
        ReDim Colour(picW+1,picH+1,2,1)//laitettaan taulukko uuten kokoon
        If picX > 0 And PicxX+picW < ScreenWidth()-1 And picY > 0 And PicY+picH < ScreenHeight()-1 //ettei mene ruuudun ulkopuolelle
            Lock()
            For x = 1 To picW
                For y = 1 To picH
                    pixel = GetPixel2(picX + x, picY + y) //otettaan tausta talteen
                    Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
                Next y
            Next x
            Unlock()
            DrawToImage pic
            Lock()
            For x = 1 To picW
                For y = 1 To picH
                    pixel = GetPixel2(x,y) //otetaan itse kuva talteen
                    Colour(x,y,0,1) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,1) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,1) = ((pixel Shl (3*8)) Shr 24) 
                Next y
            Next x
            Unlock()
            DrawToScreen
        Else
            MakeError "Kuva menee ruudun yli, pienennä kuvaa!"
        EndIf
    EndFunction
    
    
    //luodaan kuva
    Function OpacityImage(pic,op#)
        op = 1-op
        picW = ImageWidth(pic)-1
        picH = ImageHeight(pic)-1
        newPic = MakeImage(picW+1,picH+1)
        DrawToImage newPic
        Lock()
        For x = 2 To picW
            For y=2 To picH
                R = Colour(x,y,0,1)
                G = Colour(x,y,1,1)
                B = Colour(x,y,2,1)
                ColorR = R+(Colour(x,y,0,0) -R)*op //yhdistetään värit
                ColorG = G+(Colour(x,y,1,0) -G)*op
                ColorB = B+(Colour(x,y,2,0) -B)*op
                PutPixel2 x,y, (ColorB + ColorR Shl 16 + ColorG Shl 8) //pistettään se kasaan
            Next y
        Next x
        Unlock()
        DrawToScreen
        Return newPic
    EndFunction



    ///////////////////////////////////////////////Esimerkki////////////////////////////////////////////////////////////////////
    
    SCREEN 500,400
    ClsColor 255,255,255
  
    CenterText 250,200, "lataa..", 2
    DrawScreen  
    
    //Luodaan kuva, jonka läpinäkyvyys muutetaan
    map = MakeImage(497,397)
    //map = LoadImage("media/map.bmp")
    DrawToImage map
        Color 0,0,1 //luodaan taustalle palikoita
        Box 0,0, 500, 400, 1
    DrawToScreen
    
    //Luodaan tausta
    Tausta = MakeImage(500,400)
    DrawToImage Tausta
        Color 255,0,0 //luodaan taustalle palikoita
        Box 10,10, 60, 60, 1
        Color 0,0,255
        Box 100,100,400,46, 1
        Color 0,255,0
        Box 100,100,20,300, 1
    DrawToScreen
    DrawImage Tausta,0,0
    //laskee kuvan tämän hetkisen ruudun mukaan
    ExploreImage(map,0,0) //tutkitaan kuva
    
    
    Tarkkuus = 15 //kuvien määrä
    Dim kuva(Tarkkuus)
    Color 0,0,0
    
    //talletetaan lasketut kuvat
    For i=0 To Tarkkuus
        kuva(i) = OpacityImage(map,b#) //luodaan kuvat
        b# = b# + (1.0/Tarkkuus)
        CenterText 250,200, "lataa... " + (i*(100/Tarkkuus)) + "%",  2
        DrawScreen
    Next i
    
    
    a = Tarkkuus*6

    Repeat
              
        DrawImage Tausta, 0,0
        a = Min(Max(a+(KeyDown(200)-KeyDown(208)),0),Tarkkuus*6)
        DrawImage kuva(a/6), 1,1
        Text 0,0, "FPS:" + FPS()
        DrawScreen
        
    Forever
Locked