APUA!!
APUA!!
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):
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):
Alussa oli asiakas, projekti ja Koodari...
[/size]
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 ->
-
- Advanced Member
- Posts: 308
- Joined: Tue Nov 25, 2008 8:06 pm
- Contact:
Re: APUA!!
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.
Lyhyempi tapa.[/edit]
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:
Sama vaikutus, mutta minä tekisin näin:kaneli2000 wrote: Simppelisti näin:Code: Select all
koodia...
Code: Select all
If osutaan_seinään Then y_vauhti = -y_vauhti
If osutaan_mailaan Then x_vauhti = -x_vauhti
Last edited by Herra Siili on Wed Nov 18, 2009 10:11 pm, edited 2 times in total.
a.k.a. Gehock
- kaneli2000
- Guru
- Posts: 1059
- Joined: Mon Mar 17, 2008 2:40 pm
- Location: Lempäälä
Re: APUA!!
Simppelisti näin: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.
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
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: APUA!!
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
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: APUA!!
Pallon hallinta on loppujenlopuksi helppoa:
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ä.
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)
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
We're in a simulation, and God is trying to debug us.
-
- Advanced Member
- Posts: 308
- Joined: Tue Nov 25, 2008 8:06 pm
- Contact:
Re: APUA!!
Ei nuo ole objecteja. Ne on piirrettyjä laatikoita ja ympyröitä.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ä.
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...
[/size]
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 ->
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: APUA!!
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)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.
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
Re: APUA!!
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
- TheDuck
- Devoted Member
- Posts: 632
- Joined: Sun Aug 26, 2007 3:51 pm
- Location: C:\Program Files\Tuusula\
Re: APUA!!
OFF: btw, voisitte laittaa framelimitit noihin koodeihinne, ihmettelin miksi menee pallot noin saakelin kovaa, niin ohjelma pyörikin 300fps
^^
Re: APUA!!
Otin vapauden muokata koodiasi, jotta botti olisi jopa voitettavissa. Merkittävät muutokset: botin vakionopeus ja mahdollisuus lisätä kierrettä palloon:MAVmaggot wrote:Ah, koodaja ehtikin ensin. No anyway, alottelijaystävällisyyteen pyrkivä esimerkki hieman kiusallisella botilla:
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
Re: APUA!!
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.
Re: APUA!!
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
We're in a simulation, and God is trying to debug us.