Kun tekisin autopelin, missä voi ajaa autolla eri suuntiin
näytöllä niin, että se kääntyy, eli auton kulma ilmoitetaan asteina. Mitenkähän voisi laskea, että jos tiedän:
X-sijainnin
Y-sijainnin
auton nopeuden
auton kulman
Niin mitenkähän voi laskea auton seuraavan sijannin X ja Y-koordinaatit?
Voisin vaikka vannoa, että tarvitaan pii:tä?
auto.x = auto.x + Sin(kulma_radiaaneina) * nopeus auto.y = auto.y + Cos(kulma_radiaaneina) * nopeus
Lumi-ukkeli kirjoitti:
Voisin vaikka vannoa, että tarvitaan pii:tä?
Vain, jos sinun tarvitse muuttaa asteet radiaaneiksi:
rad = asteet * PII / 180
Ei tarvi piitä kun käyttää koota (k = Atn(1)/45). rad = asteet * k :)
No voi jes :)
rad = asteet * PII / 180 rad = asteet * Atn(1) * 4 / 180 rad = asteet * Atn(1) / 45 ...
Eikö se nyt ole melkein yksi ja sama mitä noista muodoista käyttää? :)
Heh, tarkoitettu enempi vitsiksi kuin saivarteluksi. Jos muunnosta tarvii vain kerran, sama kuinka sen muotoilee. Mutta jos useammin, niin kannattaa kerroin laskettaa valmiiksi Form_Load-tapahtumassa. Koodi lyhenee ja kirjoitusaika lyhenee. :)
Taas sain sekavia vastauksia ja sain myös aikaan tappelua.
Meneekö suoraan metsään, jos laitan näin?:
kulma_radiaaneina = asteet * 3.141592 / 180 auto.x = auto.x + Sin(kulma_radiaaneina) * nopeus auto.y = auto.y + Cos(kulma_radiaaneina) * nopeus
Ihan oikein teit.
Hyvä kääntäjähän laskee tuon (pii / 180) valmiiksi ja jättää siihen vain k:n.
Pieni optimointi olisi vielä semmoinen, että laskisi Sinin ja Cosinin valmiiksi muuttujiin aina, kun auto kääntyy, ja sitten käyttäisi vain näitä muuttujia. Pitkän suoran aikana on aika turhaa laskea uudestaan sinejä ja kosineja, kun ne ovat kuitenkin samat. Vaikka mitäpä tuo nykykoneilla enää merkitsee...
Mitä missä tapellaan?? No vitsit sikseen. Oikeastaan kuljettu matka lasketaan kaavasta s = v*t eli tuossa kaavassa pitäisi vielä olla kertoimena aikaväli. Miten tuo nopeus on ilmaistu? Jos se on esim. km/h, tarvitset kertoimen jolla muutat nopeuden kuvaruudulle sopivaksi ja sitten vielä tämä aikaväli. Nämä kaikki voidaan sisällyttää kyllä nopeuteen suoraan, jos sille annetaan sopiva arvo. Jos kuitenkin nopeus halutaan näyttää ruudulla yksiköissä km/h, tarvitset tuon skaalauskertoimen.
Kukapa haluaa tietää, että kuinka lujaa ne pikselit kulkee siinä näytöllä. 8}
Eihän pikselit minnekkään kulje paitsi jos potkit näytön pellolle. Autopeleissä on tavallisesti nopeusnäyttö (km/h). Jotta auto liikkuu ruudulla sopivaa vauhtia, on tämä arvo skaalattava ylempänä olevaan kaavaan sopivaksi.D
Joo mutta en oo vielä niin pitkällä että tarttisin semmosta.
Suurempi onkkelma on että miten kääntää sitä autoa?
Ajattelin näin aluksi tehä paintilla auton vaikka 8 eri asentoon ja sitten piirrellä niitä, mutta silloin kääntyminen täytyy tapahtua 360/8(=45) asteen välein .
Kokeilin tässä jotakin kuvan kääntöjuttua koodivinkeistä, mutta siinä koko kierrokseen pitää asteita laittaa yli 500 ja
siitä kuvasta tulee ihan kiero kun sitä on yhden kierroksen kääntänyt.
Onkohan suuri moka tehdä näin aluksi BitBlt:llä, ja sitten
kun alkaa olemaan siinä vaiheessa, että ei enään riitä, niin
sitten kääntää DirectX:lle?
Lumi-ukkeli kirjoitti:
Onkohan suuri moka tehdä näin aluksi BitBlt:llä, ja sitten kun alkaa olemaan siinä vaiheessa, että ei enään riitä, niin sitten kääntää DirectX:lle?
On ja ei. Sikäli on, että valmista koodia on ikävä muokkailla, ja kun tilanne on se, että DirectX:ään joudutaan lopulta kuitenkin, niin turha siinä on muuta viritellä. Sikäli taas ei, että koska BitBlt ei riitä mihinkään, joudut kuitenkin heti siirtymään DirectX:ään :)
Teet vaan heti DirectX:lle, pääset helpommalla. (OpenGL ei myöskään olisi paha.) DirectX:ssä et tarvitse kuin sen yhden kuvan, kun sitä voi kääntää helposti juuri sinne, minne haluaa.
Joo kyllä muuten, mutta tämä mun DirectX osaaminen ei oo mitenkään mahtavaa, eli kuvan kääntämiseen menee vielä aikaa.
Omistan muuten yhden DirectX7 -kirjan joka on onneksi suomeksi mutta opetusmateriaalina käytetään C++, josta en osaa paljon minkään vertaa.
Voikohan OpenGL:ää ja DirectX:ää käyttää yhtäaikaa?
'Kuvaa voi pyörittää seuraavia arvoja muokkaamalla 'Piirrämme kuvan nyt kuitenkin suorassa RotationCenter.X = 0.5 RotationCenter.Y = 0.5 Rotation = 0
Mitenkä näitä arvoja tulisi muutella (DX8-oppaasta), että kuva kääntyisi esimerkiksi 90 astetta vasemmalle?
oiskohan että rotation = 90 :)?
Taitaisi itse asiassa olla, että Rotation = (Pii / 2), koska DirectX käyttää radiaaneja. Ellei sitä arvoa sitten myöhemmin muunneta radiaaneiksi jossakin. (Radiaanit = Asteet / 180 * Pii)
Mitä nuo RotationCenterit tekee?
Ne ovat X- ja Y-koordinaatit sille kuvan pisteelle, jonka ympäri kuvaa pyöritetään. Kannattaa laittaa aluksi jonnekin kuvan keskelle.
Hankala tuota hommailla kun se kuva katoaa niin nopeasti näkyvistä.
Olisiko tuosta meitzin kirjottamasta pelimoottorista apua
https://www.ohjelmointiputka.net/koodivinkit/
Private Type koord x As Single y As Single End Type Const maksiminopeus = 100 'vakio Dim nopeus As Single 'muuttujia Dim asteet As Single Dim liikummeko As Boolean Dim suunta As String Dim auto As koord Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyUp Then 'jos painetaan ylös liikummeko = True 'muutetaan arvo 'trueksi' ElseIf KeyCode = vbKeyLeft Then 'jos painetaan vasemmalle suunta = "vasen" 'annetaan arvo ElseIf KeyCode = vbKeyRight Then 'jne... suunta = "oikea" ElseIf KeyCode = vbKeyEscape Then 'painetaas escia End 'lopetetaan koko roska End If End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyUp Then 'kun ylös näyttävä nuolinäppäin ei ookkaan enään pohjassa liikummeko = False 'muutetaas arvo falseksi! HÄHÄ! :D ElseIf KeyCode = vbKeyLeft Or KeyCode = vbKeyRight Then 'kun päästetää tästä irti suunta = "" 'otetaan arvot veks/vaihdetaan End If End Sub Private Sub Form_Load() Me.KeyPreview = True Me.ScaleMode = 3 End Sub Private Sub Timer1_Timer() If liikummeko = True Then 'nappi pohjassa If nopeus < maksiminopeus Then 'jos nopeus on vähemmän kuin maksimi nopeus = nopeus + 0.1 'silloin voidaan huoleti lisätä End If Else 'jos nappi ei ookkaan enään pohjassa If nopeus >= 0.05 Then 'ja nopeus on kummiskin enemmän kuin 0 nopeus = nopeus - 0.05 'miinustetaas siitä End If End If If suunta = "vasen" Then 'jos ehto on tosi asteet = asteet + 0.1 'väännetään arvoja ElseIf suunta = "oikea" Then asteet = asteet - 0.1 End If 'auton uus paikka on x = x + muuttuva luku auto.x = auto.x + Sin(asteet) * nopeus auto.y = auto.y + Cos(asteet) * nopeus 'asetetaas oikeet koordinaatit picture1boksille Picture1.Left = auto.x Picture1.Top = auto.y End Sub
Tossa pieni esimerkki. Mitään virheenkorjausta ei ole, ja esimerkki ei varmaankaan edes toimi kunnolla. [en ehtinyt kokeilla] :D
Mutta tarvii Form1:lle: Timer1 [intervalliksi joku 10] ja sitten Picture1.
Ja on kuvan pyörittämiseen muukin mahdollisuus, kuin tuo dx8:ia hyödyntäen [mikä ei ole yhtään huono asia, sinänsä ^^]. esimerkiksi koodivinkeistä löytyy yksi tapa jota ite kokeilin omaan rallipeliin, tapa oli melko hyvä[parempi kuin omani], minun tapani hyödyntää sitä oli huono. :)
Toi mun auto pyörii aivan miten sattuu, ja ilmeinen syy on tuo pyörityksen keskipiste, eli miten sen saa sen objektin (eli auton) keskelle?
No kai tiedät, mikä on pikseli? Olet varmaan itse tehnyt sen auton kuvan, joten tiedät varmaan, montako pikseliä sen leveys on? Katso, mitkä ovat keskikohdan koordinaatit, ja laita ne tuohon.
nomic kirjoitti:
Ja on kuvan pyörittämiseen muukin mahdollisuus, kuin tuo dx8:ia hyödyntäen
Niin, kuten DX9 :)
OpenGL on myös kiva.
Ja hyihyihyi, ei saa käyttää timeriä reaaliaikaisen pelin ajastukseen.
Joo mutta miten ne autot sitten saa liikkumaan täsmälleen yhtä lujaa riippumatta koneen tehoista/nopeudesta lukuunottamatta sitä, että kone olisi niin hidas ettei jaksaisi pyörittää peliä?
Metabolix kirjoitti:
No kai tiedät, mikä on pikseli? Olet varmaan itse tehnyt sen auton kuvan, joten tiedät varmaan, montako pikseliä sen leveys on? Katso, mitkä ovat keskikohdan koordinaatit, ja laita ne tuohon.
nomic kirjoitti:
Ja on kuvan pyörittämiseen muukin mahdollisuus, kuin tuo dx8:ia hyödyntäen
Niin, kuten DX9 :)
OpenGL on myös kiva.Ja hyihyihyi, ei saa käyttää timeriä reaaliaikaisen pelin ajastukseen.
:D
Pahoitteluni. Olin vähän koomassa/unessa/jossain kun tota kirjoittelin. :)
Opengl on lähempänä mun syräntä kuin dx.
Sitäpaitsi, kirjoitin edelliseen viestiin, että toi on vain esimerkki, kasasin koko roskan "siirtelyn" ympärille, jotta helposti ymmärtää mitä tapahtuu missäkin. en viiti alkaa sotkea tähän mukaan mitään apia jne... tai voisin tietysti, mutta sekoittaakohan se liikaa vinkin alkuperäistä ideaa?
Lumi-ukkeli kirjoitti:
Joo mutta miten ne autot sitten saa liikkumaan täsmälleen yhtä lujaa riippumatta koneen tehoista/nopeudesta lukuunottamatta sitä, että kone olisi niin hidas ettei jaksaisi pyörittää peliä?
Älä ikinä käytä timeria tuollaiseen!
Laske edellisestä siirrosta kulunut aika ja kerro liikemäärä sillä. Eli jos on liikuttu 2 sekuntia, niin liikut 2x niin paljon kuin sekuntissa. Tutustu funktioon GetTickCount (tai timeGetTime ja tarvittaessa timeBeginPeriod ja timeEndPeriod). Google tai MSDN auttaa.
Gaxx kirjoitti:
auto.x = auto.x + Sin(kulma_radiaaneina) * nopeus auto.y = auto.y + Cos(kulma_radiaaneina) * nopeus
Tuossa on se vika, että auto liikkuu kulmaa päin mennessä nopeampaa kuin suoraan sivulle.
Eipäs olekkaan, oma virheeni.
Asiasta toiseen: Miten sais ensinnäkin jonkun kuvan taustakuvaksi?
Olisko mahdollista, että tekisi kentan vaikka 32 * 32 pikselin palasista, mutta auton kuitenkin liikkumaan sulavasti?
Elikkä oon kopioinu tuon DirectX8 2D:tä oppaasta koodin, ja muokannut
sitä omaan tarkoitukseen sopivaksi.
Form tai PictureBox.Picture = LoadPicture("sejase.bmp/.jpg/.gif/.ico/.cur"). Jos tahdot tilettää kuvan, joudut tekemään sen koodin kautta, mutta se ei ole vaikeaa. Kun olet tilettänyt (jos tiletät), laita Form tai PictureBox.Picture = Form tai PictureBox.Image
Ja voit kyllä tehdä kentän pikkupaloista, tee ensin tilesettibittikartta ja katso putkan vepukkapeliohjelmointiopas https://www.ohjelmointiputka.net/oppaat/opas.
DirectX värittää tuon taustan mustaksi (näin se on oletuksena kun kopioin sen siitä oppaasta).
Pitäisiko sen tausta piirtää tekstuurina ennen auton piirtoa?
No luot uuden rectin taustaa varten, piirrät sen ja sen jälkeen pelaajan + kaiken muun.
Voitko antaa lyhyen esimerkin miten...?
Lumi-ukkeli kirjoitti:
Pitäisiko sen tausta piirtää tekstuurina ennen auton piirtoa?
Kyllä. Jos tasavärinen tausta kelpaa, niin vois vaihtaa sitä d3ddevice.clear:lle annettavaa väriarvoa.
Juu niin kokeilinkin, mutta tarkoitus olisi saada jonkunlainen kuva taustalle ensin ja jos se onnistuu, niin sitten alkaa niitä tilejä sinne taustalle laittamaan. Tarvitsisin hieman koodiesimerkkiä, koska DirectX ei ole vahvimpia alueitani (ainakaan vielä...)
No oppaan pohjalta sun pitäis osata piirtää kuva näytölle. Teet vaan kuvan, joka on koko näytön kokonen ja piirrät sen näytön kokosena ruudulle.
Eli tuleeko se jotenkin näin?
BeginScene
Begin
Draw Tausta
Draw Auto
End
End Scene
Juurikin noin.
Ei auta, peli vilkkuu ihan mahdottomasti ja autosta jää jälki
tai sitten ei tapahdu mitään tai tausta ei piirry...
Missä järjestyksessä se tausta oikein pitäisi piirtää?
tiedän tunteen.... siirä taustakuvan lataus form_load tapahtumaan niin enää ei välky:)))
eraggo ei toimi tolleen, tosin sain sen jo toimimaan.
Elikkä tässäpä miten sen tein:
Tehdään kaksi tekstuuria, auto ja tausta.
Loopissa piirretään ensin tausta. Kun käytetään putkan
dx8-opasta pohjana piirtoon tulee tehdä muutoksia:
rivi
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
kommentoidaan pois.
Auton piirrossa kommentoidaan rivi
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#,
pois.
Siis eli tuo ylempi poiskommentointi siis taustan kohdalla.
Asiasta toiseen:
Tiedättekö mitään hyviä 2D-auton fysiikka TUTseja tms.?
Onkohan kukaan kenties suunnitellut semmoisen oppaan tekoa putkaan...?
Mitä kannattaisi tehdä windowsin kursorille kun peli toimii kokonäyttö-tilassa ja kursori on vain tiellä (=ei tarvita)?
Taikka sitten DirectX:n oma kursorinpiilotusfunktio. Oikeastaan kaikkein fiksuin tapa taitaisi olla se, että määritetään kursoriksi kokonaan läpinäkyvä kursori (kai VB:ssä on kursorieditori), ja sitten kun kursoria mahdollisesti kaivataan (vaikkapa menussa), voidaan sellainen piirtää ruudulle ihan itse samalla tavalla kuin muutkin kuvat. Samalla saadaan hieman lisää vapauksia kursorin koon, värityksen ja erikoisefektien suhteen.
Joo näyttäis toimivan.
Teenpä nyt huvikseen tuohon auton perään peräkärryn ja siihen
tarvin tuon aiheen (asteet koordinaateiksi) vastakkaisena, eli
mitenkäs saisi x ja y koordinaateista asteita?
Itse laskisin matikan tunnilla tuon varmaan sinillä kosinilla tai tangentilla (en kyllä muista millä niistä), muttakun nuo VB:n funktiot toimivat vähän erillä tavalla...eli voisko joku kertoa miten tulisi ratkaista tai edes heittää linkki jonnekkin mistä tuohon löytyisi ratkaisu?
...ja se ongelma oli että miten lasketaan asteet, koska
pitäisi sitä peräkärryä kääntää suhteessa vetokoukkuun (eli vetokoukun sijainti ja peräkärryn sijainti tiedossa->tarvitaan asteita)?
Exceliinkin saa tämmöisen:
Karttafunktioita
Bearing Suuntima, eli kulkusuunta paikasta A paikkaan B. Koordinaatit annetaan desimaaliasteina väleissä puolipiste. Tulos on asteina myötäpäivään pohjoisesta. Syntaksi: Bearing(latitudiA ; longitudiA ; latitudiB ; longitudiB) Esimerkki: Bearing(60,85621;24,53784;60,91284;24,59522) Tulos: 26,22°
Niin miksei vb:ssäkin olisi jotakin vastaavanlaista vai voiko sen peräti laskea itse?
Arkustangentilla onnistuu. Ajattelet koko homman vain suorakulmaisena kolmiona. X- ja y-matkat ovat kateetit ja kuljettava matka on hypotenuusa.
Tan Kulma = y/x
josta seuraa
Kulma = Atan (y/x)
Joudut tosin lopuksi tarkistamaan x:n ja y:n etumerkit ja kasvattamaan saatua kulmaa niiden mukaan. Myös tasa-asteet 0, 90, 180 ja 270 on hyvä tehdä erikseen, ettei tule nollalla jakamisia yms.
Edit: Tämä on eräästä koodivinkistäni. Toimii, mutta onnistuisi varmaan vähemmälläkin koodilla. A:n arvoksi annat x:ien erotuksen ja B:n arvoksi y:iden erotuksen. En tosin muista kummasta vähennetään kumpi... kokeile. :)
Function Kulma(a As Single, b As Single) Dim k As Single, l As Integer Dim Y As Single, Y2 As Single If a <> 0 And b <> 0 Then k = Atn(b / a) / rad l = 180 If Y < Y2 Then l = 0 If Y = Y2 Then l = 0 k = k + l If k > 0 Then k = k + 90 If k > 180 And k < 270 Then k = k - 180 Else k = k + 270 End If Else If a = 0 And b < 0 Then k = 180 If b = 0 And a > 0 Then k = 270 If a = 0 And b > 0 Then k = 0 If b = 0 And a < 0 Then k = 90 End If If k > 180 Then k = k - 360 Kulma = k + 180 End Function
ELi pitääkö nuo kumpikin laskea vai tuo jälkimmäinen?
Tuo funktio palauttaa asteina, kunhan määrittele radiaanikertoimen (rad), eli sen pitää olla Pii/180. Ja koska arkustangentti palauttaa radiaaneina, niistä saa kätevästi piin:
Rad = Atn(1) * 4 / 180
Edit: Tuo koodi on siis esimerkki siitä, mitä selitin sitä ennen.
joo huomasin, mutta sama asiahan se on kuin pii / 180
Hyvin toimii
Vohveli laitan sun nimimerkin krediitteihin jos muistan ja jos tuo nyt edes menee jakoon tuo mun "peli"
Nii ja iha tiedoksi että tulossa olis jonkulainen TractorPulling-peli...
Ideoita?
Eipä toimi tuo aivan täydellisesti tuo hunajavohvelin kulmalaskin, tosin siinä ei ollut isoja virheitä. Tämän pitäisi toimia moitteetta (itse tein):
Private Function Kulma(x As Single, y As Single) If x <> 0 And y <> 0 Then If x > 0 Then Kulma = Atn(y / x) / rad + 270 Else Kulma = Atn(y / x) / rad + 90 End If Else If x = 0 And y = 0 Then Kulma = 0 If x = 0 And y > 0 Then Kulma = 0 If x = 0 And y < 0 Then Kulma = 180 If y = 0 And x < 0 Then Kulma = 90 If y = 0 And x > 0 Then Kulma = 270 End If End Function
Tuollapa on vähän arvoitusrivi tuo x = 0 ja y = 0
Lumi-ukkeli kirjoitti:
Eipä toimi tuo aivan täydellisesti tuo hunajavohvelin kulmalaskin
Joo, no kun nyt tarkemmin katson, niin tuota olikin sovellettu vähän enemmän sopimaan siihen koodivinkkiin, joten ei ihmekään, jos ei aivan toimi.
Paljonkohan on asteita silloinkun x = 0 ja y = 0?
Tuossa mun esimerkissä on 0
Silloin se on yksi ja sama piste eikä muodostu suoraa, jota voisi verrata y-akseli -suoraan. Ja yhdellä suoralla ei saa aikaan kulmaa ollenkaan. Tuo nolla lienee järkevin palautus.
Pääsisköhän tuo koodivinkkeihin?
Ja tämä kans:
Private Function etaisyys(x1 as single, y1 as single, x2 as single, y2 as single) as single Dim etaisyys2 as single etaisyys2 = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 etaisyys = sqr(etaisyys2) End Function
Voisitteko kertoa mistä löytyis apua kun yritän tehdä jonkunlaista savua peliin joka on DirectX8 & VB6:lla tehty?
1. www.planetsourcecode.com
2. googleta 'partikkeliefektit'
Lumi-ukkeli kirjoitti:
Pääsisköhän tuo koodivinkkeihin?
Ei ehkä, mutta jokin opas, joka käsittelisi mm. tuon asian, olisi hyvä. Saatan jopa jossain vaiheessa esitellä tuon asian, kun kirjoittelen tässä opasta merkkigrafiikkapelien tekemisestä.
No tuohan menisi kyllä ihan suoraan:
Private Function etaisyys(x1 as single, y1 as single, x2 as single, y2 as single) as single etaisyys = sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2) End Function
Onko joku tehnyt savuja 2D peleihin?
Mistähän johtuu hienoinen nihkeys kun kiinnostaisi oppia tätä DX:ää, mutta kukaan ei tunnu tietävän / ei halua kertoa vai mikä on syynä?
Lumi-ukkeli kirjoitti:
Mistähän johtuu hienoinen nihkeys kun kiinnostaisi oppia tätä DX:ää, mutta kukaan ei tunnu tietävän / ei halua kertoa vai mikä on syynä?
Kukaan muukaan ei osaa? :-D
-Grey-
Lumi-ukkeli kirjoitti:
Mistähän johtuu hienoinen nihkeys kun kiinnostaisi oppia tätä DX:ää, mutta kukaan ei tunnu tietävän / ei halua kertoa vai mikä on syynä?
Kenties muitten mielestä Open GL tai muu vastaava on parempaa.
Jos minulla on auto, jota pyöritetään mutta siitä pitää löytää aina vetokoukun koordinaatit, niin voiko tällä kaavalla löytää sen?
vetokoukku.x = auto.x + Sin(auto.kulma) * 10 vetokoukku.y = auto.y + Cos(auto.kulma) * 10
Minulla tuo näyttää kyllä päin metsää, mutta voiko tuon edes teoriassa saada toimimaan?
Kyllä, olettaen, että auto.x ja .y ovat auton keskuksen koordinaatit ja kulma on laskettu oikein(kai 180 enemmän, kuin "auton kulma". Kokeile itse). Sitten tietty kertoimen täytyy olla sopiva, että piste on juuri auton perän kohdalla, ettei se jää takapenkille tai laahaa maantiellä.
Mitenkähän tämä on mahdollista?
Tuo kuva on piirretty DX8:lla koordinaatteihin 100, 100 ja viivat
(100, 100)-(400, 100) ja (100, 100)-(100, 400)
Sama tapahtuu myös Pset-metodilla ja muilla grafikkakomennoilla.
Muuten toimii loistavasti paitsi että kun traktoria kääntää niin tuo vetokoukun paikka pyörii juuri vastakkaiseen(=väärään) suuntaan. Kulmat ovat kaikki radiaaneja. Mitenkähän tuo korjataan?
Pistä sen kulman eteen miinusmerkki niin pitäs toimia. Riippuu tietty hiukan toteutustavasta, mutta...
Ei auta, pyörii edelleenkin samaan (=väärään)suuntaan.
No siis eihän koukun pidäkkään pyöriä vastakkaiseen suuntaan? Lisäät sen traktorin kulmaan 180 astetta eli radiaaneissa piin niin saa vetokoukun kulman.
JIPII SE TOIMII!!!
Valitettavasti hunajavohvelin kommentti ei auttanut, mutta ISO kiitos kuitenkin kaikille auttaneille. Ja hunajavohvelihan on jo auttanut muutenkin mukavasti minua.
Taitaa tässä kohdassa olla ongelma siinä, että kaksi laskua on riippuvaisia toisistaan?
vetokoukku.x = (Traktori.x + Traktori.leveys / 2) + Sin(Traktori.Kulma * rad) * Traktori.pituus / 2 vetokoukku.y = (Traktori.y + Traktori.pituus / 2) + Cos(Traktori.Kulma * rad) * Traktori.pituus / 2 kiinnitys.x = (Perakarry.x + Perakarry.leveys / 2) - Sin(Perakarry.Kulma * rad) * Perakarry.pituus / 2 kiinnitys.y = (Perakarry.y + Perakarry.pituus / 2) - Cos(Perakarry.Kulma * rad) * Perakarry.pituus / 2 Perakarry.Kulma = Kulma(vetokoukku.x - kiinnitys.x, kiinnitys.y - vetokoukku.y)
Ja se mitä tuossa on ongelmana ilmenee tästä:
http://www.geocities.com/bigenergized/TPv003B.
Lumi-ukkeli kirjoitti:
Taitaa tässä kohdassa olla ongelma siinä, että kaksi laskua on riippuvaisia toisistaan?
vetokoukku.x = (Traktori.x + Traktori.leveys / 2) + Sin(Traktori.Kulma * rad) * Traktori.pituus / 2 vetokoukku.y = (Traktori.y + Traktori.pituus / 2) + Cos(Traktori.Kulma * rad) * Traktori.pituus / 2 kiinnitys.x = (Perakarry.x + Perakarry.leveys / 2) - Sin(Perakarry.Kulma * rad) * Perakarry.pituus / 2 kiinnitys.y = (Perakarry.y + Perakarry.pituus / 2) - Cos(Perakarry.Kulma * rad) * Perakarry.pituus / 2 Perakarry.Kulma = Kulma(vetokoukku.x - kiinnitys.x, kiinnitys.y - vetokoukku.y)Ja se mitä tuossa on ongelmana ilmenee tästä:
http://www.geocities.com/bigenergized/TPv003B.zip (38kt)
Tämä nyt on vanha aihe, mutta tuonhan olen saanut korjattua aikoja sitten. Tuossa on uusin versio: http://www.geocities.com/bigenergized/TPv008R.
Aihe on jo aika vanha, joten et voi enää vastata siihen.