Tyhmät kysymykset (I/2010)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Tyhmät kysymykset (I/2010)

Post by MaGetzUb »

No kameran kääntämiseen tarvitset qwaterniota (algoritmiä) se on vähän hankalempi, katsoppa koodaajan 3d tuto.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
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 »

Pelkkään yhden akselin ympäri pyöritykseen ei tarvita vielä sen kummempaa, muutama sini- ja kosinilause hoitaa homman tyylikkäästi. Yleensä halutaan vähintään kaksi, jolloin systeemi vaatii muutaman sinin ja kosinin lisää. Jos halutaan kolmaskin ulottuvuus mukaan niin homma menee hieman monimutkaisemmaksi. Silloin todellakin tarvitaan kvaternioita, joiden kanssa työskentely on vähemmän mukavaa. Yleensä kolmas ulottuvuus ei kuitenkaan ole läheskään välttämätön - riippuu siis ihan käyttötarkoituksestasi, miten vaikea kamera sinun kannattaa toteuttaa :>
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe »

Kiitoksia auttaneille :)
Vielä kun joku osaisi neuvoa hyvän C++ -kirjaston millä saisi mahd. hyvin piirrettyä näytölle kuten cb -piirtokomennoilla, olisin hyvin tyytyväinen :)
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by Sami The Great »

DJ-Filbe wrote:Kiitoksia auttaneille :)
Vielä kun joku osaisi neuvoa hyvän C++ -kirjaston millä saisi mahd. hyvin piirrettyä näytölle kuten cb -piirtokomennoilla, olisin hyvin tyytyväinen :)
Jos 2D grafiikkaa haluat piirellä, niin ehdottaisin sinulle SDL:ä (C kirjasto, mutta toimii c++:ssa) ja siihen SDL_gfx, joka sisältää hyviä piirtofunktioita. Jos haluat, että kirjastossa on myös monipuoliset 3D ominaisuudet, niin sitten suosittelen joko Irrlichtiä tai OGREa, joista Irrlicht on ehkä enempi aloittelijaystävällisempi, mutta OGREssa on paljon enemmän ominaisuuksia ja muutenkin mielestäni parempi.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

Jotain on mennyt pieleen. Olen koittanut laittaa objekteille elämän ja määritellyt miten ja kuinka paljon elämä vähenee. Kuitenkin kääntäjä herjaa asioista jotka esimerkkien ja tietojeni mukaan pitäisi olla oikein. Mikä on siis vikana koodissa? Kiitos jo etukäteen! :)

Code: Select all

SCREEN 900,900

SetWindow "Battle game"

Text 100,100, "Sotilas: liikkuu: nuolinäppäimistä ja ampuu: M"
Text 100,150, "Punainen mies: liikkuu: W,A,S,D ja ampuu: C"
Text 100,200, "PELI ALKKAA 6 SEKUNTIN KULUTTUA!"

Wait 6000

ClearText

Type AMMUS
Field obj
End Type

FrameLimit 40

ChDir "C:\Documents and Settings\Järjestelmänvalvoja\Omat tiedostot\BattleGame\Media"

kartta = LoadMap("cdm2.til","tileset.bmp")
PlayObject kartta,0,0,1

ukko=LoadObject("soldier.bmp", 100)
ukkeli=LoadObject("guy.bmp", 100)
pati=LoadObject("bullet.bmp")
ShowObject pati,OFF

'Pyöritä ukot alkuasentoon
RotateObject ukko,0
RotateObject ukkeli,180
PositionObject ukko,-150,100
PositionObject ukkeli,150,-100

SetupCollision ukko,ukkeli,2,2,2
SetupCollision ukkeli,ukko,2,2,2
'pati kulkee ukon läpi vaikka määritykset on
SetupCollision ukko,pati,2,2,2

Repeat

If LeftKey() Then TurnObject ukko,8
If RightKey() Then TurnObject ukko,-8
If UpKey() Then MoveObject ukko,8
If DownKey() Then MoveObject ukko,-8

If KeyDown(cbKeyA) Then TurnObject ukkeli,8
If KeyDown(cbKeyD) Then TurnObject ukkeli,-8
If KeyDown(cbKeyW) Then MoveObject ukkeli,8
If KeyDown(cbKeyS) Then MoveObject ukkeli,-8

If ObjectX(ukko)<-430 Then PositionObject ukko,-430,ObjectY(ukko)
If ObjectX(ukko)>430 Then PositionObject ukko,430,ObjectY(ukko)
If ObjectY(ukko)<-430 Then PositionObject ukko,ObjectX(ukko),-430
If ObjectY(ukko)>430 Then PositionObject ukko,ObjectX(ukko),430

If ObjectX(ukkeli)<-430 Then PositionObject ukkeli,-430,ObjectY(ukkeli)
If ObjectX(ukkeli)>430 Then PositionObject ukkeli,430,ObjectY(ukkeli)
If ObjectY(ukkeli)<-430 Then PositionObject ukkeli,ObjectX(ukkeli),-430
If ObjectY(ukkeli)>430 Then PositionObject ukkeli,ObjectX(ukkeli),430

ObjectInteger ukko,100
ObjectInteger ukkeli,100

'Tässä on ehkä joku virhe... En tajua mikä
If 
    ObjectsOverlap (ukko,pati)
    Then
    ObjectInteger ukko,ObjectInteger(ukko) -2
