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:
1:0cfe2255092a
Parent:
0:1f92de30d43e
Child:
2:0ae5ac8b0cac

File content as of revision 1:0cfe2255092a:

/**
@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 p27
#define BUTTON_B p28
#define BUTTON_C p29

enum MainState {MENU, GAME};
MainState currentState; // current state

// 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
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();
    
    // Set initial state    
//    currentState = MENU;
//    stateObj = new MainMenu(lcd, BUTTON_A, BUTTON_B, BUTTON_C);
}

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

const int NUM_CHOICES = 3;
std::string choices[NUM_CHOICES] = {"Play", "High Score", "Controls"};
int selectedChoice = 0;

PinDetect btnC(BUTTON_C);
void nextChoice() { selectedChoice = (selectedChoice + 1) % NUM_CHOICES;}

int main()
{
    init();
    
    // button
    btnC.attach_asserted(&nextChoice);
    btnC.setSampleFrequency();

    // Game loop, fixed-time step, updates game logic with regular intervals, rendering happens as fast as possible
    while(true)
    {   
        lcd->clear();
        
        //stateObj->run();
    
        joystick->update();
        lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
        
        for (int i = 0; i < 3; ++i)
        {
            std::string str = (selectedChoice == i) ? ("> " + choices[i]) : choices[i];
            lcd->printString(str.c_str(), 10, i+1);
        }
        
        lcd->refresh();
        Sleep(); // Wait for button interrupt
    }
    
    cleanUp();
    
    return 0;
}