Page 7 of 23

Re: Tyhmät kysymykset (I/2011)

Posted: Mon Mar 12, 2012 9:57 pm
by skorpioni-cb
Latexi95 wrote:
skorpioni-cb wrote:Äh ja lisää tuplapostailua :twisted:

Mulla on ongelma, olen tallentanut kaikki lähdekoodin ja tarpeellisen median oikeille paikoilleen, mutta se herjaa ettei voi ladata objectii Media\mie.bmp tässä vielä rar kaikesta tarvittavasta jotta voitte kertoo mikä mättää , ja joo siellä on vain se tilemappi, pelihahmo ja zombie minun tekeleitä, muut coolbasickin omia medioita :D
EDIT:

Ja joo ei tartte valittaa sisennyksestä

Sinun kuva tiedostosi eivät vaikuta olevan aivan kunnossa. Oletko vaihtanut niiden tiedostopäätettä tai tehnyt jotain vastaavaa, mikä aiheuttaisi sen, että CB ei pysty avaamaan niitä? Minulla tuo lopetti valittamisen, kun avasin kuvan ja tallensin sen uudestaan siihen päälle.
Ehkä johtuu siitä että tein gimpin 2.7 kehitysversiolla windowsille, koetan paintilla vielä tallentaa
EDIT:

Nyt on toinen ongelma, mulla ei toi tilemappi näy, siis mä lataan sen kuten pitääkin, mutta ei näy(äh, mulla on liikaa ongelmia -.- )

EDIT:

Edit2: Nyt tiiän miksi mappi ei näy, koska spawnaan ihan väärään kohtaan, mutta miten voin saada spawnin koordinaatit mun mapista, kun spawnipaikka on ilmoitettu data-kerrokseen arvolla 1, eli miten saan sen kyseisen tilen koordinaatit ja voin siirtää ukkoni sinne :?


Re: Tyhmät kysymykset (I/2011)

Posted: Mon Mar 12, 2012 11:03 pm
by valscion
skorpioni-cb wrote:Edit2: Nyt tiiän miksi mappi ei näy, koska spawnaan ihan väärään kohtaan, mutta miten voin saada spawnin koordinaatit mun mapista, kun spawnipaikka on ilmoitettu data-kerrokseen arvolla 1, eli miten saan sen kyseisen tilen koordinaatit ja voin siirtää ukkoni sinne :?
http://www.cbrepository.com/codes/code/33/ noista funktioista voi olla apua. Muuta se 32 noista funktioista, jos tilekarttasi tileleveys tahi korkeus ei ole se.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 4:50 pm
by skorpioni-cb
Uutta ongelmaa perään, ja uusi paketti joissa päivitetty lähdekoodi ja grafiikat


Ongelma on se että kun ammun, niin ne fireball.bmp näkyy kartan ulkopuolella, menkää sinne alareunaan ja painakaa space-barii, jotta ampuu, ja kattokaa lähdekoodii jotta voitte korjata, tosin sanokaa vaan mitkä rivit pitää korjata ja antakaa korjauskoodi, kiitos :cry:
EDIT:

Unohtu uudet koodit 8-) like a boss

EDIT:

