Drag and Drop

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

FleX

Betreff: Drag and Drop

BeitragSo, Aug 15, 2004 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Ihr! Wink

Ich programmiere grad nen spiel und darin soll man mit der maus so sachen verschieben.
Nur leider hab ich keine Ahnung wie man so was macht. Rolling Eyes

Die Fuktion sollte so sein:
Man geht mit dem Cursor über ein Bild, klickt, der Cursor verändert sich und man kann das Bild dahin verschieben wo man will.

Könnte mir nich jemand von euch ne Beispiel Quellcode schreiben, wie man so etwas machen kann Question

Danke
AMD 3200+ 64bit / 512mb DDR / Radeon 9600XT / 5.1 Sound

Slayer

BeitragSo, Aug 15, 2004 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte Dir weiter helfen Wink
Man muss es natürlich noch etwas verfeinern, aber das Prinzip ist das gleiche und es ist nicht soviel code, da solltest Du durchblicken Smile


Code: [AUSKLAPPEN]
Graphics 640,480,16,2
SetBuffer BackBuffer()



Global ax = 10,by = 10


Global mx,my,m1




While Not KeyHit(1)

mx = MouseX()
my = MouseY()
m1 = MouseDown(1)


colli = RectsOverlap (mx, my, 10, 10, ax, by, 100, 100)

Rect ax,by,100,100,1


If colli And m1
   ax = mx 
   by = my
EndIf

If colli
   Color 200,0,0
   Else
   Color 0,200,0
EndIf

Rect mx,my,10,10,1
Color 255,255,255


 
Flip:Cls
Wend:End
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

Sebastian

BeitragMo, Aug 16, 2004 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Äääähhhh.......

Entschuldige das ich diene code kritisiere ,aber wenn man die maus schnell genug bewegt verliert man das weiße Rechteck.

Ich kenn das Prob.
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !
 

Blitzkrieg Bop

BeitragMo, Aug 16, 2004 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
So, dann hab ich hier noch was, sollte bissle besser sein:
Code: [AUSKLAPPEN]

Graphics 640,480,16,2

bx = 200
by = 100

kasten = CreateImage(100,100)
SetBuffer ImageBuffer(kasten)
Color 79,79,79
Rect 0,0,100,100

MidHandle kasten

SetBuffer BackBuffer()

Repeat
Cls
HidePointer()

DrawImage kasten,bx,by

Color r,g,b
Rect MouseX(),MouseY(),5,5

If MouseDown(1) = True
   bx = MouseX()
   by = MouseY()
   r = 255
   g = 0
   b = 255
Else
   r = 255
   g = 0
   b = 0    
EndIf

Flip
Until KeyHit(1):End
~ Hey Ho Let's Go ~

Slayer

BeitragMo, Aug 16, 2004 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Sebastian hat Folgendes geschrieben:
Äääähhhh.......

Entschuldige das ich diene code kritisiere ,aber wenn man die maus schnell genug bewegt verliert man das weiße Rechteck.

Ich kenn das Prob.


Ja, das ist schon richtig.
Aber, es soll nur ein Wink in die richtung sein, wir wollen ja Ihm nicht ein fertiges game machen Wink
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version
 

FleX

BeitragMo, Aug 16, 2004 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Vielen Dank für eure Hilfe ihr hab mir echt weitergeholfen.

Aber bei dem code vom Blitzkrieg Bob springt das viereck immer zum cursor wenn man klickt, auch wenn man nicht mit dem cursor nicht auf dem viereck ist.
AMD 3200+ 64bit / 512mb DDR / Radeon 9600XT / 5.1 Sound
 

Blitzkrieg Bop

BeitragMo, Aug 16, 2004 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt Very Happy War natürlich absicht, damit du auch was machst! Also, ran! Wir können nicht alles machen.
~ Hey Ho Let's Go ~
 

FleX

BeitragMi, Aug 18, 2004 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab da jez ma was geproggt, aber wenn man jez klickt ändert sich leiber net der cusor...

