minulla on pieni ongelma

Voit pyytää apua ohjelmointiongelmiin täältä.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

minulla on pieni ongelma

Post by rami123 »

tein hyvän peli joka on vielä kesken , siinä on kana(hirviö) ja ihminen joka juoksee karkuun kanaa , tarkoitukseni oli kun kana törmää ihmiseen se katoaa ?
mutta miten se koodataan , silleen että kun kana on kerran törmännyt siihen se katoaa pelistä. :| vain tämä enään niin pelini on valmis :D sanokaa jos ette ymmärtäneet kaikkea.


Peli on Ylhäältä kuvattu
Last edited by rami123 on Mon Jun 23, 2008 10:07 pm, edited 1 time in total.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: minulla on pieni ongelma

Post by Koodiapina »

Ovatko törmäävät asiat objekteja?
Mistä suunnasta peli on kuvattu? Jos melkein 3D, niin haluatko törmäyksen tapahtuvan sijainnin määrittävillä muuttujilla vai overlapeilla?
Last edited by Koodiapina on Mon Jun 23, 2008 9:57 pm, edited 1 time in total.
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: minulla on pieni ongelma

Post by Harakka »

Jos kana ja ihminen ovat objekteja, tämän pitäisi riittää.

Code: Select all

If ObjectsOverlap(kana,ihminen) Then
  ShowObject kana,OFF
EndIf
Ensimmäisellä rivillä tarkistetaan siis ovatko nämä objektit päällekkäin (pelissäsi niillä saattaa olla eri nimet, joten ne kannattaa tarkastaa). Jos ne ovat, siirrytään seuraavalle riville (muutoin hypätään EndIf-rivin jälkeiselle riville) ja piilotetaan kana. Objektia ei oikeasti poisteta vaan sitä ei enää piirretä eikä sen törmäyksiä tarkasteta.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: minulla on pieni ongelma

Post by Jormalaz »

Saanko nauraa? :lol:
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

ihmisen oli tarkoitus kadota , kana on se hirviö näytän kuvan jos voin :lol: , samoin pelin mihin lisään tuon tekstin ja mitä muokkaan siitä?
Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: minulla on pieni ongelma

Post by Jormalaz »

rami123 wrote:ihmisen oli tarkoitus kadota , kana on se hirviö näytän kuvan jos voin :lol: , samoin pelin mihin lisään tuon tekstin ja mitä muokkaan siitä?
Kannattaisi lukea ne manuaalit.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

kun lisäsin tuon teksin repeatin jälkeen , tuli error ja memory access violatin :oops: miten nyt?
Olwi
Devoted Member
Posts: 557
Joined: Sun Dec 30, 2007 4:15 pm
Location: Muhos

Re: minulla on pieni ongelma

Post by Olwi »

Memory acces violation(eli MAV) tulee esim. kun yrität käsitellä objectia jota ei ole olemassakaan. Katsoppa mitkä nimet olet kanalle ja ihmiselle pistänyt,ja korvaa tuon koodin kana ja ihminen niillä ;)

Hieman voisit itsekin ajatella ;)
Huuda mun ip:tä!
lukutoukka
Active Member
Posts: 111
Joined: Fri Jun 13, 2008 9:06 pm

Re: minulla on pieni ongelma

Post by lukutoukka »

okei rami, lue manuaalit, niin saat tehtyä sen. Kanttis myös lukea foorumit läpi, sieltäkin löytyy apua jo varmasti samanlaisiin ongelmiin ja niissäkin saatta olla peräti esimerkkikoodit, joita vain otat ja muutat hieman, vaikka sillä lailla et opikkaan paljoa.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

oke
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: minulla on pieni ongelma

Post by Koodiapina »

Olw1 wrote:Memory acces violation(eli MAV) tulee esim. kun yrität käsitellä objectia jota ei ole olemassakaan.
Se voi esiintyä myös kun kuvaa, ääntä, karttaa, tiedostoa, muistipalaa tai fonttia ei voida käyttää.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

