Tyhmät kysymykset (I/2010)

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

Re: Tyhmät kysymykset (I/2010)

Post by Jonez »

Ei ole. Ainoa mahdollisuus on luoda itse animaatiot erillisistä kuvista. Katso funktio LoadAnimImage(). Cb muuten tukee vain seuraavia tiedostomuotoja: bmp, jpg, png ja tga.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Kasp3r
Newcomer
Posts: 23
Joined: Fri Jun 04, 2010 10:34 am

Re: Tyhmät kysymykset (I/2010)

Post by Kasp3r »

Nyt olisi uusi ongelma, inspiraatio kärpänen iski, kun näin vanhalla nintendolla pelin, jossa hypittiin liikuvien laatikkojen päällä mahdollisimman korkealle.
Ja ajattelin tehdä siitä oman version, mutta ongelmana on, että pelihahmon ja laatikkojen välinen törmäys ei ota toimiakseen. Välillä törmäys toimii ja välillä ukko putoaa lootien läpi.

Olen määritellyt törmäyksen setupcollision.. blaa blaa, mistä voisi johtua, että lootat fuskaavat.

Ja toinen ongelma on, kun lootat ovat alussa paikoillaan rivissä niin boxeja voi kävellä oikealle suoraan, mutta kun yrität kävellä vasemmalle niin ukko kävelee paikoillaan aivan kuin törmäisi vasemman puoleiseen boxiin vaikka boxit ovat silti samassa nätissä rivissä.

Image
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

Kasp3r wrote:Nyt olisi uusi ongelma, inspiraatio kärpänen iski, kun näin vanhalla nintendolla pelin, jossa hypittiin liikuvien laatikkojen päällä mahdollisimman korkealle.
Ja ajattelin tehdä siitä oman version, mutta ongelmana on, että pelihahmon ja laatikkojen välinen törmäys ei ota toimiakseen. Välillä törmäys toimii ja välillä ukko putoaa lootien läpi.

Olen määritellyt törmäyksen setupcollision.. blaa blaa, mistä voisi johtua, että lootat fuskaavat.

Ja toinen ongelma on, kun lootat ovat alussa paikoillaan rivissä niin boxeja voi kävellä oikealle suoraan, mutta kun yrität kävellä vasemmalle niin ukko kävelee paikoillaan aivan kuin törmäisi vasemman puoleiseen boxiin vaikka boxit ovat silti samassa nätissä rivissä.
Kristallipalloni on nyt toistaiseksi korjattavana, joten voisitkos vaikka copypastata sitä koodiasikin tänne?
Kasp3r
Newcomer
Posts: 23
Joined: Fri Jun 04, 2010 10:34 am

Re: Tyhmät kysymykset (I/2010)

Post by Kasp3r »

Aattelin vaan, että jos jollain ois ollu hyvää ideaa mikä vois olla pielessä, mut pistetään se koodikin nyt tänne, ei oo vaan mikään ihan lyhyt eikä mikään kaikkein siistein.

Code: Select all


'----------- ALUSTUS--------------------
loading = LoadImage("img/loading.jpg")
DrawImage loading,0,0
DrawScreen

'PLAYER

oikea=LoadAnimObject("img\walkright.png",15,26,0,4)
MaskObject oikea,32,156,0
ShowObject oikea,OFF
ObjectRange oikea,15,26

vasen=LoadAnimObject("img\walkleft.png",15,26,0,4)
MaskObject vasen,32,156,0
ShowObject vasen,OFF
ObjectRange vasen,15,26


pelihahmo=CloneObject(oikea)
ObjectRange pelihahmo,15,26 

' CAMERA
camera = CloneObject(pelihahmo)
ShowObject camera,OFF

'BOXIT
boxi1=LoadObject("img/test.png")
boxi2=LoadObject("img/test.png")
boxi3=LoadObject("img/test.png")
boxi4=LoadObject("img/test.png")
boxi5=LoadObject("img/test.png")
boxi6=LoadObject("img/test.png")

'LAAVA
laava=LoadObject("img/lava.png")
MaskObject laava,255,0,255 

veri=LoadImage("img/veri.png")

'COLLISIONS

SetupCollision pelihahmo,boxi1,1,1,2
SetupCollision pelihahmo,boxi2,1,1,2
SetupCollision pelihahmo,boxi3,1,1,2
SetupCollision pelihahmo,boxi4,1,1,2
SetupCollision pelihahmo,boxi5,1,1,2
SetupCollision pelihahmo,boxi6,1,1,2


'TAKASEINÄ

floor = MakeObjectFloor ()
seinä = LoadImage ("img\seinä.jpg")

lattia=LoadObject("img\lattia.jpg")
MaskObject lattia,255,0,255

DeleteImage loading
'----------------------------------------------
'*************** MAIN *************************
'----------------------------------------------

Repeat



Gosub Peli



DrawScreen
Forever








'----------------------------------------------
'*************** Valikko  ******************

Tiedot:

Return










'----------------------------------------------
'*************** GAME (PELI) SILMUKKKA!!!! ********************

                 ' ******************
'----------------------------------------------

Peli:
alusta:
loppuuko=False
ShowObject pelihahmo,ON

PositionObject pelihahmo,-32,-270
PositionObject boxi1,0,-250
PositionObject boxi2,32,-250
PositionObject boxi3,64,-250
PositionObject boxi4,96,-250
PositionObject boxi5,128,-250
PositionObject boxi6,160,-250
PositionObject lattia,0,-425
PositionObject laava,0,-825


PaintObject floor, seinä


'SILMUKKA
Repeat

'CAMERA
PositionObject camera,0,ObjectY(pelihahmo) 
CloneCameraPosition camera


Gosub liiku


Gosub kosketukset
Gosub boxi


If KeyDown(cbkeyreturn) Then Goto alusta


DrawGame


Color cbwhite
score=ObjectY(pelihahmo) + 275 'SCORE mittari
Text 0,0,"Score:" +score 
Text 100,0,"maassa:" +maassa
Text 200,0,"kosketus:" +collide



DrawToWorld ON,ON


Color cbRED
If loppuuko=True And ObjectY(pelihahmo)=-275 Then 

DrawImage  veri,ObjectX(pelihahmo)-40,287
Text 300,275,"GAME OVER - PRESS ESC TO QUIT! LOSER"
ShowObject pelihahmo,OFF
EndIf




   
    



DrawToWorld OFF,OFF

DrawScreen
Forever
Return



'*************** PELAAJAN LIIKKEET + PVOIMA ******************

liiku:


If maassa=False Then 
 py=py+pvoima 'päivitä painovoima
pvoima=-1
EndIf

TranslateObject pelihahmo,px,py
      
     UpdateGame 
px=0

    If LeftKey() Then     
    PaintObject pelihahmo,vasen  
    PlayObject pelihahmo,1,4,0.25      
    px=-7  
    ElseIf RightKey() Then 
    PaintObject pelihahmo,oikea    
    px=7
    PlayObject pelihahmo,1,4,0.25    
    Else    
    PlayObject pelihahmo,0
    EndIf
    
   
    
    If UpKey() And maassa=1  Then 
    py =8
    newjump=1    
    ElseIf UpKey() And newjump=1 Then
    py=13
    newjump=0    
    EndIf


    'PELAAJA EI SAA MENNÄ LATTIAN ALLE
    
      
    If ObjectY(pelihahmo) < -275 Then PositionObject pelihahmo,ObjectX(pelihahmo),-275 
    
    If ObjectX(pelihahmo) < -300 Then PositionObject pelihahmo,300,ObjectY(pelihahmo)      
    If ObjectX(pelihahmo) > 300 Then PositionObject pelihahmo,-300,ObjectY(pelihahmo)       
    
      
'Peli loppuu jos

If py>25 And collide<1 Then 
PositionCamera 0,-275      
loppuuko=True
EndIf

If playerstill=False Then
laavaaika=Timer()
playerstill=True
EndIf

ObjectOrder laava,1
If Timer()>laavaaika+3500 And  ObjectY(laava)<-540 And ObjectY(pelihahmo)<-200 And loppuuko=False Then MoveObject laava,0,-2

If ObjectY(laava) > -540 And ObjectY(pelihahmo)<-270 Then loppuuko=True


    
Return


'*************** BOXIT ******************

boxi:



bx2=ObjectX(boxi1)
by2=ObjectY(boxi1)

bx3=ObjectX(boxi2)
by3=ObjectY(boxi2)

bx4=ObjectX(boxi3)
by4=ObjectY(boxi3)

bx5=ObjectX(boxi4)
by5=ObjectY(boxi4)

bx6=ObjectX(boxi5)
by6=ObjectY(boxi5)

If Timer()>aika+1000 Then




uusiks:

kx=ObjectX(pelihahmo)
ky=ObjectY(pelihahmo)

MoveObject boxi1,bx,by

PositionObject boxi2,bx2,by2
PositionObject boxi3,bx3,by3




 sx = Rand(1,3)
 sy = Rand(1,2)
' BOXIN LIIKE
If sx = 1 Then bx=-32
If sx = 2 Then bx=0
If sx = 3 Then bx = 32


If sy = 1 Then by = -32
If sy = 2 Then by = 0

 

aika=Timer()
EndIf

If ObjectX(boxi1) < -300 Then PositionObject boxi1,300,ObjectY(boxi1)      
If ObjectX(boxi1) > 300 Then PositionObject boxi1,-300,ObjectY(boxi1) 

'Tarkistaa overlappaakö

If ObjectsOverlap (pelihahmo, boxi1, 3)=1 Then Goto uusiks 



Return



'*****************KOSKETUKSET***********************

kosketukset:

  collide=CountCollisions(pelihahmo)
    
If ObjectY(pelihahmo)=-275 Then 
maassa=True    
ElseIf collide>0 Then
maassa=True   
    
    Else 
    maassa=False
    EndIf




Return
sankja
Newcomer
Posts: 30
Joined: Thu Jan 29, 2009 10:32 pm

Re: Tyhmät kysymykset (I/2010)

Post by sankja »

Vaikke sannoo,ko tossa sun koodissa olevat mediat on itse tehtyjä ja siksi ohjelmaa on vaikkee testata , pitäs kato ite ruveta väsään tommosii ukkoi ja muit medioi , mutt aattelin semmosta ehdottaa että,
jos pystysuuntainen liikkumiskomponentti kasvaa silloinkin kun ukko on laskeutunut laatikon päälle , niin jos se kasvaa edelleen ,niin se saavuttaa lopulta arvon , joka on hiukan suurempi kuin laatikon koko pystysuunnassa , ja silloinhan ukko putoaa koska laatikko jää tavallaan siihen pystysuuntaisen arvon väliin

