Schrift
[thread]7847[/thread]

OO-Button-Modul: für SDL (ab geht um OO) (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 38 Einträge, 4 Seiten
master
 2006-04-03 16:43
#64269 #64269
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Naja das Problem ist, das ich dann alles im Hauptcode prüfen muss :-(

Das sieht so etwas scheisse aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
$active_element = $X->checkall($event->button_x,$event->button_y);


if($event->button eq 1)
{

if($active_element ne false and $active_element->dosub() ne false ) { &{$active_element->dosub()}($active_element); }

}
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Taulmarill
 2006-04-03 18:34
#64270 #64270
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, verstehe jetzt nicht ganz dein problem. wenn du eine subroutine im hauptscript aufrufen willst, würde ich dafür eine codereferenz auf die sub an die funktion als parameter übergeben. woraus sich da das o.g. problem ergibt ist imho nicht offensichtlich.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
master
 2006-04-03 19:39
#64271 #64271
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@Taulmarill:
Habe es einigermassen gelöst.

@ptk:
Wie geht genau das mit Containern?




-----------
Das Ganze klappt nun, aber noch nicht so wie gewünscht.
Ich möchte mehrere Events einbauen.

z. B.
- Einfacher button
- Button der gedrückt bleibt egal wohin mal mit der Maus geht.
(while buttondown -> button = gedrück)


Aktueller Code:

-Modul-
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package X::GFXButton;
use strict;

my @butts;


#----------------------------------------------------- INI --------------------------------------------------------




#Erzeugen
sub new {
   my ($class,@params) = @_;
   my $self = {};
   bless($self,$class);
   #for(qw(ID APP X Y IMG IMGHV)){$self->{$_} = shift(@params);}

   $self->{ID} = shift(@params);              &n
bsp; #ID oder Name
   $self->{APP} = shift(@params);              &n
bsp; #SDL APP
   $self->{X} = shift(@params);
   $self->{Y} = shift(@params);
   $self->{IMG} = shift(@params);              &n
bsp;     #IMG normal
   $self->{IMGHV} = shift(@params);              &n
bsp; #IMG hover
   $self->{IMG_click} = shift(@params);            #IMG click
   $self->{DOSUB} = shift(@params);              &n
bsp; #Button's sub

   $self->{HV} = 0;              &nbs
p;             #Hover state
   $self->draw($self->{IMG});              &n
bsp;     #Display

   push(@butts, $self);
   return($self);
}






#------------ Alle Elemente Prüfen --------------------
sub checkall
{
   my ($self, $mx, $my) = @_;
   my $active_element = 0;
   my $B_event_sub = 0;
   for(@butts) {


       if($_->check_button($mx,$my)){$active_element = $_;}

   }


    #Events bearbeiten....
    
    if($active_element) {$B_event_sub = $active_element->{DOSUB};}
        
    return ($active_element, $B_event_sub);              &n
bsp;              &n
bsp;  #Object and the sub
}









sub check_button
{
   my ($self, $mx, $my) = @_;

   my $img = $self->{IMG};

   #Hover - Effekt
   if($mx > $self->{X} &&  $mx < ($self->{X}+ $img->width)  && $my > $self->{Y}    &&   $my < ($self->{Y}+ $img->height) )
   {
       if(not  $self->{HV}) {$self->{HV}=1; $self->draw($self->{IMGHV});}
        return $self;
   } else
   {
           if($self->{HV}) {$self->{HV}=0; $self->draw($self->{IMG});}
   }
   return 0;
}





sub button_click
{
   my $self = shift; $self->draw($self->{IMG_click});
}


sub button_check{}
sub button_hover{}











#---------------------------------------------------------- CODE OK ----------------------------------------------------------

#Grafik darstellen
sub draw
{
   my ($self, $img) = @_;
   my $dest_rect = SDL::Rect->new(-height => $img->height(),-width  => $img->width(),-x=> $self->{X},-y => $self->{Y});
   $img->blit( SDL::Rect->new(-height => $img->height(),-width  => $img->width(),-x => 0, -y  => 0), $self->{APP}, $dest_rect );
   $self->{APP}->update( $dest_rect );
}

#Parameter zurückgeben (mehrere)
sub get
{my ($self, @values) = @_; my @out = ();for(@values) {push(@out,$self->{"$_"}); } return @out;}

#Einelnen Parameter setzen
sub set
{my ($self, $param, $value) = @_;  $self->{$param} = $value;}


1;


Aufruf:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Button hinzufügen...(test)
for my $i (0..15) { for my $x (0..10) { $id++; $X->new($id,$app,(65*$x),(25*$i),$img,$img2,$img3, 'loslos'); }}



$X = X::GFXButton;

($active_element, $B_event_sub) = $X->checkall($event->button_x,$event->button_y);
        
   if($event->button eq 1 && $active_element)
   {
           $active_element->button_click();
            &{$B_event_sub}($active_element) if($B_event_sub);
        
   }

#Button Event
sub loslos
{
    my $self  = shift;

    my ($ID, $IMG ) = $self->get("ID", "IMG");
    print "\r   $ID - $IMG   ";
}
\n\n

<!--EDIT|master|1144079080-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
ptk
 2006-04-03 23:34
#64272 #64272
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Der Container wäre einfach nur ein Modul, dessen Objektinstanzen deine Variable @butts enthalten würden. Man könnte auch gleich die $app im Objekt speichern. Dann würde ein Aufruf ungefähr so aussehen:
Code: (dl )
1
2
my $container = ...::Container->new($app);
$container->add("SimpleButton", ...); # alternativ: $button = ...::SimpleButton->new(...); $container->add($button);

Und in der Eventloop
Code: (dl )
$container->check_all;

Bei Tk wird beispielsweise auf ->add verzichtet, da schreibt man gleich
Code: (dl )
$container->SimpleButton(...)

und würde damit ein Objekt der Klasse Tk::SimpleButton erzeugen.
master
 2006-04-04 13:00
#64273 #64273
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Naja habe ich ja schon fast so gemacht...
Werde es ev. anpassen

Heisst übrigens nun GFXButton
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-04 19:40
#64274 #64274
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
[quote=Matze,01.04.2006, 10:15][/quote]
Quote
Ich würde vielleicht nich die Möglichkeit geben nicht nur Bilder für den Button zu benutzen sondern, dass z.B. 2 Rechtecke aufeinander gezeichnet werden.

1 Rechteck: Der Rand.(Ein bisschen größer als Nummer 2)
2 Rechteck: Eigentlicher Button.

Dann müsstest du dir nur überlegen wie du die Größe der Schrift berechnest, die man auch noch drauf schreiben lassen können müsste.



Tja das will ich auch noch so implementieren.
Ursprünglich dachte ich mir wäre GD, da optimal. Einfach im Hintergrund Bild + Text zusammensetzen.

Aber es geht ja auch einfacher mit dem Text.
Diese Implementierung ist noch recht wichtig.
Textpositionierung dürfte dann schwieriger werden. Höhe und Breite mache ich optional.

----

ps. Wie Du sicher richtig vermutest wird das ein Teil von CYA werden...
ich habe mir lange überlegt wie ich die verschiedenen Zustände, Zonen, Klicks, Grafiken, Scrollbereich. Subs usw
organisieren kann...

Die Lösung:
Ein Button-Modul und den Rest mache ich dann per includefiles
Das Button-Modul nimmt mir so extrem viel Arbeit.

Das Modul verwaltet die 170 (Test-)Buttons sehr schnell :-)
Und soviele brauchen wir bestimmt nicht pro Ebene.


Das Schwierige ist nämlich z.B. das Scrolling z unterbinden, wenn man auf einen bestimmten Button klickt,
Würde ich einfach alle maus-zonen + klicks in der gleichen loop abfragen gäbe es ein chaos.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-06 13:13
#64275 #64275
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Habe nun das Ganze in einen Container implementiert... :-)

