button panel mehrmals benutzen

Posted By: ratz

button panel mehrmals benutzen - 02/16/13 19:23

Hallo

ich mache mir schon seit einiger zeit gedanken wie man
folgendes bewerkstelligt:

ein panel mit mehreren function..

Code:
// ein einfaches gui fenster

PANEL* hWnd_win1 =
{
 bmap=hwnd_win_1;
 	
 pos_x = 100;
 pos_y = 100;
 
 flags = SHOW | TRANSLUCENT;
 layer = 10;
}



//ein einfacher knopf//

PANEL* hWnd_b_small =
{
 	
 //pos_x = 100; -> gui panel pos
 //pos_y = 100; -> gui panel pos
 
 button (334,103,"small_b_up.bmp","small_b_up.bmp","small_b_down.bmp",NULL,NULL,NULL);
 
 flags = SHOW ;
 layer = 30;
}


es handelt sich um ein Knopf/schalter
den ich gerne mehrmals verwenden will und
das gleiche möchte ich auch gerne für mein gui fensters machen

aber:

ich möchte nicht jedesmal ein neues Panel für jedes
Fenster erstellen sonst würde der code unendlich lang werden


ich finde aber überhaupt keine lösung für mein Problem
Posted By: ratz

Re: button panel mehrmals benutzen - 02/16/13 19:25

achja -> würde man alles in ein panel setzen, dann hat jedes fenster die gleiche function.

z.b.

-wenn ich es schließen würde dann würden sich alle schließen


ich glaube dass liegt damit zusammen dass man ein panel nur einmal aufrufen kann frown
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/16/13 20:06

Ich weiß nicht genau worauf du hinaus willst, aber du musst kein neues Panel erstellen, nur um einen Button auf ein Fenster zu legen.

Mit den Standart-Paneln zu arbeiten ist oft ziemlich umständlich, aber wenn man sich einen Code schreibt, den man einfach benutzen kann,
und der das Ganze gefummel mit Panels und Buttons selbst erledigt geht das eigentlich recht gut.


Achja, könntest du eventuell erklären was dein sog. "panel mit mehreren function.." ist.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/16/13 20:16

was ich damit meine ist folgendes:

ich möchte das Panel "Fenster" (hwnd_win_1)
mehrmals darstellen ohne immer wieder neue Panels schreiben zu müssen

wenn es dann dargestellt ist dann soll man auch jedes einzelnde schlißen
können -> wie beim "OS: Windows"

IN AUM 83 ist ein 2d spacegame tutoiral
aber ich werde aus dem code nicht schlau, wie man es
schaft ein panel mehreremale anzuzeigen





ich hoffe ihr wisst was ich meine,
und das gleiche möchte ich mit mein Fenster machen
nur sollen diese einfach nur dargestellt werden

- WIE GEHT DAS ???
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/16/13 20:23

Um ein vollständiges, Fenster-basierendes Gui-System zu erstellen braucht man einiges an Erfahrung und auch etwas Zeit.

Meines ist beispielsweise ~2700 Zeilen lang und noch nicht mal soo umfangreich.

Schau dir am Besten mal die Funktionen für das Managen von Panels zur Laufzeit an.
Hauptsächlich:

pan_create
pan_setbutton / -_digits / -_string


--- EDIT ---
zur Theorie dahinter:

Du hast am ende zwar trotzdem mehrere Panels, diese erstellst du aber durch (Helper-)Funktionen,
wodurch es ermöglicht wird sehr viele Panels ohne mehrere definitionen zu erstellen.
Solange deine Helperfunktionen leicht zu bedienen sind, ist es dann auch sehr leicht die Panels
zu erstellen. Am schwierigsten is es, die Funktionen, die die Panels erstellen zu schreiben.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/16/13 20:28

okey soweit war ich auchschonmal
ich hatte das problem bei pan_setbutton, dass ich dort keine x,y pos angeben kann, zudem muss man es an ein main_panel binden und wie lasse ich die darstellung wieder verschwinden -> reset(...); klapt nur mit Panels
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/16/13 20:34

