gbadev.org forum archive

This is a read-only mirror of the content originally found on forum.gbadev.org (now offline), salvaged from Wayback machine copies. A new forum can be found here.

DS development > Bug in my menu layering

#166775 - hacker013 - Tue Feb 17, 2009 4:54 pm

hey everybody,

I've written my own menu layering system. Zo the menu can have different layers. But the only thing I got is a black screen. I using the nitro engine. I hope you can help me with this, i'm already a week long trying to get this work.

UZMenuLayer.h
Code:

#ifndef __UZ_MENULAYER_H__
#define __UZ_MENULAYER_H__

#include <nds.h>
#include "NE2D.h"

#define UZ_MAX_WINDOWS 128
#define UZ_MAX_LAYERS 128

typedef struct{
   bool visible;
   NE_Window ** window;
   int priority;
   bool screen;
   /* 0 = down / 1 = top*/
}UZ_MenuLayer;

/* Functions */
// -- Initing / Freeing
void UZ_MenuLayerInit(int mlayers, int mwindows);
void UZ_MenuLayerFree();
// -- Adding / Deleting
UZ_MenuLayer* UZ_MenuLayerCreate();
void UZ_MenuLayerDelete(UZ_MenuLayer* menulayer);
// -- Drawing down / top
void UZ_MenuLayerDrawDown();
void UZ_MenuLayerDrawTop();
// -- Edit Settings
void UZ_MenuLayerSetPriority(UZ_MenuLayer* menulayer, int priority);
void UZ_MenuLayerSetVisible(UZ_MenuLayer* menulayer, bool visible);
void UZ_MenuLayerSetScreen(UZ_MenuLayer* menulayer, bool screen);
// -- Window Settings / Adding / Removing
int UZ_MenuLayerWindowAdd(UZ_MenuLayer* menulayer, NE_Window* window);
void UZ_MenuLayerWindowRemove(UZ_MenuLayer* menulayer, NE_Window* window);

#endif


UZMenuLayer.c
Code:

#include "UZMenuLayer.h"

bool uz_menulayerinited = false;
UZ_MenuLayer ** MenuLayers;
int uz_max_layers;
int uz_max_windows;

void UZ_MenuLayerInit(int mlayers, int mwindows)
{
   if(uz_menulayerinited==true)UZ_MenuLayerFree();
   /* Set Max Layers */
   if(mlayers>0){
      uz_max_layers=mlayers;
   } else {
      uz_max_layers=UZ_MAX_LAYERS;
   }
   /* Set Max Windows */
   if(mwindows>0){
      uz_max_windows=mwindows;
   } else {
      uz_max_windows=UZ_MAX_WINDOWS;
   }
   /* Allocated Enough Memory */
   MenuLayers = malloc(sizeof(UZ_MenuLayer)*uz_max_layers);
   int i=0;
   for(i=0;i<uz_max_layers;i++)
   {
      MenuLayers[i]=NULL;
   }
}

void UZ_MenuLayerFree()
{
   if(uz_menulayerinited==false)return;
   int i=0;
   /* Free All Menu Layers */
   for(i=0;i<uz_max_layers;i++)
   {
      if(MenuLayers[i]!=NULL)
      {
         UZ_MenuLayerDelete(MenuLayers[i]);
      }
   }
   free(MenuLayers);
}

UZ_MenuLayer* UZ_MenuLayerCreate()
{
   if(uz_menulayerinited==false)return NULL;
   int i=0;
   /* Check if id is free */
   for(i=0;i<uz_max_layers;i++)
   {
      /* If id is free */
      if(MenuLayers[i]==NULL)
      {
         UZ_MenuLayer* menulayer;
         menulayer = malloc(sizeof(UZ_MenuLayer));    //Set memory
         menulayer->visible=true;               //Set visible
         menulayer->priority=0;                  //Set priority
         menulayer->screen=0;                  //Set screen
         menulayer->window = malloc(sizeof(NE_Window)*uz_max_windows);
         for(i=0;i<uz_max_windows;i++)
         {
            menulayer->window[i]=NULL;            //Init Windows
         }
         MenuLayers[i]=menulayer;               //Keep pointer
         return menulayer;
      }
   }
   return NULL;
}