Es gibt aber noch Probleme..

1. wie spreche ich eleganter die allgemeinen subs in X::GFXButton an?
2. kann ich die rückreferenz auf den container(X) besser machen?

Codeteile:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
------------- Hauptprogramm -------------
my $container = X->new();
$GFXButton = X::GFXButton;

$container->GFXButton_add($id,$app,(65*$x),(25*$i),$img,$img2,$img3, 'loslos'); }}

$GFXButton->destroy_buttons($container);




------------- x.pm -------------
package X;

use X::GFXButton;
my $GFXButton = X::GFXButton;

#Erzeugen
sub new {
   my ($class,@params) = @_;
   my $self = {};
   bless($self,$class);
    $self->{BUTTS} = [];

  return($self);
}

sub GFXButton_add
{return $GFXButton->new(@_);}







-------------  GFXButton.pm -------------


#Erzeugen
sub new {
 
     
   my ($class,@params) = @_;
   my $self = {};
   bless($self,$class);
   #for(qw(ID APP X Y IMG IMGHV)){$self->{$_} = shift(@params);}

   $self->{CONTAINER} = shift(@params);        #Container
   $self->{ID} = shift(@params);    #ID oder Name
   $self->{APP} = shift(@params);  #SDL APP
   $self->{X} = shift(@params);
   $self->{Y} = shift(@params);
   $self->{IMG} = shift(@params); #IMG normal
   $self->{IMGHV} = shift(@params);  #IMG hover
   $self->{IMG_click} = shift(@params);            #IMG click
   $self->{DOSUB} = shift(@params);    #Button's sub
   $self->{TXT} = shift(@params);   #Button's Text


   $self->{HV} = 0;   #Hover state
   $self->draw($self->{IMG});  #Display


    push( @{$self->{CONTAINER}->{BUTTS}}   ,  $self);
    
    
   return($self);
}