Bei pan_setbutton kann man x und y position des buttons angeben ( im Manual mal genauer anschauen )

Um ein, wie beschrieben erstelltes Panel unsichtbar zu machen, funktioniert reset(panel, SHOW); genauso, wie mit normalen Panels.

Beim kompletten entfernen zur Laufzeit wird das schon kniffliger, vor Allem, wenn ein Fenster bei dir aus mehr als nur einem einfachen Panel besteht.
(z.B. zusätzliche informationen über das fenster)

Abgesehen davon musst du auch mit Pointern arbeiten.
Es ist - wie gesagt - nicht allzu einfach...
Posted By: Uhrwerk

Re: button panel mehrmals benutzen - 02/16/13 20:36

Originally Posted By: ratz
ich hatte das problem bei pan_setbutton, dass ich dort keine x,y pos angeben kann

Wie wärs denn mit dem 3. und 4. Parameter?
Quote:
zudem muss man es an ein main_panel binden und wie lasse ich die darstellung wieder verschwinden
Erstelle doch einfach ein Panel pro Gegner.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/16/13 21:55

so ich hab mal den code aus dem aum genommen und alles bis auf die pan_create function weggelassen und bearbeitet
verändert

Code:
//////////////////////////////////////////////////////////////////////////////

#include <acknex.h>
#include <default.c>

var i = 0; 

BMAP* enemy_tga = "enemy.tga";

PANEL* enemies[3]; 

function start_test(i);

//////////////////////////
function create_test()
{
 while (i < 3) 
 {
  wait (-1); 
  enemies[i] = pan_create("bmap = enemy.tga; flags = VISIBLE;", 20); 
  enemies[i].pos_x = 100; 
  enemies[i].pos_y = 100;
  start_test(i);
  i += 1; 
 }
}

function start_test(i)
{
 while(1)
 {	
  enemies[i].pos_x += 5;
  wait(1);
 }	   	
}

//////////////////////

function main()
{
	fps_max = 60; 
	video_mode = 6; 
	vec_set(screen_color, vector(0, 0, 0));
	create_test(); // create the enemies
}



okey das hat jetzt überhauptnichts mit damit zutun
aber ich finde die function so fastinierend

ich möchte nur noch folgendes wissen:
warum hinterläst der panel eine schmierspur beim bewegen ?


Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/16/13 22:02

Ich hab' mir vor einiger Zeit die Zähne an diesem Problem ausgebissen, bis ich gemerkt habe, dass es am sky color liegt.

verwende nie 100% schwarz (0, 0, 0) als sky- oder screen-color.

Benutze anstatt dessen:
vec_set(screen_color, vector(1, 1, 1));
bzw.
vec_fill(screen_color, 1); // bewirkt das gleiche, ist aber kürzer laugh
Posted By: ratz

Re: button panel mehrmals benutzen - 02/17/13 12:34

hey danke ! wink
genau das habe ich gesucht

ich werede mich bald wieder melden und nen paar screenshots machen
Posted By: ratz

Re: button panel mehrmals benutzen - 02/17/13 13:56


achja hier mein bild:


der button muss noch versetzt werden aber ich hab keine ebende (layer) in pan_setbutton und beim clicken kommt wieder ne fehlermedung
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/17/13 14:15

ein button ist kein eigenständiges panel.

du musst ihn per pan_setbutton auf einem panel platzieren.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/17/13 14:33

laugh okey jetzt hab ich alle fehler geschafft zu beheben , nun wenn ich aber
den knopf drücke springt der das fenster (was aus rand und scheibe besteht)
zu pos x 0 , pos y 0 tongue


hier die gui.c abgeändert
Code:
BMAP* hwnd_button_up = "small_b_down.bmp";
BMAP* hwnd_button_down = "small_b_up.bmp";

var i_1 = 0;
var i_2 = 0;
var i_3 = 0;

PANEL* main_pan = { bmap = "main.bmp"; flags = SHOW; }

PANEL* hwnd_win_small[5]; 
PANEL* hwnd_ran_small[5]; 
PANEL* hwnd_but_small[5]; 


//////////////////////////////////////////
function move_me()
{
 while(mouse_left == 1)
 {

  hwnd_win_small[i_1].pos_x = mickey.x;
  hwnd_win_small[i_1].pos_y = mickey.y;

  hwnd_ran_small[i_1].pos_x = mickey.x;
  hwnd_ran_small[i_1].pos_y = mickey.y;

  hwnd_win_small[i_3].pos_x = mickey.x;
  hwnd_win_small[i_3].pos_y = mickey.y;
  
  wait(1);
 }	
}

function create_hwnd_win()
{
 hwnd_win_small[i_1] = pan_create("bmap = hwnd_win_1.bmp; flags = VISIBLE | TRANSLUCENT", 20); 
 hwnd_win_small[i_1].pos_x = 100; 
 hwnd_win_small[i_1].pos_y = 100; 
}


function create_hwnd_ran()
{  
 hwnd_ran_small[i_2] = pan_create("bmap = hwnd_win_1_rand.bmp; flags = VISIBLE | OVERLAY", 30);     	   	
 hwnd_ran_small[i_2].pos_x = 100; 
 hwnd_ran_small[i_2].pos_y = 100;  	   	
}



function create_hwnd_but()
{  
 hwnd_but_small[i_3] = pan_setbutton(main_pan,0,0,250,230,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,move_me,NULL,NULL);
  	   	
}



ich hoffe ich nerve euch nicht mit mein ganzen rumgefrage
ich zeig ja code und screenshots wink
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/17/13 14:41

mickey ist die Mausbewegug des letzten Frames in pixeln (und .z die des mausrads * 120).

Ich schätze du willst das Panel an die Mausposition bringen?
Dann benutze 'mouse_pos.x' und 'mouse_pos.y'.

Und damit mouse_pos automatisch geupdated wird setze am besten am Programmstart mouse_mode = 4;

Und nein, du nervst mit deinen Fragen nicht grin
Vor Allem, da du einer derjenigen bist, die wenigstens auf einem zivilisierten Niveau reden bzw. fragen können wink

Es gab schon Leute, die angefangen haben Andere zu beleidigen...

EDIT: wenn du willst geb ich dir ein Beispiel, wie man ein Panel per Code erstellt und mit der Maus bewegt
Posted By: ratz

Re: button panel mehrmals benutzen - 02/17/13 19:58

grin ich hab das + vergessen

Code:
//////////////////////////////////////////
function move_me()
{
 while(mouse_left == 1)
 {

  hwnd_win_small[i_1].pos_x += mickey.x;
  hwnd_win_small[i_1].pos_y += mickey.y;

  hwnd_ran_small[i_2].pos_x += mickey.x;
  hwnd_ran_small[i_2].pos_y += mickey.y;

  
  wait(1);
 }	
}



es tuts laugh
jetzt werde ich mich mit den anderen auseinander setzen
Posted By: ratz

Re: button panel mehrmals benutzen - 02/18/13 17:02

hehe laugh laugh
...
es tuts laugh

Code:
...
//kill_hwnd() -> neuer button mit kill function 

function kill_hwnd()
{

  
 reset(hwnd_win_small[i_1],VISIBLE);
 reset(hwnd_ran_small[i_2],VISIBLE);
 
 i_1 -= 1;
 i_2 -= 1;
 
}
...
// test_me() -> in main einbinden

function test_me()
{
 while(1)
 {
  if (key_a ==1)
  {	
  wait(-1);
  
  i_1 += 1;
  i_2 += 1;
  i_3 += 1;
 
  create_hwnd_win();
  create_hwnd_ran();
  create_hwnd_but();  
  }
 
 wait(1);
 } 	
}



jetzt kann ich alle nacheinander mit EINEN button bewege,löschen und mit A taste
neue erzeugen



okey okey wink
danke für alles

jetzt kann der spaß richtig losgehen grin