Edit3: Tämä on Edit2:kkosen päällä, ja se "osaamattomat raukat" oli sarkasmia, muttakun ei oikein apua tule :(


Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 5:40 pm
by MrMonday
skorpioni-cb wrote:Uutta ongelmaa perään, ja uusi paketti joissa päivitetty lähdekoodi ja grafiikat
...
EDIT:

Edit2: ärsyttää kun kukaan ei ole vielä auttanut, eikö raukat osaa :?

Ja tuolla tavalla saattaa apu vähäiseksi jäädäkkin, että suosittelisin himpun verran kunnioittavampaa ja nöyrempää asennetta, jos haluaa "osaamattomilta raukoilta" jelppiä..

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 5:43 pm
by skorpioni-cb
MrMonday wrote:
skorpioni-cb wrote:Uutta ongelmaa perään, ja uusi paketti joissa päivitetty lähdekoodi ja grafiikat
...
EDIT:

Edit2: ärsyttää kun kukaan ei ole vielä auttanut, eikö raukat osaa :?

Ja tuolla tavalla saattaa apu vähäiseksi jäädäkkin, että suosittelisin himpun verran kunnioittavampaa ja nöyrempää asennetta, jos haluaa "osaamattomilta raukoilta" jelppiä..
Mut voitko auttaa, mä muokkasin viestin jo, jos sä osaisit tän bugin ratkaista :?

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 6:40 pm
by Latexi95
skorpioni-cb wrote: Mut voitko auttaa, mä muokkasin viestin jo, jos sä osaisit tän bugin ratkaista :?
Virhe on siinä, että et resetoi padin törmäyksiä, kun luot sen. CB siirtää padin oikeaan paikkaan vasta UpdateGamen/DrawGamen/DrawScreenin yhteydessä joten kun liikutat patia pisteestä 0,0 objektin kohdalle, se törmää seinään. Eli laita ResetObjectCollision pati\obj SetupCollisionin jälkeen.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 6:48 pm
by skorpioni-cb
Latexi95 wrote:
skorpioni-cb wrote: Mut voitko auttaa, mä muokkasin viestin jo, jos sä osaisit tän bugin ratkaista :?
Virhe on siinä, että et resetoi padin törmäyksiä, kun luot sen. CB siirtää padin oikeaan paikkaan vasta UpdateGamen/DrawGamen/DrawScreenin yhteydessä joten kun liikutat patia pisteestä 0,0 objektin kohdalle, se törmää seinään. Eli laita ResetObjectCollision pati\obj SetupCollisionin jälkeen.
Kiitos, mä aattelinkin että asialle on niin yksinkertainen ratkaisu, jota en tosin olisi osannut itse toteuttaa :mrgreen:

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 6:54 pm
by Jonez
skorpioni-cb: luulen että ihmisten auttamiskynnys on aika korkea jos pitää ruveta jotain tiedostoja latailemaan. Pelkän lähdekoodin tutkailu on paljon nopeampaa. Tosin tässä tapauksessa sillon tulisi valituksia, että tarvittavaa mediaa ei ole itse pelin testaamiseen :).
Latexi95 wrote:Eli laita ResetObjectCollision pati\obj SetupCollisionin jälkeen.
Oikeastaan tämä ei välttämättä toimi. Joudut laittamaan kyseisen komennon vasta riville 66, eli niiden rivien jälkeen jossa siirrät panoksen ampujan sijaintiin.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 6:56 pm
by Latexi95
Jonez wrote:skorpioni-cb: luulen että ihmisten auttamiskynnys on aika korkea jos pitää ruveta jotain tiedostoja latailemaan. Pelkän lähdekoodin tutkailu on paljon nopeampaa. Tosin tässä tapauksessa sillon tulisi valituksia, että tarvittavaa mediaa ei ole itse pelin testaamiseen :).
Latexi95 wrote:Eli laita ResetObjectCollision pati\obj SetupCollisionin jälkeen.
Oikeastaan tämä ei välttämättä toimi. Joudut laittamaan kyseisen komennon vasta riville 66, eli niiden rivien jälkeen jossa siirrät panoksen ampujan sijaintiin.
Aah... Totta. Kokeilin nimittäin laittaa tuon SetupCollisionin niiden jälkeen ennen kuin tajusin tuon ResetObjectCollisionin. Sen takia minulla SetupCollision oli noiden CloneObject*** komentojen jälkeen. :)

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 7:05 pm
by skorpioni-cb
Latexi95 wrote:
Jonez wrote:skorpioni-cb: luulen että ihmisten auttamiskynnys on aika korkea jos pitää ruveta jotain tiedostoja latailemaan. Pelkän lähdekoodin tutkailu on paljon nopeampaa. Tosin tässä tapauksessa sillon tulisi valituksia, että tarvittavaa mediaa ei ole itse pelin testaamiseen :).
Latexi95 wrote:Eli laita ResetObjectCollision pati\obj SetupCollisionin jälkeen.
Oikeastaan tämä ei välttämättä toimi. Joudut laittamaan kyseisen komennon vasta riville 66, eli niiden rivien jälkeen jossa siirrät panoksen ampujan sijaintiin.
Aah... Totta. Kokeilin nimittäin laittaa tuon SetupCollisionin niiden jälkeen ennen kuin tajusin tuon ResetObjectCollisionin. Sen takia minulla SetupCollision oli noiden CloneObject*** komentojen jälkeen. :)
No mulla ainakin toimi hyvin, mutta uutta kyssäriä perään, miten voin luoda typen instanssit niin että saan eri instansseihin vaikutettua erikseen eli ns. "käsin", helpottaisi nimittäin ton aseenvaihdon tekoa jos mä teen niin että mulla on vain yksi type joka aseelle, siis sillä tavalla kuin chaosworm ehdotti
EDIT:

Mikäs hemsvetti seuraavassa koodissa mavaa:

Code: Select all

en.ZOMBI = New(ZOMBI)
	en\vihu = CloneObject(z)
	For y=1 To MapHeight()
	For x=1 To MapWidth()
		If GetMap2(3,x,y)=2 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
	Next x
	Next y
	SetupCollision en\vihu,guy,2,2,1
Ja tässä vielä koko koodi, älkää välittäkö median puuttumisesta, median löydät ylhäältä päin :D

Code: Select all

Type AMMUKSET
    Field obj
End Type 
Type ZOMBI
    Field vihu As Integer 
EndType

//PlaySound "Media\SK_Battle2.mp3"

//ammoLopussa = LoadSound("Media\gong.wav")
//ampuu = LoadSound("Media\Machine gun 1.wav")

FrameLimit 40 //Sets FPS-limiting to about 40

SCREEN 800,600,0,1 //Set screen

ammo=6

ammoreppu=34

hela= LoadObject("Media\hela.bmp")

map= LoadMap("Media\m1.til","Media\tileset.bmp")
PlayObject map,0,0,0.5

guy= LoadObject("media\mie.bmp",72)
SetupCollision guy,map,2,4,2

z= LoadObject("Media\zombi.bmp")
ShowObject vihu,OFF 

ammus = LoadObject("Media\fireball.bmp")
ShowObject ammus,OFF 

elämä=LoadImage("Media\life.jpg")
hp=100

ws = MakeImage(400,300) //Make screen to view into gameworld

