Tyhmät kysymykset (I/2010)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
Zero
Lead Developer
Lead Developer
Posts: 727
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by Zero »

Silloin kun kirjoitat tiedostoon WriteInt:llä, huomaa että se menee sinne binäärimuodossa. Jos avaat tiedoston tarkasteltavaksi jossain normaalissa tekstieditorissa, kuten Windowsin muistiossa, näet tyhjää (ainakin niissä tapauksissa kun kirjoitettava luku on positiivinen ja lähellä nollaa). Tarkasta tiedostokoko - sen pitäisi olla 8 tavua. Voit tietysti siirtää myös kursorin tiedoston loppuun (esim. muistiossa tarkasteltuna), niin huomaat että sinne on mennyt 8 merkkiä.
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog
lollero1996
Newcomer
Posts: 9
Joined: Mon Oct 04, 2010 7:23 pm

Re: Tyhmät kysymykset (I/2010)

Post by lollero1996 »

Jos joku tuntee marcoderin 3d-talomoottorin, niin:
Saako talon kattoja muutettua läpinäkyviksi lennossa? Siis jos haluaa päästä talon sisään.
Tässä on koodini, miksi se ei muuta kattoa?

Code: Select all

Include "cbMap.cb"
FrameLimit 40
MapLoad("Media\yardmap.til", "Media\tileset.bmp")
player = LoadObject("Media\soldier.bmp", 72)
CameraFollow player, 1, 20
SetupCollision player, gCurrentMap, 2, 4, 2
roof1 = LoadImage ("Media\whitegrid.bmp")
wall= LoadImage ("Media\whitegrid.bmp")
Global kuva
kuva=1
Function Transparentize(img,path$)
    Select kuva
        Case 1
            DeleteImage img
            img = LoadImage ("Media\black.bmp")
            kuva=0
        Case 0
            DeleteImage img
            img = LoadImage (path)
            kuva=1
    End Select
End Function
b1 = CreateBuilding(5,5,0,5,5,5)
SetTexture(b1,TX_ROOF,roof1)
SetTexture(b1,TX_FRONT,wall)
SetTexture(b1,TX_BACK,wall)
SetTexture(b1,TX_LEFT,wall)
SetTexture(b1,TX_RIGHT,wall)
PositionObject player,-100,100
SAFEEXIT OFF
Repeat
    MoveObject player, (UpKey() - DownKey()) * 5
    TurnObject player, (LeftKey() - RightKey()) * 5
    DrawGame
    Draw3DMap()
    If KeyHit(cbKeyspace)Then
        Transparentize(roof1,"Media\whitegrid.bmp")
    EndIf
    DrawScreen
Until EscapeKey()
ReleaseTextures()
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by Herra Siili »

En ole paljon tuota käyttänyt mutta epäilen, että tekstuuri pitää asettaa uudestaan SetTexture():lla tuon Transparentize():n käytön jälkeen.
a.k.a. Gehock
lollero1996
Newcomer
Posts: 9
Joined: Mon Oct 04, 2010 7:23 pm

Re: Tyhmät kysymykset (I/2010)

Post by lollero1996 »

Kiitos! Pitää tosin ratkaista pari muuta ongelmaa, koska seinät ei näy sisältäpäin. :x En varmaan edes tarvitse Transparentizea, kun tuo SetTexture on niin kätevä. :D
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by temu92 »

Koska olen tyhmä enkä itse keksi kunnollista kaavaa laskea koordinaatteja isometrisille tileille niin voiko joku joka on vähän valistuneempi asiasta ohjata oikeeseen suuntaan? Tää oma systeemi kyllä tekee niinkun kuuluu (ainakin suurin piirtein) mutta on tuskin kovin optimaalinen :e

Oma viritelmä:

Code: Select all

xs+x*Cos(60)*w+y*(w/2), ys-x*(h/2)+y*Sin(60)*(h/2+3)
xs = x:n alotuskoordinaatti (nk. anchor)
ys = y:n alotuskoordinaatti
w ja h = tilen leveys ja korkeus

Lisäks musta tuntuu että mun tilejen koko on vähä päin jotakin; tän viritelmän tilet on 78x39, kuitenkin 80x40 tuntuis loogisemmalta. En kuitenkaan saanut sitä oikein toimimaan. Tips?
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset (I/2010)