eins noch: wie kann ich den pan_setbutton eine layer ebende nach oben machen ?
und: gibt es eine möglichkeit das main.pcx wie in c++/allegro
als buffer darstellen zu lassen , also das nur ein hintergrund simuliert wird ? weil wenn sich der knopf bewegen soll dann bewegt sich auch der main_pan mit
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/18/13 17:14

Quote:
eins noch: wie kann ich den pan_setbutton eine layer ebende nach oben machen ?

leider garnicht...
außer du erstellst ein zweites, leeres panel nur mit dem button drauf

...einer der Gründe, weshalb ich mir warscheinlich ein eigenes System mit Panels schreib.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/18/13 17:18

hmm... muss ich mal gucken aber fürs erste tuts alles wie es soll wink
Posted By: ratz

Re: button panel mehrmals benutzen - 02/19/13 12:44

hey ! ich hab ne möglichkeit gefunden, wie man den pan_setbutton
eine Layerebende hinzufügt !!!

Code:
PANEL* main_pan = 
{
 //bmap = "main.bmp";	
 pos_x = 100;
 pos_y = 100;
 flags = SHOW; 
 layer = 40; // -> pan_setbutton layer ebende ;)
}
...
function create_hwnd_but()
{  
 hwnd_but_small[i_3] = pan_setbutton(main_pan,0,0,150,0,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,move_me,NULL,NULL);
 hwnd_but_small[i_3] = pan_setbutton(main_pan,0,0,250,250,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,kill_hwnd,NULL,NULL);
}
...



will man, dass der knopf sich mitbewegt braucht man noch folgendes

Code:
function move_me()
{
 while(mouse_left == 1)
 {  
  ...
  main_pan.pos_x += mickey.x;   
  main_pan.pos_y += mickey.y;

  wait(1);
 }	
}

Posted By: Ch40zzC0d3r

Re: button panel mehrmals benutzen - 02/19/13 13:18

Hm sieht sehr umständlich aus, da würd ich meine buttons lieber komplett neu coden.
BTW: was haltet ihr davon GWEN gui als plugin zu releasen?
Bin fast fertig mit plugin, screenies kommen später.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/19/13 13:40

nun jetzt kann ich zwar die fenster bewegen und auch alle einzelnd schließen
nur das problem ist das ich die buttons nur über reset(main_pan,SHOW); verschinden lassen kann , und somit auch nur 1mal anzeigen lassen kann,
da die pan_setbutton function an ein Panel gebunden ist

aber ich hab mir folgendes ausgedacht:

die pan_create function:
Code:
pan_create(char* content, var layer)



und die pan_setbutton function:
Code:
pan_setbutton(main_pan,0,0,236,4,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,kill_hwnd,NULL,NULL);



zu verschmelzen in meine eigende function:
Code:
draw_button



diese soll den Button frei darstellen können ohne
sich an irgendein panel zu binden -> und zudem
eine layer wert haben

und so sieht die function aus
Code:
function draw_button(char* content, var layer, var num, var type, var x, var y, BMAP* bmapOn, BMAP* bmapOff, BMAP* bmapOver, BMAP* bmapOverOff, void* functionClick, void* functionLeave, void* functionOver);

function test()
{
 draw_button("bmap = hwnd_win_1_rand.bmp; flags = VISIBLE | OVERLAY", 30,0,0,236,4,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,kill_hwnd,NULL,NULL);
}



wenn ich aber dann main starte kommt die meldung:
empty function called in test!
Posted By: Uhrwerk

Re: button panel mehrmals benutzen - 02/19/13 14:16

Weil draw_button nur ein Prototyp ist und keine Implementierung hat?
Originally Posted By: ratz
nur das problem ist das ich die buttons nur über reset(main_pan,SHOW); verschinden lassen kann , und somit auch nur 1mal anzeigen lassen kann
Warum sollte das nur einmal gehen? ich versteh nur Bahnhof. Pro Objekt das Du darstellen willst ein Panel erzeugen. Bei diesem Panel dann jeweils das SHOW flag setzen oder zurücksetzen.
Posted By: ratz