For y=1 To MapHeight()
For x=1 To MapWidth()
    If GetMap2(3,x,y)=1 Then PositionObject guy,TileToWorldX(x,map),TileToWorldY(y, map)
    If GetMap2(3,x,y)=1 Then PositionObject ammus,ObjectX(guy),ObjectY(guy)
Next x
Next y

Repeat
    If LeftKey() Then TurnObject guy,5
    If RightKey() Then TurnObject guy, -5
    If UpKey() Then MoveObject guy,4
    If DownKey() Then MoveObject guy, -4
    DrawToImage ws //Draws world into image
        UpdateGame 
        Cls
        PositionCamera ObjectX( guy ) + ScreenWidth() / 2 - 400 / 2, ObjectY( guy ) - ScreenHeight() / 2 + 300 / 2
        DrawGame
    DrawToScreen 
    
    DrawImage ws,0,0
    If KeyDown(57) And ammo>0 Then
        pati.AMMUKSET = New (AMMUKSET)
        pati\obj = CloneObject (ammus)
        ammo=ammo-1
        //PlaySound ampuu
        'Asetetaan patin törmäys kenttää
    
        'Aseta pati samaan paikkaan missä pelaaja on
        CloneObjectPosition pati\obj, guy
        CloneObjectOrientation pati\obj, guy
        ShowObject pati\obj, ON
        SetupCollision pati\obj, map, 2, 4, 1
        ResetObjectCollision pati\obj
    EndIf 

    For pati.AMMUKSET = Each AMMUKSET
        MoveObject pati\obj, 6
    Next pati  
    For pati.AMMUKSET = Each AMMUKSET
        If CountCollisions(pati\obj) Then
                DeleteObject pati\obj
                Delete pati
        EndIf
    Next pati 
	//Zombie-spawning
	en.ZOMBI = New(ZOMBI)
	en\vihu = CloneObject(z)
	For y=1 To MapHeight()
	For x=1 To MapWidth()
		If GetMap2(3,x,y)=2 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
	Next x
	Next y
	SetupCollision en\vihu,guy,2,2,1
    Text 300,400,"AMMO: "+ammo+"\"+ammoreppu
    If KeyHit(cbkeyr) And ammo=0 And ammoreppu > 6 Then 
        ammo=6
        ammoreppu=ammoreppu-6
    ElseIf KeyHit(cbkeyr) And ammoreppu < 6 Then
        //PlaySound ammoLopussa
    EndIf
	
			For vihu1.ZOMBI = Each ZOMBI
		If Distance2(vihu1\vihu, guy) < 1000 Then
			distanceX = ObjectX(vihu1\vihu) - ObjectX(guy)
			distanceY = ObjectY(vihu1\vihu) - ObjectY(guy)
		
			Box 500 + 20 / 2 + distanceX * 0.1, 0 + 20 / 2 + distanceY * -0.1, 2, 2
		EndIf
	Next vihu1
	
    DrawScreen 
    
Until EscapeKey()

Function TileToWorldX(tx,map)
    Return tx * 32 -ObjectSizeX(map) / 2
EndFunction

Function TileToWorldY(ty, map)
    Return -(ty * 32 - ObjectSizeY(map) / 2)
EndFunction 
[/edit]

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 8:06 pm
by Jonez
Rivillä 29, 30:

Code: Select all

z= LoadObject("Media\zombi.bmp")
ShowObject vihu,OFF 
Pitäisi olla ShowObject z, OFF.

Suosittelen että jätät tuollaiset muuttujanimet kuten "z" pois, koska ne eivät ole tarpeeksi kuvaavia (kun projekti kasvaa, ne unohtaa), ja ovat sen verran yleisiä, että saattavat sekoittua muiden muuttujien kanssa.

Toiseen kysymykseesi:
Kirjoita:
yksittäinen_instanssinimi.KOKOELMA_NIMI = vanha_instanssi_nimi

Code: Select all

Type ase
    Field tyyppi
EndType

na.ase = New (ase)
na\tyyppi = TYYPPI_RYNKKY

For ia.ase = Each ase
    If ia\tyyppi = TYYPPI_RYNKKY Then
        rynkky.ase = ia //tässä rynkky määritellään samaksi kuin silmukan "ia".
    EndIf
Next ia

//...

//Myöhemmässä koodissa voit käyttää vain rynkky-muuttujaa käymättä kaikkia läpi:

rynkky\tyyppi = TYYPPI_KASIASE

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 13, 2012 8:48 pm
by skorpioni-cb
Jonez wrote:Rivillä 29, 30:

Code: Select all

z= LoadObject("Media\zombi.bmp")
ShowObject vihu,OFF 
Pitäisi olla ShowObject z, OFF.

Suosittelen että jätät tuollaiset muuttujanimet kuten "z" pois, koska ne eivät ole tarpeeksi kuvaavia (kun projekti kasvaa, ne unohtaa), ja ovat sen verran yleisiä, että saattavat sekoittua muiden muuttujien kanssa.

Toiseen kysymykseesi:
Kirjoita:
yksittäinen_instanssinimi.KOKOELMA_NIMI = vanha_instanssi_nimi

Code: Select all

Type ase
    Field tyyppi
EndType

na.ase = New (ase)
na\tyyppi = TYYPPI_RYNKKY

For ia.ase = Each ase
    If ia\tyyppi = TYYPPI_RYNKKY Then
        rynkky.ase = ia //tässä rynkky määritellään samaksi kuin silmukan "ia".
    EndIf
