"Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

"Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Post by otto90x »

Kokeilin ihan huvikseni tehdä parallax scroller pelin käyttäen pelin "piirtämiseen" pelkkää text komentoa. Nyt se kuitenkin Mavittaa ja en näe missä on vika. Osaisiko/haluaisiko joku auttaa?

Code: Select all

SCREEN 800,600

Type alus
    Field suunta 
    Field x
    Field y
    Field kuva$
    Field aseet$
    Field hp
    Field leveys
    Field reload
    Field xsuunta
End Type

Type ammus
    Field x
    Field y
    Field suunta
End Type

Type bonus
    Field x
    Field y
    Field malli
End Type

Type partikkeli
    Field x#
    Field y#
    Field vauhtix#
    Field vauhtiy#
    Field txt$
    Field kesto
    Field väri$
End Type


Global SW,SH

Sw=ScreenWidth()
sh=ScreenHeight()
    


Global aluksia, taso

Const kentänpituus = 1000

Const Tasokatto = 50

Const Maksimivihollismäärä = 130

DrawToWorld OFF,OFF,ON 

TASO=1




AddAlus(0,0,1,"0|4|A|64|64|64 -6|0|/|96|96|96 6|0|\|96|96|96 10|0|/|128|128|128 -10|0|\|128|128|128", "13|0|1 -13|0|1")

While Not Taso>Tasokatto

    For i=1 To 10+TASO*((Maksimivihollismäärä-10)/Tasokatto)
        AddAlus(Rand(-sw/2,sw/2),CameraY()+sh/2+Rand(kentänpituus*2),-1,"0|0|V|128|128|128 6|0|/|96|96|96 -6|0|\|96|96|96","0|0|1")
    Next i

    Paikka=CameraY()+200

    While Not aluksia=1
        
        
        
        UpdateAlukset()
        UpdateAmmukset()
        UpdatePartikkelit()


        If CameraY()-300<paikka Then   
        
            If Not Taso Mod 5 Then Color 0,255,0 Else Color cbwhite

            Text -50,Paikka,"LEVEL "+TASO
        
        EndIf
        
        '
        
        DrawToWorld OFF,OFF,OFF
        
        Color cbwhite
        Text 0,0,aluksia+" "+FPS()
        
        DrawToWorld OFF,OFF,ON 

        DrawScreen
    
    Wend
      
    TASO+1
    
Wend



Function UpdateAlukset()

    For a.alus=Each alus
    
        For i=1 To CountWords(a\kuva)

            x=GetWord(GetWord(a\kuva,i),1,"|") 
            y=GetWord(GetWord(a\kuva,i),2,"|") 
            txt$=GetWord(GetWord(a\kuva,i),3,"|") 
            
            
            r=GetWord(GetWord(a\kuva,i),4,"|") 
            g=GetWord(GetWord(a\kuva,i),5,"|") 
            b=GetWord(GetWord(a\kuva,i),6,"|") 
            
            Color r,g,b

            Text Int(a\x+x),Int(a\y+y),txt
            
        Next i
        

    
        If a\suunta=1 Then 
        
            a\x=a\x+(RightKey()-LeftKey())*3
            a\y=a\y+a\suunta+((UpKey()-DownKey()))
            
            If Rand(3)=1 Then AddPartikkeli(a\x,a\y+3,".",100+Rand(200),Rnd(-0.5,0.5),0,"255,"+Str(Rand(200,128))+",0")
            
            If KeyDown(157) And a\reload=0 Then 
               a\reload=Shoot(a\x,a\y,a\suunta,a\reload,a\aseet)
            EndIf
            
            PositionCamera 0,a\y+200 
            
        Else
        
            If a\xsuunta=0 Then a\xsuunta=Rand(1,-1)
            
            a\x=a\x+a\xsuunta
            
            If Rand(200)=1 And a\xsuunta Then a\xsuunta=a\xsuunta*-1
            
            If Rand(3)=1 Then AddPartikkeli(a\x,a\y+8,".",100+Rand(200),Rnd(-0.5,0.5),0,"255,"+Str(Rand(200,128))+",0")
            
            a\y=a\y+a\suunta
            
            If a\reload=0 And Rand(10)=1 And a\y<CameraY()+sh/2+50 Then 
                a\reload=Shoot(a\x,a\y,a\suunta,a\reload,a\aseet)
            EndIf
            
        EndIf
        
        If a\reload>0 Then  a\reload=a\reload-1
        
        If a\hp<=0 Then
        
            For y=1 To 50
            
                AddPartikkeli(a\x+Rand(-2,2),a\y+Rand(-2,2),".",300+Rand(300),Rnd(-1.5,1.5),Rnd(-1.5,1.5),"255,"+Str(Rand(200,128))+",0")
                
            Next y
        
        
            Delete a
            aluksia-1
        ElseIf  a\y<CameraY()-sh/2-50
            Delete a
            aluksia-1
        EndIf
    
    Next a
    
End Function 


