Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:13 Titel: Problem beim Scrollen |
|
|
Hallo,
ich hab nen Problem beim Scrollen. Hier erstmal der Code:
CPP: | // Mausbewegung bestimmen
switch(data.dwOfs)
{
case DIMOFS_X:
x += data.dwData;
// Wenn rechter Rand berührt wurde...
if (x + (SCR_WIDTH / 2) >= SCR_WIDTH)
{
ijliX += 5;
// Rechten Rand prüfen
if (ijliX > JLI_WIDTH / 5)
{
ijliX = JLI_WIDTH / 5;
}
}
// Wenn linker Rand berührt wurde
else if (x + (SCR_WIDTH / 2) <= 0)
{
ijliX -= 5;
// Linken Rand prüfen
if (ijliX < 0)
{
ijliX = 0;
}
}
break;
case DIMOFS_Y:
y += data.dwData;
// Wenn unterer Rand berührt wurde...
if (y + (SCR_HEIGHT / 2) >= SCR_HEIGHT)
{
ijliY += 5;
// Unteren Rand prüfen
if (ijliY > JLI_HEIGHT / 5)
{
ijliY = JLI_HEIGHT / 5;
}
}
// Wenn oberer Rand berührt wurde
else if (y + (SCR_HEIGHT / 2) <= 0)
{
ijliY -= 5;
// Oberen Rand prüfen
if (ijliY < 0)
{
ijliY = 0;
}
}
break;
} |
Problem ist nun, dass er nicht scrollt, wenn ich mit dem Mauszeiger an Bildschirmrand komme. Sondern erst, wenn ich dann noch weiter die Maus in die Richtung bewege. Dann scrollt er aber auch nur soweit, wie ich bewege.
Ich möcht gern ein "richtiges" Scrollen hinbekommen, ich denk, ihr wisst was ich mein
Die Variablen x und y sind integers und sind am Anfang auf 0 gesetzt.
Am Anfang setzte ich den Mauscursor in die Mitte des Bildschirms, nur so als Info, damit ihr auch meine Abfragen versteht:
CPP: | SetCursorPos(SCR_WIDTH / 2, SCR_HEIGHT / 2); |
Tjo, ich hoffe, mir kann da wer helfen.
Gruß
Otti
[edit]
Die Variablen ijliX und ijliY sind meine Variablen, womit ich das Hintergrundbild dann verschiebe. _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:24 Titel: |
|
|
Ich versteh nicht so wirklich, was du unter 'richtigem' Scrollen verstehst. Im Grunde musst du doch nur testen, ob die linke obere Ecke vom Mauszeiger sich am Bildschirmrand befindet und wenn das der Fall ist, wird eben gescrollt.
Bsp:
CPP: | if(Mouse.x<=1) scrollX+=10;
if(Mouse.x>=SCR_WIDTH) scrollX-=10;
if(Mouse.y<=1) scrollY+=10;
if(Mouse.y>=SCR_HEIGHT) scrollY-=10;
|
|
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:26 Titel: |
|
|
Ja, genau so mein ich das ja. Dass er dann solange scrollt, bis entweder das Bild zuende ist oder ich den Mauszeiger vom Rand wegnehme. Aber das funktioniert nicht so. Er scrollt nur, wenn der Mauszeiger am Rand ist UND ich den Mauszeiger dann noch weiter bewege.
Er soll aber eben immer scrollen, wenn sich der Mauszeiger am Rand befindet. Irgendwie fragt er aber wohl nicht richtig ab. _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:27 Titel: |
|
|
Also wenn ich deine Frage jetzt richtig verstanden hab, dann soll dein Programm auch Scrollen wenn der Cursor am Bildschirmrand still steht? So wie es bei Strategiespielen wie Command&Conquer und co auch der Fall ist?
Dann müsstest du doch einfach nur abfragen ob der Cursor den Bildschirmrand berührt und wenn er das tut, dann scrollst du trotzdem.
Also pseudo-code:
Code: |
// Cursor am oberen Bildschirmrand?
if(CursorPosition.y == 0)
ScrollNachoben um x-Einheiten
| [/code] |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:30 Titel: |
|
|
Ja, genau das mein ich. Aber das geht ja leider nicht so einfach. Problem liegt wohl irgendwie beim DirectInput, weil ich damit nicht direkt die Mausposition abfragen kann. Deswegen hab ich ja versucht, das irgendwie mit Umwegen zu regeln, wie man oben sieht, aber leider funktioniert das nicht so richtig.
[edit]
Ich glaub, ich habs nun. Ich frag nun in der CallBack-Funktion immer die aktuellen Mauskoordinaten ab und rufe dann die Funktion auf, wo er scrollt. Und da prüfe ich dann immer die Ränder. Komisch dass es anders nicht funktioniert, aber so gehts ja nun auch
Trotzdem Danke
Gruß
Otti _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 21:45 Titel: |
|
|
Hmm...nach links und recht scrollen geht nun. Da scrollt er durchgehen, aber oben und unten geht irgendwie nicht. Da scrollt er nicht durgehen, da scrollt er nur solange ich auch die Maus in die Richtung bewege. Hier der Code:
CPP: | // Mausbewegung bestimmen
switch(data.dwOfs)
{
case DIMOFS_X:
// Wenn rechter Rand berührt wurde...
if (imousex >= SCR_WIDTH - 5)
{
ijliX += 2;
// Rechten Rand prüfen
if (ijliX > JLI_WIDTH / 5)
{
ijliX = JLI_WIDTH / 5;
}
}
// Wenn linker Rand berührt wurde
else if (imousex <= 5)
{
ijliX -= 2;
// Linken Rand prüfen
if (ijliX < 0)
{
ijliX = 0;
}
}
break;
case DIMOFS_Y:
// Wenn unterer Rand berührt wurde...
if (imousey >= SCR_HEIGHT - 5)
{
ijliY += 2;
// Unteren Rand prüfen
if (ijliY > JLI_HEIGHT / 5)
{
ijliY = JLI_HEIGHT / 5;
}
}
// Wenn oberer Rand berührt wurde
else if (imousey <= 5)
{
ijliY -= 2;
// Oberen Rand prüfen
if (ijliY < 0)
{
ijliY = 0;
}
} |
imousex und imousey sind integer und werden in der CallBack-Funktion folgendermaßen belegt:
CPP: | switch(msg)
{
case WM_MOUSEMOVE:
imousex = LOWORD(lParam);
imousey = HIWORD(lParam);
ProcessInput();
break;
} |
Find einfach den Fehler nicht.
"ProcessInput" ist die Funktion, die ihr oben seht, also die, wo gescrollt wird. _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:01 Titel: |
|
|
Was hast du nur dauernd mit deiner Mausbewegung?^^
Was du brauchst ist die Mauspostion.
Sorry, keine Lust mich um die Uhrzeit durch deinen Code zu kämpfen. |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:09 Titel: |
|
|
Ok, verständlich *g*
Die Mauspositionen hab ich ja in imousex und imousey.
Und das sind meine 4 Abfragen:
CPP: | if (imousex >= SCR_WIDTH - 5)
if (imousex <= 5)
if (imousey >= SCR_HEIGHT - 5)
if (imousey <= 5) |
Die ersten beiden gehen ja, aber die letzten beiden eben nicht. Weiß aber net warum.
Büdde hülf mir *g* _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:20 Titel: |
|
|
Was ist das eigentlich für ein merkwürdiger switch()-Block in deinem Code?
"Setzt" du 'data.dwOfs' wenn die Maus bewegt wird?
Irgendwie leuchtet mir nicht ganz ein, was du damit erreichen willst. Du möchtest, dass auch gescrollt wird, wenn die Maus stillsteht, jedoch den Rand berührt, richtig?
Es mutet aber irgendwie so an, als wenn dieser switch()-Block dazu dient, festzustellen, in welche Richtung sich die Maus bewegt (->was sie ja eigentlich gar nicht soll, oder?)... ...zumindest schlussfolger ich das jetzt einfach mal aus dem Kommentar darüber.
Sorry wenn ich Mist laber, es ist spät und ich gehör in mein Bett. |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:26 Titel: |
|
|
Öhhm..jo, der switch-Block kommt mir nun auch suspekt vor *g*
Und ja, es soll noch gescrollt werden, wenn der Mauszeiger stillsteht und sich am Rand befindet.
[edit]
JIHU!
Hab nun die Switch-Anweisung und alles was dazu gehört rausgenommen und die ifs und die dazugehörigen Anweisungen stehen lassen. Nun gehts.
Danke *g* _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:31 Titel: |
|
|
Wenn du die Maus in beide Richtungen bewegst wird nur der Teil bei case DIMOFS_X ausgeführt, der für Y nicht, wenn ich mich nicht irre.
EDIT: ok, dann ist ja alles klar. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 24.07.2005, 22:35 Titel: |
|
|
Jo, k. Habs ja nun gelöst, geht wohl net anders, wollts ja eigentlich mit DirectInput lösen, aber nun gut, geht ja auch so
Danke und Gruß
Otti _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.07.2005, 14:50 Titel: |
|
|
hmm, ich glaub, ihc weiß was dein fehler is
wie du schon weißt, gibt DI dir immer die Verschiebung relativ zur vorherigen position. du setzt die maus am Anfang in die mitte, dann hast du auch die aktuelle Position. Wenn du die maus verschieben willst, musst du die werte, die DI dir gibt, zu deinen bisherigen Pos draufrechnen, ungefähr so: CPP: | long posMouseX = Bildschirmbreite / 2;
long posMouseY = Bildschirmhöhe / 2;
SetCurserPos(posMouseX, posMouseY);
// ich glaube du nimmst die DIMOUSESTATE2-struktur, wenn net is auch egal, dann nimmst du das, was du jetzt eben hast
posMouseX += dims2.lX;
posMouseY += dims2.lY; |
Gruß DirectXer
EDIT:
ach, du machst das ja ganz anders ^^ wenn du das doch mit der DIMOUSESTATE2-strktur machen willst(is in dem Fall besser und leichter), komm heut abend so zwischen 18:00 und 23:00 ins IRC, ich müsste dann irgendwann auch da sein |
|
Nach oben |
|
|
|