Version of Robotron arcade game using LPC1768, a Gameduino shield, a serial EEPROM (for high scores), two microswitch joysticks and two buttons plus a box to put it in. 20 levels of mayhem.
Dependencies: 25LCxxx_SPI CommonTypes Gameduino mbed
Diff: GameObject.cpp
- Revision:
- 4:673eb9735d44
- Child:
- 5:0b0651ac7832
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GameObject.cpp Sat Jun 08 11:24:05 2013 +0000 @@ -0,0 +1,236 @@ +/* + * SOURCE FILE : GameObject.cpp + * + * The abstract base class for all graphical game objects. + * + */ + +#include "GameObject.h" +#include "GameObjectLocator.h" +// #include "ArenaConst.h" +#include "GDExtra.h" + +/**********************************/ +/* INITIALISE AN ARRAY OF OBJECTS */ +/**********************************/ +// Really only intended for the initialisation of enemy objects and humans. +// Each object in the array is allocated a consecutive sprite number and is positioned +// randomly in the arena. The objects movement is restricted to within the arena. +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Pass pointer to a sprite number in spriteNumber. This number is incremented by this method. +void GameObject::InitialiseAll( GameObject **objects, UInt8 objectCount, UInt8 *spriteNumber ) { +#if 0 + GameObject *object; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( object != (GameObject*)NULL ) { + // Use next sprite number. + object->SpriteNumber = *spriteNumber; + // Position object randomly. + GameObjectLocator::Locate( object ); + // Restrict movement to arena. + object->MovementRestricted = true; + object->Bounds = &ArenaRectangle; + } + // Next sprite number. + (*spriteNumber)++; + } +#endif +} + +/****************************/ +/* MOVE AN ARRAY OF OBJECTS */ +/****************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Returns true if any non-null objects were found in the array. +bool GameObject::MoveAll( GameObject **objects, UInt8 objectCount ) { + GameObject *object; + bool foundNonNull = false; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( object != (GameObject*)NULL ) { + foundNonNull = true; + object->Move(); + } + } + return foundNonNull; +} + +/****************************/ +/* DRAW AN ARRAY OF OBJECTS */ +/****************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +void GameObject::DrawAll( GameObject **objects, UInt8 objectCount ) { +#if 0 + GameObject *object; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( object != (GameObject*)NULL ) { + // Check if object is visible. + // If not then it wants killing off and a NULL + // should be written to the array of pointers + // and the sprite should be hidden. + if( ! object->Visible ) { + objects[ i ] = (GameObject*)NULL; + GDExtra::HideSprite( object->SpriteNumber ); + } + else { + object->Draw(); + } + } + } +#endif +} + +/************************************************/ +/* FIND AN UNUSED OBJECT IN AN ARRAY OF OBJECTS */ +/************************************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Pass pointer to variable that will hold index of object found in index. +// Returns true if an unused object was found, false if not. +// An unused object is indicated by a null pointer in the array. +bool GameObject::FindUnusedObject( GameObject **objects, UInt8 objectCount, UInt8 *index ) { + for( UInt8 i = 0; i < objectCount; ++i ) { + if( objects[ i ] == (GameObject*)NULL ) { + // Found a null pointer. Store index in index pointer + // and return true. + *index = i; + return true; + } + } + // Did not find a null pointer. + return false; +} + +/****************************************************/ +/* FIND COLLISIONS WITH ALL THE OBJECTS IN AN ARRAY */ +/****************************************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Pass pointer to a function that takes two UInt8 parameters in func. +// The first parameter is the index of the object in the objects array that hit something. +// The second parameter is the sprite number of the sprite which it hit. +void GameObject::FindCollisions( GameObject **objects, UInt8 objectCount, void (*func)( UInt8, UInt8 ) ) { +#if 0 + GameObject *object; + UInt8 hitSpriteNumber; + // Repeat for each non-null object in the array. + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( object != (GameObject*)NULL ) { + // Get sprite number that has collided with the sprite number of the object. + hitSpriteNumber = GD.rd( COLLISION + object->SpriteNumber ); + // If result is 0xFF then no collision was found. + if( hitSpriteNumber != 0xFF ) { + // Collision, so call function to deal with it. + func( i, hitSpriteNumber ); + } + } + } +#endif +} + +/*************************************************************************/ +/* FIND AN OBJECT WITH A PARTICULAR SPRITE NUMBER IN AN ARRAY OF OBJECTS */ +/*************************************************************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Pass sprite number to look for in spriteNumber. +// Index of object with given sprite number written to variable pointed to by index. +// Returns true if sprite number was found, false if not. +bool GameObject::FindSpriteNumber( GameObject **objects, UInt8 objectCount, UInt8 spriteNumber, UInt8 *index ) { + GameObject *object; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( ( object != (GameObject*)NULL ) && ( object->SpriteNumber == spriteNumber ) ) { + *index = i; + return true; + } + } + // Did not find sprite number. + return false; +} + +/**********************************************/ +/* FIND NEAREST OBJECT IN AN ARRAY OF OBJECTS */ +/**********************************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// Pass x and y coordinates of point you want to check. +// Pass pointer to validation function in ValidFunc. +// This is used to establish if a particular object is to be considered +// when finding nearest object. It should return true if object should be considered +// or false to ignore it. Pass NULL if all objects are considered valid. +// Pass pointer to variable that will hold index of object found in index. +// Returns true if nearest object was found, false if not (maybe no objects in array). +bool GameObject::FindNearestObject( + GameObject **objects, UInt8 objectCount, + Int16 x, Int16 y, + bool (*ValidFunc)( GameObject *object ), + UInt8 *index +) { + GameObject *object; + bool found = false; + Int16 minDistance = 0x7FFF, distance; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( + ( object != (GameObject*)NULL ) && + ( ( ValidFunc == NULL ) || ValidFunc( object ) ) + ) { + // This calculation doesn't really calculate the distance between points. + // Should really be calculating square root of the sum of the squares of the + // difference between coordinates. Could leave out the square root. + // However, this is a lot quicker, has less danger of overflow and is a + // fairly good approximation for the purposes of a game. + distance = abs( x - object->Xco ) + abs( y - object->Yco ); + if( distance < minDistance ) { + found = true; + minDistance = distance; + *index = i; + } + } + } + return found; +} + +/***************************************************************************/ +/* REMOVE ALL OBJECTS IN AN ARRAY THAT ARE NOT RETAINED ON A LEVEL RESTART */ +/***************************************************************************/ +// Pass pointer to array of pointers to GameObjects in objects. +// Pass number of pointers in the array in objectCount. +// All objects pointed to in the array that have their RetainOnLevelRestart property set +// to false are removed by writing NULL into the array. +void GameObject::RemoveUnretainedObjects( GameObject **objects, UInt8 objectCount ) { + GameObject *object; + for( UInt8 i = 0; i < objectCount; ++i ) { + object = objects[ i ]; + if( ( object != (GameObject*)NULL ) && ! object->RetainOnLevelRestart ) { + objects[ i ] = (GameObject*)NULL; + } + } +} + +/*******************************/ +/* MOVE TOWARDS ANOTHER OBJECT */ +/*******************************/ +// Pass object to move towards in object. +// Pass speed at which to move in speed. +void GameObject::MoveTowards( GameObject *object, Int16 speed ) { + if( Xco <= object->Xco - speed ) { + Xco += speed; + } + else if( Xco >= object->Xco + speed ) { + Xco -= speed; + } + if( Yco <= object->Yco - speed ) { + Yco += speed; + } + else if( Yco >= object->Yco + speed ) { + Yco -= speed; + } +}