Page 26 of 154

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 5:02 pm
by jelppiä
:shock:

Mikä olisi kätevin tapa toteuttaa pelin yksinkertainen "runko", jossa valikosta siirrytään vaikkapa alkuesitykseen, ja siitä itse peliin..?
Kannattaisiko eri osa-alueet laittaa kylmästi funktioihin (tyyliin Valikko(), Peli() ), ja kutsua ne erikseen pääsilmukassa?

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 5:25 pm
by Koodiapina
jelppiä wrote::shock: Mikä olisi kätevin tapa toteuttaa pelin yksinkertainen "runko", jossa valikosta siirrytään vaikkapa alkuesitykseen, ja siitä itse peliin..? Kannattaisiko eri osa-alueet laittaa kylmästi funktioihin (tyyliin Valikko(), Peli() ), ja kutsua ne erikseen pääsilmukassa?
Ehkä jollain muulla kielellä, mutta ei Coolbasicilla, koska siinä on 126:n funktion rajoitus. Eli kannattaa säästellä niiden tekoa, varsinkin jos on iso projekti tulossa. Goto / gosub voisi olla hyvä korvike.

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 5:30 pm
by Marcoder
Grandi wrote:Ehkä jollain muulla kielellä, mutta ei Coolbasicilla, koska siinä on 126:n funktion rajoitus. Eli kannattaa säästellä niiden tekoa, varsinkin jos on iso projekti tulossa. Goto / gosub voisi olla hyvä korvike.
Funktiorajoitus on kyllä kiusallisen pieni mutta eipä pelin runko montakaan funkkaria vaadi. Goto ja Gosubit kannattaa unohtaa heti alkuunsa.

Seuraavassa malli erittäin yksinkertaisesta pelirungosta. Heti voidaan havaita että pelin eri osaset kuten valikko ja itse peli jne ovat selkeästi toisistaan erillään ja siten ylläpito on huomattavasti helpompaa.

Code: Select all

SAFEEXIT OFF

Intro()
Menu()

Function Intro()
    ClearKeys()
    startTime = Timer()
    Repeat
        Text 0, 0, "Intro..."
        DrawScreen
    Until KeyHit(cbKeyEsc) Or startTime + 2000 < Timer()
    ClearKeys()
EndFunction


Function Menu()
    ClearKeys()
    Repeat
        Text 0, 0, "Päävalikko"
        Text 0, 20, "1 = Pelaa"
        Text 0, 35, "2 = Asetukset"
        Text 0, 50, "0 = Lopeta"
        DrawScreen
        If KeyHit(cbKey1) Then Game()
        If KeyHit(cbKey2) Then Settings()
    Until KeyHit(cbKeyEsc) Or KeyHit(cbKey0)
    ClearKeys()
EndFunction


Function Settings()
    ClearKeys()
    Repeat
        Text 0, 0, "--- A S E T U K S E T ---"
        Text 0, 20, "Esc = Paluu"
        DrawScreen
    Until KeyHit(cbKeyEsc)
    ClearKeys()
EndFunction


Function Game()
    ClearKeys()
    Repeat
        Text 0, 0, "Tässä pelataan..."
        Text 0, 20, "Esc = Lopeta"
        DrawScreen
    Until KeyHit(cbKeyEsc)
    ClearKeys()
EndFunction

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 5:39 pm
by jelppiä
Hienoo! :P
Kiitos() kummallekin.

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 6:47 pm
by M.R
Minulla tulee mav kun yritän poistaa muistipalan.Ja koodin tarkoitus selviää kun katsot tämän topickin:viewtopic.php?f=12&t=500

Code: Select all

Type MTM2Map
Field Map
Field DataLayer1
Field DataLayer2
Field DataLayer3
Field DataLayer4
EndType

testi=MakeMTM2Map(100,100,25,25)
SetMTM2MapDataLayer(testi,1,1,1,60)
Print GetMTM2MapDataLayer(testi,1,1,1)
DeleteMTM2Map(testi)
WaitKey

