Lagi

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Lagi

Post by Art »

Miksi pelini rupeaa lagittamaan ? En itse löytänyt virhettä :<
Pelini löytyy alla olevasta linkistä.
¤ Art
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Lagi

Post by Latexi95 »

En suoraan löytänyt virhettä, mikä olisi aiheuttanut hidastumista. Koodia oli kuitenkin aika hankala lukea hyvin erikoisen ja epäsäännöllisen sisennyksen takia ja viholliset olisi ehdottomasti kannattanut toteuttaa tyyppien avulla. FrameLimit oli niin suuri, että sillä ei ole mitään merkitystä. DrawGamea on vähän turhankin monessa paikassa ja oudoissa paikoissa. Järjestys kuuluisi olla UpdateGame, DrawGame, DrawScreen. Jos aikaisempaa ei ole suoritettu sitten viime DrawScreenin niin jälkimmäinen suorittaa sen.
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Lagi

Post by MrMonday »

En varmaksi osaa sanoa, mutta ehkä tuo huomattava määrä törmäystarkistuksia aiheuttaa moista.. Käsittääkseni ObjectsOverlap()-funktio on kohtalaisen raskas cb:lle?
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Re: Lagi

Post by Art »

Se toimi aivan normaalisti vielä tänään, en tiedä minkä lisäyksen tein koodiin ja alkoi lagittamaan :o
Latexi95 wrote:En suoraan löytänyt virhettä, mikä olisi aiheuttanut hidastumista. Koodia oli kuitenkin aika hankala lukea hyvin erikoisen ja epäsäännöllisen sisennyksen takia ja viholliset olisi ehdottomasti kannattanut toteuttaa tyyppien avulla. FrameLimit oli niin suuri, että sillä ei ole mitään merkitystä. DrawGamea on vähän turhankin monessa paikassa ja oudoissa paikoissa. Järjestys kuuluisi olla UpdateGame, DrawGame, DrawScreen. Jos aikaisempaa ei ole suoritettu sitten viime DrawScreenin niin jälkimmäinen suorittaa sen.
En ole käsittänyt tyyppejä, vaikka olen lukenut hyvin monta opetusta, selityksiä yms.. Se harmittaa minua. Niitä en ole oppinut.
¤ Art
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Lagi

Post by MrMonday »

Art wrote:En ole käsittänyt tyyppejä, vaikka olen lukenut hyvin monta opetusta, selityksiä yms.. Se harmittaa minua. Niitä en ole oppinut.
Tyypit on aluksi todella vaikeita, itselläkin meni todella kauan, ennen ko tajusin niiden idean, mutta sitten ko ne oppii, niin niistä on todella paljon hyötyä :)

Kirjoitin pienen esimerkin, jos sen toiminta auttaisi yhtään selkiyttämään asiaa. Asiavirheitä saattaa löytyä, joten kokeneemmat minua korjatkoon :)

Code: Select all

guy_obj = LoadObject("media/guy.bmp",72) // Ladataan objekti.
ShowObject guy_obj, OFF // Piilotetaan objekti.

Type PLAYER     // Luodaan kokoelma nimeltään 'PLAYER'.
    Field obj   // Ja kokoelmaan muuttuja 'obj', johon tallennetaan myöhemmin luotavan jäsenen objekti.
    Field healt // Ja toinen muuttuja 'healt', johon tallenetaan energiat.
EndType

    create_new_player:  // Kirjanmerkki, tänne hypätään myöhemmin.

    guy.PLAYER = New(PLAYER) // Tässä luodaan uusi JÄSEN, johon päästään käsiksi 'guy'-muuttujan kautta.
    
    guy\obj   = CloneObject(guy_obj) // Tässä tallenetaan vastaluodun jäsenen 'obj'-muuttujaan alussa ladatun 'guy_obj'-objektin kopio.
    guy\healt = Rand(500,1000) // Ja täällä vielä asetetaan jäsenen 'healt'-muuttujaan arvo väliltä 500-1000 satunnaisesti arpoen.
    