Code: [AUSKLAPPEN]
Graphics 640,480,16,2

bx = 200
by = 100

kasten = CreateImage(100,100)
SetBuffer ImageBuffer(kasten)
Color 79,79,79
Rect 0,0,100,100

MidHandle kasten

SetBuffer BackBuffer()


cursor1=LoadImage ("cursor1.bmp")
cursor2=LoadImage ("cursor2.bmp")
;cursor1 ist der normale cursor
;cursor2 ist der cursor der anstadt des cursor1 erscheinen soll, wenn man die linke Maustaste drückt

MaskImage cursor1,0,255,0
MaskImage cursor2,0,255,0

cursor = cursor1

;Hauptschleife
;***********************************
Repeat
   Cls
   HidePointer()

DrawImage kasten,bx,by
DrawImage cursor,MouseX(),MouseY()

If MouseDown(1) And RectsOverlap(bx,by,50,50,MouseX( ),MouseY( ),50,50)
bx = MouseX()
by = MouseY()
cursor = cursor2
Else
cursor = cursor1
EndIf

Flip
Until KeyHit(1):End



also was hab ich da falsch gemacht? bitte helft mir!!
AMD 3200+ 64bit / 512mb DDR / Radeon 9600XT / 5.1 Sound

Slayer

BeitragMi, Aug 18, 2004 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ahnung, bei mir funktionierts.
Sobald ich im grauen rechteck bin und klicke, wird mir der andere Cursor angezeigt.

Oder willst Du das der Cursor sich auch ohne Collision Ändert ??



Code: [AUSKLAPPEN]
HidePointer();<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Graphics 640,480,16,2

bx = 200
by = 100

kasten = CreateImage(100,100)
SetBuffer ImageBuffer(kasten)
Color 79,79,79
Rect 0,0,100,100

MidHandle kasten

SetBuffer BackBuffer()


cursor1=LoadImage ("cursor1.bmp")
cursor2=LoadImage ("cursor2.bmp")
;cursor1 ist der normale cursor
;cursor2 ist der cursor der anstadt des cursor1 erscheinen soll, wenn man die linke Maustaste drückt

MaskImage cursor1,0,255,0
MaskImage cursor2,0,255,0

cursor = cursor1

;Hauptschleife
;***********************************
Repeat
   Cls
   ;HidePointer();Muss nicht in die schleife<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

DrawImage kasten,bx,by
DrawImage cursor,MouseX(),MouseY()
mousedruck = MouseDown(1)

If mousedruck
   If RectsOverlap(bx,by,50,50,MouseX( ),MouseY( ),50,50)
      bx = MouseX()
      by = MouseY()
   EndIf
cursor = cursor2
Else
cursor = cursor1
EndIf

Flip
Until KeyHit(1):End
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

Mattis_the_brain

BeitragDo, Aug 19, 2004 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine lösung...
Code: [AUSKLAPPEN]

RectPosX   = 100
RectPosY   = 150
RectSizeX   = 200
RectSizeY   = 50

Graphics(640, 480, 16, 1)

SetBuffer(BackBuffer())
While(KeyHit(1) = False)
   
   If(MouseHit(1))
      If(PointRectColli(MouseX(), MouseY(), RectPosX, RectPosY, RectSizeX, RectSizeY))
         DifX = MouseX() - RectPosX
         DifY = MouseY() - RectPosY
         RectSelect = True
      EndIf
   EndIf
   
   If(MouseDown(1))
      If(RectSelect)
         RectPosX = MouseX() - DifX
         RectPosY = MouseY() - DifY
      EndIf
   Else
      RectSelect = False
   EndIf
   
   Cls
   Rect(RectPosX, RectPosY, RectSizeX, RectSizeY, 0)
   Plot(MouseX(), MouseY())
   
   Flip(True)
Wend
End

Function PointRectColli(x3, y3, x1, y1, x2, y2)
   If(x3 =>x1 And y3 => y1 And x3 <= x1 + x2 And y3 <= y1 + y2) Return(True)
   Return(False)
