PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mouse bewegung auf Tastatur übertragen



merfen
20.11.2008, 20:50
Hallo Leute

Ich möchte gerne die Maus bewegung auf die Tasten w a s d umleiten (oder Pfeiltasten) können um damit in einem Egoshooter Spiel mittels Maus laufen zu können.

Im Netz finde ich leider nur wie man mittels Tastatur die Maus bewegt aber ich will ja das gegenteil erreichen :evil:

Das einzige was meinen Vorstellungen entspricht ist arrmouse (http://www.bookcase.com/library/software/msdos.util.mouse.html)
leider ist das aber nur für MSDOS gemacht und ich habe windows XP

Hat jemand vielleicht so en Programm dass das kann oder kann jemand von euch das mir Programmieren?

Gruss
merfen

PS: Hier ein versuch in C++ aber das funktioniert auch nicht ganz nach meinen Vorstellungen, da das fenster zu klein ist und die Maus bis an ein Maximum kommt und dann aufhört Koordinaten zu generieren (hab selbst dran mal rumgebastelt aber klappt auch ned) :(



/********************************************
* Zeus CMD - GLUT Tutorial 03 : Mouse Input *
* By Grant James (ZEUS) *
* http://www.zeuscmd.com *
********************************************/
#include <iostream>
#include <gl/glut.h>

using namespace std;

bool lbuttonDown = false;

bool init()
{
return true;
}

void display()
{

}

void mouse(int button, int state, int x, int y)
{
if (button == GLUT_RIGHT_BUTTON)
{
if (state == GLUT_DOWN)
cout << "Right button pressed"
<< endl;
else
cout << "Right button lifted "
<< "at (" << x << "," << y
<< ")" << endl;
}
else if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN)
lbuttonDown = true;
else
lbuttonDown = false;
}
}

void motion(int x, int y)
{
if (lbuttonDown)
cout << "Mouse dragged with left button at "
<< "(" << x << "," << y << ")" << endl;
}

void motionPassive(int x, int y)
{
cout << "Mouse moved at "
<< "(" << x << "," << y << ")" << endl;
}

void entry(int state)
{
if (state == GLUT_ENTERED)
cout << "Mouse Entered" << endl;
else
cout << "Mouse Left" << endl;
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);

glutInitWindowPosition(200, 200);
glutInitWindowSize(200, 200);

glutCreateWindow("03 - Mouse Input");

glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutPassiveMotionFunc(motionPassive);
glutEntryFunc(entry);

if (!init())
return 1;

glutMainLoop();

return 0;
}

Darkraiser
20.11.2008, 20:57
hmm scheint so als bräuchtest du ne abfrage des maus moves in milisecs oder ähnliches bzw eig



void motionPassive(int x, int y)
{
cout << "Mouse moved at "
<< "(" << x << "," << y << ")" << endl;
}


halt in einer dauerschleife welche errechnet ob sich X erhöht hat oder veringert hat
wenn veringern halt Sendkey S oder andersrum Sendkey W.. und so würde ich dann vorgehen

PS: ich versteh nich wie man mit der maus läuft xD da biste doch die ganze zeit am scheffeln um nach vorne bei nem Ego-shooter zu laufn xD wenn dus hinbekommn hast machn Video davon .. bestimmt lustig

mfg

AlterHacker
20.11.2008, 21:17
Hmm

Versuchs mal mit GetCursorPos();
Also:(Pseudocode)


int oldx=-1,oldy=-1;
while(1){
GetCursorPos(point);
if(oldx==-1 || oldy==-1){
oldx = point.x; oldy = point.y;
continue;
}
int x = point.x;
int y = point.y;
while(x-->oldx){rechts();Sleep(1);}
while(x++[list=1]oldy){runter();Sleep(1);}
while(y++<oldy){hoch();Sleep(1);}
Sleep(1);
}

Für die funktionen rechts, links, runter, hoch lassen sich bestimmt entsprechende WinAPI-Funktionen finden.


