Small nuisance with ChangeCursorGraphic (SOLVED)

Started by x_traveler_x, Mon 21/03/2005 04:29:41

Previous topic - Next topic

x_traveler_x

I recently put something in my script which changes the cursor's graphic for each item (rather than just using the item for the cursor).   Here's the code:

Code: ags

// ##### INVENTORY ITEM CURSORS #####

  if (character[EGO].activeinv == 1) ChangeCursorGraphic (4,66);
  if (character[EGO].activeinv == 2) ChangeCursorGraphic (4,69);


... and so on for each item I add.  I put this script in the repeatedly_execute() section of my global.

This script does work nicely.  The problem, albeit a very small one, is when an item is selected, and its corresponding item cursor is active, it overrides all SetCursorMode(6) commands.   For example, I placed a SetCursorMode(6) at the beginning of all my GUIs so that a blank arrow cursor would be active.  This always works unless the item cursor is active. 

Am I taking the right approach to this?
~~- - -. . .finding a cure for mundanity. . . - - -~~

Pumaman

ChangeCursorGraphic should only alter the current mouse cursor if the current mode is the same as the mode you're changing.

Are you sure you don't have a SetCursorMode(4) with your ChangeCursorGraphic code?

x_traveler_x

#2
Okay, I had to read your post again because I misunderstood what you were asking.  Sorry :)

Yes, I have tripple-checked my global and I'm certain that that there are no SetCursorMode(4) commands with my ChangeCursorGraphic code.  The only place where SetCursorMode(4)  can be found is on the ICONBAR GUI, where it is by default.

I'll try to rephrase my problem.  At the top of all my GUIs' codes, I placed a SetMouseCursor (6) so that the cursor turns to an arrow every time a GUI is accessed.  It works all the time, except for when an inventory item is selected and its corresponding cursor is on screen-- that's when the item's cursor stays on screen and SetMouseCursor(6) seems to be ignored.  Now if I cycle-through to another cursor, and then access a GUI again, the problem goes away and the normal arrow comes back.

I'm absolutely baffled by this, because according to the logic in my code...

Code: ags

if (character[EGO].activeinv == 1) ChangeCursorGraphic (4,66);


... only Mouse Cursor #4 should have its image changed.  However, it seems to affect Mouse Cursor #6, too as long as it is the current cursor.

-=-=-=-=-

Just tested it with SetCursorMode (6) instead of SetMouseCursor (6)... no dice.
~~- - -. . .finding a cure for mundanity. . . - - -~~

Pumaman

Quote from: x_traveler_x on Tue 22/03/2005 02:39:43
I'll try to rephrase my problem. At the top of all my GUIs' codes, I placed a SetMouseCursor (6) so that the cursor turns to an arrow every time a GUI is accessed.

That would explain it, since SetMouseCursor(6) still leaves the cursor mode as whatever it was before.

Quote
Just tested it with SetCursorMode (6) instead of SetMouseCursor (6)... no dice.

That on the other hand is rather strange ... perhaps you could use GetCursorMode to display the current cursor mode before you do your ChangeCursorGraphic lines, just for debugging to check that it is indeed 6.

x_traveler_x

Just tried your suggestion.Ã,  Unfortunately, it didn't seem to have any effect.

Here's what I did:
Code: ags

Ã,  if (character[EGO].activeinv == 1) {
Ã,  Ã,  if (GetCursorMode() == 4){
Ã,  Ã,  Ã,  ChangeCursorGraphic (4,66);
Ã,  Ã,  }
Ã,  }


Could it maybe be incorrect to put this in the repeatedly_execute() section of my global?
~~- - -. . .finding a cure for mundanity. . . - - -~~

Pumaman

What I meant was something like this:

Display("Cursor mode %d.", GetCursorMode());

so that you can check for sure whether the cursor mode is 4 or 6.

x_traveler_x

My fault.. how silly of meÃ,  :-\

I tried it.Ã,  Here's a screengrab showing the results:



Cursor Mode 4 seems to be active at the time.
~~- - -. . .finding a cure for mundanity. . . - - -~~

Pumaman

Try searching your script for "SetCursorMode" to see if you might be inadvertently setting it elsewhere.

x_traveler_x

SetCursorMode(4) only appears in this part of my global:

Code: ags

// ##### ICONBAR #####

Ã,  if (interface == 1) {
Ã,  Ã,  SetMouseCursor (6);
Ã,  Ã,  if (button == 4) {Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã, 		// Show INVENTORY
Ã,  Ã,  Ã,  show_inventory_window ();
Ã,  Ã,  }
Ã,  Ã,  else if (button == 5) {Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  		// Use selected ITEM
Ã,  Ã,  Ã,  if (character[ GetPlayerCharacter() ].activeinv >= 0)
Ã,  Ã,  Ã,  Ã,  SetCursorMode(4);
Ã,  Ã,  }
Ã,  Ã,  Ã,  if (button == 6) {Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã,  Ã, 		// Show CONTROLPANEL
Ã,  Ã,  Ã,  Ã,  GUIOff(1);Ã,  Ã,  Ã,  
Ã,  Ã,  Ã,  Ã,  GUIOn(4);
Ã,  Ã,  }
Ã,  }


I don't have any SetCursorMode(6)'s anywhere.
~~- - -. . .finding a cure for mundanity. . . - - -~~

Pumaman

Quote from: x_traveler_x on Thu 24/03/2005 20:59:47
I don't have any SetCursorMode(6)'s anywhere.

In that case, that would explain why the cursor mode is still 4. You'd need to use SetCursorMode(6) to change it.

x_traveler_x

I did try that.  Remember when I said earlier that I put SetMouseCursor(6) at the beginning of the GUI scripts to change it?  Then I changed it to SetCursorMode(6) instead, but that didn't work either.
~~- - -. . .finding a cure for mundanity. . . - - -~~

Ashen

Looking at your code, the cursor mode would only be changed when a button was pushed not when the GUI opened, so of course mode 4 would be active. You need to put the SetCursorMode(6)/SetMouseCursor(6) wherever in the script you open the GUI.
I know what you're thinking ... Don't think that.

x_traveler_x

Unfortunately, I tried that too, but it makes no difference where I put the code.Ã,  Usually everything works fine with the way the code is now, but when any selected item is active and the item cursor is changed, THEN the problem occurs.Ã,  Based on that, I can only assume that I did something wrong when I added the ChangeCursorGraphic code.Ã,  At any rate, it continues to boggle me.

???

I do appreciate your help, guys, really.

~~- - -. . .finding a cure for mundanity. . . - - -~~

Ashen

OK, what about:
Code: ags

// ##### INVENTORY ITEM CURSORS #####
if (GetGUIAt (mouse.x, mouse.y) == -1) { // mouse not over a GUI, make mode 4 look like item
  if (character[EGO].activeinv == 1) ChangeCursorGraphic (4,66);
  if (character[EGO].activeinv == 2) ChangeCursorGraphic (4,69);
  // etc for other items
}
else ChangeCursorGraphic (4, ARROWGRAPHIC); // mouse over GUI, use arrow graphic
I know what you're thinking ... Don't think that.

x_traveler_x

Interesting idea, but it has a problematic side effect.  Now the cursor's graphic doesn't change when the player chooses an item (unless you move it off the GUI).

I'll play around wih it some more.  Maybe I'll come up with something.

Thanks again!
~~- - -. . .finding a cure for mundanity. . . - - -~~

Ashen

That's not so much a 'problematic side effect', as exactly what it was meant to do. I must've missunderstood what you wanted, sorry about that.

What exactly DO you want to happen? You said:
Quote
It works all the time, except for when an inventory item is selected and its corresponding cursor is on screen-- that's when the item's cursor stays on screen and SetMouseCursor(6) seems to be ignored.
And yet now when the graphic doesn't change you call it a problem. I don't mean to sound rude, or irritated, it'd just be easier for me to help, if I actually understood what I'm helping you do.
I know what you're thinking ... Don't think that.

x_traveler_x

SOLVED!

I modified the idea you gave me, Ashen, and came up with this:

Code: ags


// ##### "ARROW" CURSOR MAINTANENCE #####
  
  if (GetGUIAt (mouse.x, mouse.y) == 1) SetMouseCursor(6);
  if (GetGUIAt (mouse.x, mouse.y) == 3) SetMouseCursor(6);



... and so on for every GUI where I want the cursor to be an arrow!  It seems so obvious now :)

Thanks again!
~~- - -. . .finding a cure for mundanity. . . - - -~~

x_traveler_x

Quote
And yet now when the graphic doesn't change you call it a problem. I don't mean to sound rude, or irritated, it'd just be easier for me to help, if I actually understood what I'm helping you do.

I realize it sounded very confusing the way I was describing it.  And I am truely sorry about that.  So I understand and sympathize with any frustration. 

What I wanted was to change the mouse cursor into arrow-shaped-pointer which displayed the inventory item, because I strongly dislike using the item itself with a hotspot as the cursor.  When I used your suggestion, the cursor was still in the INVENTORY GUI when the player selected it, therefore preventing the arrow changing into the item cursor.

That should hopefully clear up any confusion.  I am pleased to say that I was able to solve this (as I mentioned in my previous post) by modifying the suggestion you gave me.  See above.

Again, thanks Ashen and Pumaman, for all the help and support.  It helped, and I learned from it!

Peace!

~~- - -. . .finding a cure for mundanity. . . - - -~~

Ashen

#18
No problem, glad it's sorted.
However, if there's only one GUI (i.e. the inventory) you don't want it on, you could try:
Code: ags

if (GetGUIAt (mouse.x, mouse.y) == -1) { // mouse not over a GUI, make mode 4 look like item
  if (character[EGO].activeinv == 1) ChangeCursorGraphic (4,66);
  if (character[EGO].activeinv == 2) ChangeCursorGraphic (4,69);
  // etc for other items
}
// ##### "ARROW" CURSOR MAINTANENCE #####
else if (GetGUIAt (mouse.x, mouse.y) != INVGUI) SetMouseCursor(6);

Or something similar, anyway, to cut down the number of lines needed.

On a similar theme - couldn't you give each inventory item a 'cursor' property, set to the sprite number you want it to have, and just use one:
Code: ags

if (character[EGO].activeinv != -1) ChangeCursorGraphic (4, GetInvProperty(player.activeinv, "cursor"));

Instead of having a line for each item.
I know what you're thinking ... Don't think that.

x_traveler_x

Good points.  I suppose I could give those suggestions a try.

I'll experiment with them and see how they turn out.

Thanks again!
~~- - -. . .finding a cure for mundanity. . . - - -~~

SMF spam blocked by CleanTalk