APUA!!

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
Koodari
Active Member
Posts: 201
Joined: Wed Nov 18, 2009 9:01 pm
Contact:

APUA!!

Post by Koodari »

Eli en osaa vielä kirjoittaa sopivaa koodia kimmokkeelle. Eli tahdon, että kun objeckti PALLO tormää seinään (Esim. 38° kulmassa), niin pallo jatkaa matkaansa samassa 38° kulmassa.
Voisiko joku kirjoittaa koodin, jonka "Kimpoaja" on PALLO ja "Kimmoke" on SEINÄ. Kiitos sille, joka tämän voi tehdä! ;)


(Tämänhetkinen projekti on pelihullun äitini pyynnöstä vanhanaikainen TV-Peli):
Image
Alussa oli asiakas, projekti ja Koodari...

Code: Select all

[23:36:33] <Minixmix> jos nyt viel yhen lastin heittäis
[23:36:48] <Minixmix> Sit loput vois hoitaa kännyllä :/
[00:14:49] <Minixmix> mutta nyt tyhjennykselle ->
[/size]
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: APUA!!

Post by Herra Siili »

Ensinnäkin suosittelen lukemaan ne foorumin säännöt. Otsikko oli huonoin mahdollinen.
Kimmokkeen saat tehtyä siten, että jos pallo törmää kenttään, mutta Y-suunnan (pystysuunta) liike päinvastaiseksi. Jos pallo törmää mailaan, muuta X-suunta (vaakasuunta) päinvastaiseksi.
Ei ole nyt mahdollisuutta koodia laittaa, mutta tuolla pitäisi onnistua.
EDIT:

kaneli2000 wrote: Simppelisti näin:

Code: Select all

koodia...
Sama vaikutus, mutta minä tekisin näin:

Code: Select all

If osutaan_seinään Then y_vauhti = -y_vauhti
If osutaan_mailaan Then x_vauhti = -x_vauhti
Lyhyempi tapa.[/edit]
Last edited by Herra Siili on Wed Nov 18, 2009 10:11 pm, edited 2 times in total.
a.k.a. Gehock
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: APUA!!

Post by kaneli2000 »

Herra Siili wrote:Ensinnäkin suosittelen lukemaan ne foorumin säännöt. Otsikko oli huonoin mahdollinen.
Kimmokkeen saat tehtyä siten, että jos pallo törmää kenttään, mutta Y-suunnan (pystysuunta) liike päinvastaiseksi. Jos pallo törmää mailaan, muuta X-suunta (vaakasuunta) päinvastaiseksi.
Ei ole nyt mahdollisuutta koodia laittaa, mutta tuolla pitäisi onnistua.
Simppelisti näin:

Code: Select all

If osutaan_seinään Then y_vauhti = y_vauhti / -1
If osutaan_mailaan Then x_vauhti = x_vauhti / -1
I see the rainbow rising
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: APUA!!

Post by SPuntte »

Tuohon "ratkaisuun" sisältyy klassinen ongelma siitä, että pallo vaihtaa useamman kerran suuntaa ja jatkaa matkaansa ihan minne sattuu. Kannattaa siis sisällyttää mukaan tarkistus, joka varmistaa, että nopeuden etumerkki muutetaan vain, jos pallo liikkuu törmäyksen toista osapuolta kohti. Tämä tarkoittaa esimerkiksi ikkunan yläreunan tapauksessa positiivista nopeuden y-komponenttia maailmakoordinaatistossa ja vasemman mailan kohdalla taas negatiivista x-komponenttia jne.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: APUA!!

Post by MaGetzUb »

Pallon hallinta on loppujenlopuksi helppoa:

Code: Select all

pdx = 2
pdy = 2
Repeat

petäisyysx = Objectx(pallo) - pdx
pdx = px

py = ObjectY(pallo)
petäisyysy = Objecty(pallo) - pdy
pdy = py

TranslateObject pallo, petäisyysx , petäisyysy  px = ObjectX(pallo)