End Function

Mattis_the_brain

BeitragDo, Aug 19, 2004 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir Dedacht ich schreib mal gleich ne ganze DragDropEngine...

Include-file:
Code: [AUSKLAPPEN]

Type OBJ_DragDrop
   Field PosX, PosY
   Field SizeX, SizeY
   Field RectSelect
End Type
Global OBJ.OBJ_DragDrop

Global DifX, DifY
Global   MouseKey1

Function OBJ_CreateDragDrop(PosX, PosY, SizeX, SizeY)
   OBJ.OBJ_DragDrop = New OBJ_DragDrop
   OBJ\PosX   = PosX
   OBJ\PosY   = PosY
   OBJ\SizeX   = SizeX
   OBJ\SizeY   = SizeY
   Return(Handle(OBJ))
End Function

Function OBJ_UpdateDragDrop()
   For OBJ = Each OBJ_DragDrop
      If(MouseKey1)
         If(PointRectColli(MouseX(), MouseY(), OBJ\PosX, OBJ\PosY, OBJ\SizeX, OBJ\SizeY))
            DifX = MouseX() - OBJ\PosX
            DifY = MouseY() - OBJ\PosY
            OBJ\RectSelect = True
         EndIf
      EndIf
      
      If(MouseDown(1))
         If(OBJ\RectSelect = True)
            OBJ\PosX = MouseX() - DifX
            OBJ\PosY = MouseY() - DifY
         EndIf
      Else
         OBJ\RectSelect = False
      EndIf
      Rect(OBJ\PosX, OBJ\PosY, OBJ\SizeX, OBJ\SizeY, 0)
   Next
End Function

Function OBJ_ReturnX(id)
   OBJ = Object.OBJ_DragDrop(id)
   Return(OBJ\PosX)
End Function

Function OBJ_ReturnY(id)
   OBJ = Object.OBJ_DragDrop(id)
   Return(OBJ\PosY)
End Function

Function PointRectColli(x3, y3, x1, y1, x2, y2)
   If(x3 =>x1 And y3 => y1 And x3 <= x1 + x2 And y3 <= y1 + y2) Return(True)
   Return(False)
End Function


Test-file:
Code: [AUSKLAPPEN]

Include "DragDrop.bb"

Graphics(640, 480, 16, 1)

obj1 = OBJ_CreateDragDrop(100, 100, 200, 100)
obj2 = OBJ_CreateDragDrop(100, 250, 100, 60)

SetBuffer(BackBuffer())
While(KeyHit(1) = False)
   MouseKey1 = MouseHit(1)
   OBJ_UpdateDragDrop()
   
   Cls
   
   Rect(OBJ_ReturnX(obj1), OBJ_ReturnY(obj1), 200, 100, 0)
   Rect(OBJ_ReturnX(obj2), OBJ_ReturnY(obj2), 100, 60, 0)
   
   Plot(MouseX(), MouseY())
   
   Flip(True)
Wend
End
 

FleX

BeitragDo, Aug 19, 2004 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
mattis du bist genial und dein code extrem geil nur leider raff ich nix davon und weiß auch net wie ich den in meinen code einbaude... Crying or Very sad

ma wieder zu den leichteren beispielen (für noobs, wie mich):

ich hab es geschafft wzei objekte einzubauen die man mit drad and drog bewegen kann. Nur wenn man das eine rechteck über das andere schiebt bleibt das andere daran "hängen" und wir mitgezogen. Wie kann man das ändern??? Question

Code: [AUSKLAPPEN]

HidePointer();<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Graphics 640,480,16,2

bx = 200
by = 100

kx = 200
ky = 150

kasten = CreateImage(100,100)
SetBuffer ImageBuffer(kasten)
Color 79,79,79
Rect 0,0,100,100

MidHandle kasten

SetBuffer BackBuffer()

;Bilder
;**************************************

kasten2=LoadImage ("k.bmp")
cursor1=LoadImage ("hando.bmp")
cursor2=LoadImage ("handg.bmp")


MaskImage cursor1,0,255,0
MaskImage cursor2,0,255,0


cursor = cursor1
;***********************************
;Hauptschleife
;***********************************

Repeat
Cls

DrawImage kasten2,kx,ky
DrawImage kasten,bx,by
DrawImage cursor,MouseX(),MouseY()

mousedruck = MouseDown(1)

If mousedruck
If RectsOverlap(bx,by,50,50,MouseX( ),MouseY( ),50,50)
bx = MouseX()
by = MouseY()
EndIf
cursor = cursor2
Else
cursor = cursor1
EndIf

If mousedruck
If RectsOverlap(kx,ky,100,100,MouseX( ),MouseY( ),50,50)
kx = MouseX()
ky = MouseY()
EndIf
cursor = cursor2
Else
cursor = cursor1
EndIf





Flip
Until KeyHit(1):End
AMD 3200+ 64bit / 512mb DDR / Radeon 9600XT / 5.1 Sound

wunderkind

BeitragDo, Aug 19, 2004 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Dem Bier sei dank Wink, hier mein Vorschlag. Der Code kann vielleicht etwas entmüllt werden.

Code: [AUSKLAPPEN]
Type tdrag
   Field x%
   Field y%
   Field width%
   Field height%
   Field active%
   Field name$
End Type


Global mx%
Global my%
Global mxs% ; mousexspeed
Global mys% ; mouseyspeed
Global md%
Global ao.tdrag ; saves the active object later
Global object_selected% = False


Graphics(800,600,32,2)
SetBuffer(BackBuffer())
ClsColor(128,128,128)

create_drag_object(10,10,100,30,"obj1")
create_drag_object(300,50,100,30,"obj2")
create_drag_object(250,400,110,110,"obj3")


While Not KeyHit(1)
   mx% = MouseX()
   my% = MouseY()
   mxs% = MouseXSpeed()
   mys% = MouseYSpeed()
   md% = MouseDown(1)

   Cls()

   do_drag_objects()
   draw_drag_objects()

   Flip()
Wend


End


; ----------------------------------------------
; . functions


; ----------------------------------------------
; . functions
Function do_drag_objects()
   If md% And object_selected = False Then
      ao = Null ; reset active object
      ; check about activity
      For drag.tdrag = Each tdrag
         ; change active object, if nessery
         If is_in(drag,mx,my) Then
            drag\active% = True
            ao = drag
            object_selected% = True
         Else
            drag\active% = False
         End If
      Next
   Else If md% Then   
      ; move the active object
      If ao <> Null  Then
         ao\x% = ao\x% + mxs%
         ao\y% = ao\y% + mys%
      End If
   Else object_selected = False
   End If
End Function


; ----------------------------------------------
; . create_drag_object()
Function create_drag_object(x%, y%, width%, height%, name$)
   drag.tdrag = New tdrag
   drag\x% = x%
   drag\y% = y%
   drag\width% = width%
   drag\height% = height%
End Function
; end of function create_drag_object()
; ----------------------------------------------


; ----------------------------------------------
; . draw drag objects
Function draw_drag_objects()
   For drag.tdrag = Each tdrag
      Color(255,255,255)
      Rect(drag\x%,drag\y%,drag\width%,drag\height%)
      
      If drag\active% Then
         ao = drag ; save active object
         Color(255,0,0)
      Else
         Color(0,0,255)
      End If

      Rect(drag\x%,drag\y%,drag\width%,drag\height%,0)
   Next
End Function
; end of function draw_drag_objects()
; ----------------------------------------------


; ----------------------------------------------
; . is_in()
Function is_in%(drag.tdrag, x%, y%)
   If x% >= drag\x% And x% <= drag\x%+drag\width% And y% >= drag\y% And y% <= drag\y%+drag\height% Then
      Return True
   Else
      Return False
   End If
End Function
; end of function is_in()
; ----------------------------------------------


; end of functions
; ----------------------------------------------

