Page 1 of 1

Hiiriohjaus 2D-räiskinnässä [RATKAISTU]

Posted: Fri Dec 12, 2008 8:31 am
by GrinningGhoul
Peli on ylhäältäpäin kuvattu 2D-räiskintä. Pelihahmo kääntyy hiirellä, eteen-, taakse- ja sivuliikkuminen tapahtuu näppäimistöllä. Kursori on piilotettu ja hiiren liikuttaminen sivulle kääntää hahmoa oman akselinsa ympäri, samaan tyyliin kuin esim. Tapan Kaikki -pelissä. Toimii muuten, mutta kursorin ajautuminen reunaan pysäyttää kääntymisen. Kuinka tämän saisi estettyä?

Koodi: RotateObject ukko,-MouseX()

Re: Hiiriohjaus 2D-räiskinnässä

Posted: Fri Dec 12, 2008 11:17 am
by Aavesoturi
Aseta hiiri jokaisella luuppi kerralla ruudun keskelle (PositionMouse ScreenWidth()/2, ScreenHeight()/2) ja käytä RotateObjectissa MouseX():n sijaan MouseMoveX():ää.
EDIT: juu en ajatellu tuota rotateobjectia, eli sen tilalle turnobject

Re: Hiiriohjaus 2D-räiskinnässä

Posted: Fri Dec 12, 2008 11:28 am
by GrinningGhoul
Kokeilin kursorin heittämistä ruudun keskelle mutta se sai hahmon pyörähtämään väärään suuntaan. Muistaakseni olen kokeillut myös MouseMoveX():ää, eikä sekään toiminut kunnolla. Valitettavasti en pääse nyt tarkistamaan asiaa, koska päivitin Coolbasicin juuri, eikä tässä versiossa jostain syystä toimi cbKey()-toiminto joten en pääse alkuvalikkoa pidemmälle... Oletko kokeillut että tuo esimerkkisi toimii?

Muistaakseni PositionMouse + MouseMoveX saivat ukon vain tärähtelemään paikallaan.

Re: Hiiriohjaus 2D-räiskinnässä

Posted: Fri Dec 12, 2008 11:58 am
by Murskaaja
Ihan hyvin se toimii. Tosin rotateobjectin tilalle turnobject ja sen pitää luonnollisesti tulla ennen hiiren sijoittamista keskelle.

Code: Select all

sotilas = LoadObject("media\soldier.bmp",72)
ShowMouse OFF
Repeat
    TurnObject sotilas, Min(8,Max(-8,-MouseMoveX()))
    MoveObject sotilas, (UpKey()-DownKey())*3, (RightKey()-LeftKey())*3
    PositionMouse ScreenWidth()/2,ScreenHeight()/2
    DrawScreen
Forever

Re: Hiiriohjaus 2D-räiskinnässä

Posted: Sat Dec 13, 2008 7:37 am
by GrinningGhoul
Joo, nyt toimii. Kiitoksia vain kummallekkin. Tuli mieleen että ehkä aikaisemmat viritykseni epäonnistuivat siinä että laitoin ne jonkinlaisen if-lausekkeen sisään kuten näppäimillä liikkumisenkin. Tuo Min ja Max -komentojen käyttö jää kyllä minulle vähän hämäräksi, varsinkin kun Coolbasicin oma esimerkki on niin yksinkertainen ja näyttää erilaiselta. Lähinnä tuo sulkeiden käyttö tuntuu oudolta. Jos pienen valaistuksen saisi tuon lausekkeen toimintaan, tyyliin miksi mikäkin on missäkin kohdassa niin olisi hyvä. Ei haluttaisi jättää ohjelmaan mitään kohtia joita ei täysin ymmärrä.

PS: Sain ohjelman toimimaan kun korvasin KeyHitit KeyDownilla, outo juttu. Versiossa 10.1 KeyHitit toimi kyllä.

Re: Hiiriohjaus 2D-räiskinnässä [RATKAISTU]

Posted: Sat Dec 13, 2008 5:28 pm
by Murskaaja
Tuossa koodissa siis min() ja max() käytöllä rajoitin kääntymisen määrää per ruudunpiirtokierros. Se toimii ihan hyvin ilmankin, mutta silloin sotilas kääntyy holtittomasti jos hiirtä liikuttaa liikaa. Veikkaan, että min() max() toiminta koodissani selkiytyy aika paljon kun sen jakaa osiin:

Code: Select all

kääntyminen = -MouseMoveX()
kääntyminen = Max(-8, kääntyminen) 'ei anneta sotilaan kääntyä oikealle kuin korkeintaan 8 astetta.
kääntyminen = Min(8, kääntyminen) 'sama rajoitus vasemmalle kääntymiseen.
TurnObject sotilas, kääntyminen
En tiedä osasinko selittää selvästi, mutta viimeistään kokeilemalla oppii :) Mutta jos if-lausekkeiden käyttö on selvempää, kannattaa niitä toki suosia.

Re: Hiiriohjaus 2D-räiskinnässä

Posted: Sun Dec 14, 2008 4:47 am
by GrinningGhoul
Kyllä se nyt taisi aueta... kiitän. Oma logiikkani soti vain noiden sulkeiden käyttöä vastaan, kun molemmat menevät kiinnin vasta tuolla lopussa. Ja omassa aikaisemmassa yrityksessäni taisin yrittää lukea hiiren liikkeen kaksi kertaa; liikutetaanko vasemmalle vai oikealle. Tämä hiiriohjauksen epäkohta olikin piikkinä lihassa ihan liian kauan, joten tämä oli suuri voitto... Kumma muuten etten löytänyt vastaavaa ketjua joten piti kysyä itse. Useimmat ilmeisesti tekevät hiiriohjauksen juuri Pain! -tyyppisesti tai sitten ohjaavat vain näppäimistöllä. Tai sitten olen ainut joka ei osannut? :) Ja nyt en itse kirjoita tähän ketjuun enempää niin ei tule tarpeettoman pitkä, kun asia kerran on jo selvä.