Jäälleen toinen MAV ongelma

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
Ville
Newcomer
Posts: 5
Joined: Tue Dec 10, 2013 10:40 pm

Jäälleen toinen MAV ongelma

Post by Ville »

Eli hei,
olen tässä harjoitellut coolbasicciä ja kirjoitin tälläisen pelin:

Code: Select all

SCREEN 1024,600,0,2
tr=LoadObject("data\tr.png")
ttr=LoadObject("data\tr.png")
ShowObject ttr,OFF
tl=LoadObject("data\tl.png")
ShowObject tl,OFF
an=LoadAnimObject("data\an.png",100,100,0,2)
ShowObject an,OFF
ann=LoadAnimObject("data\ann.png",100,100,0,2)
ShowObject ann,OFF
trr=LoadObject("data\trr.png")
ShowObject trr,OFF
bg=LoadImage("data\bg.png")
FrameLimit 60
sl=LoadObject("data\sl.png",36)
gravity=1
og=LoadAnimObject("data\or.png",100,100,0,2)
tnr=LoadFont("times new roman",100)
oog=CloneObject(og)
SetFont tnr
Repeat
    oy=-160
    ox=560
    ooy=-160
    oox=-560
    lvl=1
    x=0
    y=0
    ShowObject sl,OFF
    hit=0
    y1=15
    y2=0
    
    Repeat
        score=lvl-1
        Text 10,10,score
        
        TurnObject sl,-10
        PositionObject tr,x,y
        PositionObject sl,sx,sy
        PositionObject og,ox,oy
        PositionObject oog,oox,ooy
        
        PlayObject og,0,1,0.1,ON
        PlayObject oog,0,1,0.1,ON
        
        If hit=0 Then
            sx=x
            sy=y
            ShowObject sl,OFF
        EndIf
        
        DrawImage bg,0,500
        
        If KeyDown(cbkeyright) Then x=x+5
        If KeyDown(cbkeyleft) Then x=x-5
        
        If x>512 Then x=512
        If x<-512 Then x=-512
        
        If jjump=<2 And KeyHit(cbkeyup) Then
            jump=1
            jjump=jjump+1
        EndIf
        
        If jump=1 Then
            gravity=0
            If c<15 Then
                y=y+y1
                c=c+1
                y1=y1-1
            EndIf
            If c=15 Then PaintObject tr,ttr
            If c=15 Then jump=0
            If c=15 Then gravity=1
            If c=15 Then y1=15
            If c=15 Then c=0
        EndIf
        
        If y=<-160 Then y=-160
        If y=-160 Then
            jjump=0
            y2=0
        EndIf    
        
        If y>-160 And gravity=1 Then
            y=y-y2
            y2=y2+1
        EndIf
        
        If KeyDown(cbkeyright) Then PaintObject tr,an
        If KeyDown(cbkeyleft) Then PaintObject tr,ann
        If jjump=<2 and KeyHit(cbkeyup) Then PaintObject tr,trr
        
        If KeyUp(cbkeyright) Then PaintObject tr,ttr
        If KeyUp(cbkeyleft) Then PaintObject tr,tl
        
        If KeyDown(cbkeyright) Then PlayObject tr,0,1,0.1,ON
        If KeyDown(cbkeyleft) Then PlayObject tr,0,1,0.1,ON
        
        If KeyDown(cbkeyright) Then orientation=0
        If KeyDown(cbkeyleft) Then orientation=1
        If KeyHit(cbkeyup) Then orientation=2
        
        
        If KeyDown(cbkeyspace) And hit=0 And orientation=0 Then
            hit=1
        EndIf
        If KeyDown(cbkeyspace) And hit=0 And orientation=1 Then
            hit=2
        EndIf
        If KeyDown(cbkeyspace) And hit=0 And orientation=2 Then
            hit=3
        EndIf
        
        If hit=1 Then
            ShowObject sl,ON
            If sx<512 Then
                sx=sx+10
            EndIf
            If sx=>512 Then
                ShowObject sl,OFF
                hit=0
            EndIf
            
        EndIf
        
        If hit=2 Then
            ShowObject sl,ON
            If sx>-512 Then
                sx=sx-10
            EndIf
            If sx=<-512 Then
                ShowObject sl,OFF
                hit=0
            EndIf
            
        EndIf
        
        If hit=3 Then
            ShowObject sl,ON
            If sy>-300 Then
                sy=sy-10
            EndIf
            If sy=<-300 Then
                ShowObject sl,OFF
                hit=0
            EndIf
            
        EndIf
        
        If x<ox Then ox=ox-lvl
        If x>ox Then ox=ox+lvl
        If score=>10 Then
            If x>oox Then oox=oox+lvl
            If x<oox Then oox=oox-lvl
        EndIf
        
        If ox=<x+50 And ox>x-50 And y-50=<oy Then Exit
        
        If ox=<sx+50 And ox>sx-50 And sy-50=<oy Then
            ox=560
            hit=0
            lvl=lvl+1
        EndIf
        
        If lvl=>10
            If oox=<x+50 And oox>x-50 And y-50=<ooy Then Exit
            
            If oox=<sx+50 And oox>sx-50 And sy-50=<ooy Then
                oox=-560
                hit=0
                lvl=lvl+1
            EndIf
        EndIf
        
        DrawScreen
        
    Forever
    
    Text 200,10,"You're dead!"
    DrawScreen
    Wait 1000
    WaitKey
