Surkea ongelma... Avun tarpeessa täällä.

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Terve.

Olen aloittelija koodaaja ja teen mun ekaa peliä (semmosta sotapeliä), mutta tuli ongelma vastaan. Mul ei ole ollu mitään muuta ongelmaa mitä en olisi saanut ratkaistua itse ilman tutorialeja ja omaa päätäni. Eli haluun että kun se luoti osuisi siihen toiseen pelaajaan nii se toinen pelaaja "kuolee" eli objekti häviää tai se menee aloituspaikkaan takaisin. Ongelma on kuitenkin se että joka kerta ku se luoti osuu siihen toiseen pelaajaan niin tulee sama vanha "Memory access violation."

Tässä olisi pätkä koodia:

Code: Select all

'Ammunta
Type AMPUMINEN
Field bullet
End Type

FrameLimit 40
DrawToWorld ON

'OBJEKTIT:

'Luoti
bullet = LoadObject ("bullet.png")
ShowObject bullet, OFF
ObjectOrder bullet, -1

'Pelaaja1
pelaaja = LoadObject("tornip.png", 360)
ObjectRange pelaaja, 72, 80
ObjectOrder pelaaja, 1
ObjectPickable pelaaja, 2
HPelaaja = 500

'pelaaja2
pelaaja2 = LoadObject("torni.png", 360)
ObjectRange pelaaja2, 72, 80
ObjectOrder pelaaja, 1
ObjectPickable pelaaja2, 2
HPelaaja2 = 500

'pelaajien aloitus
PositionObject pelaaja, -200, 100

RotateObject pelaaja, 0

'pelaajien törmäys
SetupCollision pelaaja, pelaaja2, 2, 2, 2

'PÄÄSILMUKKA
Repeat

'Liikuttaminen - pelaaja1
If KeyDown (cbkeya) Then TurnObject pelaaja, 5
If KeyDown (cbkeyd) Then TurnObject pelaaja, -5
If KeyDown(cbkeyw) Then MoveObject pelaaja, 0, -5
If KeyDown (cbkeys) Then MoveObject pelaaja, 0, 5

'pelaaja1 ampuminen
If KeyDown (57) And reload=0 Then
luoti.AMPUMINEN = New (AMPUMINEN)
luoti\bullet = CloneObject (bullet)

CloneObjectPosition luoti\bullet, pelaaja
CloneObjectOrientation luoti\bullet, pelaaja
SetupCollision luoti\bullet, pelaaja2, 2, 2, 1

reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
MoveObject luoti\bullet, 10
If ObjectX (luoti\bullet)<-850 Or ObjectX (luoti\bullet)>850 Or ObjectY (luoti\bullet)<-600 Or ObjectY (luoti\bullet)>600 Or CountCollisions (luoti\bullet) Then
DeleteObject luoti\bullet
Delete luoti
endif

'TÄSSÄ ON ONGELMA
If CountCollisions (luoti\bullet) Then HPelaaja2=HPelaaja2-500
If HPelaaja2=0 Then
PositionObject pelaaja2, 200,100
EndIf

Next luoti

UpdateGame

DrawGame

'tässä on objectpickable juttuja, jne

Drawscreen

Forever
Eli ongelma on tuossa countcollisions (luoti\bullet) then pelaaja2, jne kohdassa. Olen koittanut laittaa sitä vaikka minne ja muutella sitä, mut ei toimi. Tarvitsisin apua mahdollisimman pian, koska työ pitää palauttaa. Kiitos.

PS. En todellakaan käytä copy - pastea, en vaikka henki menisi.
Last edited by Mentality on Sat Jun 01, 2013 11:01 am, edited 2 times in total.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
User avatar
Rohmu
Newcomer
Posts: 29
Joined: Fri Apr 15, 2011 12:48 pm
Contact:

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Rohmu »

Poista luoti vasta loopin lopussa(kutsut siis objektia joka on jo poistettu)
Roolipeliprojekti: Endless Travels
viewtopic.php?t=2548
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Rohmu wrote:Poista luoti vasta loopin lopussa(kutsut siis objektia joka on jo poistettu)
Koitin nyt tehdä näin, mutta joko tulee sama ongelma uudestaan tai sitten luoti pysähtyy ukon päälle (En ole asettanut collisionia tietenkään ampuvan ukon ja luodin välillä). Kiitos avusta kuitenkin.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Code: Select all