Post by koodaaja »

temu92 wrote:Koska olen tyhmä enkä itse keksi kunnollista kaavaa laskea koordinaatteja isometrisille tileille niin voiko joku joka on vähän valistuneempi asiasta ohjata oikeeseen suuntaan?

Oma viritelmä:

Code: Select all

xs+x*Cos(60)*w+y*(w/2), ys-x*(h/2)+y*Sin(60)*(h/2+3)
xs = x:n alotuskoordinaatti (nk. anchor)
ys = y:n alotuskoordinaatti
w ja h = tilen leveys ja korkeus

Lisäks musta tuntuu että mun tilejen koko on vähä päin jotakin; tän viritelmän tilet on 78x39, kuitenkin 80x40 tuntuis loogisemmalta. En kuitenkaan saanut sitä oikein toimimaan. Tips?
Itse olen aina käyttänyt tällaista:

Code: Select all

xs-y*h+x*w, ys+(ys*h+xs*w)/2.0
Ja jos haluaa, voi vielä lisätä korkeuselementin vähentämällä tilen korkeuden kertaa korkeuden (mikäli tilesi on korkeampi kuin pelkkä lätty) y-koordinaateista. Tilekooksi käy periaatteessa mikä tahansa, kunhan leveys on korkeuteen nähden kaksinkertainen - tässä pitää jättää tilen itsensä mahdollinen korkeus huomiotta (jos esimerkiksi kuutioista kasailee).
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe »

Tuli tenkkapoo tiedostojen käsittelyssä:

Code: Select all

            f=OpenToRead(filu) // tämä tiedosto on olemassa
            f2=OpenToWrite(filu+".part")
            Repeat
                tl1=ReadString(f)
                If tl1 = "¤" Then
                    temp=ReadInt(f)
                    For i=1 To 8
                        WriteInt f2, temp
                    Next i
                Else
                    WriteString f2, tl1
                EndIf
            Until EOF(f)
Eli mavia heittää. Mikä neuvoksi?
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Tyhmät kysymykset (I/2010)

Post by MetalRain »

Miten olet tallentanut luettavan tiedoston? ReadString ja ReadInt funktiot eivät lue selkokielisiä rivejä vaan niillä luettava data on pitänyt kirjoittaa oikeassa muodossa (esim käyttämällä komentoja WriteString ja WriteInt). Käytä Readline komentoa jos haluat lukea tiedostosta selkokielisiä rivejä.

Esim näin:

Code: Select all

f=OpenToRead(filu) // tämä tiedosto on olemassa
f2=OpenToWrite(filu+".part")
Repeat
    rivi$=Readline(f)
    If left(rivi$,1) = "¤" Then
        temp=int(mid(rivi$,2))
        rivi$=""
        For i=1 To 8
            rivi$=rivi$+str(temp)
        Next i
    EndIf
    Writeline f2, rivi$
Until EOF(f)
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe »

MetalRain wrote:Miten olet tallentanut luettavan tiedoston? ReadString ja ReadInt funktiot eivät lue selkokielisiä rivejä vaan niillä luettava data on pitänyt kirjoittaa oikeassa muodossa (esim käyttämällä komentoja WriteString ja WriteInt). Käytä Readline komentoa jos haluat lukea tiedostosta selkokielisiä rivejä.

Esim näin:

Code: Select all

f=OpenToRead(filu) // tämä tiedosto on olemassa
f2=OpenToWrite(filu+".part")
Repeat
    rivi$=Readline(f)
    If left(rivi$,1) = "¤" Then
        temp=int(mid(rivi$,2))
        rivi$=""
        For i=1 To 8
            rivi$=rivi$+str(temp)
        Next i
    EndIf
    Writeline f2, rivi$
Until EOF(f)
Olen tekemässä tiedostonpakkausohjelmaa, joten tietotyyppi voi olla mikä tahansa. Mitä teen?
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by valscion »