pistin tuon tekstin ja pistin nimet oikein EHKÄ (kana ja ihminen) ja vieläkin sanoo samaa memory access violatin vaikka kokeilen mitä :?
mitä oikein teen
Olwi
Devoted Member
Posts: 557
Joined: Sun Dec 30, 2007 4:15 pm
Location: Muhos

Re: minulla on pieni ongelma

Post by Olwi »

Jos koodisi ei ole kovin pitkä niin heitäppä tänne.
Korjailen sit kun olen pelannut eka yhden matsin Sensible Socceria :mrgreen:


Edit:
Niin ja saa sen heittää jos on pitempikin,ei se haittaa ;)
Huuda mun ip:tä!
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

SCREEN 500,500

FrameLimit 40

ClsColor cbblack

ukko1 = LoadObject ("C:\Documents and Settings\HP_Administrator\Desktop\ramin peli\kana.bmp",72)
ukko2 = LoadObject ("C:\Documents and Settings\HP_Administrator\Desktop\ramin peli\ihminen.bmp",72)

RotateObject ukko1,0
RotateObject ukko2,180

PositionObject ukko1,-150,100
PositionObject ukko2,150,-100


SetupCollision ukko1,ukko2,2,2,2
SetupCollision ukko2,ukko1,2,2,2

Repeat

Color cbRed
Text 3,0,"Tuhoa vihollinen"

Color cbRed
Text 12,12,"Kana Vs ihminen"

If LeftKey() Then TurnObject ukko1,5
If RightKey() Then TurnObject ukko1,-5
If UpKey() Then MoveObject ukko1,2
If DownKey() Then MoveObject ukko1,-2

If KeyDown(cbKeyA) Then TurnObject ukko2,5
If KeyDown(cbKeyD) Then TurnObject ukko2,-5
If KeyDown(cbKeyW) Then MoveObject ukko2,2
If KeyDown(cbKeyS) Then MoveObject ukko2,-2

If ObjectX(ukko1)<-200 Then PositionObject ukko1,-200,ObjectY(ukko1)
If ObjectX(ukko1)>200 Then PositionObject ukko1,200,ObjectY(ukko1)
If ObjectY(ukko1)<-150 Then PositionObject ukko1,ObjectX(ukko1),-150
If ObjectY(ukko1)>150 Then PositionObject ukko1,ObjectX(ukko1),150

If ObjectX(ukko2)<-200 Then PositionObject ukko2,-200,ObjectY(ukko2)
If ObjectX(ukko2)>200 Then PositionObject ukko2,200,ObjectY(ukko2)
If ObjectY(ukko2)<-150 Then PositionObject ukko2,ObjectX(ukko2),-150
If ObjectY(ukko2)>150 Then PositionObject ukko2,ObjectX(ukko2),150

DrawScreen

Forever

tonne pitää lisätä se että se ihminen poistuu kun kana törmää siihen , miten lisään sen? (tämä on kaksinpeli)
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

oho :oops: se olikin pitkä teksti
Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: minulla on pieni ongelma

Post by Jormalaz »

Lisäät vielä:

If countcollisions(ukko1) then
deleteobject ukko2
endif

If countcollisions(ukko2) then
deleteobject ukko1
endif

EDIT: En ole varma toimiiko, mutta kokeile.
Olwi
Devoted Member
Posts: 557
Joined: Sun Dec 30, 2007 4:15 pm
Location: Muhos

Re: minulla on pieni ongelma

Post by Olwi »

Vinkki:Code-tagit helpottavat koodin lukemista.
Vinkki2:Tekstin piirtoväriä(Color-käsky) ei tarvitse kutsua joka kerta,kun jotain tekstiä näytölle lisää,jos ei sitä halua muuttaa. Siis,jos kaikki teksti tulee punaisella,käsket vain alussa Color cbred,ja sen jälkeen ei tarvitse tuota kirjoittaa.

Tässä olis tällänen viritys,kun kana(ukko1) kävelee ihmiseen(ukko2) pahki,ihminen(ukko2) katoaa,ja kana(ukko1) saa yhden pisteen. Painamalla R,kana ja ihminen palautuvat alkuperäisille paikoilleen. Vaihdat vain tiedostopolut omiksesi takaisin,ja se toimii. (kommentoin muutokseni...)