Next ia

//...

//Myöhemmässä koodissa voit käyttää vain rynkky-muuttujaa käymättä kaikkia läpi:

rynkky\tyyppi = TYYPPI_KASIASE
kiitos, ja z oli muuttujan nimenä, koska coolbasic ei erottele isoja ja pieniä kirjaimia :(

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 11:56 am
by Awaclus
MrMonday wrote:
skorpioni-cb wrote:Uutta ongelmaa perään, ja uusi paketti joissa päivitetty lähdekoodi ja grafiikat
...
EDIT:

Edit2: ärsyttää kun kukaan ei ole vielä auttanut, eikö raukat osaa :?

Ja tuolla tavalla saattaa apu vähäiseksi jäädäkkin, että suosittelisin himpun verran kunnioittavampaa ja nöyrempää asennetta, jos haluaa "osaamattomilta raukoilta" jelppiä..
Uskoisin, ettei skorppari ollut ihan vakavissaan kutsuessaan meitä osaamattomiksi raukoiksi.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 12:20 pm
by Latexi95
Chaosworm wrote: Uskoisin, ettei skorppari ollut ihan vakavissaan kutsuessaan meitä osaamattomiksi raukoiksi.
Totta, mutta en nyt kyllä siltikkään oikein osaa arvostaa tuota skorpparin edittiä. Ja pidin lisättyä hymiötä huonosti valittua.
Tuo ehkä kuului niihin editteihin, mitkä ehkä olisi kannattanut jättää laittamatta. Toiset kun kuitenkin vapaaehtoisesti auttavat, niin pieni kohteliaisuus ei ole pahitteeksi.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 4:55 pm
by skorpioni-cb
Latexi95 wrote:
Chaosworm wrote: Uskoisin, ettei skorppari ollut ihan vakavissaan kutsuessaan meitä osaamattomiksi raukoiksi.
Totta, mutta en nyt kyllä siltikkään oikein osaa arvostaa tuota skorpparin edittiä. Ja pidin lisättyä hymiötä huonosti valittua.
Tuo ehkä kuului niihin editteihin, mitkä ehkä olisi kannattanut jättää laittamatta. Toiset kun kuitenkin vapaaehtoisesti auttavat, niin pieni kohteliaisuus ei ole pahitteeksi.
Tiedän, että lähestymistapani oli aika "paska" mutta olen välillä aika kärsimätön ihminen, joten voitte arvata mistä tämä johtui tämä "osaamattomat raukat"-kommentti.
Offtopic: BTW. Isolla alkukirjaimella alkavat ja isoon välimerkkiin loppuvat jutut on virkkeitä, eli jos ette tiennyt niin ftw
EDIT:

Nyt ei sitten mun zombit törmää mun pelihahmoon vaikka pitäisi, taidan olla liian surkea tähän hommaan jotta voin ratkaista, tässä uusin koodini, mediat löydätte sieltä mistä pitääkin

Code: Select all

Type AMMUKSET
    Field obj
End Type 
Type ZOMBI
    Field vihu As Integer 
EndType

//PlaySound "Media\SK_Battle2.mp3"

//ammoLopussa = LoadSound("Media\gong.wav")
//ampuu = LoadSound("Media\Machine gun 1.wav")

FrameLimit 40 //Sets FPS-limiting to about 40

SCREEN 800,600,0,1 //Set screen

Const MAX_ZOMBIE = 2

ammo=6

ammoreppu=34

zombimäärä=0

hela= LoadObject("Media\hela.bmp")

map= LoadMap("Media\m1.til","Media\tileset.bmp")
PlayObject map,0,0,0.5

guy= LoadObject("media\mie.bmp",72)
SetupCollision guy,map,2,4,2

zom= LoadObject("Media\zombi.bmp")
ShowObject zom,OFF 

ammus = LoadObject("Media\fireball.bmp")
ShowObject ammus,OFF 

elämä=LoadImage("Media\life.jpg")
hp=100

ws = MakeImage(400,300) //Make screen to view into gameworld

For y=1 To MapHeight()
For x=1 To MapWidth()
    If GetMap2(3,x,y)=1 Then PositionObject guy,TileToWorldX(x,map),TileToWorldY(y, map)
    If GetMap2(3,x,y)=1 Then PositionObject ammus,ObjectX(guy),ObjectY(guy)
Next x
Next y

Repeat
    If LeftKey() Then TurnObject guy,5
    If RightKey() Then TurnObject guy, -5
    If UpKey() Then MoveObject guy,4
    If DownKey() Then MoveObject guy, -4
    DrawToImage ws //Draws world into image
        UpdateGame 
        Cls
        PositionCamera ObjectX( guy ) + ScreenWidth() / 2 - 400 / 2, ObjectY( guy ) - ScreenHeight() / 2 + 300 / 2
        DrawGame
    DrawToScreen 
    
    DrawImage ws,0,0
    If KeyDown(57) And ammo>0 Then
        pati.AMMUKSET = New (AMMUKSET)
        pati\obj = CloneObject (ammus)
        ammo=ammo-1
        //PlaySound ampuu
        'Asetetaan patin törmäys kenttää
    
        'Aseta pati samaan paikkaan missä pelaaja on
        CloneObjectPosition pati\obj, guy
        CloneObjectOrientation pati\obj, guy
        ShowObject pati\obj, ON
        SetupCollision pati\obj, map, 2, 4, 1
        ResetObjectCollision pati\obj
    EndIf 

    For pati.AMMUKSET = Each AMMUKSET
        MoveObject pati\obj, 6
    Next pati  
    For pati.AMMUKSET = Each AMMUKSET
        If CountCollisions(pati\obj) Then
                DeleteObject pati\obj
                Delete pati
        EndIf
    Next pati 
	If Not zombimäärä=MAX_ZOMBIE Then
		//Zombie-spawning
		en.ZOMBI = New(ZOMBI)
		en\vihu = CloneObject(zom)
		zombimäärä=zombimäärä+1
		For y=1 To MapHeight()
		For x=1 To MapWidth()
			If GetMap2(3,x,y)=4 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
		Next x
		Next y
		SetupCollision en\vihu,guy,2,2,1
		SetupCollision en\vihu,map,2,4,2
		ShowObject en\vihu,ON
		MoveObject en\vihu,20
	EndIf 
    Text 300,400,"AMMO: "+ammo+"\"+ammoreppu
	Text 300,430,"Zombimäärä: "+zombimäärä
    If KeyHit(cbkeyr) And ammo=0 And ammoreppu > 6 Then 
        ammo=6
        ammoreppu=ammoreppu-6
    ElseIf KeyHit(cbkeyr) And ammoreppu < 6 Then
        //PlaySound ammoLopussa
    EndIf
	
			For vihu1.ZOMBI = Each ZOMBI
		If Distance2(vihu1\vihu, guy) < 1000 Then
			distanceX = ObjectX(vihu1\vihu) - ObjectX(guy)
			distanceY = ObjectY(vihu1\vihu) - ObjectY(guy)
		
			Box 500 + 20 / 2 + distanceX * 0.1, 0 + 20 / 2 + distanceY * -0.1, 2, 2
		EndIf
	Next vihu1
	
    DrawScreen 
    
Until EscapeKey()

Function TileToWorldX(tx,map)
    Return tx * 32 -ObjectSizeX(map) / 2
EndFunction

Function TileToWorldY(ty, map)
    Return -(ty * 32 - ObjectSizeY(map) / 2)
EndFunction 
[/edit]

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 7:41 pm
by Jonez
Cb:n törmäyksentunnistus tapahtuu hieman oudosti. Yritän tässä selittää sitä:

Sinulla oli vihu -> guy -suuntainen törmäys. Se tarkoittaa, että jos vihu liikkuu pelaajaa päin, tapahtuu törmäys. Eli jos vihu on paikallaan, ei törmäystä voi tapahtua. Joudut tämän lisäksi tekemään myös guy -> vihu-suuntaisen törmäyksen, eli jos myös pelaaja liikkuu vihua päin, tapahtuu törmäys.

Nyt jos molemminpuolinen törmäyksentarkistus on olemassa, ja molemmat liikuvat toisiaan kohti, voittaa toinen törmäys. Eli toinen objekti työntää toisen pois tieltään. Työntäjällä on "suurempi prioriteetti". Suurempi prioriteetti on sillä törmäystarkistuksella, joka on asetettu viimesimpänä. Eli siis jos on asetettu vihu -> guy-törmäys, sekä guy -> vihu-törmäys tässä järjestyksessä, voittaa guy -> vihu, ja guy työntää vihua pois.

Tässä tulee ongelma jos on kolmas törmäysosapuoli, yleensä kartta. Jos kartan prioriteetti ei ole suurin, työnnetään toinen objekteista kartan yli (jonkun objekteista täytyy antaa periksi). Eli aseta ukkojen ja kartan välinen törmäys vikaksi, niin saat kartan prioriteetin suurimmaksi. Huomaa että et voi asettaa törmäystä map -> ukko, se pitää aina olla ukko -> map-puolinen.

Lisäksi, kannattaa asettaa tällaisissa tapauksissa törmäyksestä liukuva (2, 2, 2). Se on tietääkseni vähemmän buginen.

Aseta seuraavat törmäysytarkistukset rivien 98 ja 99 törmäyksentunnistuten tilalle.

Code: Select all

    //Asetetaan vihu -> ukko -törmäys (pienin prioriteetti)
    SetupCollision  en\vihu, guy,2,2,2
      
    //Asetetaan ukko -> vihu -törmäys (suurempi prioriteetti. Nyt jos molemmat kävelevät toisiaan päin, ukon
    //liike voittaa, eli ukko voi työntää vihuja)
    SetupCollision guy, en\vihu,2,2,2

    //Asetetaan vihu -> map -törmäys. Suurin prioriteetti, eli jos tulee vihun, pelaajan ja mapin yhteinen törmäys,
    //mappi ei ainakaan "anna periksi", eli mikään näistä objekteista ei voi nyt liukua mapin hit-kohdan yli.
    SetupCollision en\vihu,map,2,4,2
    
   //Asetetaan pelaajan törmäys karttaan uudelleen. Tämä on sinänsä turha, koska ukkoon ei kohdistu yhtäkään sitä suuremman
    //prioriteetin törmäystä, eli ukkoa ei voi työntää kartan hit-kohtien yli vaikka tätä ei uudelleen asetettaisikaan.
    //Kuitenkin parempi tehdä varman päälle.
    SetupCollision guy, map, 2, 4, 2
Tässä vielä koko toimiva koodi, jossa on testimielessä asetettu zombeille liike ukkoa kohti.

Code: Select all

Type AMMUKSET
    Field obj
End Type 
Type ZOMBI
    Field vihu As Integer 
EndType

//PlaySound "Media\SK_Battle2.mp3"

//ammoLopussa = LoadSound("Media\gong.wav")
//ampuu = LoadSound("Media\Machine gun 1.wav")

FrameLimit 40 //Sets FPS-limiting to about 40

SCREEN 800,600,0,1 //Set screen

Const MAX_ZOMBIE = 2

ammo=6

ammoreppu=34

zombimäärä=0

//hela= LoadObject("Media\hela.bmp")

map= LoadMap("Media\m1.til","Media\tileset.bmp")
PlayObject map,0,0,0.5

guy= LoadObject("media\mie.bmp",72)
SetupCollision guy,map,2,4,2

zom= LoadObject("Media\zombi.bmp")
ShowObject zom,OFF 

ammus = LoadObject("Media\fireball.bmp")
ShowObject ammus,OFF 

elämä=LoadImage("Media\life.jpg")
hp=100

ws = MakeImage(400,300) //Make screen to view into gameworld

For y=1 To MapHeight()
For x=1 To MapWidth()
    If GetMap2(3,x,y)=1 Then PositionObject guy,TileToWorldX(x,map),TileToWorldY(y, map)
    If GetMap2(3,x,y)=1 Then PositionObject ammus,ObjectX(guy),ObjectY(guy)
Next x
Next y

Repeat
    If LeftKey() Then TurnObject guy,5
    If RightKey() Then TurnObject guy, -5
    If UpKey() Then MoveObject guy,4
    If DownKey() Then MoveObject guy, -4
    DrawToImage ws //Draws world into image
        UpdateGame 
        Cls
        PositionCamera ObjectX( guy ) + ScreenWidth() / 2 - 400 / 2, ObjectY( guy ) - ScreenHeight() / 2 + 300 / 2
        DrawGame
    DrawToScreen 
    
    DrawImage ws,0,0
    If KeyDown(57) And ammo>0 Then
        pati.AMMUKSET = New (AMMUKSET)
        pati\obj = CloneObject (ammus)
        ammo=ammo-1
        //PlaySound ampuu
        'Asetetaan patin törmäys kenttää
    
        'Aseta pati samaan paikkaan missä pelaaja on
        CloneObjectPosition pati\obj, guy
        CloneObjectOrientation pati\obj, guy
        ShowObject pati\obj, ON
        SetupCollision pati\obj, map, 2, 4, 1
        ResetObjectCollision pati\obj
    EndIf 

    For pati.AMMUKSET = Each AMMUKSET
        MoveObject pati\obj, 6
    Next pati  
    For pati.AMMUKSET = Each AMMUKSET
        If CountCollisions(pati\obj) Then
                DeleteObject pati\obj
                Delete pati
        EndIf
    Next pati 
   If Not zombimäärä=MAX_ZOMBIE Then
      //Zombie-spawning
      en.ZOMBI = New(ZOMBI)
      en\vihu = CloneObject(zom)
      zombimäärä=zombimäärä+1
      For y=1 To MapHeight()
      For x=1 To MapWidth()
         If GetMap2(3,x,y)=4 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
      Next x
      Next y
      

    //Asetetaan vihu -> ukko -törmäys (pienin prioriteetti)
    SetupCollision  en\vihu, guy,2,2,2
      
    //Asetetaan ukko -> vihu -törmäys (suurempi prioriteetti. Nyt jos molemmat kävelevät toisiaan päin, ukon
    //liike voittaa, eli ukko voi työntää vihuja)
    SetupCollision guy, en\vihu,2,2,2

    //Asetetaan vihu -> map -törmäys. Suurin prioriteetti, eli jos tulee vihun, pelaajan ja mapin yhteinen törmäys,
    //mappi ei ainakaan "anna periksi", eli mikään näistä objekteista ei voi nyt liukua mapin hit-kohdan yli.
    SetupCollision en\vihu, map,2,4,2
    
   //Asetetaan pelaajan törmäys karttaan uudelleen. Tämä on sinänsä turha, koska ukkoon ei kohdistu yhtäkään sitä suuremman
    //prioriteetin törmäystä, eli ukkoa ei voi työntää kartan hit-kohtien yli vaikka tätä ei uudelleen asetettaisikaan.
    //Kuitenkin parempi tehdä varman päälle.
    SetupCollision guy, map, 2, 4, 2
    
      ShowObject en\vihu,ON
      MoveObject en\vihu,20
   EndIf 
    Text 300,400,"AMMO: "+ammo+"\"+ammoreppu
   Text 300,430,"Zombimäärä: "+zombimäärä
    If KeyHit(cbkeyr) And ammo=0 And ammoreppu > 6 Then 
        ammo=6
        ammoreppu=ammoreppu-6
    ElseIf KeyHit(cbkeyr) And ammoreppu < 6 Then
        //PlaySound ammoLopussa
    EndIf
   
         For vihu1.ZOMBI = Each ZOMBI
      If Distance2(vihu1\vihu, guy) < 1000 Then
         distanceX = ObjectX(vihu1\vihu) - ObjectX(guy)
         distanceY = ObjectY(vihu1\vihu) - ObjectY(guy)
         
         PointObject vihu1\vihu, guy
         MoveObject vihu1\vihu, 3
         
         Box 500 + 20 / 2 + distanceX * 0.1, 0 + 20 / 2 + distanceY * -0.1, 2, 2
      EndIf
   Next vihu1
   
    DrawScreen 
    
Until EscapeKey()

Function TileToWorldX(tx,map)
    Return tx * 32 -ObjectSizeX(map) / 2
EndFunction

Function TileToWorldY(ty, map)
    Return -(ty * 32 - ObjectSizeY(map) / 2)
EndFunction

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 8:46 pm
by skorpioni-cb
Jonez wrote:Liian pitkä teksti...
Kiitos Jonez mulla on ongelma, taas kerran, oikeestaan 2 kpl kysymyksiä:
1) Kun mulla tulee näihin mappeihin useita samantunnisteisia data-arvoja, niin miten voin ottaa niiden kaikkien samantyyppisten data-arvojen tilekoordinaatit esim. taulukoon, jotta ei tartte miettiä, miksi vain yhdessä kymmenestä ammuslaatikkospawnista vain yhteen niistä spawnaa ne ammuslaatikot.

2)Minä tein zombien-spawnaamiskoodiin muutosta niin, että jos yhtään zombia ei ole tapettu, tai viime tappamisesta on mennyt 13 sekunttia, niin tulee uusi zombi, mutta tämä koodi bugaa niin, että kun yksi on tapettu, niin niitä alkaa spawnata helvetisti, tässä if-lause, josta luulen bugin johtuvan:

Code: Select all

   If (Not zombimäärä=MAX_ZOMBIE And Timer()>kuolespawn+13000)Or (zombimäärä<MAX_ZOMBIE And kuolespawn=0)
Ja tässä koko muokattu koodi:

Code: Select all

Type AMMUKSET
    Field obj
End Type 
Type ZOMBI
    Field vihu As Integer 
	Field hela As Integer
EndType

//PlaySound "Media\SK_Battle2.mp3"

//ammoLopussa = LoadSound("Media\gong.wav")
//ampuu = LoadSound("Media\Machine gun 1.wav")

FrameLimit 40 //Sets FPS-limiting to about 40

SCREEN 800,600,0,1 //Set screen

Const MAX_ZOMBIE = 2

ammo=6

ammoreppu=34

zombimäärä=0

kuolespawn=0

hela= LoadObject("Media\hela.bmp")

map= LoadMap("Media\m1.til","Media\tileset.bmp")
PlayObject map,0,0,0.5

guy= LoadObject("media\mie.bmp",72)
SetupCollision guy,map,2,4,2

zom= LoadObject("Media\zombi.bmp")
ShowObject zom,OFF 

ammus = LoadObject("Media\fireball.bmp")
ShowObject ammus,OFF 

elämä=LoadImage("Media\life.jpg")
hp=100

ws = MakeImage(400,300) //Make screen to view into gameworld

For y=1 To MapHeight()
For x=1 To MapWidth()
    If GetMap2(3,x,y)=1 Then PositionObject guy,TileToWorldX(x,map),TileToWorldY(y, map)
    If GetMap2(3,x,y)=1 Then PositionObject ammus,ObjectX(guy),ObjectY(guy)
Next x
Next y

Repeat
    If LeftKey() Then TurnObject guy,5
    If RightKey() Then TurnObject guy, -5
    If UpKey() Then MoveObject guy,4
    If DownKey() Then MoveObject guy, -4
    DrawToImage ws //Draws world into image
        UpdateGame 
        Cls
        PositionCamera ObjectX( guy ) + ScreenWidth() / 2 - 400 / 2, ObjectY( guy ) - ScreenHeight() / 2 + 300 / 2
        DrawGame
    DrawToScreen 
    
    DrawImage ws,0,0
    If KeyDown(57) And ammo>0 Then
        pati.AMMUKSET = New (AMMUKSET)
        pati\obj = CloneObject (ammus)
        ammo=ammo-1
        //PlaySound ampuu
        'Asetetaan patin törmäys kenttää
    
        'Aseta pati samaan paikkaan missä pelaaja on
        CloneObjectPosition pati\obj, guy
        CloneObjectOrientation pati\obj, guy
        ShowObject pati\obj, ON
        SetupCollision pati\obj, map, 2, 4, 1
        ResetObjectCollision pati\obj
    EndIf 

    For pati.AMMUKSET = Each AMMUKSET
        MoveObject pati\obj, 6
    Next pati  
    For pati.AMMUKSET = Each AMMUKSET
        If CountCollisions(pati\obj) Then
                DeleteObject pati\obj
                Delete pati
        EndIf
    Next pati 
   If (Not zombimäärä=MAX_ZOMBIE And Timer()>kuolespawn+13000)Or (zombimäärä<MAX_ZOMBIE And kuolespawn=0)  Then
      //Zombie-spawning
      en.ZOMBI = New(ZOMBI)
      en\vihu = CloneObject(zom)
	  en\hela = 100
      zombimäärä=zombimäärä+1
      For y=1 To MapHeight()
      For x=1 To MapWidth()
         If GetMap2(3,x,y)=4 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
      Next x
      Next y
	SetupCollision guy,en\vihu,2,2,1
	SetupCollision en\vihu,guy,2,2,1     
	SetupCollision en\vihu,map,2,4,2   
	ShowObject en\vihu,ON
	MoveObject en\vihu,20
   EndIf 
    Text 300,400,"AMMO: "+ammo+"\"+ammoreppu
   Text 300,430,"Zombimäärä: "+zombimäärä
    If KeyHit(cbkeyr) And ammo=0 And ammoreppu > 6 Then 
        ammo=6
        ammoreppu=ammoreppu-6
    ElseIf KeyHit(cbkeyr) And ammoreppu < 6 Then
        //PlaySound ammoLopussa
    EndIf
	For vihu.ZOMBI = Each ZOMBI
		If Distance2(vihu\vihu,guy)=<50.0 Then
			PointObject vihu\vihu,guy
			MoveObject vihu\vihu,2
		Else
			MoveObject vihu\vihu,Rand(-2,2)
			TurnObject vihu\vihu,Rnd(-1.0,1.0)
		EndIf
		For pati.AMMUKSET = Each AMMUKSET
			If ObjectsOverlap(vihu\vihu,pati\obj) Then
				DeleteObject pati\obj
				Delete pati
				vihu\hela= vihu\hela-20
			EndIf
		Next pati
		If vihu\hela = 0 Then
			DeleteObject vihu\vihu
			Delete vihu
			zombimäärä=zombimäärä-1
			kuolespawn=Timer()
		EndIf
	Next vihu
   
         For vihu1.ZOMBI = Each ZOMBI
      If Distance2(vihu1\vihu, guy) < 1000 Then
         distanceX = ObjectX(vihu1\vihu) - ObjectX(guy)
         distanceY = ObjectY(vihu1\vihu) - ObjectY(guy)
      
         Box 500 + 20 / 2 + distanceX * 0.1, 0 + 20 / 2 + distanceY * -0.1, 2, 2
      EndIf
   Next vihu1
   
    DrawScreen 
    