If KeyDown (57) And reload=0 Then
luoti.AMPUMINEN = New (AMPUMINEN)
luoti\bullet = CloneObject (bullet)

CloneObjectPosition luoti\bullet, pelaaja
CloneObjectOrientation luoti\bullet, pelaaja
SetupCollision luoti\bullet, pelaaja2, 2, 2, 1

reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
MoveObject luoti\bullet, 10
If ObjectsOverlap (luoti\bullet, pelaaja2) Then 
HPelaaja2 = HPelaaja -500
DeleteObject luoti\bullet
Delete luoti
EndIf
Next luoti
Olen korjannut koodia vähäsen kun en saanut sitä toista toimimaan, mutta en saa kuitenkaan laitettua sitä "If HPelaaja2 = 0 then deleteobject pelaaja2." Minne vaan sen tungen ni tulee sama vanha "MAV." Kiitos jos joku pystyy auttamaan. Vaikka osa korjattua koodia jeesaisi. Kiitos jo etukäteen.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Latexi95 »

Ongelma on siinä, että kun poistat sen sen pelaaja2n niin sen poiston jälkeenkin tarkistat törmäykset, jolloin koitat käyttää jo poistettua objektia. Voit esimerkiksi tehdä niin, että laitat pelaaja2n nollaksi poistamisen jälkeen. Silloin voit tarkistaa if-lausekkeella, että pelaaja2 ei ole nolla. Jos pelaaja2 ei ole nolla, niin voit käyttää sitä huoletta.
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Latexi95 wrote:Ongelma on siinä, että kun poistat sen sen pelaaja2n niin sen poiston jälkeenkin tarkistat törmäykset, jolloin koitat käyttää jo poistettua objektia. Voit esimerkiksi tehdä niin, että laitat pelaaja2n nollaksi poistamisen jälkeen. Silloin voit tarkistaa if-lausekkeella, että pelaaja2 ei ole nolla. Jos pelaaja2 ei ole nolla, niin voit käyttää sitä huoletta.
Kiitos kun vaivauduit vastaamaan. En ole kuitenkaan aivan varma mitä tarkoitat ja jos siitä ei ole hirveästi haittaa niin voisitko laittaa pienen esimerkin. :oops: Kuten sanoin on aivan ensimmäinen pelini... Kiitos
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Latexi95 »

Code: Select all

If KeyDown (57) And reload=0 Then
luoti.AMPUMINEN = New (AMPUMINEN)
luoti\bullet = CloneObject (bullet)

CloneObjectPosition luoti\bullet, pelaaja
CloneObjectOrientation luoti\bullet, pelaaja

If pelaaja2 then
    SetupCollision luoti\bullet, pelaaja2, 2, 2, 1
endif
reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
MoveObject luoti\bullet, 10
if pelaaja2 then
    If ObjectsOverlap (luoti\bullet, pelaaja2) Then 
    HPelaaja2 = HPelaaja -500
    if HPelaaja2 <= 0 then
        DeleteObject pelaaja2
        pelaaja2 = 0
    endif
    DeleteObject luoti\bullet
    Delete luoti
    EndIf
endif
Next luoti
Muokkasin tuota antamaasi koodia, niin että sen pitäisi toimia. Jos jossain muussa kohdin pääsilmukassa käytät pelaaja2 objektia (esim sen liikutuksessa) niin muista samaan tapaan ensin tarkistaa, että se on olemassa.

Tälläiset virheet ja ongelmat ovat hyvin tavallisia aloittelijoilla. Samanlaisia ongelmia oli minullakin kun ensimmäisiä pelejä tein CB:llä.
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Latexi95 wrote:

Code: Select all

If KeyDown (57) And reload=0 Then
luoti.AMPUMINEN = New (AMPUMINEN)
luoti\bullet = CloneObject (bullet)

CloneObjectPosition luoti\bullet, pelaaja
CloneObjectOrientation luoti\bullet, pelaaja

If pelaaja2 then
    SetupCollision luoti\bullet, pelaaja2, 2, 2, 1