Code: Select all


SCREEN 500,500

FrameLimit 40

ClsColor cbblack

ukko1 = LoadObject ("media\guy.bmp",72)
ukko2 = LoadObject ("media\soldier.bmp",72)

RotateObject ukko1,0
RotateObject ukko2,180

PositionObject ukko1,-150,100
PositionObject ukko2,150,-100


SetupCollision ukko1,ukko2,2,2,2
SetupCollision ukko2,ukko1,2,2,2

Repeat

Color cbRed
Text 3,0,"Tuhoa vihollinen"
Text 12,12,"Kana Vs ihminen"

If LeftKey() Then TurnObject ukko1,5
If RightKey() Then TurnObject ukko1,-5
If UpKey() Then MoveObject ukko1,2
If DownKey() Then MoveObject ukko1,-2

If KeyDown(cbKeyA) Then TurnObject ukko2,5
If KeyDown(cbKeyD) Then TurnObject ukko2,-5
If KeyDown(cbKeyW) Then MoveObject ukko2,2
If KeyDown(cbKeyS) Then MoveObject ukko2,-2

If ObjectX(ukko1)<-200 Then PositionObject ukko1,-200,ObjectY(ukko1)
If ObjectX(ukko1)>200 Then PositionObject ukko1,200,ObjectY(ukko1)
If ObjectY(ukko1)<-150 Then PositionObject ukko1,ObjectX(ukko1),-150
If ObjectY(ukko1)>150 Then PositionObject ukko1,ObjectX(ukko1),150

If ObjectX(ukko2)<-200 Then PositionObject ukko2,-200,ObjectY(ukko2)
If ObjectX(ukko2)>200 Then PositionObject ukko2,200,ObjectY(ukko2)
If ObjectY(ukko2)<-150 Then PositionObject ukko2,ObjectX(ukko2),-150
If ObjectY(ukko2)>150 Then PositionObject ukko2,ObjectX(ukko2),150


//Jos ukko1 törmää johonkin,niin ukko2 piilotetaan ja muuttujaa kananpisteet kasvatetaan yhdellä
If CountCollisions(ukko1) Then
ShowObject ukko2,OFF
kananpisteet=kananpisteet+1
EndIf
//Jos painaa r-näppäintä,niin objektit palautuvat alkuperäisille paikoilleen alkuperäisiin kulmiin,ja ukko2 muutetaan jälleen näkyväksi
If KeyHit(cbkeyr) Then
PositionObject ukko1,-150,100
PositionObject ukko2,150,-100
RotateObject ukko1,0
RotateObject ukko2,180
ShowObject ukko2,ON
EndIf

Text 30,30,"Pisteitä kanalla:"+kananpisteet
DrawScreen

Forever

Edit
Jormalaz,sun koodisi aiheuttaa MAVin,syy:
Ensin tarkastetaan osuuko ukko1 mihinkään,jos osuu,niin poistetaan ukko2.
Sitten tarkastetaan osuuko ukko2 mihinkään,mutta ukko2 on jo poistettu.
;)
Huuda mun ip:tä!
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: minulla on pieni ongelma

Post by Harakka »

Lisää Repeat-loopin sisään seuraavat rivit:

Code: Select all

If tormatty = 0 Then 'seuraavalle riville mennään vain jos ei olla aikaisemmin törmätty
  If CountCollisions(ukko1) Then 'jos ukko on nyt törmäämässä kanaan
    DeleteObject ukko2 'poistetaan kana
    tormatty = 1 'merkitään että törmäys on tapahtunut (jää muistiin)
  EndIf
EndIf
Lisäksi laita ohjaaminen ja liikkumisen rajoitus (ja kaikki missä ukko2-objektia eli kanaa käytetään) toteutumaan vain jos ei olla törmätty, eli näin:

Code: Select all

If tormatty = 0 Then
  'kanan ohjaaminen
  'kanan sijainnin rajoittaminen
EndIf
Näin voidaan välttää MAV.

