Tyhmät kysymykset (I/2011)

Voit pyytää apua ohjelmointiongelmiin täältä.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

Johtuu siitä että yrität editoida sellaista osaa mapista jota ei ole olemassa. Editmap vaatii tilekoordinaatteja parametreina, eli vasen yläkulma on 1, 1, ja se kasvaa alas oikealle. Nyt kuitenkin käytät objektikoordinaatteja.

Joudut siis muuttamaan objektikoordinaatit tilekoordinaateiksi. Tähän taitaa olla funktiot tehtynä cbRepositoryssa. Jos sieltä ei löydy niin kokeile hakua.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
aloittelijamies
Newcomer
Posts: 45
Joined: Fri Nov 18, 2011 9:55 pm

Re: Tyhmät kysymykset (I/2011)

Post by aloittelijamies »

kiitos VesQ vinkistä, kokeilen kun jaksan
Mikki0000
Member
Posts: 63
Joined: Tue Dec 27, 2011 11:50 pm
Location: Päijät-Häme

Re: Tyhmät kysymykset (I/2011)

Post by Mikki0000 »

Miten pystyy tekemään nettipelin
exe tiedosto swf muotoon: Lopetettu
Tervetuloa lukemaan foorumin noloimman käyttäjän viestejä!
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Viltzu »

Mikki0000 wrote:Miten pystyy tekemään nettipelin
Opettelemalla ensin perusteet, koodaamalla projektin ilman nettiominaisuuksia, opettelemalla cbNetwork, koodaamalla projektin päälle nettiominaisuudet.

Aloita kohdasta "perusteet". Jos jotai arviota haluat kauanko kestää että pääset loppuun niin sanotaa sellane pari vuotta jos ahkera olet.
anti-koodari

Re: Tyhmät kysymykset (I/2011)

Post by anti-koodari »

Hei!
Mulla on pieni ongelma tämän ensimmäisen 'pelini' kanssa, ammukset eivät oikein lähde piipusta. (Olen "koodannut" tämän copy-pastettamalla mukana tulevista lessoneista.)
:oops:

Code: Select all

FrameLimit 40
SCREEN 550,400 'näyttö
SetWindow "Game"
DrawToWorld ON
'Print ""

Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
    Field obj 'yksi kenttä nimeltään ''obj'
End Type 

ukko=LoadObject("Media\soldier.bmp",72)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF

ääniAmmu = LoadSound ("Media\Blaster.wav")
musa = PlaySound ("Media\SK_Battle2.mp3")

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1
ukko = LoadObject("Media\guy.bmp",360)
'lataa vihulainen
vihu = LoadObject ("Media\guy.bmp",72)
ObjectPickable vihu, 2 'aseta se poimittavaksi
PositionObject vihu, 32,150 'sijoita ylemmäs
ObjectPickable kartta, ON 'aseta se poimittavaksi



SetupCollision ukko, kartta, 1, 4, 2
 
Color cbred
AddText "Voit ohjata nuolilla.Voit poistaa tämän tekstin painamalla enter."
    Color cbRed
    Text X,325,"moi"
Plusx=1
SetupCollision ukko, vihu, 2, 2, 2
Repeat 'silmukka
    If KeyHit(28) Then 
        ClearText
    EndIf
    
    x = x + plusx    
    If x<0 Or x>200 Then plusx= -plusx
    'DrawImage kuva,40,20
     ClsColor cbblack 'Taustan väri
    'kakkos ukon alku asento
    'RotateObject ukko2,180

    'koodin pätkä voit lisätä ukkelin tai kameran.
    'If KeyDown(cbKeyA) Then 
    'If KeyDown(cbKeyD) Then 
    'If KeyDown(cbKeyW) Then 
    'If KeyDown(cbKeyS) Then 
    'Tällä liikutetaan ukkelia
    If LeftKey() Then TurnObject ukko, 5
    If RightKey() Then TurnObject ukko, -5    
    If UpKey() Then MoveObject ukko, 2
    If DownKey() Then MoveObject ukko, -2

    'Älä päästä ukkelia rajojen ulkopuolelle
    'If ObjectX(ukko)<-200 Then PositionObject ukko,-200,ObjectY(ukko)
    'If ObjectX(ukko)>200 Then PositionObject ukko,200,ObjectY(ukko)
    'If ObjectY(ukko)<-150 Then PositionObject ukko,ObjectX(ukko),-150
    'If ObjectY(ukko)>150 Then PositionObject ukko,ObjectX(ukko),150
    'Älä päästä ukkelia rajojen ulkopuolelle
    'If ObjectX(ukko2)<-150 Then PositionObject ukko2,-200,ObjectY(ukko2)
    'If ObjectX(ukko2)>150 Then PositionObject ukko2,200,ObjectY(ukko2)
    'If ObjectY(ukko2)<-100 Then PositionObject ukko2,ObjectX(ukko2),-150
    'If ObjectY(ukko2)>100 Then PositionObject ukko2,ObjectX(ukko2),150
     
    'Aktivoi jos on kaksi pelaajaa käytössä
    'SetupCollision ukko,ukko2,2,2,2
    'SetupCollision ukko2,ukko,2,2,2

    'Color cbRed
    'Text X,325,""
    
    UpdateGame 'päevitä peli
    CloneCameraPosition ukko 'cameera ja U.K.K.Eli
       
    DrawGame       

    'Voidaanko ampua
    If KeyDown(cbkeyspace) And reload=0 Then
        PlaySound ääniAmmu,50
        reload=10 'lataa 1/4 sekunnissa (koska framelimit 40) 
    EndIf
    
    'lataaminen
    If reload>0 Then reload-1
    
    If SoundPlaying(musa)=0 Then 
        musa = PlaySound ("Media\SK_Battle2.mp3")
        If Rand(1,2)=1 Then 
            SetSound musa,0,100,-100 'vasen kajari
        Else
            SetSound musa,0,100,100 'oikea kajari
        EndIf
    EndIf 
    
    'Ammu-systeemi. Vain, jos ase on ladattu
    'If KeyDown(cbkeyspace) And reload=0 Then    
       ' Gosub LisääAmmus        
    'EndIf
    
    'päivitä aseen lataaminen
  '  If reload>0 Then reload=reload-1
    Gosub PäivitäAmmukset
    
     'If reload>0 Then reload=reload-1

      ' 
      ' ObjectPick ukko
      '  e=PickedObject()
    ' If e=vihu Then
       'Color cbMagenta
       'Circle PickedX()-4,PickedY()+4,8,OFF
   'EndIf   
    
    
    DrawScreen 'piirtää ruudun
 

  Until EscapeKey()
End

 If KeyDown(cbkeyspace) And reload=0 Then    
        luoti.AMMUS = New(AMMUS) 'luo uusi ammus
        luoti\obj=CloneObject(pati) 'tee klooni
        'asetetaan pati samaan paikkaan
        CloneObjectPosition luoti\obj,ukko                
        'käännetään pati samaan suuntaan
        CloneObjectOrientation luoti\obj,ukko            
        reload=5 'aseen lataus        
    EndIf
    'päivitä aseen lataaminen
    If reload>0 Then reload=reloa
            'vapaa paikka löytyi, luodaan pati
                
            'AMMUS_ELOSSA(i)=ON
            'AMMUS_OBJ(i)=CloneObject(pati)
                
            'asetetaan pati samaan paikkaan
            'CloneObjectPosition AMMUS_OBJ(i),ukko
                
            'käännetään pati samaan suuntaan
            'CloneObjectOrientation AMMUS_OBJ(i),ukko
            
            'reload=5 ''aseen lataus
          
            'enempää paikka-tarkistuksia ei tarvita,
            'joten voimme paeta silmukasta
    'Päivitä kaikki ammukset
    For luoti.AMMUS = Each AMMUS
        MoveObject luoti\obj,6
        If ObjectX(luoti\obj)<-480 Or ObjectX(luoti\obj)>300 Or ObjectY(luoti\obj)<-400 Or ObjectY(luoti\obj)>300 Then
            'ammus ylittää rajan -> tuhoa se               
            DeleteObject luoti\obj ''poista objekti
            Delete luoti ''poista luoti kokonaan
             EndIf
    Next luoti
           
   
Return

PäivitäAmmukset:
    'liikutetaan kaikkia ammuksia, ja katsotaan
    'törmäävätkö ne oransseihin seiniin. Jos
    'törmäävät, niin ne poistetaan ammuslistasta,
    'ja paikka vapautuu uudelle ammukselle.
    
    'käydään KAIKKI läpi
    For i=1 To 100
        If AMMUS_ELOSSA(i) Then
            MoveObject AMMUS_OBJ(i),6
            
            'tämä on inhottavan pitkä rivi-------------> -------------> -------------> -------------> ------------->
            'voit kuitenkin pilkkoa sen mielessäsi
            'OR:n erottamiin osiin...
            If ObjectX(AMMUS_OBJ(i))<-180 Or ObjectX(AMMUS_OBJ(i))>180 Or ObjectY(AMMUS_OBJ(i))<-130 Or ObjectY(AMMUS_OBJ(i))>130 Then
                'ammus ylittää rajan -> tuhoa se
                
                DeleteObject AMMUS_OBJ(i)
                
                'vapauta paikka tyhjäksi
                AMMUS_ELOSSA(i)=OFF
            EndIf
            
        EndIf
    Next i
'
Return 'palaa takaisin pääsilmukkaan
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Tyhmät kysymykset (I/2011)

Post by MrMonday »

anti-koodari wrote:Hei!
Mulla on pieni ongelma tämän ensimmäisen 'pelini' kanssa, ammukset eivät oikein lähde piipusta. (Olen "koodannut" tämän copy-pastettamalla mukana tulevista lessoneista.)
:oops:

Code: Select all

koodia
Ainakin sen huomasin että käytät taulukoita ja tyyppejä sekaisin, etkä ole määritellyt taulukoita ollenkaan. Eli suosittelen tutustumaan oppitunteihin, eli "lessoneihin" hieman syvemmin :)
Oppitunnissa Ammukset toteutetaan tuo systeemi taulukoilla ja oppitunnissa Ammukset 2 tyypeillä. Manuaalista löydät kattavammin tietoa niistä, mutta jos olet ihan alussa ohjelmoinnin kanssa, niin ne eivät välttämättä ole vielä niin tarpeellisia opetella, vaan kannattaa perehtyä manuaalin "Perusteet" ja "CoolBasic ohjelmointikieli"-osioihin.
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Tyhmät kysymykset (I/2011)

Post by MrMonday »

Pahoittelen tuplapostia, mutta muistin että itsellänikin oli ongelma :D Eli kuten aikaisemminkin kyselin EditMap-komennosta, niin en ole löytänyt foorumilta vastausta ongelmaan, enkä ole sitä itse keksinyt, niin voisiko joku osaava pistää esimerkkiä, kuinka muutan objektin maailman koordinaatit tile koordinaateiksi? Löysin jotkut GetTileX() ja GetTileY()-funktiot, joilla pitäisi onnistua, vaan ei toiminut niilläkään vaikka niitäkin yritin muokkailla :( Alkaa aiheuttaa harmaita hiuksia tämä ongelma :roll: :cry: :D
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by valscion »

MrMonday wrote:Pahoittelen tuplapostia, mutta muistin että itsellänikin oli ongelma :D Eli kuten aikaisemminkin kyselin EditMap-komennosta, niin en ole löytänyt foorumilta vastausta ongelmaan, enkä ole sitä itse keksinyt, niin voisiko joku osaava pistää esimerkkiä, kuinka muutan objektin maailman koordinaatit tile koordinaateiksi? Löysin jotkut GetTileX() ja GetTileY()-funktiot, joilla pitäisi onnistua, vaan ei toiminut niilläkään vaikka niitäkin yritin muokkailla :( Alkaa aiheuttaa harmaita hiuksia tämä ongelma :roll: :cry: :D
Selvitin tuon pienen kikkailun avulla. Tässä olisi lopputulos:

Code: Select all

Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
    Return ((_x + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction

Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
    Return ((-_y + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction

// ESIMERKKI

FrameLimit 60

map= LoadMap("Media\cdm2.til","Media\tileset.bmp")
guy= LoadObject("Media\guy.bmp", 72)

Repeat

    If LeftKey() Then TurnObject guy, 5
    If RightKey() Then TurnObject guy, -5 
    If UpKey() Then MoveObject guy, 2
    If DownKey() Then MoveObject guy, -2

    tileX = GetTileXFromWorldX( ObjectX(guy), map, 32 )
    tileY = GetTileYFromWorldY( ObjectY(guy), map, 32 )
    
    If tileX >= 1 And tileX <= MapWidth() And tileY >= 1 And tileY <= MapHeight() Then
        If oldtileX >= 1 And oldtileY >= 1 Then
            EditMap map, 0, oldtileX, oldtileY, oldtile
        EndIf
    
        oldtileX = tileX
        oldtileY = tileY
        oldtile = GetMap2(0,tileX,tileY)
        EditMap map, 0, tileX, tileY, 114
    EndIf
    
    CloneCameraPosition guy
    DrawScreen

Forever 
Eli tärkein osahan tuossa on nuo tileX ja tileY -muuttujien laskut:

Code: Select all

tileX = (x + ObjectSizeX(map)/2) / 32 + 1
tileY = (-y + ObjectSizeY(map)/2) / 32 + 1
Näissä oletetaan ettei karttaa ole siirretty tai käännelty. x ja y -muuttujat ovat maailmankoordinaateissa.

tileX lasketaan niin että maailmankoordinaatiston x-koordinaattiin ensin lisätään koko kartan leveys jaettuna kahdella, eli puolikas kartan leveyttä. Näin saadaan aivan vasemman laidan pienimmäksi mahdolliseksi x-koordinaatiksi 0. Sitten jaamme saadun luvun tilen leveydellä, tässä tapauksessa 32:lla, jotta saisimme tilekoordinaatteja. Edelleen vasemman laidan pienin arvo on 0 ja koska tilekoordinaatit alkavat ykkösestä, täytyy arvoon vielä lisätä se 1.

tileY:lle tehdään muuten sama mutta kiepsautetaan y-koordinaatin arvo heti negatiiviseksi, koska maailmankoordinaateissa y kasvaa ylöspäin mutta karttakoordinaateissa y kasvaa alaspäin.

EDIT: Eli jos haluat niin tässä olisi valmiit funktiot sinulle:

Code: Select all

Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
    Return ((_x + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction

Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
    Return ((-_y + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction 
EDIT2: Muokkasin esimerkkikoodin käyttämään noita funktioita myös, siisti sitä hieman. Lisäsin funktiot nyt myös cbrepositoryyn: http://www.cbrepository.com/codes/code/69/
Sain näköjään funktioilleni vielä mukavan URLin :)
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
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Tyhmät kysymykset (I/2011)

Post by MrMonday »

Kiitos kaunis VesQlle avusta, mutta valitettavasti tuokaan ei toiminut toivotulla tavalla. Tai sitten minulla jäi tuosta joku seikka ymmärtämättä, vaikka yritin toki sisäistää mahdollisimman hyvin mitä se tekee (vihaan käyttää koodia jos en tiedä miksi se tekee mitäkin) :roll: Tai minulla on koodissa joku systeemi vaturallaan sillain että se haraa vastaan, mutta en mitään järkevää selitystä löytänyt. Eli nyt EditMap-komento toimii, mutta se muokkaa karttaa jostain ihan muualta. Ei siis ihan randomisti mistä kohtaa kenttää sattuu, vaan aina saman verran ylhäältä ja oikealta siitä kohdasta katsottuna missä muutoksen pitäisi tapahtua. Alla hieman muokattuna ja karsittuna kohta, missä ammutaan, eli jätin kaiken epäolennaisen pois, jotta helpommin saisi selvää. Teenkö minä siis koodissa jotain väärin? Ja kiitos vielä avusta Jonezille ja VesQlle.

Code: Select all

    If KeyHit(29) Then
                    
        luoti = CloneObject(master_luoti)
                            
        PositionObject luoti, ObjectX(pelaaja),ObjectY(pelaaja)
        RotateObject luoti, ObjectAngle(pelaaja)

    While Distance2(pelaaja, luoti)>1000

            If GetMap(3,ObjectX(luoti),ObjectY(luoti)) = 3 Or GetMap(3,ObjectX(luoti),ObjectY(luoti)) = 4 Then
                tileX = GetTileXFromWorldX( ObjectX(luoti), kartta, 32 )
                tileY = GetTileYFromWorldY( ObjectY(luoti), kartta, 32 )
                EditMap kartta, 1, tileX, tileY, 16
                Exit
            EndIf 
            
        DrawScreen
            
    Wend     
        DeleteObject luoti
    EndIf 
    
    // VesQ:n funktiot tässä
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

Täytyy sanoa, etten valitettavasti saanut oikein selvää mitä koodisi täytyi tehdä. Joten koodasin pienen esimerkin siitä miten EditMappia ja VesQ:n funkkareita käyteyään yhdessä. Muutin funktioiden toimintaa niin, että nyt ne ottavat huomioon myös jos itse karttaa on liikuteltu. Jos haluat "optimoida" koodiasi (koska kartaa ei lähes ikinä liikutella), käytä vesQ:n alkuperäisiä.

Code: Select all

Type tBullets
    Field obj
EndType

map = LoadMap("Media\cdm2.til", "media\tileset.bmp")
guy = LoadObject("media\guy.bmp", 72)
SetupCollision guy, map, 2, 4, 2

bullet = LoadObject("media\bullet.bmp")
ShowObject bullet, OFF

Repeat

    TurnObject guy, (LeftKey() - RightKey()) * 5
    MoveObject guy, (UpKey() - DownKey()) * 5
    
    CloneCameraPosition(guy)
    
    If KeyHit(CbKeyLControl) Then
        Shoot(guy, bullet)
    EndIf
    
    
    For ib.tBullets = Each tBullets
        bDeleteBullet = False
        MoveObject ib\obj, 5

        //Otetaan mapin hit-arvo luodin kohdalta ylös
        mapData = GetMap(2, ObjectX(ib\obj), ObjectY(ib\obj))
        
        //jos luoti on seinän kohdalla (arvo != 0)
        If mapData <> 0 Then
        
            tileX  = GetTileXFromWorldX(ObjectX(ib\obj), map, 32)
            tileY = GetTileYFromWorldY(ObjectY(ib\obj), map, 32)
            
            //poistetaan hit
            EditMap map, 2, tileX, tileY, 0

            //muutetaan kuvaa
            EditMap map, 0, tileX, tileY, mapData - 1
                     
            bDeleteBullet = True //luoti tuhtoutuu osuessaan seinään
        EndIf
          
        //tuhotaan luoti jos se menee liian kauas
        If Distance2(ib\obj, guy) > 2000 Then bDeleteBullet = True
        
        //tuhotaan luoti jos täytyy
        If bDeleteBullet Then
            DeleteObject ib\obj
            Delete ib
        EndIf
    Next ib
    DrawScreen
Forever

Function Shoot(obj, bullet)
    nb.tBullets = New (tBullets)
    nb\obj = CloneObject (bullet)
    CloneObjectPosition nb\obj, obj
    CloneObjectOrientation nb\obj, obj
EndFunction

// VesQ:n funktiot tässä
Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
    ox = _x - ObjectX(_map)
    Return ((ox + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction

Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
    oy = _y - ObjectY(_map)
    Return ((-oy + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Locked