KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [C] Raster-Menü ?
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Guten Tag,

Weiß einer von euch, wie ich ein Raster-Menü (like Handys etc.)
in C programmieren kann ?
Von den funktionen her weiß ich einiges.

Soviel ich weiß muss man:

Code:
[...]
menu = {"Test","TEST","TEST"}
aktivmenu = 0;

If (pad.Buttons & PSP_CTRL_DOWN)
{
aktivmenu+=3;
}
If (pad.Buttons & PSP_CTRL_UP)
{
aktivmenu-=3;
}
if (pad.Buttons & PSP_CTRL_LEFT)
{
aktivmenu-=1;
}
if (pad.Buttons & PSP_CTRL_RIGHT)
{
aktivmenu+=1;
}
[...]


Um den Code braucht ihr euch nicht zu kümmern, nur möcht ich wissen,
wie man das ganze jetzt grafisch darstellt,also:
Wenn man z.B. Links drückt, soll sich ein Bild nach Links bewegen und rechts...

Beispiel:

Bild von Google Bilder

Dieser Umriss,der sich beim drücken von tasten bewegt, wie kann ich so was darstellen ?


Ich bin für jede Antwort sehr dankbar und kriegt auch ein Danke x3

Liebe Grüße:

David

Mit sceGu?
Könnte jemand ein Beispiel machen ?`
z.B. ein Codeschnipsel ...

@Arktos
Danke, aber ich kann aus deinem Beitrag keinen Entschluss ziehen....

An Alle:

Ich kann C;bin selber IT-Entwickler und habe IT-Entwicklung studiert...
Danke schön...


z.B.
Background:

Code:
Image* bg1;
bg1 = loadImage("bg1.png");
[...]
blitAlphaImageToScreen(0 ,0 ,480 , 272, bg1, 0, 0);
[...]




Icons:

Sagen wir mal, es gibt neun icons:

Icon1.png
Icon2.png
Icon3.png
Icon4.png
Icon5.png
Icon6.png
Icon7.png
Icon8.png
Icon9.png

Code:
[...]
blitAlphaImageToScreen(0 ,0 ,32 , 32, icon1, 25, 25);
[...]


Und der Umriss heißt:
Checked.png

Wie kann ich jetzt machen, dass Checked.png sich beim drücken der Tasten auf die Position der jeweiligen Icons verschiebt ?

Meine Teorie:

Code:
[...]
X = 128;
Y = 128;
[...]
blitAlphaImageToScreen(0 ,0 ,32 , 32, umriss, X, Y);

If (pad.Buttons & PSP_CTRL_LEFT)
{
X += 25;
}


Ich weiß der der obrige Code falsch ist und eine millionen syntax fehler hat,
aber ich meine so in der art....

Danke im Vorraus

Ich würde das mit Strukturen machen, die Icons verwalten...
so in der Art:

Code:
#define N_ICONS 9;

typedef struct _Icon
{
     int x, int y;
     char *text;
     Image *img;
     void (* OnClick) (void);
} Icon;

Icon icons[N_ICONS];


x und y eben setzen, sodass sie am Raster sind.

Dann eben immer die Position in ner Variable (z.B. menu_position) speichern, immer auf die X-Taste testen, und wenn diese gedrückt ist, icons[menu_position].OnClick aufrufen.

Okey danke für die antwort...

Aber meine eig. frage war ja, wie ich das mit den checked also diesem Umriss machen kann ?

David
Du musst doch checked.png einfach nur um die Breite bzw. Höhe deiner Icons verschieben oder was war das Problem?

Edit: Achso, du meinst dem Umriss. Funktioniert das denn nicht mit einem Alpha-Channel?

Code:
void Menu(int icon_num, int icons_per_column, Icon *icons, Image *bg, Image *border)
{
    SceCtrlData pad;
    memset(&pad, 0, sizeof(SceCtrlData));

    int menu_position = 0;

    while(1)
    {
        sceCtrlReadBufferPositive(&pad, 1);
        
        if((pad.Buttons & PSP_CTRL_LEFT) && (activmenu >= 0))
            menu_position--;
        else if((pad.Buttons & PSP_CTRL_RIGHT) && (activmenu < icon_num))
            menu_position++;
        else if((pad.Buttons & PSP_CTRL_UP) && ((activmenu - icons_per_column) >= 0)
            menu_position -= icons_per_column;
        else if((pad.Buttons & PSP_CTRL_DOWN) && ((activmenu + icons_per_column) < icon_num)
            menu_position += icons_per_column;
        
        if(pad.Buttons & PSP_CTRL_CROSS)
        {
            icons[menu_position].OnClick();
        }
        
        /* Hintergrund anzeigen */
        ShowImage(0, 0, bg);
        
        int i;
        for(i = 0; i < icon_num; i++)
        {
            if(i == menu_position)
                ShowImage(icons[i].x, icons[i].y, border); // Rand anzeigen
            
            /* Icon anzeigen */
            ShowImage(icons[i].x, icons[i].y, icons[i].img);
        }
    }
}


Das ist jetzt nicht getestet, aber sollte ungefähr das Prinzip zeigen.
Diese ShowImage Funktion gibts natürlich nicht, habs nur als Platzhalter genommen, setz dort einfach deine Bild-Anzeig Funktion ein.

Das verschieben der checked.png Big Grin
Also soll ich

Code:
blitAlphaImageToScreen(0 ,0 ,32 , 32, test, X, Y);
X = 28;
Y = 28;


und wenn man links oder so drückt, soll sich X um z.B. 30 erhöhen ?
Ist das richtig wenn man:
X += 20;

macht ?

Hast du meinen Post gesehen? Einen über dir, wir haben gleichzeitig geschrieben Wink

D4V3 $v1 :
Ich kann C;bin selber IT-Entwickler und habe IT-Entwicklung studiert...
Danke schön...


Also für einen der das Studiert haben soll hört sich das aber sehr unwissend an. Um solch ein problem zu lösen gibt es viele methoden. Alphablending wurde ja schon erwähnt oder einfach den kasten aussenrum selbst zeichnen. Das SDK dürfte dazu gut genug dokumentiert sein.

P.s. wenn du X und 30 erhöhen willst solltest du auch X+=30; machen und nicht 20.

Referenz-URLs