Forever

End
juu on muute vähä pitkä...
mut ongelma siis on että kun kirjoitin tämän läppärilläni niin suoriutui ilman mitään ongelmia, mutta kun kopioin koodin pöytäkoneelleni (ja luonnollisesti kopioin myös kaikki kuvatiedostot) ja yritän suorittaa sovellusta niin se pyörii jonkin aikaa sujuvasti mutta heittää sitten puskista MAVin...
EDIT:

Täältä http://sdrv.ms/1f6CLL1 löytyy kaikki sourcet ja kuvat helpottamaan vian etsintää. Linkissä oleva koodi on tosin paljon erilainen kun yllä laittamani.

Last edited by Ville on Wed Dec 11, 2013 4:54 pm, edited 2 times in total.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Jäälleen toinen MAV ongelma

Post by Latexi95 »

Kun sivulle nuolen nostaa ylös käytät PaintObjectia ja maalaat takaisin pysäytetyn kuvan. KeyDown kuitenkin palauttaa 1 samaan aikaan kun KeyUp palauttaa 1, joten PaitObjectin jälkeen koitat vielä animoida sitä PlayObjectilla. Pysäytetty versio kuitenkaan ei ole animoitava ja siitä syystä tulee MAV. Jos siirrät KeyUp-iffit KeyDown iffien taakse ongelmaa ei tule, koska PaintObjectia kutsutaan vasta PlayObjectin jälkeen. Sitten tuo If KeyDown(...) The PaintObject tr, an ja sitä seuraava rivi kannattaa vaihtaa käyttämään KeyHit funktiota koska tuo syöritettaan nyt joka loopin kierroksella mikä ei ole tarpeellista.
Vastaisuudessa suosittelen lähettämään testikoodit sellaisessa muodossa että ne voi suoraan ajaa vain kopioimalla ne editoriin eli kannattaa koodia lähettäessä vaihtaa kuvat CB:n mukana tuleviin oletusgrafiikoihin. (Esim "Media/guy.bmp" tai "Media\zerorun1.bmp") Silloin muiden on helppompaa tarttua ongelmaan, kun ei tarvitse ensin vaihtaa medioiden polkuja.
Tyhmät kysymykset on (nimestään huolimatta) useinmiten paras paikka yksinkertaisten ongelmien ratkaisun hakemiseen, eikä yksittäisen ongelman takia ole pakko luoda uutta viestiketjua. :)

Tervetuloa foorumeille.
User avatar
Ville
Newcomer
Posts: 5
Joined: Tue Dec 10, 2013 10:40 pm

Re: Jäälleen toinen MAV ongelma

Post by Ville »

tein mainitsemasi muutokset mutta MAV jatkaa esiin hyppimistään.... ja nyt jos esim. juoksee oikealle ja vaihtaakin suunnan mutta sattuu painamaan molempia nuolinäppäimiä samaan aikaan niin ukko jää paikallaanolo asentoon.
tein uuden ketjun koska ajattelin että ongelma olisi hankalampi (niin kuin se näyttää vieläkin olevan...) ja koodin jätin muokkaamatta muille sopivaksi sillä ajattelin sen olevan epäolennainen ratkaisun kannalta vaan että vika olisi jossain muualla koska sama koodi toimii toisella koneella ja toisella koneella ei.
Post Reply