void UZ_MenuLayerDelete(UZ_MenuLayer* menulayer)
{
   if(uz_menulayerinited==false)return;
   if(menulayer==NULL)return;
   int i;
   for(i=0;i<uz_max_layers;i++)
   {
      if(MenuLayers[i]==menulayer)
      {
         MenuLayers[i]=NULL;
         for(i=0;i<uz_max_windows;i++)
         {
            UZ_MenuLayerWindowRemove(menulayer,menulayer->window[i]);
         }
         free(menulayer);
         return; //Don't loop unnessary loops.
      }
   }
   
}

void UZ_MenuLayerDrawDown()
{
   if(uz_menulayerinited==false)return;
   int i=0;
   for(i=0;i<uz_max_layers;i++)
   {
      if(MenuLayers[i]!=NULL)
      {
         if(MenuLayers[i]->screen==0  && MenuLayers[i]->visible==true)
         {
            int j=0;
            for(j=0;j<uz_max_windows;j++)
            {
               /* Get Original Priority */
               int tmp_priority=MenuLayers[i]->window[j]->priority;
               /* Set to the correct depth for MenuLayers */
               NE_WindowSetPriority(MenuLayers[i]->window[j],MenuLayers[i]->priority+tmp_priority);
               /* Draw Window */
               NE_WindowDraw(MenuLayers[i]->window[j]);
               /* Reset Priority */
               NE_WindowSetPriority(MenuLayers[i]->window[j],tmp_priority);
            }
         }
      }
   }
}

void UZ_MenuLayerDrawTop()
{
   if(uz_menulayerinited==false)return;
   int i=0;
   for(i=0;i<uz_max_layers;i++)
   {
      if(MenuLayers[i]!=NULL)
      {
         if(MenuLayers[i]->screen==1 && MenuLayers[i]->visible==true)
         {
            int j=0;
            for(j=0;j<uz_max_windows;j++)
            {
               /* Get Original Priority */
               int tmp_priority=MenuLayers[i]->window[j]->priority;
               /* Set to the correct depth for MenuLayers */
               NE_WindowSetPriority(MenuLayers[i]->window[j],MenuLayers[i]->priority+tmp_priority);
               /* Draw Window */
               NE_WindowDraw(MenuLayers[i]->window[j]);
               /* Reset Priority */
               NE_WindowSetPriority(MenuLayers[i]->window[j],tmp_priority);
            }
         }
      }
   }
}

void UZ_MenuLayerSetPriority(UZ_MenuLayer* menulayer, int priority)
{
   if(uz_menulayerinited==false)return;
   if(menulayer==NULL)return;
   menulayer->priority = priority;
}

void UZ_MenuLayerSetVisible(UZ_MenuLayer* menulayer, bool visible)
{
   if(uz_menulayerinited==false)return;
   if(menulayer==NULL)return;
   menulayer->visible = visible;
}

void UZ_MenuLayerSetScreen(UZ_MenuLayer* menulayer, bool screen)
{
   if(uz_menulayerinited==false)return;
   if(menulayer==NULL)return;
   menulayer->screen = screen;
}

int UZ_MenuLayerWindowAdd(UZ_MenuLayer* menulayer, NE_Window* window)
{
   if(uz_menulayerinited==false)return 0;
   if(menulayer==NULL)return 0;
   int i=0;
   for(i=0;i<uz_max_windows;i++)
   {
      if(menulayer->window[i]==NULL)
      {
         menulayer->window[i]=malloc(sizeof(NE_Window));
         menulayer->window[i]=window;
         return 1;
      }
   }
   return 0;
}

void UZ_MenuLayerWindowRemove(UZ_MenuLayer* menulayer, NE_Window* window)
{
   if(uz_menulayerinited==false)return;
   if(menulayer==NULL)return;
   int i=0;
   for(i=0;i<uz_max_windows;i++)
   {
      if(menulayer->window[i]==window)
      {
         free(menulayer->window[i]);
         menulayer->window[i]=NULL;
      }
   }
}

_________________
Website / Blog

Let the nds be with you.