Until EscapeKey()

Function TileToWorldX(tx,map)
    Return tx * 32 -ObjectSizeX(map) / 2
EndFunction

Function TileToWorldY(ty, map)
    Return -(ty * 32 - ObjectSizeY(map) / 2)
EndFunction
Kun näihin on vastattu, tämä alkaa olla jo julkaisukunnossa :P

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 14, 2012 9:31 pm
by Jonez
Kysymys1:
Käy kartta pelin alussa läpi (For x = 1 to MapWidth() ... y to mapHeight), tarkasta onko datakerros (GetMap2(x, y, 3)) haluttu, ja lisää tämä tieto vaikka kaksiulotteiseen taulukkoon, jossa ensimmäinen ulottuvuuteen tulee x-koordinaatti, ja toiseen ulottuvuuteen y-koordinaatti. Jos et tiedä entuudestaan kuinka monta data-kerrosta kartasta löytyy, kannattaa tehdä tämä tyypeillä.

Code: Select all

Dim spawnipaikat(paikkamaara, 1)

//seuraava asettaa koordinaatit 1, 1 taulukon ensimmäiseen soluun
spawnipaikat(0, 0) = 1
spawnipaikat(0, 1) = 1
Kysymys 2:
Ilman koodia katsomatta, unohdat varmaan nollata ajastimen joka laskee kuinka kauan viime zombin tappamisesta on kulunut.