Repeat // Aloitetaan pääsilmukka.

    // Seuraavaksi hoidetaan objektin liikuttaminen, eli ihan perusasioita.
    // Huomion arvoinen seikka on kuitenkin, että emme liikuta ladattua 'guy_obj'-objektia, vaan nimenomaan jäsenmuuttujaan tallennettua kopiota.

    If KeyDown(200) Then MoveObject guy\obj, 1
    If KeyDown(208) Then MoveObject guy\obj,-1
    If KeyDown(203) Then TurnObject guy\obj, 1
    If KeyDown(205) Then TurnObject guy\obj,-1
    
    // Näytetään energian määrä yläkulmassa.
    
    Text 0,0,"Healt: "+guy\healt
    
    Box 50,50,300,200,0 // Piirretään tavallinen laatikko, tähän ei siis liity mitään ihmeellistä.
    
    // Tässä tehdään tarkistus, onko 'guy\obj'-objekti määrättyjen rajojen ulkopuolella, ja jos on, niin vähennetään muuttujasta 'guy\healt' yksi, ja tämä tarkistus siis jokaisella silmukan pyörähdyksellä.
    If ObjectX(guy\obj) < -150 Or ObjectX(guy\obj) > 150 Or ObjectY(guy\obj) < -100 Or ObjectY(guy\obj) > 100 Then guy\healt = guy\healt - 1
    
    // Ja mikäli muuttujan 'guy\healt' arvo on 0 tai alle 0, niin poistetaan jäseneen sidottu media,
    // eli 'guy\obj'-objekti (rivillä 38) ja sen jälkeen poistetaan itse jäsen (rivillä 39) 
    // ja hypätään ohjelmassa kohtaan 'create_new_player', jonka jälkeen siis luodaan taas uusi jäsen.
    
    If guy\healt =< 0 Then
        DeleteObject guy\obj
        Delete guy
        Goto create_new_player
    EndIf
    
    DrawScreen // Piirretään ruutu.
    
// Lopuksi poistutaan silmukasta, mikäli painetaan ESC-näppäintä. 
// (CB tekee niin muutenkin, jos SAFEEXIT-toiminto on päällä, oletuksena on.)    
    
Until KeyHit(1)
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Re: Lagi

Post by Art »

MrMonday wrote:
Art wrote:En ole käsittänyt tyyppejä, vaikka olen lukenut hyvin monta opetusta, selityksiä yms.. Se harmittaa minua. Niitä en ole oppinut.
Tyypit on aluksi todella vaikeita, itselläkin meni todella kauan, ennen ko tajusin niiden idean, mutta sitten ko ne oppii, niin niistä on todella paljon hyötyä :)

Kirjoitin pienen esimerkin, jos sen toiminta auttaisi yhtään selkiyttämään asiaa. Asiavirheitä saattaa löytyä, joten kokeneemmat minua korjatkoon :)

Code: Select all

guy_obj = LoadObject("media/guy.bmp",72) // Ladataan objekti.
ShowObject guy_obj, OFF // Piilotetaan objekti.

Type PLAYER     // Luodaan kokoelma nimeltään 'PLAYER'.
    Field obj   // Ja kokoelmaan muuttuja 'obj', johon tallennetaan myöhemmin luotavan jäsenen objekti.
    Field healt // Ja toinen muuttuja 'healt', johon tallenetaan energiat.
EndType

    create_new_player:  // Kirjanmerkki, tänne hypätään myöhemmin.

    guy.PLAYER = New(PLAYER) // Tässä luodaan uusi JÄSEN, johon päästään käsiksi 'guy'-muuttujan kautta.
    
    guy\obj   = CloneObject(guy_obj) // Tässä tallenetaan vastaluodun jäsenen 'obj'-muuttujaan alussa ladatun 'guy_obj'-objektin kopio.
    guy\healt = Rand(500,1000) // Ja täällä vielä asetetaan jäsenen 'healt'-muuttujaan arvo väliltä 500-1000 satunnaisesti arpoen.
    
Repeat // Aloitetaan pääsilmukka.

    // Seuraavaksi hoidetaan objektin liikuttaminen, eli ihan perusasioita.
    // Huomion arvoinen seikka on kuitenkin, että emme liikuta ladattua 'guy_obj'-objektia, vaan nimenomaan jäsenmuuttujaan tallennettua kopiota.

    If KeyDown(200) Then MoveObject guy\obj, 1
    If KeyDown(208) Then MoveObject guy\obj,-1
    If KeyDown(203) Then TurnObject guy\obj, 1
    If KeyDown(205) Then TurnObject guy\obj,-1
    
    // Näytetään energian määrä yläkulmassa.
    
    Text 0,0,"Healt: "+guy\healt
    
    Box 50,50,300,200,0 // Piirretään tavallinen laatikko, tähän ei siis liity mitään ihmeellistä.
    
    // Tässä tehdään tarkistus, onko 'guy\obj'-objekti määrättyjen rajojen ulkopuolella, ja jos on, niin vähennetään muuttujasta 'guy\healt' yksi, ja tämä tarkistus siis jokaisella silmukan pyörähdyksellä.
    If ObjectX(guy\obj) < -150 Or ObjectX(guy\obj) > 150 Or ObjectY(guy\obj) < -100 Or ObjectY(guy\obj) > 100 Then guy\healt = guy\healt - 1
    
    // Ja mikäli muuttujan 'guy\healt' arvo on 0 tai alle 0, niin poistetaan jäseneen sidottu media,
    // eli 'guy\obj'-objekti (rivillä 38) ja sen jälkeen poistetaan itse jäsen (rivillä 39) 
    // ja hypätään ohjelmassa kohtaan 'create_new_player', jonka jälkeen siis luodaan taas uusi jäsen.
    
    If guy\healt =< 0 Then
        DeleteObject guy\obj
        Delete guy
        Goto create_new_player
    EndIf
    
    DrawScreen // Piirretään ruutu.
    