If ObjectY(pallo) < alaseinä Or ObjectY(pallo) > yläseinä And vauhtimuutettu = False Then vauhtimuutettu = True : pdy = - pdy Else vauhtimuutettu = False 
Until KeyHit(1) 
Jotain tuon tapaista, en tiedä toimiiko, mutta ainakin pikaisella katsauksella pitäisi vörkkiä. ;)

En lähtisi edes toteuttamaan tätä projektia objekteilla, ne on köppäisiä, mutta aloittelia ystävällisiä. :)
Last edited by MaGetzUb on Sun Nov 22, 2009 2:31 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: APUA!!

Post by Herra Siili »

Mitä virkaa tuolla petäisyys - muuttujalla on?
a.k.a. Gehock
User avatar
Koodari
Active Member
Posts: 201
Joined: Wed Nov 18, 2009 9:01 pm
Contact:

Re: APUA!!

Post by Koodari »

MaGetzUb wrote:Pallon hallinta on loppujenlopuksi helppoa:
En lähtisi edes toteuttamaan tätä projektia objekteilla, ne on köppäisiä, mutta aloittelia ystävällisiä. :)
Ei nuo ole objecteja. Ne on piirrettyjä laatikoita ja ympyröitä.
Olen käyttänyt CoolBasic :ia noin 2 kuukautta, mutta en ymmärrä esimerkiksi näitä käskyjä: osutaan_seinään ; osutaan_mailaan jne.
Missä kohtaa ohjelman tulee tietää, mitä "osutaan_seinään" tarkoittaa. Voiko joku laittaa yksinkertaisen koodinpätkän tästä!
Menenkin itse tutkimaan asiaa...
Alussa oli asiakas, projekti ja Koodari...

Code: Select all

[23:36:33] <Minixmix> jos nyt viel yhen lastin heittäis
[23:36:48] <Minixmix> Sit loput vois hoitaa kännyllä :/
[00:14:49] <Minixmix> mutta nyt tyhjennykselle ->
[/size]
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: APUA!!

Post by koodaaja »

Koodari wrote:Olen käyttänyt CoolBasic :ia noin 2 kuukautta, mutta en ymmärrä esimerkiksi näitä käskyjä: osutaan_seinään ; osutaan_mailaan jne.
Kyseinen pätkä oli todennäköisesti nk. pseudokoodia, eli koodia jota ei sellaisenaan voi kääntää mutta ihminen ymmärtää siitä mitä tarkoitetaan. Tuo on myös ihan toimiva pätkä mikäli osutaan_seinään ja osutaan_mailaan ovat muuttujia. (if muuttuja -tyyppisessä tilanteessa ehto toteutuu jos muuttujan arvo ei ole 0)

Itse ongelmaan: haluat tosiaan pallollesi x- ja y -suuntaiset nopeudet. Kun törmätään pystysuunnassa, y -nopeus käännetään, kun taas vaakasuunnassa, x -nopeus käännetään. Y -suuntainen törmäys on hyvin yksinkertainen löytää, jos ollaan menossa näytön ulkopuolelle niin törmätään. X -suuntaisessa on otettava huomioon mailan sijainti - jos törmätessä sivuseinään ei olla mailan kohdalla, pallo menee siitä läpi. Tämä hoituu helposti vertaamalla mailan y -koordinaattia pallon y -koordinaattiin mikäli törmätään x -suunnassa.

Tässä pientä runkoa.

Code: Select all

pallo_x = 200
pallo_y = 150

pallo_x_nopeus = 5
pallo_y_nopeus = 5

Repeat
    
    pallo_x = pallo_x + pallo_x_nopeus
    pallo_y = pallo_y + pallo_y_nopeus
    
    If pallo_x<10 Or pallo_x>390 Then pallo_x_nopeus = -pallo_x_nopeus
    If pallo_y<10 Or pallo_y>290 Then pallo_y_nopeus = -pallo_y_nopeus
    
    Box pallo_x-5, pallo_y-5, 10, 10
    
    DrawScreen