Function LoadMTM2Map(mapf$,tileset$)
Errors OFF
file=OpenToRead(mapf$)
If file=0 Then MakeError "Can't load MTM2 map.Can't open map:"+Chr(13)+Chr(10)+mapf$
Errors ON
w=ReadInt(file)
h=ReadInt(file)
tw=ReadShort(file)
th=ReadShort(file)
map=MakeMap(w,h,tw,th)

For l=0 To 3
For y=1 To h
For x=1 To w
EditMap map,l,x,y,ReadByte(file)
Next x
Next y
Next l


PaintObject map,LoadImage(tileset$)

nmap.MTM2Map=New(MTM2Map)
nmap\Map=map

nmap\DataLayer1=MakeMEMBlock(2*(w*h))
For y=0 To h
For x=0 To w
pos=0
pos=pos+(h*y)
pos+x
pos=pos*2
PokeShort nmap\DataLayer1,pos,ReadShort(file)
Next x
Next y

nmap\DataLayer2=MakeMEMBlock(2*(w*h))
For y=0 To h
For x=0 To w
pos=0
pos=pos+(h*y)
pos+x
pos=pos*2
PokeShort nmap\DataLayer2,pos,ReadShort(file)
Next x
Next y

nmap\DataLayer3=MakeMEMBlock(2*(w*h))
For y=0 To h
For x=0 To w
pos=0
pos=pos+(h*y)
pos+x
pos=pos*2
PokeShort nmap\DataLayer3,pos,ReadShort(file)
Next x
Next y

nmap\DataLayer4=MakeMEMBlock(2*(w*h))
For y=0 To h
For x=0 To w
pos=0
pos=pos+(h*y)
pos+x
pos=pos*2
PokeShort nmap\DataLayer4,pos,ReadShort(file)
Next x
Next y

CloseFile file
Return ConvertToInteger(nmap)
EndFunction

Function GetMTM2TilMap(map)
gmap.MTM2Map=ConvertToType(map)
Return gmap\Map
EndFunction


Function GetMTM2MapDataLayer(map,dlayer,x,y)
gmap.MTM2Map=ConvertToType(map)
pos=0
pos=pos+(y*MapWidth())
pos+x
pos=pos*2
If dlayer=1 Then layer=gmap\DataLayer1
If dlayer=2 Then layer=gmap\DataLayer2
If dlayer=3 Then layer=gmap\DataLayer3
If dlayer=4 Then layer=gmap\DataLayer4
Return PeekShort(layer,pos)
EndFunction

Function SetMTM2MapDataLayer(map,dlayer,x,y,_data)
gmap.MTM2Map=ConvertToType(map)
pos=0
pos=pos+(y*MapWidth())
pos+x
pos=pos*2
If dlayer=1 Then layer=gmap\DataLayer1
If dlayer=2 Then layer=gmap\DataLayer2
If dlayer=3 Then layer=gmap\DataLayer3
If dlayer=4 Then layer=gmap\DataLayer4
PokeShort layer,pos,_data
EndFunction

Function DeleteMTM2Map(map)
dmap.MTM2Map=ConvertToType(map)
DeleteObject dmap\Map
DeleteMEMBlock dmap\DataLayer1
DeleteMEMBlock dmap\DataLayer2
DeleteMEMBlock dmap\DataLayer3
DeleteMEMBlock dmap\DataLayer4
Delete dmap
EndFunction

Function SaveMTM2Map(mapp,mapfile$)
smap.MTM2Map=ConvertToType(mapp)
map=smap\Map
file=OpenToWrite(mapfile$)
WriteInt file,MapWidth()
WriteInt file,MapHeight()
WriteShort file,ObjectSizeX(map)/MapWidth()
WriteShort file,ObjectSizeY(map)/MapHeight()