en tiedä nyt että johtuuko sun onkelma tästä , mutta tää onki vaan ehdotus :shock:
2AMBJTO

Re: Tyhmät kysymykset (I/2010)

Post by 2AMBJTO »

En nyt millään tajuu ,että miten tehtiin peliin aseenvaihto? Jotai Select-Case esimerkkejä löytyy,mutten oikein osaa niitä vielä.Eli mulla on nyt tollanen

Code: Select all

Type Aseet
field damage
field reloadtime
field hinta
field obj
field id
Ja nyt en tiedä minne voin laittaa tiedot aseista?
jotai että

Code: Select all

Kivääri
Aseet\damage=15
aseet\reloadtime 4
aseet\hinta=4000
aseet\id=1
Toi ei tietenkää toimi,mutta ton tapasesti.
Jos koneellanne on joku purkkane esimerkki nii senditkää tänne nii voisin kattoa vaikka siitää=)
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 »

2AMBJTO wrote:En nyt millään tajuu ,että miten tehtiin peliin aseenvaihto? Jotai Select-Case esimerkkejä löytyy,mutten oikein osaa niitä vielä.Eli mulla on nyt tollanen

Code: Select all

Type Aseet
field damage
field reloadtime
field hinta
field obj
field id
Ja nyt en tiedä minne voin laittaa tiedot aseista?
jotai että

Code: Select all

Kivääri
Aseet\damage=15
aseet\reloadtime 4
aseet\hinta=4000
aseet\id=1
Toi ei tietenkää toimi,mutta ton tapasesti.
Jos koneellanne on joku purkkane esimerkki nii senditkää tänne nii voisin kattoa vaikka siitää=)

Code: Select all

Dim Kivääri.Aseet
Kivääri.Aseet = New( Aseet )
Kivääri\damage = 15
Kivääri\reloadtime = 4
Kivääri\hinta = 4000
Kivääri\id = 1
1N1QQDT

Re: Tyhmät kysymykset (I/2010)

Post by 1N1QQDT »

Ja miten voin sitte loopissa tarkistaa että mikä ase ID on käytössä?
onks se jotenki näin?

Code: Select all

For kivääri.aseet = Each aseet
If aseet\id=1 then
kivääri ampumis koodi..
next kiivääri
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 »

1N1QQDT wrote:Ja miten voin sitte loopissa tarkistaa että mikä ase ID on käytössä?
onks se jotenki näin?

Code: Select all

For kivääri.aseet = Each aseet
If aseet\id=1 then
kivääri ampumis koodi..
next kiivääri
Ei, vaan talletat nykyisen aseen johonkin muuttujaan tai jotain. Et nyt selvästikään osaa aivan kunnolla, IMHO.

Alkaisin tässä vaiheessa huudella Osmoa jos olisit rekisteröitynyt :/
sankja
Newcomer
Posts: 30
Joined: Thu Jan 29, 2009 10:32 pm

Re: Tyhmät kysymykset (I/2010)

Post by sankja »