Code: Select all

If zombi_tapetaan
    zombi_spawn_aika = Timer()
EndIf

If Timer() - zombi_spawn_aika > 13000 And zombimaara < MAX_ZOMBIE Then
    zombi_spawn_aika = Timer() //<-tämä nollaa timerin, jotta uusi zombi tulee taas 13 sekunnin kuluttua
    uusiZombi()
EndIf
Edit. Laitoin zombi-spawnerin koodin huomioimaan myös maksimizombimäärän.

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 9:28 am
by Konstaduck
Olen tässä taas mietiskellyt syvällisiä, ja yksi, mikä jäi kiusaamaan on animaatio avatarissa.

Kokeilin haulla etsiä, mutta löytyi vaan sen avatarin muilta sivuilta lataamis estojuttui jne jne.

Eli miten saisin animaation avatariini? Meneekö se samalla tavalla, kuin tuo CB:n animaatiokuva?

vastauksia odotellen, Konstaduck

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 9:41 am
by Latexi95
Konstaduck wrote:Olen tässä taas mietiskellyt syvällisiä, ja yksi, mikä jäi kiusaamaan on animaatio avatarissa.

Kokeilin haulla etsiä, mutta löytyi vaan sen avatarin muilta sivuilta lataamis estojuttui jne jne.

Eli miten saisin animaation avatariini? Meneekö se samalla tavalla, kuin tuo CB:n animaatiokuva?

vastauksia odotellen, Konstaduck
Laitoin kyllä tämän vastauksen jo offtopiciin, mutta ilmeisesti se meni sinulta ohi.

Sinun pitää tehdä gif-kuva, siihen saat laitettua animaation. Sitten vaan laitat sen samanlailla avatariksesi kuin tavallisenkin kuvan.