Eigentlich fehlt noch die Sortierung der Objekte. Gut zu beobachten, wenn alle Objekte übereinandergezogen wurden.
 

Blitzkrieg Bop

BeitragDo, Aug 19, 2004 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, hab hier nen grundgerüst:
Code: [AUSKLAPPEN]

Graphics 640,480

Type Cube
   Field x
   Field y
   Field width
   Field height
   Field fill
   Field image
End Type


Create_Cube(200,50,200,60,False) ;x,y,width,height,fill

Repeat
Cls

mouse_mode = mouse_mode Xor MouseHit(2)

Text 0,0,"mouseModus:"+mouse_mode

If MouseDown(1) = True
   mdown = True
ElseIf MouseDown(1) = False
   mdown = False
EndIf       
If MouseHit(1) = True
   mhit = True
   If mouse_mode = 1
      mvar = Not mvar
   EndIf    
ElseIf MouseHit(1) = False
   mhit = False
EndIf    

For c.cube = Each cube
;mouse_mode = 0
;klick and hold down
;-
;mouse_mode = 1
;1.klick
;2.move
;3.klick
If mouse_mode = 0
   If mdown = 1
      If MouseX() > c\x-(c\width/2) And MouseX() < (c\x + c\width/2)
         If MouseY() > c\y-(c\height/2) And MouseY() < (c\y + c\height/2)
            c\x = MouseX()
            c\y = MouseY()
         EndIf
      EndIf
   EndIf
ElseIf mouse_mode = 1
   If MouseX() > c\x-(c\width/2) And MouseX() < (c\x + c\width/2)
      If MouseY() > c\y-(c\height/2) And MouseY() < (c\y + c\height/2)
         If    mvar = 1
            c\x = MouseX()
            c\y = MouseY()
         EndIf
      EndIf       
   EndIf
EndIf       

DrawImage c\image,c\x,c\y
Next

Flip
Until KeyHit(1):End

Function Create_Cube(x,y,width,height,fill)
c.cube = New cube
c\x = x
c\y = y
c\width = width
c\height = height
c\fill = fill

c\image = CreateImage(c\width,c\height) ;create new image
SetBuffer ImageBuffer(c\image)
Rect 0,0,c\width,c\height,c\fill
MidHandle c\image
SetBuffer BackBuffer()

End Function


Aber wunderkindsens Code is sehr gut. Guck dir den am besten an!
*Edit : Warum hab ich das eigentlich Cube genannt? Is wohl zu spät ...
~ Hey Ho Let's Go ~
 

dubitat

BeitragFr, Aug 20, 2004 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
jungs wieso so schwer?

einfach abfragen ob schon ein rechteck dranhängt:

Code: [AUSKLAPPEN]

If MouseDown(1) And RectsOverlap(bx,by,50,50,MouseX( ),MouseY( ),50,50)
if rechteck_dran = 0 then
rechteck_dran=1
bx = MouseX()
by = MouseY()
cursor = cursor2
endif
Else
cursor = cursor1
rechteck_dran = 0
EndIf


viel spaß damit! musst den code nur ersetzen in die stelle bei deinem! ich hoffe es funktioniert weil ichs nich getestet habe!
Erare humanum est - Irren ist Menschlich

Mattis_the_brain

BeitragSa, Aug 21, 2004 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz einfach Leuts...
...Wenn Maus über Rect und MouseHit() dann select = true
...Wenn select = True dann Move

somit kann kein zweites objekt mit bewegt werden da wir eine variable select haben und MouseHit() und nicht Down nehmen...

Hmm... und was ist an der Functionsweise meiner Engine nicht zu verstehen... 1. Objekt erstellen 2. Position abfragen 3. Updaten

@wunderkind ... das ist auch nichts anderes als ich gemacht hab blos das du deine types anders verwaltest nämlich über ein zusätzliches handle

@Blitzkrieg Bob ... dein code kann nur Rects erstellen die man dann bewegen kann wir wollten aber etwas universelles was man auch in anderen programmen nutzen kann z.b. zum bewegen von Bildern oder sonstigem

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group