Seite 1 von 1

Maus an den seiten schleifen lassen

Verfasst: 10.06.2008 20:41
von Gn00bi
meine frage ist: wie kann ich dafür sorgen, dass wenn man die maus bewegt sie nur an den seiten langschleift und nicht iwie in die mitte geht:

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

;-Konstanten
#tmapX = 58 - 1
#tmapY = 26 - 1
#tileh = 28
#tilew = 17
#Screenh = 768
#Screenw = 1024

;-Bildschrim öffnen
OpenScreen(1024, 768, 32, "Test")

;-Sprites createn+malen
CreateSprite(0, #tilew, #tileh)
 StartDrawing(SpriteOutput(0))
  Box(0, 0, 35, #tileh, RGB(255, 255, 255))
 StopDrawing()

CreateSprite(1, #tilew, #tileh)
 StartDrawing(SpriteOutput(1))
  Box(0, 0, #tilew, #tileh, RGB(0, 0, 255))
 StopDrawing()
 
 CreateSprite(2, 20, 20)
 StartDrawing(SpriteOutput(2))
  Box(0, 0, 20, 20, RGB(255, 0, 255))
 StopDrawing()
 
  CreateSprite(3, 20, #screenh)
 StartDrawing(SpriteOutput(3))
  Box(0, 0, 20, #screenh, RGB(255, 0, 255))
 StopDrawing()
 
  CreateSprite(4, #screenw, 20)
 StartDrawing(SpriteOutput(4))
  Box(0, 0, #screenw, 20, RGB(255, 0, 255))
 StopDrawing()
 
 CreateSprite(5, #tilew, #tileh)
 StartDrawing(SpriteOutput(5))
  Box(0, 0, #tilew, #tileh, RGB(10, 100, 255))
 StopDrawing()


;-Framerate
SetFrameRate(60)

Repeat
  ExamineKeyboard() 
  ExamineMouse()

;beenden
  If KeyboardPushed(#PB_Key_Escape)
   Quit = 1
  EndIf


;-Sprites anzeigen  


ClearScreen(RGB(0,100,0))
   
 
mausx = MouseX()
mausy = MouseY()


        
If mausy > 20 And mausy < #screenh - 40 And mausx < 20
 DisplaySprite(2, 0, mausy)
ElseIf mausy < 20 And mausx > 20 And mausx < #screenw - 40
 DisplaySprite(2, mausx, 0) 
ElseIf mausy > 20 And mausx > #screenw - 40 And mausy < #screenh - 40
 DisplaySprite(2, #screenw - 20, MouseY())
ElseIf mausy > #screenh - 40 And mausx > 20 And mausx < #screenw - 40
 DisplaySprite(2, MouseX(), #screenh- 20)
EndIf


;-Map anzeigen

  Restore Map
  For pmapY = 0 To #tmapY
    For pmapX=0 To #tmapX
      a.b
      Read a
      If a = 1
        DisplaySprite(1, pmapX*#tilew + 20, pmapY*#tileh + 20 )
      ElseIf a = 0
        DisplaySprite(0, pmapX*#tilew + 20, pmapY*#tileh + 20 )
      ElseIf a = 5
        DisplaySprite(5, pmapX*#tilew + 20, pmapY*#tileh + 20 )
      EndIf
    Next
  Next


  FlipBuffers()

Until Quit = 1
End

;-Map daten
DataSection
  Map:

  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5


EndDataSection
soweit hab ich das ja schon, das problem ist, wenn man die maus durch die mitte schiebt kommt si oben und so wieder raus, das soll aber so nicht sein

Verfasst: 11.06.2008 09:53
von Rokur
Speicher deine Mausposition in eigenen Variablen, und ändere sie nur wie folgt:

Wenn die Maus am oberen Rand ist (y=0), dann darf sich nur die X-Komponente ändern, ausser die Maus ist am linken oder rechten Rand (x=0 oder x=Bildschirmbreite).

Das musst du dann für alle Ränder machen.

Um die Änderung der Mausposition zu bekommen kannst du MouseDeltaX() und MouseDeltaY() benutzen.

Das Symbol für den Mauszeiger zeichnest du dann an die gespeicherte Position.


Eine andere Möglichkeit wäre in etwa so:
Wenn die Maus am oberen Rand ist (y < Bildschirmhöhe/2) aber nicht ganz links (x=0) oder rechts (x=Bildschirmbreite), dann setze y=0, usw.

Verfasst: 11.06.2008 14:29
von Rokur
Nachtrag:

Ich vermute das soll so eine Art Labyrinth werden? Falls sich die Maus dann auf vorgegebenen Wegen auch ins Innere bewegen können soll, dann kannst du das so lösen:

Aktuelle Mausposition in eigenen Variablen speichern.
Mit MouseDeltaX() und MouseDeltaY() prüfen, in welche Richtung sich die Maus bewegen will. Prüfen ob das Zielfeld "erlaubt" ist, wenn ja Bewegung durchführen, wenn nicht alte Position beibehalten. Wenn du das getrennt für X- und Y-Achse machst, dann "schleift" der Zeiger gerade am Weg entlang, auch wenn die Maus leicht schräg bewegt wird.

Und solange dein Code noch klein und übersichtlich ist solltest du feste Werte wie 20 und 40 bei der Mausabfrage durch Konstanten ersetzen! Dann kannst du das später viel leichter ändern, falls du die Größe verändern willst. Ausserdem sind Konstanten wie z.B. #CursorWidth, #TileWidth, usw. selbsterklärend. Du kennst dich in deinem eigenen Code viel besser aus, wenn du längere Zeit nichts damit gemacht hast und mal wieder rein schaust.

Verfasst: 11.06.2008 20:25
von Kaeru Gaman
um die maus immer am selben rand zu halten,
musst du "mitschreiben", an welchem rand sie sich befindet.
weiterhin musst du ziemlich genau prüfen,
unter welchen umständen sie an einen anderen rand wechseln darf.

hab das mal from-the-scratch gecoded, um mich auf die abfrage zu konzentrieren.

Code: Alles auswählen

EnableExplicit

InitSprite()
InitKeyboard()
InitMouse()

#ScrW = 1024    ; Screenwidth
#ScrH = 768     ; Screenheight
#CurW = 32      ; Cursorwidth
#CurH = 32      ; Cursorheight

#RBord = #ScrW - #CurW -1   ; right border
#BBord = #ScrH - #CurH -1   ; bottom border

OpenScreen(#ScrW, #ScrH, 32, "MouseBorder")

CreateSprite(0, #CurW, #CurH )
  StartDrawing(SpriteOutput(0))
    Box ( 0,     0  , #CurW, #CurH, $0080F0 )
    DrawingMode(#PB_2DDrawing_Outlined)
    Box ( 3,     3  , #CurW-6, #CurH-6, $C00000 )
    Line( 0,     0  , #CurW, #CurH, $800000 )
    Line( 0, #CurH-1, #CurW,-#CurH, $800000 )
  StopDrawing()

Define EXIT.l

Define.l MouX, MouY   ; mouse coords
Define.l CurX, CurY   ; cursor display coords
Define.l ActBord      ; actual border
Define.l ChangeBord   ; change to another border

Repeat
  ExamineKeyboard()
  ExamineMouse()
  MouX = MouseX()
  MouY = MouseY()

  ClearScreen($201008)
  StartDrawing(ScreenOutput())
    Line( MouX,    0,     0, #ScrH, $C04020 )   ; mark x-pos
    Line(    0, MouY, #ScrW,     0, $C04020 )   ; mark y-pos
    DrawingMode(#PB_2DDrawing_Outlined)
    Box( #CurW, #CurH, #RBord - #CurW,  #BBord - #CurH, $40F0F0 )
  StopDrawing()

  CurX = MouX
  CurY = MouY

  Select ActBord
    Case 0  ; Top Border
      If MouY > #CurH           ; Y out of top border?
        If MouX < #CurW         ; X on left border?
          ActBord = 3           ; change to left
        ElseIf MouX > #RBord    ; X on right border?
          ActBord = 1           ; change to right
        EndIf
      EndIf
      CurY = 0    ; for top border is Y = 0

    Case 1  ; Right Border
      If MouX < #RBord           ; X out of right border?
        If MouY < #CurH         ; Y on top border?
          ActBord = 0           ; change to top
        ElseIf MouY > #BBord    ; Y on bottom border?
          ActBord = 2           ; change to bottom
        EndIf
      EndIf
      CurX = #RBord    ; for right border is X = #RBord

    Case 2  ; Bottom Border
      If MouY < #BBord           ; Y out of bottom border?
        If MouX < #CurW         ; X on left border?
          ActBord = 3           ; change to left
        ElseIf MouX > #RBord    ; X on right border?
          ActBord = 1           ; change to right
        EndIf
      EndIf
      CurY = #BBord    ; for bottom border is Y = #BBord

    Case 3  ; Left Border
      If MouX > #CurW           ; X out of left border?
        If MouY < #CurH         ; Y on top border?
          ActBord = 0           ; change to top
        ElseIf MouY > #BBord    ; Y on bottom border?
          ActBord = 2           ; change to bottom
        EndIf
      EndIf
      CurX = 0    ; for left border is X = 0

  EndSelect

  If CurX > #RBord : CurX = #RBord : EndIf  ; not further
  If CurY > #BBord : CurY = #BBord : EndIf

  DisplaySprite( 0, CurX, CurY )

  If KeyboardPushed(#PB_Key_Escape)
    EXIT = 1
  EndIf

  FlipBuffers()
Until EXIT
...soll das jedoch nachher wirklich ein Labyrinth werden, wie Rokur vermutet,
ist das der komplett falsche Ansatz, dann musst du eher nen "mausfolger" programmieren.

Verfasst: 11.06.2008 22:21
von Gn00bi
danke kaeru gaman genauso hatte ich mir das gedacht. muss mir morgen nochmal den code genauer angucken. und nein es soll kein labyrinth werden

wenn ich noch fragen zu deinem code hab stell ich sie hier noch, könnten auch noch ein paar mehr fragen zu anderen themen kommen^^

danke erstmal hast mich ein gutes stück weiter gebracht. hatte mir das auch schon so ungefähr gedacht, bin dann aber immer gescheitert