DJ-Filbe wrote:Olen tekemässä tiedostonpakkausohjelmaa, joten tietotyyppi voi olla mikä tahansa. Mitä teen?
Luet ReadInt:llä jokaisen tavun kokonaisluvun erikseen ja niiden arvojen perusteella päättelet jotain. ReadLine-komento kun saattaa kerralla nielaista koko tiedoston sisällön, eikä se välttämättä ole optimaalisin ratkaisu.

Jos et välttämättä tarvitse tavun kokoista palikkaa aina, niin voit myös käyttää funktioita ReadShort ja ReadByte tarpeesi mukaan. ReadByte taitaa olla paras vaihtoehto tiedostonpakkausohjelmalle.

EDIT: Hups. Pikku moka tietotyypeissä :P
Last edited by valscion on Thu Oct 07, 2010 6:50 pm, edited 1 time in total.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 »

VesQ wrote:Jos et välttämättä tarvitse tavun kokoista palikkaa aina, niin voit myös käyttää funktioita ReadShort ja ReadByte tarpeesi mukaan. ReadByte taitaa olla paras vaihtoehto tiedostonpakkausohjelmalle.
Protip: ReadByte lukee tavun.
User avatar
Akuji
Member
Posts: 60
Joined: Fri Oct 08, 2010 5:59 pm
Location: Turku

Re: Tyhmät kysymykset (I/2010)

Post by Akuji »

En löytänyt mistään, joten päädyin kysymään:
eli miten saan peliini semmoisen jutun, että kun on ampunut vihun, niin se ei katoa vaan siihen tulee esim. verta?
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by temu92 »

Yksi keino on PaintObjectilla maalata vihulaisen objekti tyypissä uudelleen veriläiskäksi ja tekoälyn päivityksessä sitten huomioida jos vihulaisen HP on pienempi tai tasan 0 eli älä liikuta tai pistä botteja ampumaan silloin.
User avatar
Akuji
Member
Posts: 60
Joined: Fri Oct 08, 2010 5:59 pm
Location: Turku

Re: Tyhmät kysymykset (I/2010)

Post by Akuji »

Tein niin, mutta ei kuitenkaan onnistunut. Kaikki vihut muuttivat muotoa. :?: Olen varmasti tehnyt jotain väärin. Pystyisitkö laittamaan jotain koodinpätkää tai semmoista?
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by valscion »

Akuji wrote:Tein niin, mutta ei kuitenkaan onnistunut. Kaikki vihut muuttivat muotoa. :?: Olen varmasti tehnyt jotain väärin. Pystyisitkö laittamaan jotain koodinpätkää tai semmoista?
Jos teet viholliset tyypeillä tai taulukoilla ja käytät vihujen luonnissa CloneObject-komentoa, niin muistathan ettet laita PaintObjectilla sen alkuperäisen objektin (josta kaikki kloonit ovat lähtöisin) ulkomuotoa muuksi? Sinun tulee vaihtaa vain sen tietyn kloonin ulkomuotoa sillä PaintObjectilla.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
Akuji
Member
Posts: 60
Joined: Fri Oct 08, 2010 5:59 pm
Location: Turku

Re: Tyhmät kysymykset (I/2010)

Post by Akuji »

En ole oikein tarvinnut PaintObjectia ennen, joten asia ei ole minulle niin tuttu. Komennon sijoittamisen kohdalla on se suurin pulma. Asiaa pitäisi hieman valottaa.
Eli haluan peliini...

-kun ammun vihun, se muuttuu veriläiskäksi, ja silloin siinä ei enää ole törmäystunnistetta, eli toisin sanoen -se ei voi enää vahingoittaa pelaajaa.
-se ei liiku enää sen jälkeen, kun healtti on nolla.

Tämä on pelirunko, joka on hyvin samanlainen kuin omani, joten siihen voi hyvin lisätä.

Code: Select all

SCREEN 800,600,0,1
FrameLimit 40

playerpoints = 0
font = LoadFont("Verdana",32,1,1)
SetFont font

// Luodaan tyyppikokoelma ammuksia varten
Type BULLETS
    Field obj
End Type

// Ladataan media
GoSub LoadMedia

// Määritetään tyyppikokoelma vihollisille ja luodaan pari vihollista
Type ENEMIES
    Field obj
    Field energy
End Type
GoSub MakeEnemies