EndIf

If KeyDown(cbKeyM) And reload=0 Then
luoti.AMMUS = New(AMMUS)
luoti\obj=CloneObject(pati)
CloneObjectPosition luoti\obj,ukko
CloneObjectOrientation luoti\obj,ukko
reload=5
EndIf
If reload>0 Then reload=reload-1

For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If ObjectX(luoti\obj)<-430 Or ObjectX(luoti\obj)>430 Or ObjectY(luoti\obj)<-430 Or ObjectY(luoti\obj)>430 Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti

If KeyDown(cbKeyC) And reload=0 Then
luoti.AMMUS = New(AMMUS)
luoti\obj=CloneObject(pati)
CloneObjectPosition luoti\obj,ukkeli
CloneObjectOrientation luoti\obj,ukkeli
reload=5
EndIf

If reload>0 Then reload=reload-1

For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If ObjectX(luoti\obj)<-430 Or ObjectX(luoti\obj)>430 Or ObjectY(luoti\obj)<-430 Or ObjectY(luoti\obj)>430 Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti

DrawScreen

Until EscapeKey()
Last edited by Peltsi on Tue Nov 02, 2010 8:40 am, edited 1 time in total.
Guest

Re: Tyhmät kysymykset (I/2010)

Post by Guest »

If-ehtolause pitäisi kirjoittaa näin:

Code: Select all

    If ObjectsOverlap (ukko,pati) Then
        ObjectInteger ukko,ObjectInteger(ukko) -2
    EndIf
Koodisi tosin yrittää tarkistaa, onko objekti "ukko" kosketuksissa objectin "pati" kanssa (joka siis on master-objekti), se ei siis tarkista tyypin AMMUS jäseniä ollenkaan. Ehtolause pitäisi siis laittaa jonkin silmukan sisälle, jossa läpikäydään kaikki ammukset. Lisäksi asetat pääsilmukassa joka kerta elämäksi 100, eli elämä ei ehdi vähentyä ollenkaan, jos siis tarkoituksesi oli että se vähentyy joka kerta kun amuus osuu ukkoon. Elämä pitäisi siis asettaa ennen pääsilmukkaa. Tässä esimerkki korjatusta koodista:

Code: Select all

    SCREEN 900,900

    SetWindow "Battle game"

    Text 100,100, "Sotilas: liikkuu: nuolinäppäimistä ja ampuu: M"
    Text 100,150, "Punainen mies: liikkuu: W,A,S,D ja ampuu: C"
    Text 100,200, "PELI ALKKAA 6 SEKUNTIN KULUTTUA!"

    Wait 6000

    ClearText

    Type AMMUS
    Field obj
    End Type

    FrameLimit 40

    ChDir "C:\Documents and Settings\Järjestelmänvalvoja\Omat tiedostot\BattleGame\Media"

    kartta = LoadMap("cdm2.til","tileset.bmp")
    PlayObject kartta,0,0,1

    ukko=LoadObject("soldier.bmp", 100)
    ukkeli=LoadObject("guy.bmp", 100)
    pati=LoadObject("bullet.bmp")
    ShowObject pati,OFF

    'Pyöritä ukot alkuasentoon
    RotateObject ukko,0
    RotateObject ukkeli,180
    PositionObject ukko,-150,100
    PositionObject ukkeli,150,-100

    SetupCollision ukko,ukkeli,2,2,2
    SetupCollision ukkeli,ukko,2,2,2
    'pati kulkee ukon läpi vaikka määritykset on
    SetupCollision ukko,pati,2,2,2

    ObjectInteger ukko,100
    ObjectInteger ukkeli,100

    Repeat

    If LeftKey() Then TurnObject ukko,8
    If RightKey() Then TurnObject ukko,-8
    If UpKey() Then MoveObject ukko,8
    If DownKey() Then MoveObject ukko,-8

    If KeyDown(cbKeyA) Then TurnObject ukkeli,8
    If KeyDown(cbKeyD) Then TurnObject ukkeli,-8
    If KeyDown(cbKeyW) Then MoveObject ukkeli,8
    If KeyDown(cbKeyS) Then MoveObject ukkeli,-8

    If ObjectX(ukko)<-430 Then PositionObject ukko,-430,ObjectY(ukko)
    If ObjectX(ukko)>430 Then PositionObject ukko,430,ObjectY(ukko)
    If ObjectY(ukko)<-430 Then PositionObject ukko,ObjectX(ukko),-430
    If ObjectY(ukko)>430 Then PositionObject ukko,ObjectX(ukko),430

    If ObjectX(ukkeli)<-430 Then PositionObject ukkeli,-430,ObjectY(ukkeli)
    If ObjectX(ukkeli)>430 Then PositionObject ukkeli,430,ObjectY(ukkeli)
    If ObjectY(ukkeli)<-430 Then PositionObject ukkeli,ObjectX(ukkeli),-430
    If ObjectY(ukkeli)>430 Then PositionObject ukkeli,ObjectX(ukkeli),430

    If ObjectsOverlap (ukko,pati) Then
        ObjectInteger ukko,ObjectInteger(ukko) -2
    EndIf

    If KeyDown(cbKeyM) And reload=0 Then
    luoti.AMMUS = New(AMMUS)
    luoti\obj=CloneObject(pati)
    CloneObjectPosition luoti\obj,ukko
    CloneObjectOrientation luoti\obj,ukko
    reload=5
    EndIf
    If reload>0 Then reload=reload-1

    For luoti.AMMUS = Each AMMUS
        If ObjectsOverlap (ukko,luoti\obj) Then
            ObjectInteger ukko,ObjectInteger(ukko) -2
        EndIf       
        MoveObject luoti\obj,6
        If ObjectX(luoti\obj)<-430 Or ObjectX(luoti\obj)>430 Or ObjectY(luoti\obj)<-430 Or ObjectY(luoti\obj)>430 Then
            DeleteObject luoti\obj
            Delete luoti
        EndIf
    Next luoti

    If KeyDown(cbKeyC) And reload=0 Then
    luoti.AMMUS = New(AMMUS)
    luoti\obj=CloneObject(pati)
    CloneObjectPosition luoti\obj,ukkeli
    CloneObjectOrientation luoti\obj,ukkeli
    reload=5
    EndIf

    If reload>0 Then reload=reload-1

    For luoti.AMMUS = Each AMMUS
    MoveObject luoti\obj,6
    If ObjectX(luoti\obj)<-430 Or ObjectX(luoti\obj)>430 Or ObjectY(luoti\obj)<-430 Or ObjectY(luoti\obj)>430 Then
    DeleteObject luoti\obj
    Delete luoti
    EndIf
    Next luoti

    DrawScreen

    Until EscapeKey()
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