Forever
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: APUA!!

Post by MAVmaggot »

Ah, koodaja ehtikin ensin. No anyway, alottelijaystävällisyyteen pyrkivä esimerkki hieman kiusallisella botilla:

Code: Select all

pallox = ScreenWidth()/2
palloy = ScreenHeight()/2
palloxplus = 5
palloyplus = 1
Repeat
    //jos pallo osuu ylä- tai alaseinään kimmotetaan se
    If palloy>ScreenHeight() Or palloy<0
        palloyplus = -palloyplus 'kimmotuksen saa aikaan muuttamalla liikkumisen negatiiviseksi
    EndIf
    
    //jos pallo osuu vasempaan seinään ja botin mailaan...
    If pallox < 5 And palloy > maila2y And palloy < maila2y+100
        palloxplus = -palloxplus
    ElseIf pallox > ScreenWidth()-5 And palloy > maila1y And palloy < maila1y+100
        palloxplus = -palloxplus
    EndIf
    
    //jos pallo menee yli rajojen päätetään peli
    If pallox<0 Or pallox>ScreenWidth() Then End

    //päivitetään koordinaatit
    maila1y = MouseY()-50
    maila2y = palloy-50
    pallox = pallox + palloxplus
    palloy = palloy + palloyplus
    
    //piirretään kaikki
    Box ScreenWidth()-5,maila1y,5,100
    Box 0,maila2y,5,100
    Circle pallox-3,palloy-3,6
    DrawScreen
Forever
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: APUA!!

Post by TheDuck »

OFF: btw, voisitte laittaa framelimitit noihin koodeihinne, ihmettelin miksi menee pallot noin saakelin kovaa, niin ohjelma pyörikin 300fps :D
^^
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: APUA!!

Post by Jonez »

MAVmaggot wrote:Ah, koodaja ehtikin ensin. No anyway, alottelijaystävällisyyteen pyrkivä esimerkki hieman kiusallisella botilla:
Otin vapauden muokata koodiasi, jotta botti olisi jopa voitettavissa. Merkittävät muutokset: botin vakionopeus ja mahdollisuus lisätä kierrettä palloon:

Kaikki uudet rivit on kommentoitu tyyliin: //MUUTOS: tämä ja tämä muutettiin.

Code: Select all

FrameLimit 80

//MUUTOS: palloy ja palloyplus ovat liukulukuja (float)
pallox = ScreenWidth()/2
palloy# = ScreenHeight()/2
palloxplus# = 3
palloyplus = 1

Repeat
    //jos pallo osuu ylä- tai alaseinään kimmotetaan se
    If palloy>ScreenHeight() Or palloy<0
        palloyplus = -palloyplus 'kimmotuksen saa aikaan muuttamalla liikkumisen negatiiviseksi
    EndIf
    
    //jos pallo osuu vasempaan seinään ja botin mailaan...
    If pallox < 5 And palloy > maila2y And palloy < maila2y+100
        palloxplus = -palloxplus
    ElseIf pallox > ScreenWidth()-5 And palloy > maila1y And palloy < maila1y+100
        palloxplus = -palloxplus
        
        //MUUTOS: pallo saa kierrettä sitä enemmän mitä enemmän mailaa heilauttaa:
        palloyplus = palloyplus - Cos( GetAngle( 0, maila1y, 0, vanhaMaila1y ) + 90 )
    EndIf
    
    //jos pallo menee yli rajojen päätetään peli
    If pallox<0 Or pallox>ScreenWidth() Then End

    //päivitetään koordinaatit
    vanhaMaila1y = maila1y  //<- MUUTOS: otetaan pelaajan mailan vanha koordinaatti talteen
    maila1y = MouseY()-50
    
    //MUUTOS: maila2y _yrittää_ seurata palloa, mutta sen nopeus on hitaampi.
    maila2y = maila2y + ( ( palloy - 50 ) > maila2y ) - ( ( palloy - 50 ) < maila2y )

    pallox = pallox + palloxplus
    palloy = palloy + palloyplus
    
    //piirretään kaikki
    Box ScreenWidth()-5,maila1y,5,100
    Box 0,maila2y,5,100
    Circle pallox-3,palloy-3,6
    DrawScreen