/////// PÄÄSILMUKKA ///////
Repeat
    GoSub CheckButtons
    GoSub EnemyAI
    GoSub CheckBullets
    GoSub DrawGUI
        
    // Siirretään kameraa pelaajan mukana
    CloneCameraPosition player
    
    // Tarkistetaan onko taustamusiikki pysähtynyt ja käynnistetään tarvittaessa uudelleen
    If SoundPlaying(backgroundmusic) = 0 Then
        backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
    EndIf
    
    DrawScreen 

Until EscapeKey()


/////// ALIOHJELMAT ///////
// Aliohjelma jossa ladataan pelissä tarvittava media
LoadMedia:
    // Ladataan kartta ja animoidaan se
    map = LoadMap("Media\cdm2.til", "Media\Tileset.bmp")
    PlayObject map,0,0,0.5
    
    // Ladataan panosobjektin grafiikat ja piilotetaan objekti
    bulletobject = LoadObject("Media\bullet.bmp", 72)
    ShowObject bulletobject, OFF
    
    // Ladataan pelaaja ja asetetaan törmäyksentunnistus kartan seinien ja pelaaja välille
    player = LoadObject("Media\soldier.bmp", 72)
    SetupCollision player,map,2,4,2
    
    // Ladataan vihollinen ja piilotetaan objekti
    enemyobject = LoadObject("Media\guy.bmp", 72)
    ShowObject enemyobject, OFF
    
    // Ladataan äänet
    backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
    shot = LoadSound("Media\gun 1.wav")
    scream = LoadSound("Media\scream1.wav")
Return

// Aliohjelma joka tarkistaa näppäinpainallukset
CheckButtons:
    If UpKey() Then MoveObject player,4
    If DownKey() Then MoveObject player,-4
    If LeftKey() Then TurnObject player,5
    If RightKey() Then TurnObject player,-5    
    
    // Tarkistetaan painetaanko ampumisnäppäintä ja jos, 
    // niin luodaan ammus ja törmäystunnistus sille
    If KeyHit(cbkeySpace) Then
        PlaySound shot, 40
        blt.BULLETS = New(BULLETS)
        blt\obj = CloneObject(bulletobject)
        CloneObjectPosition blt\obj, player
        CloneObjectOrientation blt\obj, player
        MoveObject blt\obj,15
        SetupCollision blt\obj,map,2,4,1
        ResetObjectCollision blt\obj
    EndIf
Return



// Aliohjelma, jossa tehdään viholliselle alkeellinen tekoäly
EnemyAI:
    For enem.ENEMIES = Each ENEMIES
        // Tarkistetaan näkeekö vihollisobjekti pelaajaobjekti ja
        // jos näkee niin aloitetaan liikuttamaan pelaajaa kohti
        If ObjectSight(enem\obj,player) Then
            PointObject enem\obj, player
            MoveObject enem\obj, 2
        EndIf
    Next enem
Return

// Aliohjelma, jossa läpikäydään ammukset
CheckBullets:
    For blt.BULLETS = Each BULLETS
        MoveObject blt\obj, 10
        For enem.ENEMIES = Each ENEMIES
            // Tarkistetaan osuuko ammus viholliseen
            If ObjectsOverlap(blt\obj, enem\obj, 2) Then
                deleteobj = 1
                enem\energy = enem\energy -20
                playerpoints = playerpoints + 5
            EndIf
        Next enem
        bulcollisions = CountCollisions(blt\obj)
        For i = 1 To bulcollisions
            // Tarkistetaan onko ammus osunut seinään
            If GetCollision(blt\obj, i) > 1 Then deleteobj = 1
        Next i
        If deleteobj = 1 Then
            DeleteObject blt\obj
            Delete blt
            deleteobj = 0
        EndIf
    Next blt
Return

// Aliohjelma jossa piirretään "käyttöliittymä"
DrawGUI:
    DrawGame
    DrawToWorld ON
    // Käydään viholliset läpi
    For enem.ENEMIES = Each ENEMIES
        PosX = ObjectX(enem\obj) - (ObjectSizeX(enem\obj)/2)
        PosY = ObjectY(enem\obj) + ObjectSizeY(enem\obj)
        EnWidth = enem\energy / 3
        Color cbWhite
        Box PosX,PosY,33,6
        Color cbRed
        Box PosX+1,PosY-1,EnWidth-2,4
        If enem\energy <= 0 Then
            // Jos energia nollassa, niin toistetaan huuto ja poistetaan vihollistyyppi
            PlaySound scream,40
            DeleteObject enem\obj
            Delete enem
        EndIf
    Next enem
    DrawToWorld OFF
    
    // Kirjoitetaan pisteet näytölle (ensimmäinen on varjostus)
    Color cbBlack : Text 12,12, playerpoints
    Color cbWhite : Text 10,10, playerpoints
Return

// Aliohjelma, jossa määritetään kaksi vihollista ja niiden energia
MakeEnemies:
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,-500
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,500
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,-800
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,800
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
    
Return
koodaus 600

Re: Tyhmät kysymykset (I/2010)

Post by koodaus 600 »

kattokaa nää koodinpätkät
repeattia ennen

Code: Select all

Type objects
Field obj

End Type
repeatin jälkeen

Code: Select all

  For vahingoittaja.objects  = Each objects
    If ObjectsOverlap (vahingoittaja\obj,pelihahmo) Then
    hp=hp-1
    
    EndIf 

    Next vahingoittaja
    
    For voimistaja.objects  = Each objects
    If ObjectsOverlap (voimistaja\obj,pelihahmo) Then
    voimat=voimat+1
    
    EndIf 

    Next voimistaja 
ja nyt on ongelmana et jos oon vahingoittajan tai voimistajan päällä,niin voimaa tulee ja health lähtee =D
eli oon kumman vaa päällä nii lähtee hp ja tulee voimaa.
Ja en aio tehä tätä nyt kahella eri typellä koska tiiän,et sen saa näinkin toimii =)
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

koodaus 600 wrote:kattokaa nää koodinpätkät
repeattia ennen

Code: Select all

Type objects
Field obj

End Type
repeatin jälkeen

Code: Select all

  For vahingoittaja.objects  = Each objects
    If ObjectsOverlap (vahingoittaja\obj,pelihahmo) Then
    hp=hp-1
    
    EndIf 

    Next vahingoittaja
    
    For voimistaja.objects  = Each objects
    If ObjectsOverlap (voimistaja\obj,pelihahmo) Then
    voimat=voimat+1
    
    EndIf 

    Next voimistaja 
ja nyt on ongelmana et jos oon vahingoittajan tai voimistajan päällä,niin voimaa tulee ja health lähtee =D
eli oon kumman vaa päällä nii lähtee hp ja tulee voimaa.
Ja en aio tehä tätä nyt kahella eri typellä koska tiiän,et sen saa näinkin toimii =)
Riippumatta siitä, käytkö läpi kaikki saman tyyppikokoelman jäsenet nimellä voimistaja vai vahingoittaja, käyt ne kaikki läpi sillä nimellä kun olet määrännyt ne kaikki läpi käytävän (in be4 "through a corridor"). Voit tehdä niin, että laitat samalle tyyppikokoelmalle kaksi kenttää, joissa toisessa on objekti ja toisessa on joko 1 tai 2 riippuen siitä, minkä tyyppinen objekti on kyseessä ja sitten tuon ObjectsOverlapin kohdalla tarkistat, mikä on toisessa kentässä olevan muuttujan arvo.
User avatar
Akuji
Member
Posts: 60
Joined: Fri Oct 08, 2010 5:59 pm
Location: Turku

Re: Tyhmät kysymykset (I/2010)

Post by Akuji »

Jep. Kiitti vinkistä. Toimii! :o
User avatar
Akuji
Member
Posts: 60
Joined: Fri Oct 08, 2010 5:59 pm
Location: Turku

Re: Tyhmät kysymykset (I/2010)

Post by Akuji »

Kaikki on melkein valmista, mutta vihollisen ampumisen jälkeen raadolle jää törmäystunnistus, jota en ole pystynyt poistamaan. En tiedä miksi. :?: En ole edes laittanut sille törmäystä sitä luodessani. Olen kokeillut eri tekniikoita, mutta ei tehoa. Osaako joku auttaa, miten törmäystunnistus poistetaan raadolta?
Locked