For l=0 To 3
For y=1 To MapHeight()
For x=1 To MapWidth()
WriteByte file,GetMap2(l,x,y)
Next x
Next y
Next l

For l=1 To 4
For y=0 To MapHeight()
For x=0 To MapWidth()
WriteShort file,GetMTM2MapDataLayer(map,l,x,y)
Next x
Next y
Next l

CloseFile file
EndFunction


Function MakeMTM2Map(w,h,tw,th)
nmap.MTM2Map=New(MTM2Map)
nmap\Map=MakeMap(w,h,tw,th)
nmap\DataLayer1=MakeMEMBlock(2*(w*h))
nmap\DataLayer2=MakeMEMBlock(2*(w*h))
nmap\DataLayer3=MakeMEMBlock(2*(w*h))
nmap\DataLayer4=MakeMEMBlock(2*(w*h))
mappi=ConvertToInteger(nmap)

For l=1 To 4
For y=0 To h
For x=0 To w
SetMTM2MapDataLayer(mappi,l,x,y,0)
Next x
Next y
Next l

Return mappi
EndFunction

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 8:03 pm
by simo simpanssi
Tätä on varmaan kysytty tässä ketjussa varmaan miljoona kertaa, mutta en jaksanu käydä kun yheksän sivullista läpi,(eikä vastausta löytynyt) joten kysyn nyt(taas):
miten saa räiskintäpeliin luotua heltit type vihulle? vastaus esimerkin kanssa, kiitos.

Re: Tyhmät kysymykset

Posted: Wed Jan 23, 2008 8:17 pm
by Mysterius Coder
Kehotan opettelemaan itse. Se on ainoa tapa voi saada pelin valmiiksi.
http://www.coolbasic.com/oldforums/inde ... type++tuto
Siinä on ainakin yksi type tuto. Taisi olla muutamia muitakin jossain netin kätköissä...

Re: Tyhmät kysymykset

Posted: Thu Jan 24, 2008 7:43 pm
by BulletStorm
Elikkä. Olen nyt löytänyt juuri sopivan keinon tehdä tekoälyn BulletStormiin, nimittäin SDK:n ObjectVisionin. Ongelmana on se, että koodi ei suostu jostain syystä toimimaan. Tässä pieni koodinpätkä siitä, mistä aloitin:

Code: Select all

    If ObjectVision (vihu, pelaaja, 90, 500) Then
       MoveObject vihu, 2.5
       //Tähän tulee ampuminen
    EndIf
Kellään sattuisi olemaan kokemusta kyseisestä funkkarista?

E: Eli vihu ei liiku, vaikka ukko 'pomppisi' sen edessä.

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 9:05 am
by Jonez
BulletStorm: Tossa SDK:n ObjectVisionissa näyttäisi olevan bugi, jonka takia se ei havaitse tietyn kulman yli. Tietenkin voi olla myös mahdollista että toi sun
ongelma johtuu jostain muusta osasta koodia.

Tein kuitenkin oman ObjectVision-funkkarin, jonka pitäisi toimia.
Tämä esimerkkikoodi on hiukan muokattu versio tosta SDK:n ObjectVisionin esimerkkikoodista.

Code: Select all

FrameLimit 40

'Tee pelimaailma
ruoho = MakeObjectFloor ()
nurmikko = LoadImage ("Media\grass.bmp")
PaintObject ruoho, nurmikko

ukko1 = LoadObject ("Media\guy.bmp",72)
vihu = LoadObject ("Media\guy.bmp",72)

'Pyöritä ukot alkuasentoon
RotateObject ukko1,0
RotateObject vihu,180-45

'Aseta ukot alkupaikkoihin
PositionObject ukko1,-150,100
PositionObject vihu,50,-50


Repeat
    
    'Ukon 1 ohjaus
    If LeftKey() Then TurnObject ukko1,5
    If RightKey() Then TurnObject ukko1,-5
    If UpKey() Then MoveObject ukko1,5
    If DownKey() Then MoveObject ukko1,-5
 
    DrawGame
    
    If ObjectVision(vihu,ukko1, 90, 500) Then 
        PointObject vihu, ukko1
        MoveObject vihu, 2
        Color cbRed: Text 10,10,"NÄKEE!"
    EndIf
    
    DrawScreen
Forever

// Tarkastaa onko objekti toisen objektin näkökentässä
Function ObjectVision( _obj, _obj2, _fov = 90, _dist = 1000 )
    If Distance2( _obj, _obj2 ) < _dist And ObjectSight( _obj, _obj2 ) Then
        _angle = WrapAngle( ( GetAngle2( _obj, _obj2 ) - ObjectAngle( _obj ) ) )
        _sight = _fov / 2
      
        If _angle < _sight Or _angle > 360 - _sight Then
            Return True
        EndIf  
    EndIf
End Function

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 12:52 pm
by Pate5
simo simpanssi wrote:Tätä on varmaan kysytty tässä ketjussa varmaan miljoona kertaa, mutta en jaksanu käydä kun yheksän sivullista läpi,(eikä vastausta löytynyt) joten kysyn nyt(taas):
miten saa räiskintäpeliin luotua heltit type vihulle? vastaus esimerkin kanssa, kiitos.
Kun luot tyypin näin...

Code: Select all

Type vihut
Field obj
EndType
...niin lisäät vain yksinkertaisesti uuden fieldin, johon tallennat vastustajan healthin.

Näin:

Code: Select all

Type vihut
Field obj
Field enu
EndType
Kun luot uuden vastustajan, niin muutat heltin:

Code: Select all

vihu\enu=5
Jos vastustajaan osuu, helttiä vähennetään. Jos heltti menee nollaan, vastustaja kuolee. Valmista esimerkkiä en nyt anna.

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 3:38 pm
by BulletStorm
Jonez wrote:BulletStorm: Tossa SDK:n ObjectVisionissa näyttäisi olevan bugi, jonka takia se ei havaitse tietyn kulman yli. Tietenkin voi olla myös mahdollista että toi sun
ongelma johtuu jostain muusta osasta koodia.

Tein kuitenkin oman ObjectVision-funkkarin, jonka pitäisi toimia.
Tämä esimerkkikoodi on hiukan muokattu versio tosta SDK:n ObjectVisionin esimerkkikoodista.

Code: Select all

FrameLimit 40

'Tee pelimaailma
ruoho = MakeObjectFloor ()
nurmikko = LoadImage ("Media\grass.bmp")
PaintObject ruoho, nurmikko

ukko1 = LoadObject ("Media\guy.bmp",72)
vihu = LoadObject ("Media\guy.bmp",72)

'Pyöritä ukot alkuasentoon
RotateObject ukko1,0
RotateObject vihu,180-45

'Aseta ukot alkupaikkoihin
PositionObject ukko1,-150,100
PositionObject vihu,50,-50


Repeat
    
    'Ukon 1 ohjaus
    If LeftKey() Then TurnObject ukko1,5
    If RightKey() Then TurnObject ukko1,-5
    If UpKey() Then MoveObject ukko1,5
    If DownKey() Then MoveObject ukko1,-5
 
    DrawGame
    
    If ObjectVision(vihu,ukko1, 90, 500) Then 
        PointObject vihu, ukko1
        MoveObject vihu, 2
        Color cbRed: Text 10,10,"NÄKEE!"
    EndIf
    
    DrawScreen
Forever

// Tarkastaa onko objekti toisen objektin näkökentässä
Function ObjectVision( _obj, _obj2, _fov = 90, _dist = 1000 )
    If Distance2( _obj, _obj2 ) < _dist And ObjectSight( _obj, _obj2 ) Then
        _angle = WrapAngle( ( GetAngle2( _obj, _obj2 ) - ObjectAngle( _obj ) ) )
        _sight = _fov / 2
      
        If _angle < _sight Or _angle > 360 - _sight Then
            Return True
        EndIf  
    EndIf
