2D Coords

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

2D Coords

Beitrag von 125 »

Hi,
da ich Danilos bsp. bezüglich Fenster in den 2D screen Zeichnen sehr gut fand bin ich nun dabei Alle PB Window Befehle 2D Equivalente zu verpassen. Nun hab ich schon OpenWindow geproggt mit und window zeichnen moving und nochn paar sachen nun bin ich dabei Fenster verschieben bei Titelleisten klicking+moving zu programmieren und weis nicht so recht wie ich Prüfen soll ob der Mauszeiger im Window ist hab schon mehres probiert aber irgendwie fehlt mir da die möglichkeit des Räumlichen denkens :oops:

Immoment habe ich es so versucht aber wirklich funktionieren tuts nicht:

Code: Alles auswählen

    If MouseX>x And MouseY<y
      If X-Width<MouseX And Y+Height>MouseY
X=X des Fensters
Y=Y des Fensters
Width=Width des Fensters
Height=Height des Fensters
MouseX und MouseY sind ja selbsterklärend.
Wie muss es richtig aussehen? Ich bekomms einfach nicht hin...

plz help
mfg
125
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Code: Alles auswählen

If MouseX > X And MouseX < X + Width And MouseY > Y And MouseY < Y + Height : blabla : EndIf
Aber was ist daran bitte räumlich? :?
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Es ist vermutlich ein 2D-Raum (auch Ebene genannt) :mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
mipooh
Beiträge: 226
Registriert: 12.12.2004 04:49
Kontaktdaten:

Beitrag von mipooh »

Code: Alles auswählen

ExamineMouse()
if MouseX>=x And MouseY>=y And MouseX<=x+Width And MouseX<=y+Height
Da müsste alles abgedeckt sein...ausser falls MouseX und MouseY sich sowieso auf das aktive Fenster beziehen sollten, probiert hab ich's nicht...
Gruss
Mipooh
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Juhu THX funzt :D :allright:
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

