Tyhmät kysymykset (I/2012)
Re: Tyhmät kysymykset (I/2011)
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.
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.
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Eli CB:n manuaalissa on virhe, .Png - tiedostopääte käy myös, ei virheellisesti vain .BMP.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.
Tuosta pitäisi kertoa Zerolle, että korjaavat CBC:n manuaaliin oikean tiedon
Re: Tyhmät kysymykset (I/2011)
Se ei ole virhe. On virhe tallentaa BMP tiedosto .png pääteiseen tiedostoon. Se onnistuu, mutta ei ole suositeltavaa.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
Re: Tyhmät kysymykset (I/2011)
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ä.
Päätteet on sitä varten, että tiedoston nimestä voisi esittää edes jonkinlaista arvausta sen sisällöstä.
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottunaLatexi95 wrote:Se ei ole virhe. On virhe tallentaa BMP tiedosto .png pääteiseen tiedostoon. Se onnistuu, mutta ei ole suositeltavaa.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
Uutta kysymystä heti kehiin: Voiko latexi tuolla sinun Savesettings & Parsesettings:sillä käsitellä muita kuin .INI - tiedostopäätteitä? Entä voiko arvoksi tallentaa merkkijonon?
Re: Tyhmät kysymykset (I/2011)
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ä.Konstaduck wrote: Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna
Re: Tyhmät kysymykset (I/2011)
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.Konstaduck wrote:Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna ?
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Tyhmät kysymykset (I/2011)
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.
Kuva selventämään.
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Tyhmät kysymykset (I/2011)
löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?esa94 wrote:On.
Kiitos
Re: Tyhmät kysymykset (I/2011)
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.aloittelijamies wrote:löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?esa94 wrote:On.
Kiitos
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Tyhmät kysymykset (I/2011)
ok, ei se mitään. Ei se pelintekeminen tähän kaadu.Chaosworm wrote: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.aloittelijamies wrote:löytyykö koodia, jota voisit laittaa ihmeteltäväksi tähän foorumille?esa94 wrote:On.
Kiitos
Re: Tyhmät kysymykset (I/2011)
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
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Tyhmät kysymykset (I/2011)
kiitos tästä
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
No tuolla logiikalla se on kyllä yksinkertaisintaaxu wrote: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.Konstaduck wrote:Voisi siihen manuaaliin kyllä laittaa, että .PNG sopii. Tuntuu vain nurinkuriselta aloittelijoihin katsottuna ?
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
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
Re: Tyhmät kysymykset (I/2011)
Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.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
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.
Re: Tyhmät kysymykset (I/2011)
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.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.
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
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
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.Latexi95 wrote:Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.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
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.
Re: Tyhmät kysymykset (I/2011)
Löysinpäs joskus tekemäni läpinäkyvyys efektin... joillakin heittää mav, joillakin ei. Teimpäs pienen häivtys esimerkin, joka ei ole realiaikainenKonstaduck wrote: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.Latexi95 wrote:Itse asiassa tuollainen kokoruutu tilassa toimiva "häivytys" komento löytyy ihan CB:stä itsestäänkin: ScreenGamma.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
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.
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