Skip to content

A game engine designed for the Nintendo DS based on interface and hardware abstraction.

Notifications You must be signed in to change notification settings

leffuy/babycthulu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Baby Cthulu is an abstraction interface and management engine.

Throw the .cpp's in tests into a template devkit working project and you'll have
for one of them you'll need a copy of the data files to serve as test sprites.

The 3D tests show the currently limited functionality of the engine.

Sprite capabilities are pretty solid. Multiple sprites of varying sizes can be:
 *Blitted anywhere on the screen
 *Have Alpha channels and such
 *Be animated
 *Stopped

I will add more functionality as I think of it. Esepcially while adding BG
functionality and such. Trying to make the engine compact but useful for users
in the same way Game Maker was useful in making neat nethack like RPG's. 
(Man I want to learn to play that game so bad now...)

Anywho. Enjoi what I've got so far. Try out what you can. Break it send in bugs.


*************************************************************
*
* CTHULU Basics
*
*
----------------------------


1.1 bcthulu Nodes.
Baby Cthulu is first and foremost an API. Thus you must have an access method.
The functions of the babyCthulu interface can be seen in the source.

To create a handle to babyCthulu use the call "bluCreate()" to return a
reference to the babycthulu interface. This is done as so:

	bcthulu* blu = bluCreate();

After this call blu will have a reference to babyCthulu. And will be able to
make calls to the interface.

blu->GFX_Initiate() or Input will begin to initialize the graphics engines and 
will
be ready to handle input and 2D. 

1.2 Graphics
As of currently babyCthulu only handles sprite memory. One could theoretically 
add lower level code to access bg's until this functionality is added.

Graphics memory can be initiated. It has not been implemented however.

1.2.1 Sprites
Lets first  take a look at the sprite memory. Using previous knowledge from the
DS architecture we know that OMA memory has 128 active spaces to hold sprites
of any shape size or format. (Unlike it's predecessor the gba which did not
have enough memory to full implement OAM). 

Lets look at some specs before diving into cthulu
	*0680:0000 is the VRAM base of a total of 656KB. Libnds breaks this up 
	 into 9 banks. 
		Bank A - B: 128KB
		Bank E: 64KB
		Bank F & G: 16KB
		Bank H: 32KB
		Bank I: 16KB
	This spans all of VRAM @680:0000. One needs to map virtual VRAM pointer 
        addresses to the real VRAM for the 2D engine to operate. This is done
	with setBank(parameters);

	That is not in the scope of this manual and if you have not learned it
	you should not be using cthulu.

Babycthulu will automatically set the memory banks dependning on what you're
going to craft in terms of it's the engines. The default initiate will
set the Bank A to the start of sprite memory, and Bank B to the BG.

So to get ready to make sprites go ahead and call blu->GFX_Inititate(); 
Onto the sprite structures. Baby Cthulu handles all sprite data in memory
using structures that represents a fully animated sprite. (This is an advanced
feature, the animation). Go take a look in the babyCthulu header file about
what data you can set into the sprite:
		
		struct bluSprite{
		int init;
		int frame;
		int framerate;
		int counter;
		int x;
		int y;
		int fps;
		int id;
		int priority;
		unsigned short* gfx;
		const unsigned int* tiles;
		const unsigned short* pal;
		unsigned int tlen;
		unsigned int plen;
		SpriteMapping sm;
		SpriteSize sz;
		SpriteColorFormat sfmt;
		};

All of these should be self explanatory (save init, set init to 0 before 
initializing a sprite and it will be set to 1. Do not mess with it after. Set 
frame the framerate and counter to 0 as well). 

Framerate is not a real FPS. The higher this number the slower the animation 
will play the lower the faster it will play. 

Everything else should be explanatory. 

After you construct a struct, pass a reference to it to LDSprite(); this will 
cause the sprite to go into memory. From here you may BltSpr() it.

So how to use this? First use the grit extensions in devkitpro to configure 
your sprites for your program. See the sample gritfiles, the best learning is 
through code. 

Once you do this your tiles should be named after your image. I like to metatile
so one sheet will have all the tiles like SnakeTiles or SnakePal and the len's
respectively. This is the easiest way to manage 2D resources through the gfx 
tools used by the Makefile. 

So as said include the .h files to get the tiles and palette info. Afterwhich 
pass these values into a babyCthulu sprite structure as described above.

After you have set all that up and then set init=0 you are read to begin with 
your sprite.

Pass a call to  GFX_LDSprite() your sprite object and memory will be assigned to
it and the system will declare it initialized. You can now build animations to 
accesorize the sprite object with. And animation is created in much the same 
fashion using a structure object. However it has two slots for large memory
(assigned to the 4MB heap for optimization reasons), which we assign to tiles.

So step one is describing the amount of frames the animation will be (usually
indicated by the size of the sprite sheet). Then the sizes of each frame which
is almost always the size of the base sprite. You then assign it frames the same
way you assign a sprite a tileset. From here you make a call to play animation
with a reference to the base sprite. This call will determine if enough time has
passed to change frames if so it pulls the current tiles out of the basesprite
then slides in the frame number as indicated by the animation table.
Release when done. Pretty simple system.

---
Under Construction:
Started experimenting with the stuff underneath the input queues, trying to 
buff it up a bit so that events are resolved efficiently. Probably need TODO 
some modifications to the whole iprintf() thing. -- On going part of the below.

Going to build queue resolver for when the thing is spinning the framefunc.
When a message is resolved we'll place time markers to see how fast the
engine is actually running. This will be done first probably due to it's 
simplicity. In essence the queue needs to output the average time between 
resolving consecutive events. - Still working on this built a sort of developers
console to start this one off.

Resource manager for the 2D engine. Given a table of sprites and associated
animations (and soon/eventually backgrounds), the resource manager should 
determine how to load and unload a large amount en masse without disturbing
current program flow.

---

If this manual is out of your scope here are some things to get started before
developing with or for babyCthulu:
*GNU C/C++ - if you know Java, Basic, or any language, this will take at most a
day to get up to speed

*Pointers - this is a part of learning C/C++, but they are a fundamental 
concept in computing that many people misinterperate and henceforth misuse.

If you understand those two things you should be fine, if not people will hate
you as you work on this project. 

-Stevie

Project by: Stevie Frederick and Patrick Jennings

About

A game engine designed for the Nintendo DS based on interface and hardware abstraction.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published