Voit myös yhdistää kaksi ylempää koodia ja laittaa ohjaamisen ym. tuon ehtolausekkeen sisään, ennen törmäystarkistusta.

EDIT: Vähän myöhässä. ;) Toivottavasti viesti kuitenkin selventää ideaa.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: minulla on pieni ongelma

Post by koodaaja »

Jormalaz wrote:Lisäät vielä:

If countcollisions(ukko1) then
deleteobject ukko2
endif

If countcollisions(ukko2) then
deleteobject ukko1
endif

EDIT: En ole varma toimiiko, mutta kokeile.
Saanko nauraa? Teh allmighty evolol.

Code: Select all

SCREEN 500,500

FrameLimit 40

ClsColor cbblack

ukko1 = LoadObject ("C:\Documents and Settings\HP_Administrator\Desktop\ramin peli\kana.bmp",72)
ukko2 = LoadObject ("C:\Documents and Settings\HP_Administrator\Desktop\ramin peli\ihminen.bmp",72)

RotateObject ukko1,0
RotateObject ukko2,180

PositionObject ukko1,-150,100
PositionObject ukko2,150,-100

Repeat
    
    Color cbRed
    Text 3,0,"Tuhoa vihollinen"
    
    Color cbRed
    Text 12,12,"Kana Vs ihminen"
    
    If LeftKey() Then TurnObject ukko1,5
    If RightKey() Then TurnObject ukko1,-5
    If UpKey() Then MoveObject ukko1,2
    If DownKey() Then MoveObject ukko1,-2
    
    If KeyDown(cbKeyA) Then TurnObject ukko2,5
    If KeyDown(cbKeyD) Then TurnObject ukko2,-5
    If KeyDown(cbKeyW) Then MoveObject ukko2,2
    If KeyDown(cbKeyS) Then MoveObject ukko2,-2
    
    If ObjectX(ukko1)<-200 Then PositionObject ukko1,-200,ObjectY(ukko1)
    If ObjectX(ukko1)>200 Then PositionObject ukko1,200,ObjectY(ukko1)
    If ObjectY(ukko1)<-150 Then PositionObject ukko1,ObjectX(ukko1),-150
    If ObjectY(ukko1)>150 Then PositionObject ukko1,ObjectX(ukko1),150
    
    If ObjectX(ukko2)<-200 Then PositionObject ukko2,-200,ObjectY(ukko2)
    If ObjectX(ukko2)>200 Then PositionObject ukko2,200,ObjectY(ukko2)
    If ObjectY(ukko2)<-150 Then PositionObject ukko2,ObjectX(ukko2),-150
    If ObjectY(ukko2)>150 Then PositionObject ukko2,ObjectX(ukko2),150
    
    If ObjectsOverlap(ukko1, ukko2) Then
        
        ShowObject ukko1, OFF
        
    EndIf
    
    DrawScreen
    
Forever
Siinäpä tuo. Sisensin samantien.

Haiskahtaa muuten valmiin esimerkin käyttämiseltä : D Toki valmiin modaus on hyvä tapa oppia, mutta älä toki väitä itse tekemäksesi.

Ja sitten, täysin ilman kenenkään lupaa, kerron pari asiaa:

Tämä vaikuttaa ensimmäiseltä projektiltasi. Älä ikinä julkaise ensimmäistä projektiasi minkään sortin tuotoksena. Itse tein aikanaan sen virheen, ja kylläpä sitä katuu. Se oli, sikäli kuin muistan, hirveää purkkaa, esimerkeistä kopiointia ja huono peli. Ei kukaan ole seppä CB:n ladattuaan. (itse asiassa tämä kielto koskee yleensä myös toista ja kolmatta, usein myös paria seuraavaa, mutta kuitenkin)