End Function
Kiitos. Tuo sinun funkkarisi toimi vallan mainiosti ;)

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 8:26 pm
by tuhoojabotti
BulletStorm wrote:Elikkä. Olen nyt löytänyt juuri sopivan keinon tehdä tekoälyn BulletStormiin, nimittäin SDK:n ObjectVisionin. Ongelmana on se, että koodi ei suostu jostain syystä toimimaan. Tässä pieni koodinpätkä siitä, mistä aloitin:

Code: Select all

koodia...
Kellään sattuisi olemaan kokemusta kyseisestä funkkarista?

E: Eli vihu ei liiku, vaikka ukko 'pomppisi' sen edessä.
outoa sillä kyllä se minun pelissäni toimii...

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 10:41 pm
by Guest
Miten saan estettyä kameraa menemästä tiettyjen maailmankoordinaattien ulkopuolelle? (Esim niin, että kameran X-koordinaatit olisivat aina väliltä -500,500)

Re: Tyhmät kysymykset

Posted: Fri Jan 25, 2008 10:57 pm
by Harakka
Guest wrote:Miten saan estettyä kameraa menemästä tiettyjen maailmankoordinaattien ulkopuolelle? (Esim niin, että kameran X-koordinaatit olisivat aina väliltä -500,500)
Jos kameran X on suurempi kuin maksimi-x, kameran x on maksimi-x. Jos kameran X on pienempi kuin minimi-x, kameran x on minimi-x. Samat y-akselilla. Jos osaat, voit tehdä saman myös Min()- ja Max()-lausekkeilla yhdellä rivillä.

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 3:35 am
by Myst!c
Olen yrittänyt opetella input komentoa ja sen saa kirjoittamaani nimeä tallentumaan,
eli siinä lukee: What is your name? Ja alemmas voi kirjoittaa, sitten se pitäisi tallentaa.
Vaikka enteristä. :)

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 3:40 am
by Myst!c
Tuossa on hieman koodia jota olen yrittänyt laittaa, nimi kyllä näkyy,
vilahtaa vain tosin. :S

Code: Select all

Color cbred
SetFont arial
Text 5,0,"What is your name?"
Locate 0,20
            command$=Input(" ")
            If KeyHit (28) Then 
            ClearText 
            text 5,0," Okay your name is " +command$
            EndIf 
EDIT: Anteeksi tuplaposti en huomannut.. Olen vähän väsynyt ehkä pitäisi mennä nukkumaan. ^^

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 7:58 am
by Harakka
Inputti pitää laittaa looppiin.

Code: Select all

Repeat
  Repeat
    nimi$ = input("Nimesi?")
    DrawScreen
  Until Keyhit(cbkeyreturn)
  CloseInput : ClearKeys
  Text 0,0,"Moi, " + nimi$ + "!"
  DrawScreen
  Waitkey
Forever

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 10:54 am
by regalis
Onko mahdollista piirtää DrawGhostImagella johonkin kuvaan, niin että se jäisi siihen?
DrawToImage map
DrawGhostImage light, 10, 10, 0, 50
DrawToScreen
Näin tehdessä kuvaan ei piirretä yhtään mitään (tai ainakaan itse ohjelmassa koordinaateissa 10, 10 ei näy mitään)

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 11:00 am
by koodaaja
Tokihan olet muistanut piirtää ruudun ja kuvan map? Lisäksi, jos kyseinen kuva on liian pieni, ei tuo light mahdu siihen.

Re: Tyhmät kysymykset

Posted: Sat Jan 26, 2008 11:07 am
by regalis
Kyllä, ruutu ja map piirretään. Ja light-kuva on paljon mapia pienempi. Vika taitaa sitten olla jossain muualla koodissa, pitää yrittää löytää se itse...