Re: button panel mehrmals benutzen - 02/19/13 15:06

ich hoffe mir kann mal jemand helfen , hier der ganze code

Code:
erledigt



http://www.file-upload.net/download-7230908/GUI.rar.html
[bitte auf den ganz kleinen download button drücken ]

keine angst, wenn mantchmal die fehlermeldung kommt "script crash in kill_hwnd"
das liegt daran , dass [i_1] und so nochnicht wieder resettet sind
Posted By: ratz

Re: button panel mehrmals benutzen - 02/19/13 18:40

BOA BOA BOA grin

ICH HABS !!!!

Code:
...
var i_1
PANEL* main_pan[5];
...
function move_me()
{
...
  main_pan[i_1].pos_x += mickey.x;  
  main_pan[i_1].pos_y += mickey.y; 
...
}
...
function create_hwnd_but()
{  
 main_pan[i_1] = pan_create("bmap = NULL; pos_x = 100; pos_y = 100; flags = VISIBLE", 40); 
 
 hwnd_but_small[i_2] = pan_setbutton(main_pan[i_1],0,0,236,4,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,kill_hwnd,NULL,NULL);
 hwnd_but_small[i_2] = pan_setbutton(main_pan[i_1],0,0,217,4,hwnd_button_up,hwnd_button_down,hwnd_button_up,NULL,move_me,NULL,NULL);
}
...



Jetzt kann ich endlich mehere buttons "createn" werend der Laufzeit und wieder schließen
ein paar bugs sind zwar noch drin , wie z.b. das sich
andere fenster wieder schließen und dannach nicht mehr bewegen lassen aber fürs erste reicht es erstmal laugh

danke an Kartoffel und den anderen die mir soviele tolle tipps gegeben haben

ich hoffe ihr könnt ein paar codeschnipsel gebracuhen
und euch eure eigende gui zusammenschweißen. ^^
Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/19/13 19:34

Hey, noch eine kleine Sache von mir:

Zum Bewegen von Panels per Maus kannst du auch panel.event verwenden.
Der Vorteil dabei ist, dass der Pointer auf das Panel mit an die Event-Funktion übergeben wird. (ist übrigens auch bei Buttons so)

Somit musst du in der Funktion nicht mit deinen Arrays arbeiten und ersparst dir evtl. ein wenig Zeit.

hier ein Beispiel:
Code:
void PanelMove(PANEL * panel) // funktion um das panel zu bewegen
{
	// maus - panel offset berechnen
	var mouse_offset_x = panel.pos_x - mouse_pos.x;
	var mouse_offset_y = panel.pos_y - mouse_pos.y;
	
	while(mouse_left) // während die maustaste gehalten wird:
	{
		// panel auf maus-position + offset setzen
		panel.pos_x = mouse_pos.x + mouse_offset_x;
		panel.pos_y = mouse_pos.y + mouse_offset_y;
		
		// die panel-position auf den bildschirm begrenzen
		panel.pos_x = clamp(panel.pos_x, 0, screen_size.x - panel.size_x);
		panel.pos_y = clamp(panel.pos_y, 0, screen_size.y - panel.size_y);
		
		wait(1);
	}
}


// ...und für alle Panels, die man mit der Maus bewegen soll:

panel.event = PanelMove; // (event-funktion ohne klammern oder parameter!)


So können alle Panels, die die Funktion "PanelMove" als Event haben, problemlos bewegt werden ohne die globalen Pointer zu managen wink
Posted By: ratz

Re: button panel mehrmals benutzen - 02/19/13 19:35

Potato-Man saves the day! grin


Posted By: Kartoffel

Re: button panel mehrmals benutzen - 02/19/13 19:42

sieht doch schonmal sehr gut aus ;D

Meines ist mittlerweile so weit:

(verwendet hab' ich es hier in eineim kleinen ToDo-List-Programm)

Solltest du noch mehr Fragen haben, kann ich dir gerne helfen.

(wir haben fast gleichzeitig gepostet, hast du meinen post davor gelesen?)
© 2023 lite-C Forums