Drag and Drop
Übersicht BlitzBasic Allgemein
FleXBetreff: Drag and Drop |
So, Aug 15, 2004 21:18 Antworten mit Zitat |
|
---|---|---|
Hi Ihr!
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. 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 Danke |
||
AMD 3200+ 64bit / 512mb DDR / Radeon 9600XT / 5.1 Sound |
Slayer |
So, Aug 15, 2004 21:45 Antworten mit Zitat |
|
---|---|---|
Das sollte Dir weiter helfen
Man muss es natürlich noch etwas verfeinern, aber das Prinzip ist das gleiche und es ist nicht soviel code, da solltest Du durchblicken 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 |
Mo, Aug 16, 2004 14:25 Antworten mit Zitat |
|
---|---|---|
Ääää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 |
Mo, Aug 16, 2004 16:01 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Aug 16, 2004 16:26 Antworten mit Zitat |
|
---|---|---|
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 |
||
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version |
FleX |
Mo, Aug 16, 2004 18:41 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Aug 16, 2004 19:13 Antworten mit Zitat |
|
---|---|---|
Stimmt War natürlich absicht, damit du auch was machst! Also, ran! Wir können nicht alles machen. | ||
~ Hey Ho Let's Go ~ |
FleX |
Mi, Aug 18, 2004 22:26 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Aug 18, 2004 22:38 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Aug 19, 2004 1:03 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Aug 19, 2004 15:10 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Aug 19, 2004 19:02 Antworten mit Zitat |
|
---|---|---|
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...
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??? 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 |
Do, Aug 19, 2004 21:42 Antworten mit Zitat |
|
---|---|---|
Dem Bier sei dank , 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 |
Do, Aug 19, 2004 22:59 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Aug 20, 2004 12:17 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Aug 21, 2004 12:58 Antworten mit Zitat |
|
---|---|---|
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 |
||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group