A complex 2D-dungeon game on LPC1768 in SWJTU-Leeds Joint School XJEL2645 project. Referenced from the framework contributed by https://os.mbed.com/users/Siriagus/code/SimplePlatformGame/

Dependencies:   mbed N5110 ShiftReg PinDetect

main.cpp

Committer:
Siriagus
Date:
2015-04-28
Revision:
3:4e3f342a135c
Parent:
2:0ae5ac8b0cac
Child:
4:d6661b976359

File content as of revision 3:4e3f342a135c:

/**
@brief Simple platform game developed for ELEC2645 Embedded Systems Project at University of Leeds

@author Andreas Garmannslund
**/

#include "mbed.h"
#include "N5110.h"
#include "PowerControl.h"
#include "PinDetect.h"

#include "Joystick.h"
#include <string>

#include "State.h"
#include "MainMenu.h"
#include "map.h"
#include "images.h"

#include <ctime>

// Redefine pin names for simple access.
#define JOY_H p17
#define JOY_V p16
#define JOY_BTN p15

#define LED_POT p20

#define BUTTON_A p28
#define BUTTON_B p27
#define BUTTON_C p29

// Components
N5110 *lcd; // VCC, SCE, RST, D/C, MOSI, SCLK and LED
Joystick *joystick;

// Brightness potentiometer
AnalogIn ledPot(LED_POT);

/*
// Buttons
DigitalIn btnA(p27);
DigitalIn btnB(p28);
DigitalIn btnC(p29);
*/

// Debugging
Serial pc(USBTX, USBRX);
BusOut leds(LED1, LED2, LED3, LED4);


// @brief Clears the screen and fill it with the image in the argument.
void clearAndDrawImage(const int img[BANKS][WIDTH])
{
    for (int i = 0; i < BANKS; ++i)
    {
        for (int j = 0; j < WIDTH; ++j)
        {
            lcd->buffer[j][i] = img[i][j];
        }
    }
    lcd->refresh();
}

//State *stateObj; // current state object

// States

//enum MenuState {SELECT_MENU, HIGH_SCORES, CONTROLS, LOAD_GAME};

enum MenuState {SELECT_PLAY, SELECT_HIGHSCORES, SELECT_CONTROLS, LOAD_GAME, HIGHSCORES, CONTROLS};
int currentState; // current state

enum NewMenuState;

// fsm[state][input] where input are 0, 1, 2 corresponding to buttons A, B, C
int fsm[6][3] = {
    {LOAD_GAME, SELECT_PLAY, SELECT_HIGHSCORES},            // State: SELECT_PLAY
    {HIGHSCORES, SELECT_HIGHSCORES, SELECT_CONTROLS},       // State: SELECT_HIGHSCORES
    {CONTROLS, SELECT_CONTROLS, SELECT_PLAY},               // State: SELECT_CONTROLS
    {LOAD_GAME, LOAD_GAME, LOAD_GAME},                      // State: LOAD_GAME
    {SELECT_HIGHSCORES, SELECT_HIGHSCORES, HIGHSCORES},     // State: HIGHSCORES
    {SELECT_CONTROLS, SELECT_CONTROLS, CONTROLS}            // State: CONTROLS
};

PinDetect btnA(BUTTON_A);
PinDetect btnB(BUTTON_B);
PinDetect btnC(BUTTON_C);

void btnAPressed() {currentState = fsm[currentState][0];}
void btnBPressed() {currentState = fsm[currentState][1];}
void btnCPressed() {currentState = fsm[currentState][2];}

void init();
void cleanUp();

int main()
{
    init();
    
    while(true)
    {   
        lcd->clear();
    
        joystick->update();
        lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
        
        // Update
        switch (currentState)
        {        
            case SELECT_PLAY:
                lcd->printString(">Play", 10, 1);
                lcd->printString("High Scores", 10, 2);
                lcd->printString("Controls", 10, 3);
            break;
            
            case SELECT_HIGHSCORES:
                lcd->printString("Play", 10, 1);
                lcd->printString(">High Scores", 10, 2);
                lcd->printString("Controls", 10, 3);
            break;
            
            case SELECT_CONTROLS:
                lcd->printString("Play", 10, 1);
                lcd->printString("High Scores", 10, 2);
                lcd->printString(">Controls", 10, 3);
            break;
            
            case HIGHSCORES:
            // Placeholder TODO: Actually high scores
                lcd->printString("High Scores", 10, 0);
                lcd->printString("AND 1000000", 10, 1);
                lcd->printString("AND  500000", 10, 2);
                lcd->printString("AND     100", 10, 3);
                lcd->printString(">Back", 10, 4);
            break;
            
            case CONTROLS:
                lcd->printString("Controls", 10, 0);
                lcd->printString("A: Jump", 10, 1);
                lcd->printString("B: Shoot", 10, 2);
                lcd->printString("C: Pause", 10, 3);
                lcd->printString(">Back", 10, 4);
            break;
            
            case LOAD_GAME:
                clearAndDrawImage(logo);
            break;
                
        }
        
        lcd->refresh();
        Sleep();
    }
    
    cleanUp();
    
    return 0;
}

void init()
{
    // Init LCD
    lcd = new N5110(p7, p8, p9, p10, p11, p13, p26);
    lcd->init();
    lcd->normalMode();
    lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
    
    // Init joystick
    joystick = new Joystick(JOY_H, JOY_V, JOY_BTN);
    joystick->calibrate();
    
    // Init buttons
    btnA.attach_asserted(&btnAPressed);
    btnB.attach_asserted(&btnBPressed);
    btnC.attach_asserted(&btnCPressed);
    
    btnA.setSampleFrequency();
    btnB.setSampleFrequency();
    btnC.setSampleFrequency();
    
    // Set initial state    
    currentState = SELECT_PLAY;
}

void cleanUp()
{
    delete lcd;
    delete joystick;
}