// Lopuksi poistutaan silmukasta, mikäli painetaan ESC-näppäintä. 
// (CB tekee niin muutenkin, jos SAFEEXIT-toiminto on päällä, oletuksena on.)    
    
Until KeyHit(1)
Kiitos, tuo auttoi minua tajuamaan jo hieman tyypeistä. Nyt vaan testailemaan niin opin sen varmaan muutamassa päivässä. :3

Edit:Tajusinkin jo koko homman. Kiitos !! En tiedä miten voin sinua kylliksi kiittää :)

Edit: Ongelma ratkaistu ! Ottakaa alusta framelimit ja screen pois ja pastetkaa "SCREEN 1260,960" toi siihen..

Edit: Kokeilkaahan nyt, peli ei lagita yhtään ja muutan kaikki typellä huomenna, nyt muutin vain viholliset :)
Last edited by Art on Thu Nov 29, 2012 11:19 am, edited 1 time in total.
¤ Art
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Lagi

Post by MrMonday »

Hieno kuulla että saatoin olla avuksi :) Mahdollisesti muutkin hyötyvät tuosta esimerkistä, vaikka voisin sitä kyllä vielä hieman parannella, eli selkeyttää :)
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Re: Lagi

Post by Art »

MrMonday wrote:Hieno kuulla että saatoin olla avuksi :) Mahdollisesti muutkin hyötyvät tuosta esimerkistä, vaikka voisin sitä kyllä vielä hieman parannella, eli selkeyttää :)
Selostukset ja koodi oli hyvää, myös vain yhden objektin kloonaaminen ja type hommeli selkeytti asiaa. Nyt aijon toteuttaa todella paljon typeä, koska ennen en ollut sitä tajunnut.
Voi laittaa lukkoon. (mikäli näillä foorumeilla se on tapana :/ )
¤ Art
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Lagi

Post by MrMonday »

Art wrote:
MrMonday wrote:Hieno kuulla että saatoin olla avuksi :) Mahdollisesti muutkin hyötyvät tuosta esimerkistä, vaikka voisin sitä kyllä vielä hieman parannella, eli selkeyttää :)
Selostukset ja koodi oli hyvää, myös vain yhden objektin kloonaaminen ja type hommeli selkeytti asiaa. Nyt aijon toteuttaa todella paljon typeä, koska ennen en ollut sitä tajunnut.
Voi laittaa lukkoon. (mikäli näillä foorumeilla se on tapana :/ )
Seuraavaksi kannattaa tutustua ezben kirjoittamaan type-tutoriaaliin, kunhan ensin sisäistät typet kunnolla, se on todella pätevä opastus :) Ja ideahan typeissä on, että saat vaikka sata vihollista tehtyä todella vähällä koodilla:

Code: Select all

For i = 0 To 99
    // Luo uusi jäsen tässä.
Next i
EDIT:

Ja silti jokaisella jäsenellä on omat muuttujat, vaikka ne saman nimisiä onkin :) Kokeile vaikka For-silmukassa luodessasi asettaa guy\healt = i

Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Re: Lagi

Post by Art »

MrMonday wrote:
Art wrote:
MrMonday wrote:Hieno kuulla että saatoin olla avuksi :) Mahdollisesti muutkin hyötyvät tuosta esimerkistä, vaikka voisin sitä kyllä vielä hieman parannella, eli selkeyttää :)
Selostukset ja koodi oli hyvää, myös vain yhden objektin kloonaaminen ja type hommeli selkeytti asiaa. Nyt aijon toteuttaa todella paljon typeä, koska ennen en ollut sitä tajunnut.
Voi laittaa lukkoon. (mikäli näillä foorumeilla se on tapana :/ )
Seuraavaksi kannattaa tutustua ezben kirjoittamaan type-tutoriaaliin, kunhan ensin sisäistät typet kunnolla, se on todella pätevä opastus :) Ja ideahan typeissä on, että saat vaikka sata vihollista tehtyä todella vähällä koodilla:

Code: Select all

For i = 0 To 99
    // Luo uusi jäsen tässä.
Next i
EDIT:

Ja silti jokaisella jäsenellä on omat muuttujat, vaikka ne saman nimisiä onkin :) Kokeile vaikka For-silmukassa luodessasi asettaa guy\healt = i

Mistähän tähän tutoriaaliin pääsee ?
¤ Art
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Lagi

Post by Latexi95 »

Ezben tyyppitutoriaali löytyy "Esimerkit ja tutorialit" alueen yläreunaan liimattuna: viewtopic.php?f=12&t=1618
Post Reply