JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f4510cec9e3c6390abf8452d1839c4e0Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem beim Scrollen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 24.07.2005, 21:13    Titel: Problem beim Scrollen Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 21:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 21:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 21:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 21:30    Titel: Antworten mit Zitat

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 Smile

Trotzdem Danke Smile

Gruß
Otti
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 21:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:01    Titel: Antworten mit Zitat

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. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:09    Titel: Antworten mit Zitat

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 Sad *g*
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:20    Titel: Antworten mit Zitat

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. Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:26    Titel: Antworten mit Zitat

Ö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! Wink
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 Very Happy *g*
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 24.07.2005, 22:35    Titel: Antworten mit Zitat

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 Wink

Danke und Gruß
Otti Smile
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.07.2005, 14:50    Titel: Antworten mit Zitat

hmm, ich glaub, ihc weiß was dein fehler is Wink

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 Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum