Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
jelppiä

Re: Tyhmät kysymykset

Post 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?
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post 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.
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: Tyhmät kysymykset

Post 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
jelppiä

Re: Tyhmät kysymykset

Post by jelppiä »

Hienoo! :P
Kiitos() kummallekin.
M.R
Active Member
Posts: 102
Joined: Sat Dec 22, 2007 3:05 pm

Re: Tyhmät kysymykset

Post 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
simo simpanssi
Newcomer
Posts: 6
Joined: Thu Dec 20, 2007 3:49 pm

Re: Tyhmät kysymykset

Post 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.
Mysterius Coder
Active Member
Posts: 133
Joined: Mon Aug 27, 2007 8:13 pm

Re: Tyhmät kysymykset

Post 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ä...
Kyllä minä osaan, mutta kun mieli on tällasen kaaoksen vallassa, niin ei siitä mitään tule.
BulletStorm

Re: Tyhmät kysymykset

Post 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ä.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post 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
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: Tyhmät kysymykset

Post 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.
CoolBasic henkilökuntaa
Graafikko
BulletStorm

Re: Tyhmät kysymykset

Post 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 ;)
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Tyhmät kysymykset

Post 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...
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
Guest

Re: Tyhmät kysymykset

Post by Guest »

Miten saan estettyä kameraa menemästä tiettyjen maailmankoordinaattien ulkopuolelle? (Esim niin, että kameran X-koordinaatit olisivat aina väliltä -500,500)
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post 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ä.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Myst!c
Advanced Member
Posts: 259
Joined: Fri Dec 21, 2007 11:49 am
Location: Kemi

Re: Tyhmät kysymykset

Post 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ä. :)
Every Legend Has A Start!
Myst!c
Advanced Member
Posts: 259
Joined: Fri Dec 21, 2007 11:49 am
Location: Kemi

Re: Tyhmät kysymykset

Post 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. ^^
Every Legend Has A Start!
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post 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
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Tyhmät kysymykset

Post 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)
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja »

Tokihan olet muistanut piirtää ruudun ja kuvan map? Lisäksi, jos kyseinen kuva on liian pieni, ei tuo light mahdu siihen.
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Tyhmät kysymykset

Post 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...
Locked