|
|
||||||||
|
|||||||||
![]() |
|
|
#1 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
NLDJoystick
Omschrijving:
NLDJoystick is een runtime-unit welke tot maximaal twee joysticks kan monitoren en de gegevens daarvan met behulp van events ter beschikking stelt voor je eigen programma. NLDJoystick is een losstaande unit en werkt op basis van WinAPI (unit MMSystem.pas). Oorsprong: Laatst tijdens het maken van een spelletje kwam de wens om dat spelletje met een joystick te kunnen besturen om de hoek kijken. Verder komt mijn motivatie voor 32 knoppen-, 6 assen- en "Point Of View"-ondersteuning voornamelijk uit het onderwerp Joystick uitlezen met WinAPI. Hoewel het spelletje slechts 1 knop en 2 assen behoefde, zag ik er wel een uitdaging in om de unit algemeen geschikt te maken. Gebruik: De joysticks hoeven niet aangemaakt of vrijgegeven te worden. Roep de joysticks aan met de functie's Joystick1 of Joystick2. Vóór gebruik moet de betreffende joystick 'opgestart' worden met Initialize: Code:
function Initialize(const NeedAdvanced: Boolean = False): Boolean; NLDJoystick heeft per joystick twee mogelijke modi: - De simpele modus: voor joysticks met maximaal 2 assen en maximaal 4 knoppen. Ook kun je deze modus gebruiken bij geavanceerde joysticks. - De geavanceerde modus: voor joysticks met maximaal 6 assen, maximaal 32 knoppen of een 'Point Of View'-functionaliteit. De simpele modus maakt gebruik van een messagehandler voor de standaard Windows joystick-messages. De geavanceerde modus maakt gebruik van een interne timer om de gegevens van de joystick met een gewenst interval uit te lezen. Vervolgens zijn er vier events die ingesteld kunnen worden om de joystick aan je programma te koppelen: Code:
TJoyButtonEvent = procedure(Sender: TNLDJoystick;
const Buttons: TJoyButtons) of object;
TJoyMoveEvent = procedure(Sender: TNLDJoystick; const JoyPos: TJoyRelPos;
const Buttons: TJoyButtons) of object;
TJoyPOVChangedEvent = procedure(Sender: TNLDJoystick;
const Degrees: Single) of object;
...
property OnButtonDown: TJoyButtonEvent read FOnButtonDown
write FOnButtonDown;
property OnButtonUp: TJoyButtonEvent read FOnButtonUp write FOnButtonUp;
property OnMove: TJoyMoveEvent read FOnMove write FOnMove;
property OnPOVChanged: TJoyPOVChangedEvent read FOnPOVChanged
write FOnPOVChanged;
Verder zijn er nog een tweetal property's die ingesteld kunnen worden: - PollingInterval: Cardinal: het interval waarop de interne timer de joystickgegevens uitleest (alleen in geavanceerde modus). Standaardwaarde = 40, of het minimale PollingInterval dat voor de betreffende joystick van toepassing is. - ThresholdFactor: Single: het drempelpercentage waarbinnen de joystickbewegingen niet worden geregistreerd (alleen in simpele modus). Bijvoorbeeld ThresholdFactor = 0.1, dan moet de joystick minstens 10% worden bewogen voordat er een OnMove-event optreedt. Standaardwaarde = 0. Dan zijn er nog een aantal alleen-lezen property's zoals: AbsCenter, AbsMax, AbsMin, Advanced, AxisCount, Axises, ButtonCount en HasPOV. Voordelen: Geen apart componenten-package nodig. Nadelen: Geen. ![]() Bugs: Voor zover ik weet zijn er geen bugs. Meldt ze alsjeblieft wel! Disclaimer: Het component is ongetwijfeld in vele gedaantes via andere componentensets verkrijgbaar, maar zou de wereld er niet stukken beter uitzien met de standaard componentenset van Borland, slechts aangevuld met die van NLDelphi? ![]() Ik heb de unit zelf getest met slechts een game-pad met 2 assen, 10 knoppen en geen Point-Of-View. En ik zet mijn vraagtekens bij de constante JOY_POVCENTERED = -1 (zie MMSystem.pas) die men vervolgens in een Cardinal wil stoppen. Overigens wordt die constante niet gebruikt in deze unit. Waar te vinden? Op de Subversion server, zie http://svn.nldelphi.com/nldelphi/ope...n/NLDJoystick/ Veel plezier...
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; Laatst aangepast door NGLN : 28-Apr-08 om 20:10 Reden: Bijlage verwijderd, link naar SVN toegevoegd |
|
|
|
|
|
#2 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
Nieuwe versie...
Wijzigingen:
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; Laatst aangepast door NGLN : 28-Apr-08 om 20:07 Reden: Bijlage verwijderd |
|
|
|
|
|
#3 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
Versie 1.0.0.2
Wijziging:
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; |
|
|
|
|
|
#4 |
|
Registered User
Geregistreerd op: Dec 2007
Berichten: 21
|
Hoi Albert,
Een haast wel perfect component. Ik gebruik nog steeds Delphi 2008 op windows 7, want ik heb het niet zo Dotnet( ) te staan.Het is uiteraard al een hele tijd geleden dat je dit gemaakt hebt, maar goed ik waag de gok. Ik ben er wat mee aan het 'stoeien' om een onderwater ROV aan te sturen middels een joystick met POV op een arduino microposcessor via een seriele aansluiting en wil daarbij ook de POV gebruiken. Het blijkt echter dat de ONMove event van de POV alleen getriggerd wordt als je deze voor het eerst gebruikt. Als je up drukt en deze vasthoud dan komt ie alleen de eerste keer in het onmove event en ook als je deze weer loslaat. Maar als je deze vasthoudt in de up stand, dan krijg je geen event meer. Is er een mogelijkheid om dit te veranderen? Ik had alwat erover gelezen en dat lijkt met JOY_RETURNPOVCTS te moeten maar kom daar niet echt uit. Kun je me verder helpen hiermee? Groet André |
|
|
|
|
|
#5 | |
|
Senior Member
Geregistreerd op: Jan 2002
Berichten: 4.430
|
Citaat:
|
|
|
|
|
|
|
#6 |
|
Registered User
Geregistreerd op: Dec 2007
Berichten: 21
|
Ach ja, die gekke fingers ook altijd, 2007 uiteraard...
|
|
|
|
|
|
#7 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
Ik snap je vraag. Je wilt net als bij de buttons dat het event blijft vuren zolang de POV niet gecentreerd is? Hmm, eigenlijk wel logisch...
Nu heb ik geen joystick met POV om dat te testen, dus vandaar dat ik er wellicht ook niet aan gedacht heb om het in te bouwen, hihi.Afijn, het component vraagt al om JOY_RETURNPOVCTS bij het verwerken van de joystick data, dus dat is wel in orde. Wat je moet doen is een RepeatPOVDelay property toevoegen en deze in de ProcessAdvanced routine implementeren zoals ik dat met de RepeatButtonDelay heb gedaan. De code kun je bijna letterlijk overnemen. Mocht het niet lukken, vanavond zal ik er naar kijken.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; |
|
|
|
|
|
#8 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
André, code is aangepast.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; |
|
|
|
|
|
#9 |
|
Registered User
Geregistreerd op: Dec 2007
Berichten: 21
|
Dat is vlot gefikst.
![]() Ik ga het vanavond meteen uitproberen en laat het resultaat weten. Groet André |
|
|
|
|
|
#10 |
|
Registered User
Geregistreerd op: Dec 2007
Berichten: 21
|
Hoi Albert,
Wel ik heb de oude package verwijderd en de nieuwe geinstalleerd, nu zijn er dingen die niet meer werken. DE POV doet het helemaal niet meer en de joypos.R ook niet. ![]() De JoyPos.Z doet het daarintegen wel. Er is iets niet helemaal goed gegaan, of ik doe iets verkeerd. Groet andre |
|
|
|
|
|
#11 |
|
Registered User
Geregistreerd op: Dec 2007
Berichten: 21
|
My bad, was vergeten de Advanced propertie op true te zetten.
![]() Het werkt precies zoals het de bedoeling was. Hier ben ik blij mee. Je inzet word zeer gewaardeerd, groet andré |
|
|
|
|
|
#12 |
|
Registered User
Geregistreerd op: Jan 2013
Berichten: 4
|
Hello... everybody....
I use your component to my project... But i have a problem... Everything works except of the ButtonUp event... Info... I have Delphi 7 .... And the joystick is a ... Bluetooth.. insinde the GlovePie > PPjoy VirtualJoystick... I get that is connected in ID 0... Everthing works ok ... but ButtonUp Event not even strike in Code:
procedure TNLDJoystick.DoButtonUp(const Buttons: TJoyButtons);
begin
if Assigned(FOnButtonUp) then
FOnButtonUp(Self, Buttons);
if FSuspendScreensaver then
NotifyKeyboardActivity;
end;
Thanks ... P.S.. How can i take the idle status of the joystick... e.x( When the joystick handle is in center and joypos.x = 0 and joypos.y = 0 and not moving...) Thanks again.... Laatst aangepast door azrael11 : 18-Jan-13 om 08:56 |
|
|
|
|
|
#13 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
I added an OnIdle event.
As for the OnButtonUp event not functioning, I cannot explain. Having no real joystick nor bluetooth device, I cannot test further either. Try debugging yourself, you have the code. Please return with a report, if any.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; |
|
|
|
|
|
#14 | |
|
Registered User
Geregistreerd op: Jan 2013
Berichten: 4
|
Citaat:
For the OnButtonUp event here what i found... I give a very fast repeat button delay 10... and the result is that when is butttonup i get null number buttons[] in every button... But in OnButtonDown i get buttons[1] so somewhere in code it clear or lost the button number... Bcs you know the code structure better from me ... i hope this helps you ... I try to fix it.. but i think you do that much faster than me.. Thank you very much... |
|
|
|
|
|
|
#15 |
|
Registered User
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
|
The Buttons parameter from the OnButtonDown and OnButtonUp events reflect the current state of the buttons. Thus, the parameter in OnButtonUp being 1 less than in OnButtonDown is by design. Maybe I will change this in future, but the present implementation says that á button is released, not which. For now I recommend to save the previous button state in a private field and compare.
The typical use I had in mind with this component was: Delphi Code:
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert'; |
|
|
|
![]() |
| Bookmarks |
| Momenteel bekijken: 1 (0 leden en 1 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp | |
| Onderwerpopties | Zoek in onderwerp |
| Weergavemodus | Stem op dit onderwerp: |
|
|