endif
reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
MoveObject luoti\bullet, 10
if pelaaja2 then
    If ObjectsOverlap (luoti\bullet, pelaaja2) Then 
    HPelaaja2 = HPelaaja -500
    if HPelaaja2 <= 0 then
        DeleteObject pelaaja2
        pelaaja2 = 0
    endif
    DeleteObject luoti\bullet
    Delete luoti
    EndIf
endif
Next luoti
Muokkasin tuota antamaasi koodia, niin että sen pitäisi toimia. Jos jossain muussa kohdin pääsilmukassa käytät pelaaja2 objektia (esim sen liikutuksessa) niin muista samaan tapaan ensin tarkistaa, että se on olemassa.

Tälläiset virheet ja ongelmat ovat hyvin tavallisia aloittelijoilla. Samanlaisia ongelmia oli minullakin kun ensimmäisiä pelejä tein CB:llä.
Paljon kiitoksia avusta. :) Olen kuitenkin saanut jo toisen haasteen, nimittäin nyt en löydä paikkaa luotien hävittämiseksi jos ne osuvat seinään. Oman järkeni mukaan en pysty laittamaan sitä "If objectsoverlap (luoti\bullet, pelaaja2) or objectsoverlap (luoti\bullet, kartta) then," jne. koska muuten jos ampuisi seinään niin pelaaja 2 kuolisi. Kysyn koska olen kokeillut jo kaikkea mitä mieleen tulee. Olen myös testannut getmap komennolla. Kiitos.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

Code: Select all

If KeyDown (57) And reload=0 Then
luoti.AMPUMINEN = New (AMPUMINEN)
luoti\bullet = CloneObject (bullet)

CloneObjectPosition luoti\bullet, pelaaja
CloneObjectOrientation luoti\bullet, pelaaja
SetupCollision luoti\bullet, kuukartta, 2, 4, 2

If pelaaja2 Then
SetupCollision luoti\bullet, pelaaja2, 2, 2, 1
EndIf

reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
MoveObject luoti\bullet, 10
If pelaaja2 Then
If ObjectsOverlap (luoti\bullet, pelaaja2) Then
HPelaaja2 = HPelaaja2 -50
If HPelaaja2 <= 0 Then
Deleteobject pelaaja2
pelaaja = 0
ElseIf GetMap (2, ObjectX (luoti\bullet), ObjectY(luoti\bullet)) Then
DeleteObject luoti\bullet
Delete luoti
EndIf
EndIf
EndIf
Next luoti
Eli olen kokeillut jo kaikkea mitä ikinä voisin keksiä. Olen tehnyt saman koodinpätkän monta kertaa uudestaan kokeilemalla eri vaihtoehtoja. En kuitenkaan nyt saa sitä toimimaan... Luodit eivät häviä osuttuaan seinään vaan ne jäävät siihen kiinni. Kun luodit osuvat Pelaaja2 niin se toimii kuitenkin ihan hyvin. Jos joku voisi vielä auttaa niin olisi mukavaa. Olen vähän hätäinen, koska työ on palautettava. Kiitos.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by legend »

Suosittelisin koodin sieventämistä.
Koodisi näyttää sievennettynä tältä:

Code: Select all

If KeyDown (57) And reload=0 Then
    luoti.AMPUMINEN = New (AMPUMINEN)
    luoti\bullet = CloneObject (bullet)
    
    CloneObjectPosition luoti\bullet, pelaaja
    CloneObjectOrientation luoti\bullet, pelaaja
    SetupCollision luoti\bullet, kuukartta, 2, 4, 2
    
    If pelaaja2 Then
        SetupCollision luoti\bullet, pelaaja2, 2, 2, 1
    EndIf
    
    reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
    MoveObject luoti\bullet, 10
    If pelaaja2 Then
        If ObjectsOverlap (luoti\bullet, pelaaja2) Then
            HPelaaja2 = HPelaaja2 -50
            If HPelaaja2 <= 0 Then
                DeleteObject pelaaja2
                pelaaja = 0
            ElseIf GetMap (2, ObjectX (luoti\bullet), ObjectY(luoti\bullet)) Then
                DeleteObject luoti\bullet
                Delete luoti
            EndIf
        EndIf
    EndIf
Next luoti
Nyt kun katsot selkeää koodia, huomaat virheen.
Tarkistat osuuko luoti seinään, jos pelaaja on hengissä, luoti on pelaajan päällä ja pelaajalla on elämää. Eli siis vasta pelaajan osuessa.
Joten siirrä tarkistus riippumattomaksi pelaajasta. Lisäksi lisää luodin tuhoaminen pelaajaan osuessa.
Eli

Code: Select all

For luoti.AMPUMINEN = Each AMPUMINEN
    tuhoaLuoti = 0
    
    MoveObject luoti\bullet, 10
    If pelaaja2 Then
        If ObjectsOverlap (luoti\bullet, pelaaja2) Then
            HPelaaja2 = HPelaaja2 -50
            If HPelaaja2 <= 0 Then
                DeleteObject pelaaja2
                pelaaja = 0
            EndIf
            tuhoaLuoti = 1
        EndIf
    EndIf
    
    If GetMap (2, ObjectX (luoti\bullet), ObjectY(luoti\bullet)) Then
        tuhoaLuoti = 1
    EndIf
    
    If tuhoaLuoti
        DeleteObject luoti\bullet
        Delete luoti
    EndIf
    
Next luoti
Mentality
Newcomer
Posts: 7
Joined: Sat May 18, 2013 2:56 pm

Re: Surkea ongelma... Avun tarpeessa täällä.

Post by Mentality »

legend wrote:Suosittelisin koodin sieventämistä.
Koodisi näyttää sievennettynä tältä:

Code: Select all

If KeyDown (57) And reload=0 Then
    luoti.AMPUMINEN = New (AMPUMINEN)
    luoti\bullet = CloneObject (bullet)
    
    CloneObjectPosition luoti\bullet, pelaaja
    CloneObjectOrientation luoti\bullet, pelaaja
    SetupCollision luoti\bullet, kuukartta, 2, 4, 2
    
    If pelaaja2 Then
        SetupCollision luoti\bullet, pelaaja2, 2, 2, 1
    EndIf
    
    reload = 25
EndIf

If reload>0 Then reload=reload-1

For luoti.AMPUMINEN = Each AMPUMINEN
    MoveObject luoti\bullet, 10
    If pelaaja2 Then
        If ObjectsOverlap (luoti\bullet, pelaaja2) Then
            HPelaaja2 = HPelaaja2 -50
            If HPelaaja2 <= 0 Then
                DeleteObject pelaaja2
                pelaaja = 0
            ElseIf GetMap (2, ObjectX (luoti\bullet), ObjectY(luoti\bullet)) Then
                DeleteObject luoti\bullet
                Delete luoti
            EndIf
        EndIf
    EndIf
Next luoti
Nyt kun katsot selkeää koodia, huomaat virheen.
Tarkistat osuuko luoti seinään, jos pelaaja on hengissä, luoti on pelaajan päällä ja pelaajalla on elämää. Eli siis vasta pelaajan osuessa.
Joten siirrä tarkistus riippumattomaksi pelaajasta. Lisäksi lisää luodin tuhoaminen pelaajaan osuessa.
Eli

Code: Select all

For luoti.AMPUMINEN = Each AMPUMINEN
    tuhoaLuoti = 0
    
    MoveObject luoti\bullet, 10
    If pelaaja2 Then
        If ObjectsOverlap (luoti\bullet, pelaaja2) Then
            HPelaaja2 = HPelaaja2 -50
            If HPelaaja2 <= 0 Then
                DeleteObject pelaaja2
                pelaaja = 0
            EndIf
            tuhoaLuoti = 1
        EndIf
    EndIf
    
    If GetMap (2, ObjectX (luoti\bullet), ObjectY(luoti\bullet)) Then
        tuhoaLuoti = 1
    EndIf
    
    If tuhoaLuoti
        DeleteObject luoti\bullet
        Delete luoti
    EndIf
    
Next luoti
Kiitos avusta. Kiitos kaikille muillekin jotka auttoivat minua hoitamaan ongelmaani, sillä peli toimii moitteettomasti ainakin tällä hetkellä. Huomasin kuitenkin että luodit eivät kadonneet seinään osuessaan jos luodin nopeus oli 10, siksi kokeiltuani sain selville että ainakin 25:den nopeus toimii kuten sen pitääkin. Kiitos vielä kerran.
Surkea olen, mutta en käytä copy - pastea, en vaikka henki menisi.
Post Reply