#Bei MausUP Buttons normal zeichnen
sub buttons_up  {
my ($self, $container) = @_;
for(@{$container->{BUTTS}})
{$_->{PRESSED} = 0; $_->draw($_->{IMG});}
}


#Buttons nicht mehr prüfen
sub destroy_buttons {
my ($self, $container) = @_;
$container->{BUTTS} = [];}


z.b. soll im X::GFXButton
die sub destroy_buttons
aufgerufen werden..

Das Problem ist, das ich kein Objekt habe..
im Hauptcode steht der Aufruf:

$GFXButton->destroy_buttons($container);
somit ist in der sub destroy_buttons das $self sinnlos

und ich muss:
1. container wieder mitgeben
2. mir mit der Variable $GFXButton aushelfen
was problematisch ist, denn wenn ich
im X.pm

statt "sub GFX_Button_add" nur "sub GFX_Button" mache, gibts probleme...\n\n

<!--EDIT|master|1144329507-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Crian
 2006-04-06 16:57
#64276 #64276
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Irgendwie sind da auseinandergebrochene &nbsp; in deinen Quellcode geraten.

Am Ende eines Moduls sollte ein wahrer Wert stehen. Es hat sich eingebürgert, dort

Code: (dl )
1; 


hinzuschreiben.\n\n

<!--EDIT|Crian|1144328958-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
master
 2006-04-06 17:02
#64277 #64277
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@crain
das 1; steht auch dort... darum nur "code teile"
wären ca. 2 A4 seiten code würde ich alles posten...

Das "&n" irgnorieren :-) habe es nun korrigiert...
aber wie siehts nun mit meinem Problemchen aus? :-)\n\n

<!--EDIT|master|1144328669-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Crian
 2006-04-06 17:14
#64278 #64278
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Die Zeichen haben mich vom Verstehen deines Problems abgehalten - dachte ich ... ich verstehe es aber immer noch nicht irgendwie :-(

Also, du hast eine OO-Klasse in einer Datei, in der mit new ein geblesstes Objekt zurückgegeben wird (besser mit return $self; ohne die Klammern btw.). --> GFXButton.pm <--

Du hast ein Hauptporgramm, dass X::new aufruft ... das gibts gar nicht?

Ich glaub du solltst dir mal das Kapitel zu OO im Kamelbuch in ruhe durchlesen, oder das davor zu Paketen zusätzlich.

Es kommt mir irgendwie sehr komisch vor, was du da machst.


Oder du formulierst nochmal mit Worten, was du eigentlich erreichen willst.\n\n

<!--EDIT|Crian|1144329339-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 4 >| >> 38 Einträge, 4 Seiten



View all threads created 2006-03-31 19:08.