Kiitokset Guest:ille, koodi toimii hyvin!

Mutta kumminkin, asiani koskee Tilesteriä.
Olen yrittänyt tehdä tilekarttoja (onnistunutkin), mutta tilekarttojen lataaminen peliin on tuottanut ongelmia ("Can't load map..." ilmoitus). Olen jopa kokeillut "Kartat" esimerkistä kopioida koodin johon olen vaihtanut tiedostonimet (tämä sen takia että mikään ei olisi voinut mennä vikaan). Muut kuvat ja objektit toimivat hyvin, mutta jostain syystä omat tilesetit eivät toimi (ei pitäisi johtua väärästä tallennus kansiosta). :(
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 »

Peltsi wrote:Kiitokset Guest:ille, koodi toimii hyvin!

Mutta kumminkin, asiani koskee Tilesteriä.
Olen yrittänyt tehdä tilekarttoja (onnistunutkin), mutta tilekarttojen lataaminen peliin on tuottanut ongelmia ("Can't load map..." ilmoitus). Olen jopa kokeillut "Kartat" esimerkistä kopioida koodin johon olen vaihtanut tiedostonimet (tämä sen takia että mikään ei olisi voinut mennä vikaan). Muut kuvat ja objektit toimivat hyvin, mutta jostain syystä omat tilesetit eivät toimi (ei pitäisi johtua väärästä tallennus kansiosta). :(
Tilesterillä tilekartat pitää tallentaa 1.3 muodossa, muuten ne eivät toimi.
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
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

VesQ wrote:
Peltsi wrote:Kiitokset Guest:ille, koodi toimii hyvin!

Mutta kumminkin, asiani koskee Tilesteriä.
Olen yrittänyt tehdä tilekarttoja (onnistunutkin), mutta tilekarttojen lataaminen peliin on tuottanut ongelmia ("Can't load map..." ilmoitus). Olen jopa kokeillut "Kartat" esimerkistä kopioida koodin johon olen vaihtanut tiedostonimet (tämä sen takia että mikään ei olisi voinut mennä vikaan). Muut kuvat ja objektit toimivat hyvin, mutta jostain syystä omat tilesetit eivät toimi (ei pitäisi johtua väärästä tallennus kansiosta). :(
Tilesterillä tilekartat pitää tallentaa 1.3 muodossa, muuten ne eivät toimi.
Mav:ia heittää... Onko vika Tilesterissä?
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

Peltsi wrote:
VesQ wrote:
Peltsi wrote:Kiitokset Guest:ille, koodi toimii hyvin!

Mutta kumminkin, asiani koskee Tilesteriä.
Olen yrittänyt tehdä tilekarttoja (onnistunutkin), mutta tilekarttojen lataaminen peliin on tuottanut ongelmia ("Can't load map..." ilmoitus). Olen jopa kokeillut "Kartat" esimerkistä kopioida koodin johon olen vaihtanut tiedostonimet (tämä sen takia että mikään ei olisi voinut mennä vikaan). Muut kuvat ja objektit toimivat hyvin, mutta jostain syystä omat tilesetit eivät toimi (ei pitäisi johtua väärästä tallennus kansiosta). :(
Tilesterillä tilekartat pitää tallentaa 1.3 muodossa, muuten ne eivät toimi.
Mav:ia heittää... Onko vika Tilesterissä?
Voithan kokeilla A Stigmatoria tai TileGeniä, etenkin kun ne muutenkin ovat parempia ohjelmia kuin Tilester.
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2010)

Post by Kille »

ja olethan muistanut tallentaa kartat oikeaan kansioon?
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

Kille wrote:ja olethan muistanut tallentaa kartat oikeaan kansioon?
Juu, ja olen myös käyttänyt ChDir komentoa määrittämään oletushakemiston. Pitää kai kokeilla noita muita tilesetti softia. Kiitoksia avusta! :)
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2010)

Post by legend »

chdir ei toimi kunnolla vistassa eikä seiskassa eikä aina xp. En suosittele sen käyttöä. Ongelma voi olla siinä.
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

Miksi MAV tulee heti kun peli pääsee silmukkaan? Olen yrittänyt laittaa ammukset tuhoutumaan kun ne osuvat tilekartan hit-kerrokseen, ja siitäkös peli ei tykännyt.

Code: Select all

    SCREEN 900,900

    SetWindow "Battle game (Ver: kehitys)"
    
    ChDir "C:\Documents and Settings\Järjestelmänvalvoja\Omat tiedostot\BattleGame kehitys\Media"

    Text 100,100, "Vihreä sotilas: liikkuu: nuolinäppäimistä ja ampuu luodin: M"
    Text 100,150, "Punainen sotilas: liikkuu: W,A,S,D ja ampuu luodin: C"
    Text 100,200, "Kummallakin pelaajalla elämä on 100, yhdestä osumasta menettää 1."
    Text 100,250, "PELI ALKKAA 6 SEKUNTIN KULUTTUA!"
    Text 100,300, "Paina pelin aikana H päästäksesi ohjeeseen"


    Type AMMUS
    Field obj
    End Type
    
    Type AMPU
    Field amm
    End Type

    FrameLimit 40

    Wait 6000
    
    ClearText

    kartta = LoadMap("kartta.til","tileset.bmp")
    PlayObject kartta,0,0,1

    ukko=LoadObject("soldier.bmp", 360)
    ukkeli=LoadObject("soldier2.bmp", 360)
    pati=LoadObject("panos.bmp")
    ShowObject pati,OFF
    paukku=LoadObject ("panos.bmp")
    ShowObject paukku,OFF

    
    Dim ykm As String
    ykm="Vihreä sotilas kuoli, Punainen sotilas voitti. Peli päättyi."
    
    Dim kam As String
    Dim linechange As String
    linechange=Chr(13)+Chr(10)
    kam="Punainen sotilas kuoli, Vihreä sotilas voitti. Peli päättyi."
    ykm=ykm+linechange

    'Pyöritä ukot alkuasentoon
    RotateObject ukko,0
    RotateObject ukkeli,180
    PositionObject ukko,-100,100
    PositionObject ukkeli,100,-100
'Törmäykset
    SetupCollision ukko,ukkeli,2,2,2
    SetupCollision ukkeli,ukko,2,2,2
    SetupCollision ukko,kartta,1,4,2
    SetupCollision ukkeli,kartta,1,4,2
'ELMÄMÄT
    ObjectInteger ukko,100
    ObjectInteger ukkeli,100
    
    Repeat
    
    Color cbwhite
    Text 10,860,"Pelin toimintanopeus (ruudunpäivitystä sekunnissa):"
    Text 420,860,FPS()
    Text 10,880,"Paina H päästäksesi ohjeeseen"
    
    Color cbred
    Text 100,100,FPS()
    
    If KeyDown(cbKeyH) Then
    Execute "BattleGameOhje.txt"
    EndIf

    If LeftKey() Then TurnObject ukko,4
    If RightKey() Then TurnObject ukko,-4
    If UpKey() Then MoveObject ukko,5
    If DownKey() Then MoveObject ukko,-5

    If KeyDown(cbKeyA) Then TurnObject ukkeli,4
    If KeyDown(cbKeyD) Then TurnObject ukkeli,-4
    If KeyDown(cbKeyW) Then MoveObject ukkeli,5
    If KeyDown(cbKeyS) Then MoveObject ukkeli,-5

    If ObjectX(ukko)<-430 Then PositionObject ukko,-430,ObjectY(ukko)
    If ObjectX(ukko)>430 Then PositionObject ukko,430,ObjectY(ukko)
    If ObjectY(ukko)<-430 Then PositionObject ukko,ObjectX(ukko),-430
    If ObjectY(ukko)>430 Then PositionObject ukko,ObjectX(ukko),430

    If ObjectX(ukkeli)<-430 Then PositionObject ukkeli,-430,ObjectY(ukkeli)
    If ObjectX(ukkeli)>430 Then PositionObject ukkeli,430,ObjectY(ukkeli)
    If ObjectY(ukkeli)<-430 Then PositionObject ukkeli,ObjectX(ukkeli),-430
    If ObjectY(ukkeli)>430 Then PositionObject ukkeli,ObjectX(ukkeli),430
'VIHREÄ
    If KeyDown(cbKeyM) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luot.AMPU = New(AMPU)
    luot\amm=CloneObject(paukku)
    CloneObjectPosition luot\amm,ukko
    CloneObjectOrientation luot\amm,ukko
    reload=5 'Luodin lataus nopeus
    EndIf
    If reload>0 Then reload=reload-1

    For luot.AMPU = Each AMPU
    MoveObject luot\amm,50 'Luodin lento nopeus
        If ObjectsOverlap (ukkeli,luot\amm) Then
            ObjectInteger ukkeli,ObjectInteger(ukkeli) -1 'Luodin hittaus
            DeleteObject luot\amm
            Delete luot
        EndIf       
    Next luot
    'Elämä 0
    If ObjectInteger (ukkeli) = 0 Then
    PlaySound "screm1.wav",100
    MakeError kam
    End
    EndIf

'PUNAINEN 

    If KeyDown(cbKeyC) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luoti.AMMUS = New(AMMUS)
    luoti\obj=CloneObject(pati)
    CloneObjectPosition luoti\obj,ukkeli
    CloneObjectOrientation luoti\obj,ukkeli
    reload=5 'Luodin lataus nopeus
    EndIf

    If reload>0 Then reload=reload-1

    For luoti.AMMUS = Each AMMUS
        If ObjectsOverlap (ukko,luoti\obj) Then
            ObjectInteger ukko,ObjectInteger(ukko) -1 'Luodin hittaus
            EndIf       
    MoveObject luoti\obj,50 'Luodin lento nopeus
    If ObjectsOverlap (ukko,luoti\obj) Then 
            DeleteObject luoti\obj
            Delete luoti
            EndIf
    Next luoti
    
'MAV tulee jos lisätään nämä määritykset ja if:in
    SetupCollision luoti\obj,kartta,2,4,2
    osuu = CountCollisions (luoti\obj)  
    If osuu Then
    DeleteObject luoti\obj
    Delete luoti
    EndIf
    
    If ObjectInteger (ukko) = 0 Then
    PlaySound "screm1.wav",100
    MakeError ykm
    End
    EndIf

    DrawScreen

    Until EscapeKey()
Kasp3r
Newcomer
Posts: 23
Joined: Fri Jun 04, 2010 10:34 am

Re: Tyhmät kysymykset (I/2010)

Post by Kasp3r »

Toimiikos teillä tämmönen?

Code: Select all

comic=LoadFont("Comic Sans MS",50)

teksti$="lol"
x=TextWidth("")+teksti$
x2=TextHeight("")+teksti$
X näyttää nollaa ja x2 näyttää taas fontin korkeuden 49

Eli miksi TextWidth ei toimi tuollalailla, kun funktioon sitä tarvitsisin.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2010)