//EDIT: Hm es passiert meistens wenn man das window auf die Rechte Bildschirmseite verschiebt... Ich finde irgendwie keinen Grund dafür :(
//EDIT2: Er zickt irgendwie bei der If Abrage sobald das Window auf der rechten Bildschirmseite ist kommt er nicht mehr durchs if...
//Edit3: Hab gerade mal versucht die Window x y immer nach 4 Secs zu resseten und sobald das window wieder auf der linken seite war wars wieder Moveable... ich versteh das nicht...
hmm Problem Nr.2 das irgendwie keinen Definierbaren Grund hat...
Wenn man die Windows so nen paar mal hin und her geschoben hat (zwischen 1und20 mal) Funtioniert der Mauszeiger zwar noch aber irgendwie reagiert er nicht mehr auf die Window verschiebungen hab schon alles Mögliche debuggen lassen aber entdecke nichts...
Seht ihr nen Fehler? :(

Code: Alles auswählen

Declare InitWindows()
Declare WindowMGR()
Declare PaintWindows()
#ScreenWidth  = 1024 
#ScreenHeight =  768 
#ScreenName   = "PB Windows in Screen"
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(#ScreenWidth,#ScreenHeight,32,#ScreenName)
Delay(700)
InitWindows()
Structure Window
x.l
y.l
Width.l
Height.l
Schatten.l
Title$
InWindowColor.l
WindowTitleColor.l
ShadowColor.l
TitleTextColorR.l
TitleTextColorG.l
TitleTextColorB.l
Hidden.l
WindowExists.l
EndStructure
Dim Windows.Window(100)
Global ForeGroundWindowID
Global *Thread
Global MouseX
Global MouseY

Procedure WindowMGR()
Protected WindowID
Protected x
Protected y
Protected Width
Protected Height

Repeat 
x+1
ExamineMouse()
;Check Mouse in Screen
MouseX=MouseX()
MouseY=MouseY()
If MouseX>#ScreenWidth
MouseX-1
EndIf
If MouseY>#ScreenHeight
MouseY-1
EndIf
If MouseX<1
MouseX+1
EndIf
If MouseY<1
MouseY+1
EndIf
;::::::::Start WindowEventTask::::::::
;::::::::Check WindowMove
If MouseButton(1)>0
  For WindowID=0 To 100
    x=Windows(WindowID)\x
    y=Windows(WindowID)\y
    Width=Windows(WindowID)\Width
    Height=Windows(WindowID)\Height
    ;If WindowID=0 Or WindowID=1
    ;Debug x:    Debug y:    Debug Width:    Debug Height

    ;EndIf
    If MouseX>=x And MouseY>=y And MouseX<=x+Width And MouseX<=y+Height
     ForeGroundWindowID=WindowID
       Repeat
        ExamineMouse()
        Windows(WindowID)\x+MouseDeltaX()
        Windows(WindowID)\y+MouseDeltaY()
        
        If MouseButton(1)=0
        Exit=1
        EndIf
        
        If Exit=0
        MouseX+MouseDeltaX()
        MouseY+MouseDeltaY()
        
        ;Check Mouse in Screen
        If MouseX>#ScreenWidth
        MouseX=#ScreenWidth-1
        EndIf
        If MouseY>#ScreenHeight
        MouseY=#ScreenHeight-1
        EndIf
        If MouseX<1
        MouseX=1
        EndIf
        If MouseY<1
        MouseY=1
        EndIf
        
        PaintWindows()
        EndIf
        
        Delay(4)
        Until Exit =1
  
    EndIf
   
    If Exit=1
    Break
    EndIf
  Next
EndIf
Exit=0
;::::::::End  WindowEventTask::::::::

PaintWindows()
Delay(20)
ForEver
EndProcedure

Procedure InitWindows()
*Thread=CreateThread(@WindowMGR(),0)
EndProcedure  

Procedure DeactivateWindows()
KillThread(*Thread)
EndProcedure  

Procedure OpenScreenWindow(WindowID,x,y,Width,Height,Schatten,Title$,InWindowColor,WindowTitleColor,ShadowColor,TitleTextColorR,TitleTextColorG,TitleTextColorB,Hidden)
Protected WindowID
Windows(WindowID)\x=x
Windows(WindowID)\y=y
Windows(WindowID)\Width=Width
Windows(WindowID)\Height=Height
Windows(WindowID)\Schatten=Schatten
Windows(WindowID)\Title$=Title$
Windows(WindowID)\InWindowColor=InWindowColor
Windows(WindowID)\WindowTitleColor=WindowTitleColor
Windows(WindowID)\ShadowColor=ShadowColor
Windows(WindowID)\TitleTextColorR=TitleTextColorR
Windows(WindowID)\TitleTextColorG=TitleTextColorG
Windows(WindowID)\TitleTextColorB=TitleTextColorB
Windows(WindowID)\Hidden=Hidden
Windows(WindowID)\WindowExists=1
EndProcedure

Procedure CloseScreenWindow(WindowID)
Protected WindowID
Windows(WindowID)\WindowExists=0
EndProcedure

Procedure HideScreenWindow(WindowID,Hidden)
Protected WindowID
Windows(WindowID)\Hidden=Hidden
EndProcedure

Procedure PaintWindow(WindowID)
Protected WindowID
x=Windows(WindowID)\x
y=Windows(WindowID)\y
Width=Windows(WindowID)\Width
Height=Windows(WindowID)\Height
Schatten=Windows(WindowID)\Schatten
Title$=Windows(WindowID)\Title$
InWindowColor=Windows(WindowID)\InWindowColor
WindowTitleColor=Windows(WindowID)\WindowTitleColor
ShadowColor=Windows(WindowID)\ShadowColor
TitleTextColorR=Windows(WindowID)\TitleTextColorR
TitleTextColorG=Windows(WindowID)\TitleTextColorG
TitleTextColorB=Windows(WindowID)\TitleTextColorB
Hidden=Windows(WindowID)\Hidden
WindowExists=Windows(WindowID)\WindowExists
If WindowExists=1
    If Schatten=1
    Box(x+5,y+5,Width,Height,ShadowColor);Schatten. 
    EndIf
    Box(x,y,Width,Height,InWindowColor) ;FensterInneres
    Box(x,y,Width,22,WindowTitleColor) ;TitelLeiste
    Line(x    ,y,Width,  0,$FFFFFF):Line(x,y    ,  0,height,$FFFFFF) 
    Line(x+Width,y,  0,Height,$000000):Line(x,y+height,Width,  0,$000000) 
    Locate(x+2,y+2) ;Springe zu FensterTitel
    DrawingMode(1)
    FrontColor(TitleTextColorR, TitleTextColorG, TitleTextColorB) 
    DrawText(Title$) 
EndIf
EndProcedure 

Procedure PaintWindows()
Protected WindowID
StartDrawing(ScreenOutput())
Box(0,0,#ScreenWidth,#ScreenHeight)
For WindowID=0 To 100

If WindowID<>ForeGroundWindowID
PaintWindow(WindowID)
EndIf

Next 

If ForeGroundWindowID <> -1
WindowID=ForeGroundWindowID
PaintWindow(WindowID)
EndIf
Plot(MouseX,MouseY)
FlipBuffers()
StopDrawing()
EndProcedure 

Procedure ActivateScreenWindow(WindowID)
Protected WindowID
ForeGroundWindowID=WindowID
EndProcedure 

Procedure MoveScreenWindow(WindowID,x,y)
Protected WindowID
Windows(WindowID)\x=x
Windows(WindowID)\y=y
EndProcedure 

OpenScreenWindow(0,200,455,300,200,0,"Window1",$c0c0c0,$ff0000,$404040,255,255,255,0)
OpenScreenWindow(1,100,100,300,500,0,"Window2",$c0c0c0,$ff0000,$404040,255,255,255,0)
Repeat
ExamineKeyboard()
Delay(4)
Until KeyboardPushed(#PB_Key_Escape) 
DeactivateWindows()
End
ich weiß meine Art Code zu formatieren ist schrecklich :freak: ... bitte bitte bitte helft mir trotzdem
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

keiner eine Idee worans liegen könnte?
Der Code fürs gucken ob ins Window geklickt wurden ist ist im Abschnitt:

Procedure WindowMGR()

Plz Help :(

mfg
125
mipooh
Beiträge: 226
Registriert: 12.12.2004 04:49
Kontaktdaten:

Beitrag von mipooh »

Guck's Dir mal mit dem Debugger an. Bei mir meldet der einiges...
Gruss
Mipooh
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Das hier finde ich ein bisschen schwachsinnig:

Code: Alles auswählen

If MouseX>#ScreenWidth 
MouseX-1 
EndIf 
If MouseY>#ScreenHeight 
MouseY-1 
EndIf 
If MouseX<1 
MouseX+1 
EndIf 
If MouseY<1 
MouseY+1 
EndIf 
Du machst das wohl besser so:

Code: Alles auswählen

If MouseX>#ScreenWidth - 1
MouseX=#ScreenWidth - 1
EndIf 
If MouseY>#ScreenHeight - 1
MouseY=#ScreenHeight - 1
EndIf 
If MouseX<0
MouseX=0
EndIf 
If MouseY<0
MouseY=0
EndIf
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

mipooh hat geschrieben:Guck's Dir mal mit dem Debugger an. Bei mir meldet der einiges...
Gruss
Mipooh
öhm also ich hab mir schon x y width height mousex und mousey etc. debuggen lassen ich hab mir den klick debuggen lassen und die klicks bemerkt er aber durchs if kommt es nicht wenns auf der rechten screen seite ist. also entweder bin ich blind oder du benutzts einen anderen Debugger :freak:
Antworten