En voi käsittää miksi mavia pukkaa , olisin kiitollinen jos joku auttas. :(

Code: Select all

'Tehtävä a10:
'Tee sivulta kuvattu peli, jossa ammutaan tykillä. 
'Lähtökulman ja lähtönopeuden saa valita nuolinappuloilla. 
    'kenties tykkiä voisi myös siirtää sopivaan kohtaan ruutua
    'joka voisi auttaa osumista
'Ammu pati välilyönnistä. Tarkoituksena on osua satunnaisesti 
'sijoitettuun maaliin, jolloin peli loppuu. Jos ammus menee
'ruudun ulkopuolelle, eikä osu maaliin, käyttäjä saa 
'uuden mahdollisuuden. Lisäapua saat TranslateObject-komennon oppaasta.
'Vinkki: komennot Objektikomennot 

Type AMMUS
    Field obj
EndType

Type KOHDE
    Field obj
EndType

Const PV=-0.16


Dim x,y,nax,nay,ln,lataus 
x=0:y=-124
Dim tx As Float,ty As Float

SCREEN 600,300

imgmaa=MakeImage(400,9)
    DrawToImage imgmaa
        Color cbgreen
        Box 0,0,400,3
        Color cbblackskin
        Box 0,3,400,6
    DrawToScreen 
    
imgtykinrunko=MakeImage(32,42)
    DrawToImage imgtykinrunko
        Color cbgold
        Circle 3,16,26
        Color cbsilver
        Box 0,30,32,12
    DrawToScreen 

cannon=LoadObject("cannon.bmp",180)

imgammus=MakeImage(8,8)
    DrawToImage imgammus
        Color cbyellow
        Circle 0,0,8
    DrawToScreen

imgviuhu=MakeImage(32,32)
    DrawToImage imgviuhu
        Color cbcyan
        Circle 0,0,32
    DrawToScreen 
    
objmaa=MakeObject()
PaintObject objmaa,-imgmaa

objtykinrunko=MakeObject()
PaintObject objtykinrunko,-imgtykinrunko

objammus=MakeObject()
PaintObject objammus,-imgammus
ShowObject objammus,OFF

objviuhu=MakeObject()
PaintObject objviuhu,-imgviuhu
ShowObject objviuhu,OFF

PositionObject objtykinrunko,x,y
CloneObjectPosition cannon,objtykinrunko

PositionObject objmaa,0,-143

kulma=90:ln=5
vlippu=0:osuma=0:kerta=0
aalippu=0:vklippu=0

Alku:

'While osuma=0



Repeat

    If (vlippu=0 Or osuma=1) And kerta=0
       v.KOHDE=New(KOHDE)
       v\obj=CloneObject(objviuhu)
       
        PositionObject v\obj,Rand(-500,500),Rand(-90,120)
        kerta=1
    EndIf 
    'Ehtolauseen vaiheet :
    '1.1.kun ruutu piirretään 1.kerran,eikä panosta ole
    'vielä lähetetty
        'niin vlippu=0:osuma=0:kerta=0
            'tulos= (tosi or epätosi) and tosi = tosi 
                'eli nyt cloneviuhu ilmestyy ja kerta=1
                
    '1.2.jos panosta ei vieläkään lähetetä,vaan odotellaan ja pohditaan ja mietiskellään
        'niin vlippu=0:osuma=0:kerta=1
            'tulos (tosi or epätosi) and epätosi = epätosi
                'cloneviuhu on näkyvissä edelleen,mutta uutta ei luoda
                
    '1.3.kun panos lähetetään ja sitä animoidaan
        'niin vlippu=1:osuma=0:kerta=1
            'tulos (epätosi or epätosi) and epätosi = epätosi
                'cloneviuhu vaan näkyy , mutta uutta ei luoda
    
    '2.1.kun panoksen lentäessä tapahtuu osuma cloneviuhuun,
    'osuma-muuttuja käy vain arvossa 1,mistä ei sinänsä ole mitään hyötyä
    'ja sen voisi ehkä poistaakkin
        'niin vlippu=0:osuma=0:kerta=0
            'tulos (tosi or epätosi) and tosi = tosi
                'nyt päästään luomaan uusi cloneviuhu - kerta=1
                
    '2.2.uusi cloneviuhu on tullut näkyviin
        'siten vlippu=0:osuma=0:kerta=1
            '(tosi or epätosi) and epätosi = epätosi
                'cloneviuhuja ei luoda enempää
    
    'silmukka jatkuu-->
                    
    'panoksen kulma määritys
    nax=RightKey()-LeftKey()
        If nax=1
            If kulma>34
                kulma-1
            EndIf 
        ElseIf nax=-1
            If kulma<146
                kulma+1
            EndIf 
        EndIf
    
    'panoksen lähtönopeus määritys
    nay=KeyUp(cbkeyup)-KeyUp(cbkeydown)
        If nay=1
            If ln<10
                ln+1
            EndIf 
        ElseIf nay=-1
            If ln>1
                ln-1
            EndIf 
        EndIf
        
    'luodaan uusi jäsen - ammus
    If KeyHit(cbkeyspace) And lataus=0 And vlippu=0
        a.AMMUS=New(AMMUS)
        a\obj=CloneObject(objammus)
        'määrätään liikeradan osapituusrakenne
        CloneObjectPosition a\obj,cannon
        CloneObjectOrientation a\obj,cannon 
        MoveObject a\obj,16
        'lataus=16
        tx=Cos(kulma)*ln
        ty=Sin(kulma)*ln
        vlippu=1
    EndIf 
    
    'If lataus
        'lataus-1
    'EndIf
    
    'käydään ammukset läpi ja liikutetaan niitä
    'myös rajaarvot huomioidaan
    If vlippu=1
    For a.AMMUS=Each AMMUS
        
        'liikutetaan panosta kulman ja
        'lähtönopeuden mukaan
        TranslateObject a\obj,tx,ty
        
        'painovoiman vaikutus pystysuunnassa
        ty=ty+PV
        
        For v.KOHDE=Each KOHDE
        If ObjectsOverlap(a\obj,v\obj,2)
            DeleteObject a\obj
            Delete a
            DeleteObject v\obj
            Delete v 
            'aalippu=1
            vklippu=1
            vlippu=0
            osuma=1:kerta=0
            'Wait 1000
            osuma=0
            
            
            
        EndIf 
        Next v
        
        If ObjectX(a\obj)<-290 Or ObjectX(a\obj)>290 Or ObjectY(a\obj)<-140
            DeleteObject a\obj
            Delete a
            vlippu=0
        EndIf 
        
        
    Next a
    EndIf 
    
    RotateObject cannon,kulma
    
               
Text 10,10,"lähtökulma "+kulma
Text 10,30,"lähtönopeus "+ln
DrawScreen
'If osuma=1 Then Exit 
Until EscapeKey()

'osuma=0
'Wend 
 
End 
EDIT:

No nyt toimii , kiitos VesQ !

Last edited by sankja on Sat Jul 10, 2010 9:27 am, edited 1 time in total.
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 »

sankja wrote:En voi käsittää miksi mavia pukkaa , olisin kiitollinen jos joku auttas. :(
Riviltä 173 alkaa ongelmat. Tältä siis ongelmaosio näyttää:

Code: Select all

For a.AMMUS=Each AMMUS
   
    'liikutetaan panosta kulman ja
    'lähtönopeuden mukaan
    TranslateObject a\obj,tx,ty
   
    'painovoiman vaikutus pystysuunnassa
    ty=ty+PV
   
    For v.KOHDE=Each KOHDE
    If ObjectsOverlap(a\obj,v\obj,2)
        DeleteObject a\obj // <----- HUOM!!! <------
        Delete a // <----- HUOM!!! <------
        DeleteObject v\obj
        Delete v
        'aalippu=1
        vklippu=1
        vlippu=0
        osuma=1:kerta=0
        'Wait 1000
        osuma=0
       
       
       
    EndIf
    Next v
   
    // HUOM!!! Tästä alas!
    If ObjectX(a\obj)<-290 Or ObjectX(a\obj)>290 Or ObjectY(a\obj)<-140
        DeleteObject a\obj
        Delete a
        vlippu=0
    EndIf
   
   
Next a
Tarkistat tuolla alemmassa If-lauseessa jo poistettua a\obj -objektia. Siitä johtuu MAV.
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
rpgmaker

Re: Tyhmät kysymykset (I/2010)

Post by rpgmaker »

Tossa koitin tehä vihollisten kävelymoottoria esimerkki 3 pohjalta,mutta en saa sitä kunnolla toimimaan koittakaa.. niin huomaatte.
Ja onko komentoa jolla voisin tarkistaa että vihollinenx=sijaintix esim.3pikselin tarkkuudella?
Ja miten saan tuon vähemmän purkkaiseksi?
vihollinen jää nykimään,sillä se ei ole aivan samalla Vaaka tasolla kuin ukko?

Code: Select all

'Esimerkki 3 : Liikkuva objekti
'================================================

'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !


FrameLimit 40 'rajoita pelin toimintanopeutta

'lataa pelihahmo
ukko = LoadObject("Media\guy.bmp", 4)
PositionObject ukko,150,-120
sotilas = LoadObject("Media\soldier.bmp", 4)
PositionObject sotilas,-150,120
ClsColor cbWhite

Repeat 'pääsilmukan alku
sijaintix=ObjectX(ukko)
sijaintiy=ObjectY(ukko)
vihollinenx=ObjectX(sotilas)
vihollineny=ObjectX(sotilas)
    'ohjaa nuolilla
    If LeftKey() Then TranslateObject ukko,-3,0:RotateObject ukko,180
    If RightKey() Then TranslateObject ukko,3,0:RotateObject ukko,0   
    
    If UpKey() Then TranslateObject ukko,0,3:RotateObject ukko,90
    If DownKey() Then TranslateObject ukko,0,-3:RotateObject ukko,270
    If vihollinenx=<sijaintix+Rand(-2,2) Then 
    TranslateObject sotilas,2,0
    RotateObject sotilas,0
    ElseIf vihollinenx=>sijaintix+Rand(-2,2) Then 
    TranslateObject sotilas,-2,0
    RotateObject sotilas,180
    EndIf

If vihollinenx=sijaintix Then 
paikalla=True 
Else
paikalla=False
EndIf   
    
    If vihollineny=<sijaintiy And paikalla Then 
    TranslateObject sotilas,0,2
    RotateObject sotilas,90
    ElseIf vihollineny=>sijaintiy And paikalla Then 
    TranslateObject sotilas,0,-2
    RotateObject sotilas,270
    EndIf
    
    Color cbblack
    Text 0,0,"ukon sijainti X "+sijaintix
    Text 0,30,"ukon sijainti Y "+sijaintiy
      Text 0,60,"vihollisen sijainti X "+vihollinenx
    Text 0,90,"vihollisen sijainti Y "+vihollineny
    DrawScreen

Forever
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 »

rpgmaker wrote:Tossa koitin tehä vihollisten kävelymoottoria esimerkki 3 pohjalta,mutta en saa sitä kunnolla toimimaan koittakaa.. niin huomaatte.
Ja onko komentoa jolla voisin tarkistaa että vihollinenx=sijaintix esim.3pikselin tarkkuudella?
Ja miten saan tuon vähemmän purkkaiseksi?
vihollinen jää nykimään,sillä se ei ole aivan samalla Vaaka tasolla kuin ukko?
Käytät Rand-komentoa, joka aiheuttaa sen nykimisen. Rand-komentohan tuottaa satunnaislukuja, että nyt kyllä vähän menit hakoseen.

Tuohon, että onko komentoa, jolla voisi tarkistaa tuon etäisyyden, niin ei varsinaisesti ole. Mutta voit hoitaa tarkistuksen käyttämällä If-lauseessa "And" avainsanaa, jonka avulla voit laittaa kaksi ehtoa yhteen. Eli voit tarkistaa, onko vihollinenx kolmen pikselin etäisyydellä sijaintix:stä käyttämällä tätä If-lausetta:

Code: Select all

If vihollinenx => sijaintix - 1 And vihollinenx =< sijaintix + 1
Koodissasi oli myös virhe siinä kohtaa, missä määrittelit vihollineny muuttujan. Asetit sen arvoksi ObjectX(soldier) kun varmaankin hait ObjectY(soldier) komentoa :).

Niin, ja se tärinä johtuu itse asiassa myös siitä, että liikutat sitä soldier-objektia aina kahden pikselin verran. Jos siis satutaan jatkuvasti sellaiseen tilanteeseen, että se varsinainen "oikea kohta" jää siihen liikkeen väliin, niin se yrittää jatkuvasti korjata kääntämällä ukkoa ja liikuttamalla toiseen suuntaan. Harmi vain, että silloinkin pompataan yksi pikseli liian pitkälle, jolloin objektia käännetään ja sama ongelma toistuu jatkuvasti uudelleen.
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
rpgmaker

Re: Tyhmät kysymykset (I/2010)

Post by rpgmaker »

Juu Siinä pitkin lukea :D Se Vaikutti aika paljon

Code: Select all

vihollineny=ObjectY(sotilas)
Nyt laitoin,ettei se nykisi enää,mutta nyt vihollinen menee välillä selvästi eri tasolla kun ukko.5pikseliä eri tasolla?
Saisikohan tota mitenkää,että vihollinen menisi samaa linjaa eikä nykisi?Hidastamalla vihollisen nopeus 1 pikseliin,kun ollaan tarpeeksi lähellä?
Vai onko toi nyt tollai tarpeeks hyvä?
Ja onko jotai vähemmän purkkasta tapaa tehä toi mun äskön lähettämä koodin pätkä?

Code: Select all

If vihollinenx => sijaintix - 2 And vihollinenx =< sijaintix + 2 Then 
paikalla=True 
Else
paikalla=False
EndIf   
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 »

rpgmaker wrote:Ja onko jotai vähemmän purkkasta tapaa tehä toi mun äskön lähettämä koodin pätkä?
Tein sinulle saman toiminnallisuuden sisältävän koodipätkän, jonka olen toivottavasti kommentoinut sinulle tarpeeksi hyvin. Tässäpä se, ollos hyvä:

Code: Select all

FrameLimit 40

// Ladataan objektit
ukko = LoadObject("Media\guy.bmp", 4)
sotilas = LoadObject("Media\soldier.bmp", 4)

// Muutetaan taustaväri ja piirtoväri
ClsColor cbWhite
Color cbBlack

// Asetetaan objektit randomisti NÄYTTÖKOORDINAATTIEN
// mukaan. Näytön koko on leveyssuunnassa 400 ja pystysuunnassa
// 300 oletuksena. Näin siis objektit asetetaan leveysuunnassa
// 20-380 väliin ja pystysuunnassa 20-280 väliin.
ScreenPositionObject ukko, Rand(20,380), Rand(20, 280)
ScreenPositionObject sotilas, Rand(20,380), Rand(20, 280)


Repeat
    
    sivulle = RightKey() - LeftKey()
    alas = DownKey() - UpKey()
    
    If sivulle And alas Then
        // Jos painetaan vasen-oikea nuolia ja
        // ylös-alas nuolia samaan aikaan, niin
        // ei käännetä ukkoa, vaan liikutetaan
        // sitä ainoastaan sen NYKYISEEN suuntaan.
        MoveObject ukko, 3
        
    ElseIf sivulle Or alas Then
        // Jos painettiin sivulle TAI ylös-alas, niin
        // asetetaan ukko-objektin kulma vastaavasti.
        If sivulle Then
            If sivulle=1 Then
                // sivulle-muuttujan arvo on 1, kun painettiin
                // oikeaa nuolinäppäintä. Tällöin kun key-muuttuja
                // asetetaan 0, käännetään objektia kulmaan 0*90 eli 0.
                key=0 
            Else 
                // sivulle-muuttujan arvo ei ole 1, kun painettiin
                // vasenta nuolinäppäintä. Tällöin kun key-muuttuja
                // asetetaan 2, käännetään objektia kulmaan 2*90 eli 180.
                key=2
            EndIf
        Else
            If alas=1 Then 
                // alas-muuttujan arvo on 1, kun painettiin alaspäin
                // osoittavaa nuolinäppäintä. Tällöin kun key-muuttuja
                // asetetaan 3, käännetään objektia kulmaan 3*90 eli 270.
                key=3 
            Else 
                // alas-muuttujan arvo ei ole 1, kun painettiin ylöspäin
                // osoittavaa nuolinäppäintä. Tällöin kun key-muuttuja
                // asetetaan 1, käännetään objektia kulmaan 1*90 eli 90.
                key=1
            EndIf
        EndIf
        // Objektin kääntö
        RotateObject ukko, key*90
        // Liikutetaan objektia sen NYKYISEEN suuntaan.
        MoveObject ukko, 3
        
    EndIf

    // Katsotaan objektien välinen kulma
    kulma = GetAngle2( ukko, sotilas )
    
    // Katsotaan objektien välinen etäisyys
    etäisyys = Distance2( ukko, sotilas )
    
    Text 0, 0, "Objektien välinen kulma: "+kulma+" aste(tta)."
    Text 0, 15, "Objektien etäisyys toisistaan: "+etäisyys+" pikseli(ä)."
    
    If etäisyys => 2 Then
        // Vain jos objektit ovat kahden tai useamman pikselin
        // etäisyydellä toisistaan, liikutetaan/pyöritetään
        // sotilas-objektia. Näin estetään tärinä.
        If kulma < 90 Then
            RotateObject sotilas, 180
            Text 0, 30, "Sotilas liikkuu vasemmalle."
        ElseIf kulma < 180 Then
            RotateObject sotilas, 270
            Text 0, 30, "Sotilas liikkuu alas."
        ElseIf kulma < 270 Then
            RotateObject sotilas, 0
            Text 0, 30, "Sotilas liikkuu oikealle."
        Else
            RotateObject sotilas, 90
            Text 0, 30, "Sotilas liikkuu ylös."
        EndIf
        MoveObject sotilas, 2
    EndIf

    DrawScreen

Forever
Tein noiden näppäinten ohjauksen tuolla tavalla, että ukko-objekti voisi vaihtaa suuntaa vain silloin, kun vain yksi nuolinäppäin on pohjassa.

Koitas saada aikaiseksi se, että tuo sotilas vaihtaisi suuntaa kun kulmat ovat välillä 315-45, 45-135, 135-225, 225-315. Näin sillä ei olisi väliä, mihin suuntaan ukko menisi (vasta- tai myötäpäivään)
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
rpgmaker

Re: Tyhmät kysymykset (I/2010)

Post by rpgmaker »

Juu kiitos.Postaan nyt tän minkä ite tossa tein.Eli eka menee samalle x akselille sitte alaspäin,kun toi sun taas toimi kulmilla.Kumpi on sitte parempi vähemmän koodi määrän ja fps kannalta?Lisään ainakin vielä animaatiot ja vihollisen muutan typeksi.Eli kumpaa kannattaa käyttää?
Ja viholliset sijotan data kerroksee.Ja sitte pitää vielä kysyy sitä,että mistä löydän CBSDK ja se CB aarrearkku tai joku kirjasto.Missä oli kait positionobject2 komento tai joku semmonen..En löydä googlesta.Ja sitte vielä mietityttää tämmöne,että miten saan asetettuu esim. 50 vihollista datakerrokseen(numero1)
jos siinä kartalla on vaikka 500(numero1) datakerroksessa.Eli sijoittas randomilla sille alueelle.Eikä oo mikää neliönmuotonen alue,että ei toimi positionobject.Enkä viittis sillä alkaa säätää,ku pitäis ettii ne oikee koordinaatitki.Niitä numeroita paljo helpompi klikkailla data kerroksee

Code: Select all

'Esimerkki 3 : Liikkuva objekti
'================================================

'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !


FrameLimit 40 'rajoita pelin toimintanopeutta

'lataa pelihahmo
ukko = LoadObject("Media\guy.bmp", 4)
PositionObject ukko,150,-120
sotilas = LoadObject("Media\soldier.bmp", 4)
PositionObject sotilas,-150,120
ClsColor cbWhite

Repeat 'pääsilmukan alku
sijaintix=ObjectX(ukko)
sijaintiy=ObjectY(ukko)
vihollinenx=ObjectX(sotilas)
vihollineny=ObjectY(sotilas)
    'ohjaa nuolilla
    If LeftKey() Then 
    TranslateObject ukko,-3,0:RotateObject ukko,180
    ElseIf RightKey() Then 
    TranslateObject ukko,3,0:RotateObject ukko,0   
    
    ElseIf UpKey() Then
    TranslateObject ukko,0,3:RotateObject ukko,90
    ElseIf DownKey() Then
     TranslateObject ukko,0,-3:RotateObject ukko,270
    EndIf
    If vihollinenx=<sijaintix and paikalla=False Then 
    TranslateObject sotilas,2,0
    RotateObject sotilas,0
    ElseIf vihollinenx=>sijaintix And paikalla=False Then 
    TranslateObject sotilas,-2,0
    RotateObject sotilas,180
    EndIf

 If vihollinenx => sijaintix - 2 And vihollinenx =< sijaintix + 2 Then 
paikalla=True 
Else
paikalla=False
EndIf   
    
    If vihollineny=<sijaintiy And paikalla Then 
    TranslateObject sotilas,0,2
    RotateObject sotilas,90
    ElseIf vihollineny=>sijaintiy And paikalla Then 
    TranslateObject sotilas,0,-2
    RotateObject sotilas,270
    EndIf
    
    Color cbblack
    Text 0,0,"ukon sijainti X "+sijaintix
    Text 0,30,"ukon sijainti Y "+sijaintiy
      Text 0,60,"vihollisen sijainti X "+vihollinenx
    Text 0,90,"vihollisen sijainti Y "+vihollineny
    Text 0,120,"FPS(rajoitettu 40): "+FPS()
    DrawScreen

Forever
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 »

Huh, kun on paljon kysymyksiä yhdessä viestissä. Koitanpa vastailla..
rpgmaker wrote:Juu kiitos.Postaan nyt tän minkä ite tossa tein.Eli eka menee samalle x akselille sitte alaspäin,kun toi sun taas toimi kulmilla.Kumpi on sitte parempi vähemmän koodi määrän ja fps kannalta?
No sinänsä toi sun tänhetkinen ratkaisu näyttää aika epäsiistiltä ja siksi lähdin ite tekemään toisenlaista. En tajunnut sitä ideaa, että pitäis mennä eka x-akselille niin siks tein kulmilla. Eipä se FPS:n kannalta vaikuta paljoa ollenkaan asiaan, että kummalla tavalla sen tekee.

Koodistas sen verran, että kun otat Repeat...Forever loopin alussa talteen objektien koordinaatit muuttujiin ja liikuttelet niitä objekteja sen jälkeen, niin nuo muuttujat eivät enää kerro objektien oikeita koordinaatteja. Eli jossain vaiheessa täytyy muuttujien arvot laittaa uudelleen, tai sitten pitää käyttää kaikkialla niitä alkuperäisiä ObjectX/Y-funktioita.

Siistin vähän koodias ja muutin siitä tuon edellisen pointtini takia koodia + lisäsin siihen y-suunnassa olevaan tarkistukseen vähän liikkumisvaraa (3px verran) ettei sotilas tärisisi. Nyt sen pitäis toimia.

Code: Select all

'Esimerkki 3 : Liikkuva objekti
'================================================

'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !


FrameLimit 40 'rajoita pelin toimintanopeutta

'lataa pelihahmo
ukko = LoadObject("Media\guy.bmp", 4)
PositionObject ukko,150,-120
sotilas = LoadObject("Media\soldier.bmp", 4)
PositionObject sotilas,-150,120
ClsColor cbWhite

Repeat 'pääsilmukan alku
    'ohjaa nuolilla
    If LeftKey() Then
        TranslateObject ukko,-3,0:RotateObject ukko,180
    ElseIf RightKey() Then
        TranslateObject ukko,3,0:RotateObject ukko,0   
    ElseIf UpKey() Then
        TranslateObject ukko,0,3:RotateObject ukko,90
    ElseIf DownKey() Then
        TranslateObject ukko,0,-3:RotateObject ukko,270
    EndIf
    
    sijaintix=ObjectX(ukko)
    sijaintiy=ObjectY(ukko)
    vihollinenx=ObjectX(sotilas)
    vihollineny=ObjectY(sotilas)
    
    If vihollinenx=<sijaintix and paikalla=False Then
        TranslateObject sotilas,2,0
        RotateObject sotilas,0
    ElseIf vihollinenx=>sijaintix And paikalla=False Then
        TranslateObject sotilas,-2,0
        RotateObject sotilas,180
    EndIf

    sijaintix=ObjectX(ukko)
    sijaintiy=ObjectY(ukko)
    vihollinenx=ObjectX(sotilas)
    vihollineny=ObjectY(sotilas)

    If vihollinenx => sijaintix - 2 And vihollinenx =< sijaintix + 2 Then
        paikalla=True
    Else
        paikalla=False
    EndIf   
   
    If vihollineny =< sijaintiy - 1 And paikalla Then
        TranslateObject sotilas,0,2
        RotateObject sotilas,90
    ElseIf vihollineny => sijaintiy + 2 And paikalla Then
        TranslateObject sotilas,0,-2
        RotateObject sotilas,270
    EndIf
   
    Color cbblack
    Text 0,0,"ukon sijainti X "+sijaintix
    Text 0,30,"ukon sijainti Y "+sijaintiy
    Text 0,60,"vihollisen sijainti X "+vihollinenx
    Text 0,90,"vihollisen sijainti Y "+vihollineny
    Text 0,120,"FPS(rajoitettu 40): "+FPS()
    
    DrawScreen
Forever
rpgmaker wrote:Ja sitte vielä mietityttää tämmöne,että miten saan asetettuu esim. 50 vihollista datakerrokseen(numero1)
Käy koko kartta läpi kahdella sisäkkäisellä For-loopilla (kts. funktiot MapWidth ja MapHeight manuaalista) ja tarkista jokainen tile GetMap2-funktiolla. Jos sitten löydät sen tilen, mihin objekti kuuluu laittaa, niin saat sen laitettua oikeaan kohtaan käyttämällä CB-SDK:n funktiota ObjectToMap. Laitan sen funktion tuohon alle, mutta huomaa, että sinun pitää vaihtaa gCurrentMap, gTileWidth ja gTileHeight muuttujien tilalle karttamuuttuja ja yhden tilen koko.

Code: Select all

//================================================================================
// Sijoitetaan objekti kartalle tilekoodrinaatteihin.
// Parametrit:
// _obj     - Sijoitettava objekti
// _tileX   - Tilen x-arvo
// _tileY   - Tilen y-arvo
//================================================================================
Function ObjectToMap(_obj, _tileX, _tileY)
    // Ensin lasketaan kartan vasemman yläkulman sijainti
    // maailmankoordinaateissa.
    mwx = ObjectSizeX(gCurrentMap) / -2 + ObjectX(gCurrentMap)
    mwy = ObjectSizeY(gCurrentMap) / 2 + ObjectY(gCurrentMap)
    
    // Sitten siirretään puoli tileä jotta oltaisiin ensimmäisen tilen keskellä.
    mwx = mwx + gTileWidth / 2
    mwy = mwy - gTileHeight / 2
    
    // Siirretään vielä oikean tilen kohdalle.
    mwx = mwx + (_tileX - 1) * gTileWidth
    mwy = mwy - (_tileY - 1) * gTileHeight
    
    // Ja lopuksi objekti paikoilleen.
    PositionObject _obj, mwx, mwy
EndFunction
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
rpgmaker

Re: Tyhmät kysymykset (I/2010)

Post by rpgmaker »

Juu kiitos :DVielä semmone ,että saako cbsdk:ta mistään?Googlesta etin muttei se linkki toiminu,tai sitten se coolbasic koodikirjasto
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by Viltzu »

rpgmaker wrote:Juu kiitos :DVielä semmone ,että saako cbsdk:ta mistään?Googlesta etin muttei se linkki toiminu,tai sitten se coolbasic koodikirjasto
Mitä jos olisit käyttänyt foorumin hakutoimintoa..? Ja tämä topic taitaa olla enemmän tarkoitettu ohjelmointiin liittyviin kysymyksiin.
Mutta tässäpä tämä nyt on: http://jouluserver.com/~aave/cbsdk (Jouluserver tosin on alhaalla niin joudut odottelemaan)
EDIT:

Oho en tainnut lukea viestiäsi ihan kokonaan :D

Last edited by Viltzu on Sat Jul 10, 2010 1:08 pm, edited 1 time in total.
rpgmaker

Re: Tyhmät kysymykset (I/2010)

Post by rpgmaker »

Juu sanoin että en pääse sivulle.Nii aattelin,että jos joku vois upata sen tai tietäis toisen sivun millä ois ollu
Locked