Post by legend »

Kasp3r wrote:Toimiikos teillä tämmönen?

Code: Select all

comic=LoadFont("Comic Sans MS",50)

teksti$="lol"
x=TextWidth("")+teksti$
x2=TextHeight("")+teksti$
X näyttää nollaa ja x2 näyttää taas fontin korkeuden 49

Eli miksi TextWidth ei toimi tuollalailla, kun funktioon sitä tarvitsisin.
Se kertoo tekstin leveyden laitappa noiden "" väliin tekstiä niin se näyttää jotain muuta kun nollaa.
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

Kasp3r wrote:Toimiikos teillä tämmönen?

Code: Select all

comic=LoadFont("Comic Sans MS",50)

teksti$="lol"
x=TextWidth("")+teksti$
x2=TextHeight("")+teksti$
X näyttää nollaa ja x2 näyttää taas fontin korkeuden 49

Eli miksi TextWidth ei toimi tuollalailla, kun funktioon sitä tarvitsisin.
TextWidth("") on aina 0, koska olemattomalla tekstillä ei ole tietenkään leveyttä. Int(merkkijono$) on myös aina 0. Muuttujien välisiä yhteenlaskuja ei voida suorittaa ellei niitä käännetä ensin samaan muotoon, eli siis käytännössä TextWidth("")+teksti$ on sama kuin kirjoittaisit 0+0.