Forever
Tämä siis ylimääräisenä esimerkkinä ketjun aloittajalle. Esimerkkejä ei koskaan voi olla liikaa. ;)
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: APUA!!

Post by DatsuniG »

Tässä olisi oma esimerkkini:

Code: Select all

            Type PADS
                Field X As Float
                Field Y As Float
                Field Bot
            EndType
            For i = 0 To 1
                uusi.PADS = New(PADS)
                uusi\bot = i
                uusi\y = (ScreenHeight() - 10) * i
            Next i
            y# = -10
            Repeat
                speed# = speed + Float(0.4 / FPS())
                x# = x# + Cos(angle) * speed#
                y = y + Sin(angle) * speed#
                Circle x,y,4
                For uusi.PADS = Each PADS
                    If uusi\bot Then
                        If uusi\x < x - 25 Then uusi\x = Min(ScreenWidth() - 50,uusi\x + (Min(Abs((x - 25) - uusi\x),1 * speed))) Else uusi\x = Max(0,uusi\x - Min(Abs((x - 25) - uusi\x),(1 * speed)))
                        If x > uusi\x And x < uusi\x + 50 And y > ScreenHeight() - 12 Then angle = WrapAngle(360 - angle)
                    Else
                        uusi\x = Min(Max(0,uusi\x + (RightKey() * speed) - (LeftKey() * speed)),ScreenWidth() - 50)
                        If x > uusi\x And x < uusi\x + 50 And y < 12 Then angle = WrapAngle(360 - angle)
                    EndIf
                    Box uusi\x,uusi\y,50,10
                Next uusi
                If x < 0 Then angle = WrapAngle(180 - angle)
                If x > ScreenWidth() - 4 Then angle = WrapAngle(180 - angle)
                If y < 0 Or y > ScreenHeight() Then
                    x = ScreenWidth() / 2 - 2
                    y = ScreenHeight() / 2 - 2
                    speed = 1
                    If Rand(1) then angle = Rand(45,135) Else angle = Rand(225,315)
                    For uusi.PADS = Each PADS
                        uusi\x = ScreenWidth() / 2 - 25
                    Next uusi
                EndIf
                DrawScreen
            Forever
Hengität nyt manuaalisesti.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: APUA!!

Post by MaGetzUb »

Tässä olis minun viritelmä

Code: Select all


Dim pelaajaY(1) As Float, pongball(2) As Float 

pelaajaY(0) = ScreenHeight() / 2 - 20
pelaajaY(1) = ScreenHeight() / 2 - 20

pongball(0) = ScreenWidth()/2
pongball(1) = ScreenHeight()/2
pongball(2) = 1
pongball(3) = 1

Repeat 

pongball(0) = pongball(0) + pongball(2)
pongball(1) = pongball(1) + pongball(3)





Box pongball(0),pongball(1),10,10

If BoxOverlap(pongball(0),pongball(1),10,10,20,pelaajaY(0),10,40) Or BoxOverlap(pongball(0),pongball(1),10,10,ScreenWidth()-30,pelaajaY(1),10,40) Then pongball(2) = - pongball(2)


pelaajaY(0) = pelaajaY(0) + ( KeyDown(cbkeys) - KeyDown(cbkeyw)) * 2
pelaajaY(1) = pelaajaY(1) +  (DownKey() - UpKey()) * 2

If pongball(1) < 0 Or pongball(1) > ScreenHeight() - 10 Then pongball(3) = - pongball(3)
If pongball(0)  < 29 Or (pongball(0) + 10) > ScreenWidth() - 29 Then End

Box 20,pelaajaY(0),10,40
Box ScreenWidth()-30,pelaajaY(1),10,40




DrawScreen
Forever 
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply