Displaying something like a life guage on Dreamcast VMU

Whether you're a newbie or an experienced programmer, any questions, help, or just talk of any language will be welcomed here.

Moderator: Coders of Rage

Post Reply
User avatar
Falco Girgis
Elysian Shadows Team
Elysian Shadows Team
Posts: 10294
Joined: Thu May 20, 2004 2:04 pm
Current Project: Elysian Shadows
Favorite Gaming Platforms: Dreamcast, SNES, NES
Programming Language of Choice: C/++
Location: Studio Vorbis, AL
Contact:

Displaying something like a life guage on Dreamcast VMU

Post by Falco Girgis »

Lord. This is REALLY going to be a pain. You guys all know that in a shooter game you need to display stuff like: life, ammo, frags, etc. Well I decided that I'd give the option to display that junk on TV, VMU, or both. I'm having no problem with TV, but the VMU....

First off, here is what it'll look like on the VMU:
Image

Do you notice the health meter and junk? I need the health and jet meter to go down appropriately and numbers to display how much ammo and how many frags you have.

The thing that makes this so hard is, here is the source:

Code: Select all

static const char death_vmu[] = {
".+++++++++..++++++++++++++++++++++++++++++++++++"
".+++++.++.++.+++++++++++++++++++++++++++++++++++"
".++++++++.+++..+++....................++++++++++"
".+++++.++.++.++.++....................++++++++++"
".+++++.+...+....++....................++++++++++"
".+++++.++.++.+++++....................++++++++++"
".....+.++.+++...++....................++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++"
".....++++++++++++++++++++++++...++++++++++++++++"
".+++++++++++++++++++++++++++.+++.+++++++++++++++"
".+++++++++++++++++++++..++++.+++.+++++++++++++++"
"...+.+..+++..++++..++.++++++.+++.+++++++++++++++"
".+++..++.+.++.++.++.++..++++.+++.+++++++++++++++"
".+++.+++++.++.++.++.++++.+++.+++.+++++++++++++++"
".+++.++++++..+.++...++..+++++...++++++++++++++++"
"+++++++++++++++++++.++++++++++++++++++++++++++++"
"+++.+++++++++++++++.++++++++++++++++++++++++++++"
"++.+.++++++++++++..+++++++++++++++++++++++++++++"
"++.+.+++++++++++++++++++++++++++++++++++++++++++"
"+.+++.++.+.+.++.+.+.+++..+++++..+..+++++++++++++"
"+.....++..+.+.+..+.+.+.++.+++.++.++.++++++++++++"
".+++++.+.++.+.+.++.+.+.++.+++.++.++.++++++++++++"
".+++++.+.++.+.+.++.+.++..+++++..+..+++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++"
"++.....+++++++++++++++++++++++++++++++++++++++++"
"++++.+++++++++++++++++++++++++++++++++++++++++++"
"++++.++..+++.+++++....................++++++++++"
"++++.+.++.+...++++....................++++++++++"
"++++.+....++.+++++....................++++++++++"
".+++.+.+++++.+.+++....................++++++++++"
"+...+++...+++.++++....................++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++"
};
That stores the image above as a char array. (48x32 )

Do you see where that would be hard? Would I not have to make a whole other image for every freaking combination of stats? Do you have any ideas what to do? So far I've had great success with the VMU and it is so convenient and great that I really want this to be a part of the game.

Any help would be appreciated a HELL OF ALOT.
Guest

Post by Guest »

Hmmm...can you put IF statments everywhere? If your life is whatever, draw whatever as the line. Or...maybe use arrays for every '.' or '+', and whenever your health decreases, change a dot to a plus.

Blitz example:

Code: Select all

Dim PlussesDots

Global plus = 1
Global rowX=0
Global columY= 0

If health$ = "fine" then

     For row = 0 to 31
          for colums = 0 to 31
               PlussesDots(rows,colums,plus) = findchar$(plus)
         Next
     Next

Endif

If health = "-1" then
     PlussesDots(rowx+25,colum+25,0) 
Endif

Function findchar$(i)
     If i = 0 then
           return "."
      Elseif i >= 1 then
           return "+"
     Endif
End function
See? Each thingy in the erray has a variable: plus, when it's 0, it becomes a little dot, when it's 1, it becomes a +. I hope i did that stuff up there correctly, but oh well, that was just an example, you couldn't use it anyway, you use c++. I hope that helps, but I doubt it. x.x If you find a solution, tell me.
User avatar
MarauderIIC
Respected Programmer
Respected Programmer
Posts: 3406
Joined: Sat Jul 10, 2004 3:05 pm
Location: Maryland, USA

Post by MarauderIIC »

Display your life gauge and stuff the same way you display people so that you can display it over the background as two images - the word "life" and then the solid black bar. When a player gets hit, shrink its x-dimension.

Edit: But apparently I'm looking at this in a totally different fashion. :) I'm thinking of an image essentially displayed on a box that is totally separate from everything else. Perhaps the problem stems from the fact that I haven't done any console programming and don't know what a VMU is or stands for.
I realized the moment I fell into the fissure that the book would not be destroyed as I had planned.
Guest

Post by Guest »

Edit: But apparently I'm looking at this in a totally different fashion. :) I'm thinking of an image essentially displayed on a box that is totally separate from everything else. Perhaps the problem stems from the fact that I haven't done any console programming and don't know what a VMU is or stands for.
LOL, VMU stands for visual memory unit, it's a memory card with a tiny little screen on it, and he's trying to make it display you're health on it while it's hooked up to your controller. The code for this would be displaying a "." for each blank pixel and a "+" for each light up one. But rather than rewriting the whole 40x32 (or whatever the VMU is) screen with dots and plusses, how'd he make it change whenever his health does?

X.X, you would not have posted that edit if you didn't already know what I just said, right?
User avatar
MarauderIIC
Respected Programmer
Respected Programmer
Posts: 3406
Joined: Sat Jul 10, 2004 3:05 pm
Location: Maryland, USA

Post by MarauderIIC »

Actually, I sat on the page and didn't hit post for a bit. There wasn't a reply when I started writing. And no, I didn't know what a VMU was, but I talked to Sonic and you finished it off, thanks.

Your post, however, gave me an idea: you could make an array of an array of characters (which you essentially already have anyway) and just replace the part you want.

..Dang, I'm no good with handling C-style strings anymore. Will have to use both C++ and C-style...

Code: Select all

#include <string>   //C++-style strings
#include <cstring> //C-style string functions
using namespace std;

/*...*/

char* wholeDisplay[] = { /* all your stuff */ };
string strLifeRow;    //Holds our life meter display data.
int i;
unsigned int lifeRowLength;

//Create the "I-Have-Life" part of the gauge.
strLifeRow = "";
//vvv I think there's a built in string function that'll do this vvv
for (i = 0;i < life;++i) {
    strLifeRow += "+";
}

//Fill with "Dont-Display-Me" after the life gauge.
lifeRowLength = strLifeRow.length();
for (i = lifeRowLength;i < strlen(wholeDisplay[/*correct row number*/];++i) {
    strLifeRow += ".";
}

//Move it over to the array that stores the stuff we're gonna display.
strcpy(wholeDisplay[/*correct row number*/], strLifeRow.c_str());
Hopefully that'll work.

Note this is pretty hardcoded, esp. the "correct row number" parts.
If you want your gauge to be thicker just copy it to more than one row.
I had a thing where I dynamically allocated a new array but I figured that was unnecessary since you needed it all in the wholeDisplay anyway.

EDIT: You'll want a multiplier to make the maximum length of the life bar be limited to 32 units or whatever. Don't forget if you want a result when you divide you should convert them to floats. Something like:

Code: Select all

float multiplier = 32.0/(float)maxLife;
int realLife = (life * multiplier) + 0.5;
//Adding 0.5 and converting to int (which cuts off everything
//after the decimal) effectively rounds to the nearest whole number.
if (realLife > 32)
    realLife = 32;
{ End edit }

..."Ohhh, did I winnnn?" - Peach, SSBM
I realized the moment I fell into the fissure that the book would not be destroyed as I had planned.
User avatar
Wutai
Chaos Rift God
Chaos Rift God
Posts: 1510
Joined: Sat May 29, 2004 2:30 am
Location: Currently incarcerated.

Post by Wutai »

Although someone has probably already said this, and I just couldn't understand them, I will give my idea.


My idea is to have the life, ammo, etc all be separate pictures, which in my mind seems to be better than having to make all those combinations.
This is a joke about unfunny jokes. And bad use of irony.
User avatar
Falco Girgis
Elysian Shadows Team
Elysian Shadows Team
Posts: 10294
Joined: Thu May 20, 2004 2:04 pm
Current Project: Elysian Shadows
Favorite Gaming Platforms: Dreamcast, SNES, NES
Programming Language of Choice: C/++
Location: Studio Vorbis, AL
Contact:

Post by Falco Girgis »

Lemme first say that I read Maruader's post and was intrigued. I have yet to study its full detail. This is as a reply to Wutai.

Wutai:
I don't think you realize what this is we're dealing with. A primitive 8-bit processer of a memory card. You can't load images to the thing. You can't really do anything but display stuff without hard core assembly-ing. A 48x32 pixel screen memory card capable of showing a black or white dot.

Heh, don't get it confused with a computer! :spin:
User avatar
Wutai
Chaos Rift God
Chaos Rift God
Posts: 1510
Joined: Sat May 29, 2004 2:30 am
Location: Currently incarcerated.

Post by Wutai »

You wouldn't have to use pictures, you could use text instead. (Which is what I meant in the first place)
This is a joke about unfunny jokes. And bad use of irony.
User avatar
Falco Girgis
Elysian Shadows Team
Elysian Shadows Team
Posts: 10294
Joined: Thu May 20, 2004 2:04 pm
Current Project: Elysian Shadows
Favorite Gaming Platforms: Dreamcast, SNES, NES
Programming Language of Choice: C/++
Location: Studio Vorbis, AL
Contact:

Post by Falco Girgis »

... Just forget it. You obviously don't understand--the whole point was that it is impossible to do with multiple images. It seems MarauderIIC has figured out a way, but I have to go to the drive-in movies right now. Check it out when I get home.
User avatar
MarauderIIC
Respected Programmer
Respected Programmer
Posts: 3406
Joined: Sat Jul 10, 2004 3:05 pm
Location: Maryland, USA

Post by MarauderIIC »

The thing is there's no way to tell it to display a picture. You have to tell it, "I want dot (10,15) on. I want dot (11, 15) on. I want dot (12, 15) on. I want dot (13, 15) off." and so on.

Edit: Super Sonic, looking at your original code, it seems as though I got my +'s and .'s reversed :)

Edit2: Ah, if you want to have the life bar start after the word "life," tweak it a bit and have it copy the first specified # of chars over and then add on the stuff you need. Don't forget to have i (or whatever my variable name is) start at the # of chars you copied over instead of 0. As for you and your frags, that'll be trickier, I think. You might hack it and use define a "1" and a "2" and so on in arrays that are say 5x10 or something (one array for each number) and then replace the 5x10 square in the wholeDisplay by copying one row at a time over your old frag number. Multiple digits might be a problem. Again, since it's so primitive you might just hack it again -- allocate space for two digits and if they have ninety nine frags then display 00 for 100, 01 for 101, etc, or just have it not increment or display a >99 or something. "Hack it" as opposed to programming yourself some sort of real font/display system.

Edit3: You might consider an array of strings to avoid memory problems. Although if it goes over the maximum size of the VMU who knows what'll happen, but at least you won't have screwed up some memory you weren't supposed to. And you can use "string.find()" as well.
I realized the moment I fell into the fissure that the book would not be destroyed as I had planned.
Post Reply