MfG

merfen
20.11.2008, 21:29
@Darkraiser
Genau so etwas habe ich versucht mit der while schleife nur das Problem ist dass das obige Programm eine kleine Fläche auf dem Bildschirm generiert so das die Maus nur inerhalb dieser Fläche koordinaten sendet. Leider kommt da auch noch das Problem das die Maus immer wieder in die Mitte dieses Kästchens springen muss damit neue koordinaten generiert werden können, ohne das würde es an ein maximum kommen.

PS: Hehe, das wär dann nach ner Zeit ein richtiges Muskeltraining wenn ich mit der Maus so rum scheffle, besser als ne Wii X'D

@AlterHacker
Danke für den Tipp leider sind meine C++ kentnisse recht mager und eingerostet, müsste schauen ob ich da noch was Programmieren kann. Ich kann mich errinern dass ein Problem auftauchte mit dem integrieren der WinAPI funktionen (hab mal so was ähnliches versucht)

AlterHacker
20.11.2008, 21:31
@AlterHacker
Danke für den Tipp leider sind meine C++ kentnisse recht mager und eingerostet, müsste schauen ob ich da noch was Programmieren kann. Ich kann mich errinern dass ein Problem auftauchte mit dem integrieren der WinAPI funktionen (hab mal so was ähnliches versucht)

Womit Proggste denn? Dev-Cpp? #include <windows.h> && Feddisch

merfen
20.11.2008, 21:39
Dev-Cpp

Wenn #include <windows.h> das Problem löst werd ich es mal versuchen übers Wochenende ;D

Darkraiser
20.11.2008, 21:45
hmm soweit ich weis, verändert sich der Curser im Background bei Ego-shootern nur minimal aber immerhin .. vllt kann man ja mit dem was anfangen...

oder vllt ne abfrage der Farbe des Crosshair auf dem Bildschirm wenns sich nach obn bewegt .. solls wieder zurückspringen aber du drückst w oder sonstiges ;) sieht dann zwar so aus als würdest du cheaten, weil dein Crosshair rumzappelt aber vllt klappts

mfg

merfen
20.11.2008, 22:33
So etwas geht schon aber das wird dann eh ne komplizierte Programmiererei mit einschränkungen auf andere Berreiche ;)

Darkraiser
20.11.2008, 22:34
hahaha :) mit der maus so zu laufen ist schon ne einschränkung ;)
aber ich glaube das Thema schaffst du nur über solche Umwege

mfg

otto
20.11.2008, 22:55
YOUTUBE.com
mach please vid.
Warum brauchst das denn?
keine tastatur? ;-D

Darkraiser
20.11.2008, 23:02
höhö .. ich denke mal es sieht ziemlich lustig aus wie einer die ganze zeit mit seiner maus wie verrückt rumfummelt ;)

und ich denke mal .. das nimmt er um irgendwen zu nerfn ;) weil für shooter kann man dat nich wirklich verwenden

mfg

merfen
22.11.2008, 13:49
Hallo Leute

Ich habe jetzt mal den Code nach dem Beispiel von AlterHacker neu geschrieben nur jetzt kommt die Fehlermeldung auf Zeile 13.


`point' undeclared (first use this function)

Sorry ich weiss hier nicht mehr weiter hat da jemand von euch ne Lösung parat?

Hier der Code



#include <iostream>
#include <windows.h>

using namespace std;
int oldx=-1,oldy=-1;


int main()
{

while(1)
{
GetCursorPos(point);
if(oldx==-1 || oldy==-1){
oldx = point.x; oldy = point.y;
continue;
}

int x = point.x;
int y = point.y;

while(x-->oldx){rechts();Sleep(1);}
while(x++[list=1]oldy){runter();Sleep(1);}
while(y++<oldy){hoch();Sleep(1);}

Sleep(1);
}


return 0;
}


PS: Sobald das Programm nach meinen Bedürfnissen funktioniert verrate ich euch was ich damit vorhab. Es ist sicher ned um damit jemand anderen zu nerven oder zu cheaten :D

AlterHacker
22.11.2008, 17:38
Hallo Leute

Ich habe jetzt mal den Code nach dem Beispiel von AlterHacker neu geschrieben nur jetzt kommt die Fehlermeldung auf Zeile 13.


`point' undeclared (first use this function)