Function Shoot(_x,_y,_suunta,reload,_aseet$)

    For f=1 To Int(CountWords(_aseet$," "))
    
        txt$=GetWord(_aseet$,f)
    
        x=GetWord(txt$,1,"|") 
        y=GetWord(txt$,2,"|") 
        tyyppi=GetWord(txt$,3,"|") 
        
        Select tyyppi
        
            Case 1
                AddAmmus(_x+x,_y+y,_suunta)
                reload=25
                
        End Select 
    
    Next f
    
    Return reload
    
End Function 




Function AddAlus(_x,_y,_suunta,_kuva$,_aseet$)

    a.alus=New(alus)
    a\x=_x
    a\y=_y
    a\suunta=_suunta
    a\kuva=_kuva$
    a\aseet=_aseet$
    
    minx=0
    maxx=0
    
    For i=1 To CountWords(a\kuva)

        x=GetWord(GetWord(a\kuva,i),1,"|") 
        
        If x>maxx Then maxx=x
        If x<minx Then minx=x

    Next i
    
    a\leveys=(maxx-minx)
    
    a\hp=3

    aluksia+1

End Function 

Function AddPartikkeli(_x#,_y#,_txt$,_aika,_vx#,_vy#,_väri$)

    a.partikkeli=New(partikkeli)
    a\x=_x#
    a\y=_y#
    a\txt=_txt$
    a\vauhtix=_vx#
    a\vauhtiy=_vy#
    a\kesto=Timer()+_aika
    a\väri=_väri$
    
    
End Function

Function UpdatePartikkelit()

    For p.partikkeli = Each partikkeli
    
        p\x=p\x+p\vauhtix
        p\y=p\y+p\vauhtiy
        
        Color int(GetWord(p\väri,1,",")),int(GetWord(p\väri,2,",")),int(GetWord(p\väri,3,","))
        
        Text p\x,p\y,p\txt
        
        If p\kesto<Timer() Then Delete p
    
    Next p

End Function 


Function AddAmmus(_x,_y,_suunta)

    a.ammus=New(ammus)
    a\x=_x
    a\y=_y
    a\suunta=_suunta

End Function

Function UpdateAmmukset()

    poisto=0

    For a.ammus=Each ammus
    
        If a\suunta=1 Then Color 0,255,0 Else Color 255,0,0
    
        Text a\x,a\y,"|"
    
        a\y=a\y+a\suunta*5
       
        For b.alus=Each alus
        
            If b\suunta=1 Then 
                If Distance(a\x,a\y,b\x,b\y)>800 Then poisto=1
            EndIf
            
            If b\suunta<>a\suunta Then 
                If Distance(a\x,a\y,b\x,b\y)<10 Then 
                    b\hp-1
                    
                    If b\x<a\x Then 
                        kerroin=1
                    Else
                        kerroin=-1
                    EndIf
                    
                    For y=1 To 3
                        AddPartikkeli(b\x+Rand(-2,2),b\y+Rand(-2,2),".",500,Rnd(1,2)*kerroin,a\suunta,"255,196,0")
                    Next y
                    
                    poisto=1
                EndIf
            EndIf
            
            If poisto Then Goto poistetaan
                
        Next b
        
        If poisto Then 
        
            poistetaan:
            Delete a
            poisto=0
        EndIf
        
    Next a


End Function 
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: "Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Post by Jonez »

Itse saan mavin poistumaan estämällä pääsyn AddPartikkelit()- tai UpdatePartikkelit()-funktioon. Itse mavin syy on vielä epäselvä, koska näyttäisi siltä että käsittelet niitä ainoastaan UpdatePartikkelit()-funkkarissa, enkä vielä ole löytänyt mitään vikaa sieltä.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: "Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Post by Valtzu »

En oikein osaa auttaa, kun itse en mavia saanut aikaiseksi. Missä kohtaa sen pitäisi tulla?

EDIT: Pelasin jotain minuutin verran, sitten iski mav. Katsotaampas...
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: "Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Post by koodaaja »

Minäkään en MAVia saanut, joskin ohjelma lakkasi vastaamasta reilun minuutin jälkeen. Se vain jäätyi yhtäkkiä.
User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Re: "Satunnaisia" MAVeja merkkipohjaisessa parallax scrollerissa

Post by elmo123 »

Jos jossain kohtaa ohjelmaa tulee MAV, eikä sitä kohtaa löydä, kannattaa käyttää apuna esim.SetWindow-komentoa.
Esim.

Code: Select all

SetWindow "Teksti 1"
Text 0,0,"Vitsin,tää peli jummas viideks sekunniks"
DrawScreen
Wait 5000
SetWindow "Teksti 2"
Text 0,0,"Ohoh, nyt se lähti taas pyörimään :o"
DrawScreen
Wait 5000
SetWindow "Piirrä Kuva 1"
DrawImage juttu,46,26
DrawScreen
Wait 2000
Yllä olevassa esimerkissä MAV iskee heti SetWindowin jälkeen, joten kun MAV yllättää, katso ikkunan otsikkoa, ja virhepaikka löytyy helposti :D
EDIT:

Vau,mahtava peli, mutta ensin se hyytyi ja n. 15 sekuntia ja sit vast tuli MAV

Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!
Post Reply