Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post by Harakka »

Goto-komentoa ei voi käyttää muuttujien kanssa. Laita Goto y$:n tilalle pelkkä Goto net niin pitäisi toimia.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Sepez
Newcomer
Posts: 2
Joined: Fri May 02, 2008 10:31 pm

Re: Tyhmät kysymykset

Post by Sepez »

Harakka wrote:Goto-komentoa ei voi käyttää muuttujien kanssa. Laita Goto y$:n tilalle pelkkä Goto net niin pitäisi toimia.
Eipä tahdo toimia vieläkään. Kun painan enteriä, mitään ei tapahdu.
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Tyhmät kysymykset

Post by tuhoojabotti »

kuinka saisin laskettua rgb arvot GetPixel komennosta? en keksiny...
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Tyhmät kysymykset

Post by Aavesoturi »

tuhoojabotti wrote:kuinka saisin laskettua rgb arvot GetPixel komennosta? en keksiny...
Aseta se piirtoväriksi Color 0,0,-GetPixelArvo ja käytä getRGB():tä
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post by Harakka »

Tämä saattaa olla nopeampi (käyttää getpixel2():sta projektissa, josta sen kopioin, mutta toiminee myös getpixel():illä).

Code: Select all

R = RoundDown(pix Shr 16)
gb = pix - R Shl 16
G = RoundDown(gb Shr 8)
B = gb - G Shl 8
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
KoviZZ

Re: Tyhmät kysymykset

Post by KoviZZ »

Mitä tehdä kun peli muuttuu liian raskaaksi? Eli fps laskee väkisin jonnekkin 20 paikkeille ja se pitäisi saada pysymään ainakin n. 35:ssä.
Pelissäni tällä hetkellä parikymmentä vihulaista ampuu toisiaan ja kun joku tuhoutuu niin soitetaan räjähdysefektiä ja kaikki tämä laskee fps:n n. 20:n.
Vaikka koodi onkin melko purkkaista niin ei kai senkään pitäisi aiheuttaa noin suurta fps:n putoamista näin vähillä objecteilla.
Olisiko siis mitään neuvoja tehdä pelistä vähemmän raskasta.
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Tyhmät kysymykset

Post by Aavesoturi »

KoviZZ wrote:Mitä tehdä kun peli muuttuu liian raskaaksi? Eli fps laskee väkisin jonnekkin 20 paikkeille ja se pitäisi saada pysymään ainakin n. 35:ssä.
Pelissäni tällä hetkellä parikymmentä vihulaista ampuu toisiaan ja kun joku tuhoutuu niin soitetaan räjähdysefektiä ja kaikki tämä laskee fps:n n. 20:n.
Vaikka koodi onkin melko purkkaista niin ei kai senkään pitäisi aiheuttaa noin suurta fps:n putoamista näin vähillä objecteilla.
Olisiko siis mitään neuvoja tehdä pelistä vähemmän raskasta.
Vaikea sanoa, kun ei tiedä miten oot hommat toteuttanu, mutta onko paljon pikselikomentoja? Ne hidastaa. Entäs paljon sisäkkäisiä luuppeja?
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez »

No en tässä rupea mitään romaania kirjoittamaan, mutta ratkaisu on yksinkertaisesti: optimointi.

Ohjemoidessa voi lähes kaikki asiat tehdä monella tapaa. Jotkut ovat parempia, jotkut huonompia, kaikkia ei voi verrata koska kokonaisuus ratkaisee. Yritä kuitenkin laskea silmukoiden määrää mahdollisimman paljon. Se on aika yleinen alottelijoiden virhe, että jotain tiettyä silmukkaa käytetään monta kertaa yhden framen aikana. Lähes aina riittää vain yksi silmukka esim. kaikille ammuksille tai ukkeleille.

Toinen optimointitapa on ottaa hieman raskaammat laskutoimitukset tai funktiokutsut ylös muuttujiin, jos niitä käytetään monta kertaa ja tiedetään ettei niiden arvo muutu.

Sellaista. Muitakin on, ohjelmointi on päättelyä. Päättele itse :)
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
wilizucoder
Member
Posts: 81
Joined: Sat Sep 08, 2007 11:24 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset

Post by wilizucoder »

Mul ois tällanen ongelma, et kun muutaman kerran ammus osuu vihuun, niin tulee MAV. Mistä johtuu?

Code: Select all

Type AMMUS
Field id
Field obj
End Type

Type VIHUT2
Field obj2 
End Type 

FrameLimit 60
SCREEN 800,600,16,cbzisable

tausta=MakeObjectFloor()
kuva=LoadImage("media\grass.bmp")
PaintObject tausta,kuva

oma=LoadObject("media\guy.bmp")
ShowObject oma,OFF
master=CloneObject(oma)
PositionObject master,-300,0
 
vihulainen=LoadObject("media\soldier.bmp",2)
ShowObject vihulainen,OFF  
vihulainen2=LoadAnimObject("media\cow.bmp",2)
ShowObject vihulainen2,OFF   

pati=LoadObject("media\bullet.bmp")
ShowObject pati,OFF  

elkku=100
vihukuoli=0 
pisteet=0
  
taustanopeus#=6 

ASE=0

Gosub kontrollit
Gosub aseet
Gosub vihuäly
Gosub törmäykset  
Gosub tekstit
 
Repeat 



kontrollit:

vauhti#=0
If UpKey() Then 
    vauhti=5
    MoveObject master,0,-vauhti
EndIf 
If DownKey() Then
    vauhti=5
    MoveObject master,0,vauhti
EndIf
If LeftKey() Then 
    vauhti=5
    MoveObject master,-vauhti,0
EndIf
If RightKey() Then
    vauhti=5
    MoveObject master,vauhti,0
EndIf
If KeyDown(17) Then
    vauhti=10
    MoveObject master,vauhti,0
ElseIf KeyDown(157) And RightKey() Then 
    vauhti=5
    MoveObject master,vauhti,0
Else 
    vauhti=0
    MoveObject master,vauhti,vauhti
EndIf 
 
If ObjectX(master)<-400 Then PositionObject master,-400,ObjectY(master)
If ObjectX(master)>400 Then PositionObject master,400,ObjectY(master)
If ObjectY(master)<-300 Then PositionObject master,ObjectX(master),-300
If ObjectY(master)>300 Then PositionObject master,ObjectX(master),300

Return



aseet:

If KeyHit(16) And ASE=0 Then 
    ASE=1
ElseIf KeyHit(16) And ASE=1 Then 
    ASE=2
ElseIf KeyHit(16) And ASE=2 Then 
    ASE=0
EndIf 

If KeyDown(cbkeyspace) And reload=0 Then 
    Select ASE
        Case 0
            luoti.AMMUS=New(AMMUS)
            luoti\id=0
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,13,0
            TurnObject luoti\obj,Rand(1,-1)
            reload=10
        Case 1
            luoti.AMMUS=New(AMMUS)
            luoti\id=1
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,10,-19
            TurnObject luoti\obj,Rand(1,-1)
            luoti.AMMUS=New(AMMUS)
            luoti\id=1
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,10,19
            TurnObject luoti\obj,Rand(1,-1)
            reload=6
        Case 2
            luoti.AMMUS=New(AMMUS)
            luoti\id=2
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,10,-19
            TurnObject luoti\obj,8
            luoti.AMMUS=New(AMMUS)
            luoti\id=2
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,10,19
            TurnObject luoti\obj,-8
            luoti.AMMUS=New(AMMUS)
            luoti\id=2
            luoti\obj=CloneObject(pati)
            CloneObjectPosition luoti\obj,master 
            MoveObject luoti\obj,13,0
            TurnObject luoti\obj,Rand(1,-1)
            reload=8
        EndSelect
    EndIf 

If reload>0 Then reload=reload-1

For luoti.AMMUS=Each AMMUS
    Select luoti\id
        Case 0
            MoveObject luoti\obj,15
            If Distance2(luoti\obj,master)>700 Then            
                DeleteObject luoti\obj 
                Delete luoti
            EndIf
        Case 1
            MoveObject luoti\obj,18
            If Distance2(luoti\obj,master)>700 Then            
                DeleteObject luoti\obj 
                Delete luoti
            EndIf
        Case 2
            MoveObject luoti\obj,18
            If Distance2(luoti\obj,master)>700 Then            
                DeleteObject luoti\obj 
                Delete luoti
            EndIf
        EndSelect
Next luoti

Return 



vihuäly:

MoveObject tausta,taustanopeus 

If Timer()>aika2+7000 Then  
    vihu2.VIHUT2 = New(VIHUT2)
    vihu2\obj2 = CloneObject(vihulainen2)
    RotateObject vihu2\obj2,180
    RotateObject vihu2\obj2,180
    PositionObject vihu2\obj2,500,100
    vihu2.VIHUT2 = New(VIHUT2)
    vihu2\obj2 = CloneObject(vihulainen2)
    RotateObject vihu2\obj2,180
    PositionObject vihu2\obj2,500,-100 
    aika2=Timer()
EndIf 
              
For vihu2.VIHUT2 = Each VIHUT2
        nopeus3#=Rand(0.5,1.0)
        MoveObject vihu2\obj2,nopeus3
        PaintObject vihu2\obj2,vihulainen2
        PlayObject vihu2\obj2,0,2,0.5
        If Distance2(vihu2\obj2,master)<200 Then 
            PointObject vihu2\obj2,master 
        Else 
            RotateObject vihu2\obj2,180
            MoveObject vihu2\obj2,nopeus3
        EndIf 
        If ObjectX(vihu2\obj2)<-500 Then 
            DeleteObject vihu2\obj2
            Delete vihu2
        EndIf 
Next vihu2

Return 



törmäykset:

For luoti.AMMUS=Each AMMUS
  For vihu2.VIHUT2=Each VIHUT2
        If ObjectsOverlap(luoti\obj,vihu2\obj2) Then
            vihukuoli+1
            DeleteObject luoti\obj
            Delete luoti
            DeleteObject vihu2\obj2
            Delete vihu2
        EndIf 
  Next vihu2
Next luoti

Return 



tekstit:

DrawGame 
Color cbyellow
Text 10,5,"FPS: "+FPS()
Text 10,25,"Energia: "+elkku
Text 10,45,"Tapot: "+vihukuoli
Text 10,65,"Pisteet: "+pisteet

Return 



DrawScreen 
Until KeyHit(1) 
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez »

Ongelma on tässä: (tosin niitä saattaa olla useampiakin)

Code: Select all

törmäykset:

For luoti.AMMUS=Each AMMUS
  For vihu2.VIHUT2=Each VIHUT2
        If ObjectsOverlap(luoti\obj,vihu2\obj2) Then
            vihukuoli+1
            DeleteObject luoti\obj
            Delete luoti
            DeleteObject vihu2\obj2
            Delete vihu2
        EndIf
  Next vihu2
Next luoti

Return
Tuhoat siis luodin (jos vihuun osuu), mutta silti teet törmäyksentarkistuksen seuraavan vihun kanssa samalla luodilla jota ei ole olemassakaan. Seuraa mav.

Ei todellakaan kannata tehdä niinkuin olet tehnyt, eli käydä ammuksia ja ukkeleita erikseen läpi vain liikuttaaksesi niitä ja tehdäksesi törmyäksentarkistuksia. Loppupeleissä peli hidastuu liikaa. Kannattaa tehdä kaikki yhdessä silmukassa. (Eli ammuksille yksi silmukka, ukoille yksi silmukka jne)
Last edited by Jonez on Thu May 15, 2008 12:35 pm, edited 1 time in total.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
wilizucoder
Member
Posts: 81
Joined: Sat Sep 08, 2007 11:24 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset

Post by wilizucoder »

Joo, kiitos paljon, oon vasta alottanu koodamisen ja yritän harjoitella tuota tyyppien käyttöä.
cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Tyhmät kysymykset

Post by cheeshelmet.jr »

kuinka piirtää kuvaan toinen kuva nopeasti läpinäkyvyydellä??
atomimalli
Moderator
Moderator
Posts: 227
Joined: Wed Aug 29, 2007 3:55 pm

Re: Tyhmät kysymykset

Post by atomimalli »

DrawToImagella ja DrawGhostImagella... Mikäli oikein muistan.
cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Tyhmät kysymykset

Post by cheeshelmet.jr »

itselläni tuo ghostimage ei ole toiminut
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post by Koodiapina »

cheeshelmet.jr wrote:itselläni tuo ghostimage ei ole toiminut
Kokeile kuvapiste komentoja. Eli luet vain kuvan pikseleiden värit ja sitten piirrät haluamiisi paikkoihin samat pikselit hieman erivärisenä. Eli voit esimerkiksi laskea miltä pikseli näyttäisi kun siihen sekoitetaan tietyn kuvan kohtaa tietyn kuvan kohtaan. Liiasta nopeudesta ei kannata edes haaveilla :D
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post by Harakka »

CBSDK:ssa on tätä varten jo valmiiksi funktio BlendImages(). Kannattaa kurkata.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: Tyhmät kysymykset

Post by Pate5 »

DrawGhostImage toimii, mutta siinä on pieni bugi, nimittäin se ei suostu piirtämään kuvaa koordinaatteihin 0,0. Kokeile laittaa 1,1, niin pitäisi toimia.
CoolBasic henkilökuntaa
Graafikko
cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Tyhmät kysymykset

Post by cheeshelmet.jr »

jaa jaa no kiitoksia tästä :D
AmatôôrOfCodinG

Re: Tyhmät kysymykset

Post by AmatôôrOfCodinG »

Erittäin tyhmä kysymys : Unohdin miten saan Curveanglella tehtyy pehmeän kääntymisen vihuille.Muistan kyllä täällä nähneeni esimerkin siitä,mutta en löytänyt enää :?
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez »

No CurveAnglen käyttötapahan löytyy manuaalista. Voit hiukan miettiä että miten sitä voi soveltaa ukon kääntymiseen.
Tein kuitenkin esimerkin jossa näytetään täsmälleen miten se tehdään:

Code: Select all

ukko = LoadObject( "media\guy.bmp", 72 )
pyöreys = 10

Repeat

    kulma# = GetAngle( ObjectX( ukko ), -ObjectY( ukko ), MouseWX(), -MouseWY() )
    RotateObject ukko, CurveAngle( kulma, ObjectAngle( ukko ), pyöreys )
    
    DrawScreen
Forever
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Locked