Sorry ich weiss hier nicht mehr weiter hat da jemand von euch ne Lösung parat?

Hier der Code

[code]
#include <iostream>
#include <windows.h>

using namespace std;
int oldx=-1,oldy=-1;


int main()
{

while(1)
{
GetCursorPos(point);
if(oldx==-1 || oldy==-1){
oldx = point.x; oldy = point.y;
continue;
}

int x = point.x;
int y = point.y;

while(x-->oldx){rechts();Sleep(1);}
while(x++[list=1]oldy){runter();Sleep(1);}
while(y++[list=1]
#include <windows.h>

using namespace std;
int oldx=-1,oldy=-1;

void hoch();
void runter();
void rechts();
void links();

int main()
{
POINT point:
while(1)
{
GetCursorPos(point);
if(oldx==-1 || oldy==-1){
oldx = point.x; oldy = point.y;
continue;
}

int x = point.x;
int y = point.y;

while(x-->oldx){rechts();Sleep(1);}
while(x++[list=1]oldy){runter();Sleep(1);}
while(y++<oldy){hoch();Sleep(1);}

Sleep(1);

}
return 0;
}

void hoch(){
//Hier per WinAPI die W-Taste Simulieren
}
void runter(){
//S
}
void rechts(){
//A
}
void links(){
//D
}


Wie man tasten mit der WinAPI simuliert verrät dir Google ;)

Ich hab atm nur Ubuntu, keine Garantie auf Richtigkeit

krusty
23.11.2008, 10:08
ich verstehe hier noch nicht sehr viel, aber wie tasten simuliert werden glaube ich zu wissen...



keybd_event('W',0,0,0); //Tastte wird gedrückt
keybd_event('W',0,KEYEVENTF_KEYUP,0); //Tastte wird losgelassen

ich glaube keybd_event ist schon sehr veraltet...
vlt konnte ich euch ja weiterhelfen =)

AlterHacker
23.11.2008, 10:56
ich verstehe hier noch nicht sehr viel, aber wie tasten simuliert werden glaube ich zu wissen...



keybd_event('W',0,0,0); //Tastte wird gedrückt
keybd_event('W',0,KEYEVENTF_KEYUP,0); //Tastte wird losgelassen

ich glaube keybd_event ist schon sehr veraltet...
vlt konnte ich euch ja weiterhelfen =)

keybd_event meinte ich ^^

Jetzt muss man nur noch die Schnipsel zusammenfügen und feddisch.

merfen
23.11.2008, 14:22
Danke für die Hilfe, vorallem von AlterHacker ;)

@AlterHacker
Leider gibt es immer noch ein Prroblem beim Queltext den du gepostet hast.

Wenn ich den kompiliere dann tritt ein Fehler Zeile 20 auf

cannot convert `POINT' to `tagPOINT*' for argument `1' to `BOOL GetCursorPos(tagPOINT*)'

Ich hab mal ein bisschen im Netz recherchiert aber das bringt mich irgendiwe auch ned weiter (http://www.dreamincode.net/forums/showtopic15780.htm) ich verstehe dass die Definition in der Struktur wie im Beispiel geschrieben werden muss aber das hat das Problem auch ned gelöst.

Kannst du mir da vielleicht auf die Sprünge helfen :?:

@krusty
Danke für das Posten von dem Tasten Befehl, ich hab da noch was anderes gefunden kann es sein dass das die neuere Variante des Tastatur Befehls ist (so kann man sich den drücken und nicht gedrückt Befehl ersparen)
http://api.farmanager.com/en/winapi/virtualkeycodes.html