Mitä sinun olisi pitänyt kirjoittaa, jotta oikeasti koodi laskisi tekstin pituuden, näyttää tältä:

Code: Select all

TextWidth(teksti$) 'tai TextWidth(""+teksti$) jos nyt ihan välttämättä haluaa suorittaa yhden turhan laskutoimituksen. 
Kasp3r
Newcomer
Posts: 23
Joined: Fri Jun 04, 2010 10:34 am

Re: Tyhmät kysymykset (I/2010)

Post by Kasp3r »

Kiitoksia vastauksista.

Tuollahan se toimikin joo kiitoksia.

Code: Select all

TextWidth(teksti$)
Ajattelin itsekkin tuota että koska siellä on tyhjää ei se mitään voi näytääkkään, mutta koska tuo TextHeight kuitenkin toimi niin menin ymmälleni.
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: Tyhmät kysymykset (I/2010)

Post by Peltsi »

Ohjelmani MAV:aa, vika lienee luotien törmäysmäärityksistä karttaan... Voisiko joku vilkaista koodia ja ehdottaa ratkaisua? Kiitos :)

Code: Select all

    SCREEN 900,900

    SetWindow "Battle game (Ver: kehitys)"
    
    ChDir "C:\Documents and Settings\Järjestelmänvalvoja\Omat tiedostot\BattleGame kehitys\Media"

    Text 100,100, "Vihreä sotilas: liikkuu: nuolinäppäimistä ja ampuu luodin: M"
    Text 100,150, "Punainen sotilas: liikkuu: W,A,S,D ja ampuu luodin: C"
    Text 100,200, "Kummallakin pelaajalla elämä on 100, yhdestä osumasta menettää 1."
    Text 100,250, "PELI ALKKAA 6 SEKUNTIN KULUTTUA!"
    Text 100,300, "Paina pelin aikana H päästäksesi ohjeeseen"


    Type AMMUS
    Field obj
    End Type
    
    Type AMPU
    Field amm
    End Type

    FrameLimit 40

    Wait 6000
    
    ClearText

    kartta = LoadMap("kartta.til","tileset.bmp")
    PlayObject kartta,0,0,1

    ukko=LoadObject("soldier.bmp", 360)
    ukkeli=LoadObject("soldier2.bmp", 360)
    pati=LoadObject("panos.bmp")
    ShowObject pati,OFF
    paukku=LoadObject ("panos.bmp")
    ShowObject paukku,OFF

    
    Dim ykm As String
    ykm="Vihreä sotilas kuoli, Punainen sotilas voitti. Peli päättyi."
    
    Dim kam As String
    Dim linechange As String
    linechange=Chr(13)+Chr(10)
    kam="Punainen sotilas kuoli, Vihreä sotilas voitti. Peli päättyi."
    ykm=ykm+linechange

    'Pyöritä ukot alkuasentoon
    RotateObject ukko,0
    RotateObject ukkeli,180
    PositionObject ukko,-100,100
    PositionObject ukkeli,100,-100
'Törmäykset
    SetupCollision ukko,ukkeli,2,2,2
    SetupCollision ukkeli,ukko,2,2,2
    SetupCollision ukko,kartta,1,4,2
    SetupCollision ukkeli,kartta,1,4,2
'ELMÄMÄT
    ObjectInteger ukko,100
    ObjectInteger ukkeli,100
    
    Repeat
    
    Color cbwhite
    Text 10,860,"Pelin toimintanopeus (ruudunpäivitystä sekunnissa):"
    Text 420,860,FPS()
    Text 10,880,"Paina H päästäksesi ohjeeseen"
    
    Color cbred
    Text 100,100,FPS()
    
    If KeyDown(cbKeyH) Then
    Execute "BattleGameOhje.txt"
    EndIf

    If LeftKey() Then TurnObject ukko,4
    If RightKey() Then TurnObject ukko,-4
    If UpKey() Then MoveObject ukko,5
    If DownKey() Then MoveObject ukko,-5

    If KeyDown(cbKeyA) Then TurnObject ukkeli,4
    If KeyDown(cbKeyD) Then TurnObject ukkeli,-4
    If KeyDown(cbKeyW) Then MoveObject ukkeli,5
    If KeyDown(cbKeyS) Then MoveObject ukkeli,-5

    If ObjectX(ukko)<-430 Then PositionObject ukko,-430,ObjectY(ukko)
    If ObjectX(ukko)>430 Then PositionObject ukko,430,ObjectY(ukko)
    If ObjectY(ukko)<-430 Then PositionObject ukko,ObjectX(ukko),-430
    If ObjectY(ukko)>430 Then PositionObject ukko,ObjectX(ukko),430

    If ObjectX(ukkeli)<-430 Then PositionObject ukkeli,-430,ObjectY(ukkeli)
    If ObjectX(ukkeli)>430 Then PositionObject ukkeli,430,ObjectY(ukkeli)
    If ObjectY(ukkeli)<-430 Then PositionObject ukkeli,ObjectX(ukkeli),-430
    If ObjectY(ukkeli)>430 Then PositionObject ukkeli,ObjectX(ukkeli),430
'VIHREÄ
    If KeyDown(cbKeyM) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luot.AMPU = New(AMPU)
    luot\amm=CloneObject(paukku)
    CloneObjectPosition luot\amm,ukko
    CloneObjectOrientation luot\amm,ukko
    reload=5 'Luodin lataus nopeus
    EndIf
    If reload>0 Then reload=reload-1

    For luot.AMPU = Each AMPU
    MoveObject luot\amm,50 'Luodin lento nopeus
        If ObjectsOverlap (ukkeli,luot\amm) Then
            ObjectInteger ukkeli,ObjectInteger(ukkeli) -1 'Luodin hittaus
            DeleteObject luot\amm
            Delete luot
        EndIf       
    Next luot
    'Elämä 0
    If ObjectInteger (ukkeli) = 0 Then
    PlaySound "screm1.wav",100
    MakeError kam
    End
    EndIf

'PUNAINEN 

    If KeyDown(cbKeyC) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luoti.AMMUS = New(AMMUS)
    luoti\obj=CloneObject(pati)
    CloneObjectPosition luoti\obj,ukkeli
    CloneObjectOrientation luoti\obj,ukkeli
    reload=5 'Luodin lataus nopeus
    EndIf

    If reload>0 Then reload=reload-1

    For luoti.AMMUS = Each AMMUS
        If ObjectsOverlap (ukko,luoti\obj) Then
            ObjectInteger ukko,ObjectInteger(ukko) -1 'Luodin hittaus
            EndIf       
    MoveObject luoti\obj,50 'Luodin lento nopeus
    If ObjectsOverlap (ukko,luoti\obj) Then 
            DeleteObject luoti\obj
            Delete luoti
            EndIf
    Next luoti
'!!!!!!!!!!!!!!!!!!!!!!!!   
'MAV tulee jos lisätään nämä määritykset ja if:in
    SetupCollision luoti\obj,kartta,2,4,2
    osuu = CountCollisions (luoti\obj)  
    If osuu Then
    DeleteObject luoti\obj
    Delete luoti
    EndIf
'!!!!!!!!!!!!!!!!!!!!!!!!
    
    If ObjectInteger (ukko) = 0 Then
    PlaySound "screm1.wav",100
    MakeError ykm
    End
    EndIf

    DrawScreen

    Until EscapeKey()
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2010)

Post by legend »

Peltsi wrote:Ohjelmani MAV:aa, vika lienee luotien törmäysmäärityksistä karttaan... Voisiko joku vilkaista koodia ja ehdottaa ratkaisua? Kiitos :)

Code: Select all

    SCREEN 900,900

    SetWindow "Battle game (Ver: kehitys)"
    
    ChDir "C:\Documents and Settings\Järjestelmänvalvoja\Omat tiedostot\BattleGame kehitys\Media"

    Text 100,100, "Vihreä sotilas: liikkuu: nuolinäppäimistä ja ampuu luodin: M"
    Text 100,150, "Punainen sotilas: liikkuu: W,A,S,D ja ampuu luodin: C"
    Text 100,200, "Kummallakin pelaajalla elämä on 100, yhdestä osumasta menettää 1."
    Text 100,250, "PELI ALKKAA 6 SEKUNTIN KULUTTUA!"
    Text 100,300, "Paina pelin aikana H päästäksesi ohjeeseen"


    Type AMMUS
    Field obj
    End Type
    
    Type AMPU
    Field amm
    End Type

    FrameLimit 40

    Wait 6000
    
    ClearText

    kartta = LoadMap("kartta.til","tileset.bmp")
    PlayObject kartta,0,0,1

    ukko=LoadObject("soldier.bmp", 360)
    ukkeli=LoadObject("soldier2.bmp", 360)
    pati=LoadObject("panos.bmp")
    ShowObject pati,OFF
    paukku=LoadObject ("panos.bmp")
    ShowObject paukku,OFF

    
    Dim ykm As String
    ykm="Vihreä sotilas kuoli, Punainen sotilas voitti. Peli päättyi."
    
    Dim kam As String
    Dim linechange As String
    linechange=Chr(13)+Chr(10)
    kam="Punainen sotilas kuoli, Vihreä sotilas voitti. Peli päättyi."
    ykm=ykm+linechange

    'Pyöritä ukot alkuasentoon
    RotateObject ukko,0
    RotateObject ukkeli,180
    PositionObject ukko,-100,100
    PositionObject ukkeli,100,-100
'Törmäykset
    SetupCollision ukko,ukkeli,2,2,2
    SetupCollision ukkeli,ukko,2,2,2
    SetupCollision ukko,kartta,1,4,2
    SetupCollision ukkeli,kartta,1,4,2
'ELMÄMÄT
    ObjectInteger ukko,100
    ObjectInteger ukkeli,100
    
    Repeat
    
    Color cbwhite
    Text 10,860,"Pelin toimintanopeus (ruudunpäivitystä sekunnissa):"
    Text 420,860,FPS()
    Text 10,880,"Paina H päästäksesi ohjeeseen"
    
    Color cbred
    Text 100,100,FPS()
    
    If KeyDown(cbKeyH) Then
    Execute "BattleGameOhje.txt"
    EndIf

    If LeftKey() Then TurnObject ukko,4
    If RightKey() Then TurnObject ukko,-4
    If UpKey() Then MoveObject ukko,5
    If DownKey() Then MoveObject ukko,-5

    If KeyDown(cbKeyA) Then TurnObject ukkeli,4
    If KeyDown(cbKeyD) Then TurnObject ukkeli,-4
    If KeyDown(cbKeyW) Then MoveObject ukkeli,5
    If KeyDown(cbKeyS) Then MoveObject ukkeli,-5

    If ObjectX(ukko)<-430 Then PositionObject ukko,-430,ObjectY(ukko)
    If ObjectX(ukko)>430 Then PositionObject ukko,430,ObjectY(ukko)
    If ObjectY(ukko)<-430 Then PositionObject ukko,ObjectX(ukko),-430
    If ObjectY(ukko)>430 Then PositionObject ukko,ObjectX(ukko),430

    If ObjectX(ukkeli)<-430 Then PositionObject ukkeli,-430,ObjectY(ukkeli)
    If ObjectX(ukkeli)>430 Then PositionObject ukkeli,430,ObjectY(ukkeli)
    If ObjectY(ukkeli)<-430 Then PositionObject ukkeli,ObjectX(ukkeli),-430
    If ObjectY(ukkeli)>430 Then PositionObject ukkeli,ObjectX(ukkeli),430
'VIHREÄ
    If KeyDown(cbKeyM) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luot.AMPU = New(AMPU)
    luot\amm=CloneObject(paukku)
    CloneObjectPosition luot\amm,ukko
    CloneObjectOrientation luot\amm,ukko
    reload=5 'Luodin lataus nopeus
    EndIf
    If reload>0 Then reload=reload-1

    For luot.AMPU = Each AMPU
    MoveObject luot\amm,50 'Luodin lento nopeus
        If ObjectsOverlap (ukkeli,luot\amm) Then
            ObjectInteger ukkeli,ObjectInteger(ukkeli) -1 'Luodin hittaus
            DeleteObject luot\amm
            Delete luot
        EndIf       
    Next luot
    'Elämä 0
    If ObjectInteger (ukkeli) = 0 Then
    PlaySound "screm1.wav",100
    MakeError kam
    End
    EndIf

'PUNAINEN 

    If KeyDown(cbKeyC) And reload=0 Then
    PlaySound "Machine Gun 1.wav",100
    luoti.AMMUS = New(AMMUS)
    luoti\obj=CloneObject(pati)
    CloneObjectPosition luoti\obj,ukkeli
    CloneObjectOrientation luoti\obj,ukkeli
    reload=5 'Luodin lataus nopeus
    EndIf

    If reload>0 Then reload=reload-1

    For luoti.AMMUS = Each AMMUS
        If ObjectsOverlap (ukko,luoti\obj) Then
            ObjectInteger ukko,ObjectInteger(ukko) -1 'Luodin hittaus
            EndIf       
    MoveObject luoti\obj,50 'Luodin lento nopeus
    If ObjectsOverlap (ukko,luoti\obj) Then 
            DeleteObject luoti\obj
            Delete luoti
            EndIf
    Next luoti
'!!!!!!!!!!!!!!!!!!!!!!!!   
'MAV tulee jos lisätään nämä määritykset ja if:in
    SetupCollision luoti\obj,kartta,2,4,2
    osuu = CountCollisions (luoti\obj)  
    If osuu Then
    DeleteObject luoti\obj
    Delete luoti
    EndIf
'!!!!!!!!!!!!!!!!!!!!!!!!
    
    If ObjectInteger (ukko) = 0 Then
    PlaySound "screm1.wav",100
    MakeError ykm
    End
    EndIf

    DrawScreen

    Until EscapeKey()
Virhe yläänsä löytyy helpommin jos sisentää koodin. Tää ohjelma sisäntää koodin... Ottaa huomioon kaiken =D (jopa kommentit =D)

Code: Select all

    Const file$ = "alkuperäinen tiedosto.cb" //älä laita file1 ja file2 samaa tai muuten koodisi hukkuu...
    Const file2$ = "sisennetty.cb"
    
    If Not Sisentäjä(file,file2) Then
        Print "Tiedosto puuttui"
    Else
        Print "Tiedosto on sisennetty =)"
        Print file + " -> " + file2
    EndIf
    
    WaitKey
    
    
    '' by legend
    'Siventää tekstiä
    'palauttaa 1, jos onnistui
    Function Sisentäjä(file$,file2$)
        
        If FileExists(file)
            
            Dim Väli$,Txt$,Rivi$
            Väli = "    " 'alku väli
            
            R = OpenToRead(file) 'avataan tiedostot
            W = OpenToWrite(file2)
            
            While EOF(R) = 0
                Rivi = Trim(ReadLine(R))'luetaan rivi
                
                txt = GetWord(Trim(Rivi),1," ") 'otetaan sana
                
                'käydään yksi rivinen if lause läpi
                If txt = "If" And InStr(rivi,"Then") > 0 And InStr(rivi, Chr(34)+ "Then" +Chr(34)) = 0
                    If GetWord(Mid(Rivi,InStr(Rivi,"Then")),2) = "" Or Left(GetWord(Mid(Rivi,InStr(Rivi,"Then")),2),1) = "'" Or Left(GetWord(Mid(Rivi,InStr(Rivi,"Then")),2),2) = "//"
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                    Else
                        WriteLine W, Väli + Rivi
                    EndIf
                    'käydään rivin jälkeen lavennettavat
                ElseIf txt = "Repeat" Or txt = "For" Or txt = "While" Or txt = "Type" Or txt = "Lock"  Or txt = "Function" Or txt = "If"
                    WriteLine W, Väli + Rivi
                    väli = väli + "    "
                    'käydään heti sisentävät kohdat
                ElseIf txt = "Until" Or txt = "Wend" Or txt = "EndIf" Or txt = "EndFunction"  Or txt = "Forever" Or txt = "Unlock" Or txt = "Next" Or Lower(txt) = "endtype" Or (txt = "End" And GetWord(rivi,2) = "Function")Or (txt = "End" And GetWord(rivi,2) = "If") Or (txt = "End" And GetWord(rivi,2) = "Type")
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    'käydään heti sisennettävät kohdat, jotka myös laventavat rivin jälkeen
                ElseIf txt = "ElseIf" Or txt = "Case" Or txt = "Else" Or txt = "Default"  Or (txt = "Else" And GetWord(rivi,2) = "If")
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    väli = väli + "    "
                    'käydään 8 väliä laventavat kohdat
                ElseIf txt = "Select"
                    WriteLine W, Väli + Rivi
                    väli = väli + "        "
                    'käydään 8 väliä supistavat kohdat
                ElseIf txt = "EndSelect" Or (txt = "End" And GetWord(rivi,2) = "Select")
                    Väli = Left(väli,Len(väli)-8)
                    WriteLine W, Väli + Rivi
                    'käydään ei loogiset kohdat
                ElseIf txt = "DrawToImage"
                    If i = 0 //Lavennettavat
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                        i = 1
                    Else 'käydään heti sisennettävät kohdat, jotka myös laventavat rivin jälkeen
                        väli = Left(väli,Len(väli)-4)
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                    EndIf
                ElseIf txt = "DrawToScreen" 
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    i = 0
                    'kirjoitettaan muut ylös
                Else
                    WriteLine W, Väli + Rivi
                EndIf
                
            Wend
            
            CloseFile(R)
            CloseFile(W)
            
            Return 1 'palauettaan yksi jos se onnistui
            
        Else
            
            Return 0 'jos epäonnistui
        EndIf
        
    EndFunction
    
Locked