Viimeistely on kaiken A ja O. Kirjoitin joskus hieman pidemmältikin aiheesta esimerkin kera, mutta pari pientä huomiota riittänee tällä kertaa: Älä toki lataa kuvia koko polulla, vaan käytä niin sanottuja paikallista (tai mikä hieno termi onkaan) polkua. Eli tallennat koodin, myöhemmin pelin .exen, samaan kansioon median kanssa. Tai vielä parempaa, laita media alikansioon. Hyväksi havaittu rakenne: Kaksi kansiota. Tyyliin "peli" ja "kuvat". Kansio "kuvat" sijaitsee kansion "peli" sisällä. Kansioon "peli" tallennetaan lähdekoodi (se .cb -tiedosto) ja peliä jaettaessa .exe. Kansioon "kuvat" tallennetaan - yllätys yllätys - kuvat ja projektisi mahdollisesti tarvitsemat äänet. Siten voit pelin koodissa kirjoittaa vain

Code: Select all

ukko1 = LoadObject("kuvat\kana.bmp", 72)
eli et tarvitse hirveän pitkiä polkuja, ja peli toimii missä tahansa, minne käyttäjä sen haluaa laittaa.

Lisäksi pelin nimen voi laittaa ikkunan yläpalkkiin, kuten CoolBasicin ikkunassa lukee "CoolBasic". Se näkyy myös tuolla alapalkissa, taskbariko se nyt oli. Se on hyvin helppoa. Ohjelman alkuun, vaikka SCREEN:in jälkeiselle riville

Code: Select all

SetWindow "Kana Vs ihminen"
(olettaen että tämä on pelin nimi)

Sitten, sisennykset. Kun kirjoitat koodiasi, kokeile nakata jokainen looppi ja monirivinen If-lause sarkaimen verran sisemmäs. Lisäksi muutama ylimääräinen rivi ja väli selkeyttää koodiasi kummasti. Vältä myös kaksoispisteitä ja kommentoi, jos jaksat. Tässäpä parissa minuutissa väsätty demonstraatio.

Huomaa ero:

Code: Select all

y#=0.0:yvel#=0.0:yell=0:redtimer=0
Repeat
If UpKey() Then yvel#=yvel#+0.04:yell=1 Else yell=0
yvel#=yvel#-0.02
y#=y#+yvel#
Color 100,100,100
If y#<0.0 Then
y#=0.0
If yvel#<-0.6 Then redtimer=Timer()+50
yvel#=-yvel#*0.6
EndIf
If Timer()<redtimer Then Color 255,0,0
Box 190,290-y#,20,10
If yell Then Color 255, 255,0:Box 195,300-y,10,4
DrawScreen
Forever

Code: Select all

y# = 0.0'coordinate of the ship
yvel# = 0.0'velocity
yell = 0'is the thruster being used
redtimer = 0'when last damaging contact to ground

Repeat
    
    If UpKey() Then//the thruster is being used, add velocity
        yvel# = yvel# + 0.04
        yell = 1
    Else 
        yell = 0
    EndIf
    
    //add gravity to velocity and velocity to coordinates
    yvel# = yvel# - 0.02
    y#=y#+yvel#
    
    Color 100,100,100'default ship color
    
    //if the ship is underground
    If y#<=0.0 Then
        y#=0.0'bring it back up
        If yvel#<-0.6 Then redtimer=Timer()+50'if it hit hard enough, the ship will be red for 50 milliseconds
        yvel#=-yvel#*0.6'energy loss: some energy transforms to heat and sound
    EndIf
    
    If Timer()<redtimer Then Color 255,0,0'damage color
    
    Box 190,290-y#,20,10'draw the ship..
    If yell Then Color 255, 255,0:Box 195,300-y,10,4'..and a flame in case the thruster has been used
    
    DrawScreen'draw the screen
Forever
Siinäpä vähän ohjeistusta, ja onnea projektille.

EDIT: No johan on kun pitkään kirjoitin, parikin lisäystä kerkesi tulla välissä.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: minulla on pieni ongelma

Post by rami123 »

kiitos se on nyt valmis :P ja hyvä tuli vielä vois muokata tietokoneälyn tuolle kanalle niin voisi pelata yksinkin jos jaksaisi .
piti korjata vain showobject ukko2,off ukko1 oli se hirviö :D


Tämä oli minun ensimmäinen Peli
Post Reply