├── .gitignore ├── README.md ├── preview.gif └── src ├── Animator.cpp ├── Animator.h ├── Bullet.cpp ├── Bullet.h ├── Controller.cpp ├── Controller.h ├── Enemy.cpp ├── Enemy.h ├── EnemyAnimation.h ├── Game.cpp ├── Game.h ├── Level.cpp ├── Level.h ├── Makefile ├── Player.cpp ├── Player.h ├── PlayerAnimation.h ├── Renderer.cpp ├── Renderer.h ├── Sprite.cpp ├── Sprite.h ├── StartScreen.h ├── Time.cpp ├── Time.h ├── main.cpp └── romdisk └── Sprite ├── Enemy └── GoopeSheet.png ├── Level ├── bg.png └── fg.png ├── Player └── playerSheet.png ├── StartScreen.png └── shot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cuphead_Dreamcast 2 | Cuphead prototype running on dreamcast 3 | 4 | ![](https://github.com/Aionmagan/Cuphead_Dreamcast/blob/main/preview.gif) 5 | 6 | 7 | 8 | ___ 9 | [Cuphead running on Dreamcast](https://www.youtube.com/watch?v=Kp_5ha78em0) 10 | 11 | [![video preview](https://img.youtube.com/vi/Kp_5ha78em0/0.jpg)](https://www.youtube.com/watch?v=Kp_5ha78em0) 12 | -------------------------------------------------------------------------------- /preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/preview.gif -------------------------------------------------------------------------------- /src/Animator.cpp: -------------------------------------------------------------------------------- 1 | #include "Animator.h" 2 | #include "Time.h" 3 | #include 4 | 5 | Animator::Animator(Sprites *spriteSheet, float *speeds, animLimit_t *limits, Vector *scales, 6 | uv_t *idle, uv_t *idleshot, uv_t *run, uv_t *jump, uv_t *dash, uv_t *duck) 7 | { 8 | this->spriteSheet = spriteSheet; 9 | animSpeeds = speeds; 10 | animLimit = limits; 11 | animScales = scales; 12 | idleUV = idle; 13 | idleshotUV = idleshot; 14 | runUV = run; 15 | jumpUV = jump; 16 | dashUV = dash; 17 | duckUV = duck; 18 | 19 | animationTime = 0; 20 | animSelect = 0; 21 | } 22 | 23 | Animator::~Animator() 24 | { 25 | delete spriteSheet; 26 | 27 | delete animSpeeds; 28 | delete animLimit; 29 | delete animScales; 30 | 31 | delete idleUV; 32 | delete idleshotUV; 33 | delete runUV; 34 | delete jumpUV; 35 | delete dashUV; 36 | delete duckUV; 37 | } 38 | 39 | void Animator::Update() 40 | { 41 | animMulSelect = animSelect * 4; 42 | 43 | switch(animationState) 44 | { 45 | case IDLE: 46 | temp[0] = idleUV[0+animMulSelect]; 47 | temp[1] = idleUV[1+animMulSelect]; 48 | temp[2] = idleUV[2+animMulSelect]; 49 | temp[3] = idleUV[3+animMulSelect]; 50 | break; 51 | case IDLEST: 52 | temp[0] = idleshotUV[0+animMulSelect]; 53 | temp[1] = idleshotUV[1+animMulSelect]; 54 | temp[2] = idleshotUV[2+animMulSelect]; 55 | temp[3] = idleshotUV[3+animMulSelect]; 56 | break; 57 | case RUN: 58 | temp[0] = runUV[0+animMulSelect]; 59 | temp[1] = runUV[1+animMulSelect]; 60 | temp[2] = runUV[2+animMulSelect]; 61 | temp[3] = runUV[3+animMulSelect]; 62 | break; 63 | case DUCK: 64 | temp[0] = duckUV[0+animMulSelect]; 65 | temp[1] = duckUV[1+animMulSelect]; 66 | temp[2] = duckUV[2+animMulSelect]; 67 | temp[3] = duckUV[3+animMulSelect]; 68 | break; 69 | case JUMP: 70 | temp[0] = jumpUV[0+animMulSelect]; 71 | temp[1] = jumpUV[1+animMulSelect]; 72 | temp[2] = jumpUV[2+animMulSelect]; 73 | temp[3] = jumpUV[3+animMulSelect]; 74 | break; 75 | case DASH: 76 | temp[0] = dashUV[0+animMulSelect]; 77 | temp[1] = dashUV[1+animMulSelect]; 78 | temp[2] = dashUV[2+animMulSelect]; 79 | temp[3] = dashUV[3+animMulSelect]; 80 | default: 81 | break; 82 | } 83 | 84 | spriteSheet->setUV(temp); 85 | 86 | if (animationTime < Time::time()) 87 | { 88 | animSelect++; 89 | animationTime = Time::time() + animSpeeds[animationState]; 90 | } 91 | 92 | if(animSelect >= animLimit[animationState].length) 93 | { 94 | if(animLimit[animationState].clamp) 95 | { 96 | animSelect = animLimit[animationState].length-1; 97 | } 98 | else 99 | { 100 | animSelect = 0; 101 | } 102 | } 103 | } 104 | 105 | void Animator::SetState(AnimState animState, bool reset) 106 | { 107 | if (animationState == animState){return;} 108 | 109 | if (reset) 110 | { 111 | animSelect = 0; 112 | } 113 | 114 | animationState = animState; 115 | spriteSheet->SetScale(animScales[animationState]); 116 | } 117 | 118 | int Animator::GetAnimFrame() 119 | { 120 | return animSelect; 121 | } 122 | 123 | AnimState Animator::GetState() 124 | { 125 | return animationState; 126 | } -------------------------------------------------------------------------------- /src/Animator.h: -------------------------------------------------------------------------------- 1 | #ifndef __ANIMATOR__ 2 | #define __ANIMATOR__ 3 | 4 | #include "Sprite.h" 5 | 6 | typedef struct 7 | { 8 | int length; 9 | bool clamp; 10 | }animLimit_t; 11 | 12 | enum AnimState 13 | { 14 | IDLE = 0, 15 | IDLEST, 16 | RUN, 17 | JUMP, 18 | DASH, 19 | DUCK, 20 | }; 21 | 22 | class Animator 23 | { 24 | private: 25 | int animSelect; 26 | int animMulSelect; 27 | float animationTime; 28 | 29 | AnimState animationState; 30 | Sprites *spriteSheet = NULL; 31 | 32 | float *animSpeeds = NULL; 33 | animLimit_t *animLimit = NULL; 34 | Vector *animScales = NULL; 35 | 36 | uv_t *idleUV = NULL; 37 | uv_t *idleshotUV = NULL; 38 | uv_t *runUV = NULL; 39 | uv_t *jumpUV = NULL; 40 | uv_t *dashUV = NULL; 41 | uv_t *duckUV = NULL; 42 | uv_t temp[4]; 43 | 44 | public: 45 | Animator(Sprites *spriteSheet, float *speeds, animLimit_t *limits, Vector *scales, uv_t *idle, 46 | uv_t *idleshot, uv_t *run, uv_t *jump, uv_t *dash, uv_t *duck); 47 | ~Animator(); 48 | 49 | void Update(); 50 | int GetAnimFrame(); 51 | void SetState(AnimState state, bool reset); 52 | AnimState GetState(); 53 | }; 54 | 55 | #endif //__PLAYERANIMATION__ -------------------------------------------------------------------------------- /src/Bullet.cpp: -------------------------------------------------------------------------------- 1 | #include "Bullet.h" 2 | #include "Sprite.h" 3 | 4 | static Sprites *sprite = NULL; //all bullets will use this 5 | 6 | Bullet::Bullet(float x, float y, float size, float speed) : Drawable() 7 | { 8 | direction = 1; 9 | moveSpeed = speed; 10 | isShot = false; 11 | this->size = size; 12 | 13 | 14 | setTranslate(Vector(x, y, 19)); 15 | 16 | if (sprite == NULL) 17 | { 18 | sprite = new Sprites("rd/Sprite/shot.png"); 19 | sprite->SetScale(Vector(size, size, 1)); 20 | } 21 | } 22 | 23 | Bullet::~Bullet() 24 | { 25 | 26 | } 27 | 28 | void Bullet::Update() 29 | { 30 | curPos = getPosition(); 31 | 32 | if (!isShot) 33 | { 34 | setTranslate(Vector(-1.5f, -1.5f, 21)); 35 | return; 36 | } 37 | 38 | if (curPos[0] < 30 || curPos[0] > 610){ isShot = false;} 39 | dir = Vector(direction * moveSpeed, 0, 0); 40 | translate(dir * 0.333333f); 41 | } 42 | 43 | void Bullet::Render() 44 | { 45 | if (!isShot){return;} 46 | 47 | sprite->SetTranslate(curPos); 48 | 49 | sprite->flipSprite(direction < 0); 50 | sprite->Render(); 51 | } 52 | 53 | void Bullet::Shoot(Drawable &object) 54 | { 55 | x = object.getPosition()[0]; 56 | y = object.getPosition()[1]; 57 | setTranslate(Vector(x, y, 17)); 58 | isShot = true; 59 | } 60 | 61 | void Bullet::SetDirection(int direction) 62 | { 63 | if (direction == 0){return;} 64 | this->direction = direction; 65 | } 66 | 67 | bool Bullet::GetActive() 68 | { 69 | return isShot; 70 | } 71 | 72 | bool Bullet::AABB(Drawable &object) 73 | { 74 | float xx = object.getPosition()[0]; 75 | float yy = object.getPosition()[1]; 76 | 77 | if (curPos[0] < xx + 75 && 78 | curPos[0] + size > xx && 79 | curPos[1] < yy + 75 && 80 | curPos[1] + size * 0.5f > yy) 81 | { 82 | isShot = false; 83 | return true; 84 | } 85 | 86 | return false; 87 | } -------------------------------------------------------------------------------- /src/Bullet.h: -------------------------------------------------------------------------------- 1 | #ifndef _BULLET_ 2 | #define _BULLET_ 3 | 4 | #include 5 | #include 6 | 7 | 8 | //#include "Player.h" 9 | 10 | class Bullet : Drawable 11 | { 12 | private: 13 | float moveSpeed; 14 | float size; 15 | int direction; 16 | bool isShot; 17 | float x, y; 18 | Vector curPos; 19 | Vector dir; 20 | 21 | public: 22 | Bullet(float x, float y, float size,float speed); 23 | ~Bullet(); 24 | 25 | void Update(); 26 | void Render(); 27 | void Shoot(Drawable &object); 28 | void SetDirection(int direction); 29 | bool AABB(Drawable &object); 30 | bool GetActive(); 31 | }; 32 | 33 | #endif /*_BULLET_*/ -------------------------------------------------------------------------------- /src/Controller.cpp: -------------------------------------------------------------------------------- 1 | #include "Controller.h" 2 | #include 3 | 4 | Controller::Controller() 5 | { 6 | UpdateControllerState(); 7 | 8 | for(int i = 0; i < 4; ++i) 9 | { 10 | release[i] = false; 11 | } 12 | } 13 | 14 | Controller::~Controller() 15 | { 16 | 17 | } 18 | 19 | int Controller::ButtonUsed(Buttons button) 20 | { 21 | switch(button) 22 | { 23 | case PAD_A: 24 | return 0; 25 | break; 26 | case PAD_B: 27 | return 1; 28 | break; 29 | case PAD_X: 30 | return 2; 31 | break; 32 | case PAD_Y: 33 | return 3; 34 | break; 35 | default: 36 | break; 37 | } 38 | 39 | return -1; 40 | } 41 | 42 | void Controller::UpdateControllerState() 43 | { 44 | state = (cont_state_t *)maple_dev_status(maple_enum_type(0, MAPLE_FUNC_CONTROLLER)); 45 | } 46 | 47 | bool Controller::ButtonHold(Buttons button) const 48 | { 49 | if(state != NULL) 50 | { 51 | return state->buttons & button; 52 | } 53 | return false; 54 | } 55 | 56 | bool Controller::ButtonDown(Buttons button) 57 | { 58 | if(state != NULL) 59 | { 60 | int bu = ButtonUsed(button); 61 | if((state->buttons & button)) 62 | { 63 | if (!release[bu]) 64 | { 65 | release[bu] = true; 66 | return true; 67 | } 68 | } 69 | } 70 | return false; 71 | } 72 | 73 | bool Controller::ButtonUp(Buttons button) 74 | { 75 | if(state != NULL) 76 | { 77 | int bu = ButtonUsed(button); 78 | if(!(state->buttons & button)) 79 | { 80 | if (release[bu]) 81 | { 82 | release[bu] = false; 83 | return true; 84 | } 85 | } 86 | } 87 | return false; 88 | } 89 | 90 | float Controller::JoystickX() const 91 | { 92 | if(state != NULL) 93 | { 94 | return state->joyx / 126; 95 | } 96 | 97 | return 0; 98 | } 99 | 100 | float Controller::JoystickY() const 101 | { 102 | if(state != NULL) 103 | { 104 | return state->joyy / 126; 105 | } 106 | 107 | return 0; 108 | } 109 | 110 | float Controller::RightTrigger() const 111 | { 112 | if(state != NULL) 113 | { 114 | return state->rtrig; 115 | } 116 | 117 | return 0; 118 | } 119 | 120 | float Controller::LeftTrigger() const 121 | { 122 | if(state != NULL) 123 | { 124 | return state->ltrig; 125 | } 126 | 127 | return 0; 128 | } 129 | -------------------------------------------------------------------------------- /src/Controller.h: -------------------------------------------------------------------------------- 1 | #ifndef _CONTROLLER_ 2 | #define _CONTROLLER_ 3 | 4 | #include 5 | #include 6 | 7 | /* 8 | *the Button function in Controller class 9 | * is used in this manner 10 | * controller.Button(START); 11 | */ 12 | 13 | enum Buttons 14 | { 15 | PAD_A = (1<<2), 16 | PAD_B = (1<<1), 17 | PAD_X = (1<<10), 18 | PAD_Y = (1<<9), 19 | PAD_UP = (1<<4), 20 | PAD_DOWN = (1<<5), 21 | PAD_LEFT = (1<<6), 22 | PAD_RIGHT = (1<<7), 23 | PAD_START = (1<<3), 24 | }; 25 | 26 | class Controller 27 | { 28 | private: 29 | cont_state_t *state; 30 | bool release[4]; 31 | int ButtonUsed(Buttons button); 32 | 33 | public: 34 | Controller(); 35 | ~Controller(); 36 | 37 | void UpdateControllerState(); 38 | 39 | bool ButtonHold(Buttons button) const; 40 | bool ButtonDown(Buttons button); 41 | bool ButtonUp(Buttons button); 42 | 43 | float JoystickX() const; 44 | float JoystickY() const; 45 | float RightTrigger() const; 46 | float LeftTrigger() const; 47 | }; 48 | 49 | #endif //_CONTROLLER_ -------------------------------------------------------------------------------- /src/Enemy.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "Enemy.h" 4 | #include "EnemyAnimation.h" 5 | #include "Controller.h" 6 | 7 | extern Controller controller; 8 | 9 | Enemy::Enemy(float x, float y, float speed):Drawable() 10 | { 11 | moveSpeed = speed; 12 | direction = -1; 13 | sprite = new Sprites("rd/Sprite/Enemy/GoopeSheet.png"); 14 | animation = new Animator(sprite, animationSpeeds, animationLength, animationScales, 15 | idleUV, idleShotUV, runUV, NULL, NULL, NULL); 16 | animation->SetState(RUN, true); 17 | 18 | sprite->flipSprite(false); 19 | setTranslate(Vector(x, y, 18)); 20 | sprite->SetTranslate(getPosition()); 21 | } 22 | 23 | Enemy::~Enemy() 24 | { 25 | 26 | } 27 | 28 | void Enemy::Update() 29 | { 30 | if (onGround) 31 | { 32 | if (animation->GetAnimFrame() >= animationLength[0].length-1) 33 | { 34 | animation->SetState(RUN, true); 35 | 36 | int rnd = rand() % 20; 37 | float jump = rnd + 45; 38 | float left = rnd + 15; 39 | velocity = Vector(left * direction, -jump, 0); 40 | }else 41 | { 42 | animation->SetState(IDLE, true); 43 | } 44 | }else 45 | { 46 | if(velocity[1] > 3.3f) 47 | { 48 | animation->SetState(IDLEST, true); 49 | } 50 | } 51 | 52 | translate(velocity * 0.333333f); 53 | velocity = velocity + gravity * 0.333333f; 54 | curPos = getPosition(); 55 | 56 | if (curPos[0] < 30) 57 | { 58 | curPos = Vector(31, curPos[1], 18); 59 | direction = 1; 60 | velocity = Vector(velocity[0] * -direction, velocity[1], 0); 61 | } 62 | else if (curPos[0] > 610) 63 | { 64 | curPos = Vector(609, curPos[1], 18); 65 | direction = -1; 66 | velocity = Vector(velocity[0] * direction, velocity[1], 0); 67 | } 68 | 69 | if (curPos[1] > 346) 70 | { 71 | curPos = Vector(curPos[0], 345, 18); 72 | onGround = true; 73 | canJump = true; 74 | velocity.zero(); 75 | }else 76 | { 77 | onGround = false; 78 | } 79 | 80 | setTranslate(curPos); 81 | sprite->SetTranslate(getPosition()); 82 | 83 | animation->Update(); 84 | } 85 | 86 | void Enemy::Render() 87 | { 88 | sprite->flipSprite(direction > 0); 89 | sprite->Render(); 90 | } -------------------------------------------------------------------------------- /src/Enemy.h: -------------------------------------------------------------------------------- 1 | #ifndef __ENEMY__ 2 | #define __ENEMY__ 3 | 4 | #include 5 | #include 6 | 7 | #include "Sprite.h" 8 | #include "Animator.h" 9 | 10 | /*this could have been virtualized... i'm an idiot 11 | * now i have two exact class player and enemy*/ 12 | 13 | class Enemy : public Drawable 14 | { 15 | private : 16 | float moveSpeed; 17 | int direction; 18 | 19 | Animator *animation = NULL; 20 | Sprites *sprite = NULL; 21 | 22 | bool canJump; 23 | bool onGround; 24 | 25 | Vector velocity; 26 | Vector curPos; 27 | Vector gravity = Vector(0, 9.87f, 0, 1); 28 | 29 | public : 30 | Enemy(float x, float y, float speed); 31 | ~Enemy(); 32 | 33 | void Update(); 34 | void Render(); 35 | }; 36 | 37 | #endif /*__ENEMY */ -------------------------------------------------------------------------------- /src/EnemyAnimation.h: -------------------------------------------------------------------------------- 1 | #ifndef __ENEMYANIMATION__ 2 | #define __ENEMYANIMATION__ 3 | 4 | #include "Sprite.h" 5 | #include "Animator.h" 6 | 7 | static float animationSpeeds[]= 8 | { 9 | 0.055, //idle 10 | 0.045, //idleshot 11 | 0.045, //run 12 | }; 13 | 14 | static Vector animationScales[]= 15 | { 16 | {0.15f,0.15f,0.0f,1.0f}, //idle 17 | {0.15f,0.15f,0.0f,1.0f}, //idle 18 | {0.15f,0.15f,0.0f,1.0f}, //idle 19 | }; 20 | 21 | static animLimit_t animationLength[]= 22 | { 23 | {.length = 10, .clamp = true}, //IDLE; 24 | {.length = 3, .clamp = false}, //IDLEST; 25 | {.length = 3, .clamp = false}, //RUN; 26 | }; 27 | 28 | static uv_t idleUV[]= 29 | { 30 | {.u = 0.000000, .v = 0.107422},{.u = 0.000000, .v = 0.000000}, 31 | {.u = 0.126953, .v = 0.107422},{.u = 0.126953, .v = 0.000000}, 32 | 33 | {.u = 0.126953, .v = 0.107422},{.u = 0.126953, .v = 0.000000}, 34 | {.u = 0.253906, .v = 0.107422},{.u = 0.253906, .v = 0.000000}, 35 | 36 | {.u = 0.253906, .v = 0.107422},{.u = 0.253906, .v = 0.000000}, 37 | {.u = 0.380859, .v = 0.107422},{.u = 0.380859, .v = 0.000000}, 38 | 39 | {.u = 0.380859, .v = 0.107422},{.u = 0.380859, .v = 0.000000}, 40 | {.u = 0.507813, .v = 0.107422},{.u = 0.507813, .v = 0.000000}, 41 | 42 | {.u = 0.507813, .v = 0.107422},{.u = 0.507813, .v = 0.000000}, 43 | {.u = 0.634766, .v = 0.107422},{.u = 0.634766, .v = 0.000000}, 44 | 45 | {.u = 0.634766, .v = 0.107422},{.u = 0.634766, .v = 0.000000}, 46 | {.u = 0.761719, .v = 0.107422},{.u = 0.761719, .v = 0.000000}, 47 | 48 | {.u = 0.761719, .v = 0.107422},{.u = 0.761719, .v = 0.000000}, 49 | {.u = 0.888672, .v = 0.107422},{.u = 0.888672, .v = 0.000000}, 50 | 51 | {.u = 0.761719, .v = 0.107422},{.u = 0.761719, .v = 0.000000}, 52 | {.u = 0.888672, .v = 0.107422},{.u = 0.888672, .v = 0.000000}, 53 | 54 | {.u = 0.000000, .v = 0.224512},{.u = 0.000000, .v = 0.117090}, 55 | {.u = 0.126953, .v = 0.224512},{.u = 0.126953, .v = 0.117090}, 56 | 57 | {.u = 0.126953, .v = 0.224512},{.u = 0.126953, .v = 0.117090}, 58 | {.u = 0.253906, .v = 0.224512},{.u = 0.253906, .v = 0.117090}, 59 | }; 60 | 61 | static uv_t idleShotUV[]= //this is falling 62 | { 63 | {.u = 0.000000, .v = 0.361816},{.u = 0.000000, .v = 0.234863}, 64 | {.u = 0.126953, .v = 0.361816},{.u = 0.126953, .v = 0.234863}, 65 | 66 | {.u = 0.126953, .v = 0.361816},{.u = 0.126953, .v = 0.234863}, 67 | {.u = 0.253906, .v = 0.361816},{.u = 0.253906, .v = 0.234863}, 68 | 69 | {.u = 0.253906, .v = 0.361816},{.u = 0.253906, .v = 0.234863}, 70 | {.u = 0.380859, .v = 0.361816},{.u = 0.380859, .v = 0.234863}, 71 | }; 72 | 73 | static uv_t runUV[]= //this is jumping up 74 | { 75 | {.u = 0.380859, .v = 0.361816},{.u = 0.380859, .v = 0.234863}, 76 | {.u = 0.507813, .v = 0.361816},{.u = 0.507813, .v = 0.234863}, 77 | 78 | {.u = 0.507813, .v = 0.361816},{.u = 0.507813, .v = 0.234863}, 79 | {.u = 0.634766, .v = 0.361816},{.u = 0.634766, .v = 0.234863}, 80 | 81 | {.u = 0.634766, .v = 0.361816},{.u = 0.634766, .v = 0.234863}, 82 | {.u = 0.761719, .v = 0.361816},{.u = 0.761719, .v = 0.234863}, 83 | }; 84 | 85 | #endif /*__ENEMYANIMATION__*/ -------------------------------------------------------------------------------- /src/Game.cpp: -------------------------------------------------------------------------------- 1 | #include "Game.h" 2 | 3 | #include "Controller.h" 4 | #include "Sprite.h" 5 | #include "Player.h" 6 | #include "Enemy.h" 7 | #include "Bullet.h" 8 | #include "Time.h" 9 | #include "Level.h" 10 | 11 | #include 12 | #include 13 | 14 | #define BULLETAMOUNT 20 15 | 16 | extern Controller controller; 17 | Player *player = NULL; 18 | Enemy *enemy = NULL; 19 | Level *level = NULL; 20 | Bullet *bullet[BULLETAMOUNT]; 21 | 22 | bool gameRunning = false; 23 | 24 | void Game::Start() 25 | { 26 | gameRunning = true; 27 | 28 | level = new Level(640/2, 480/2, 1); 29 | player = new Player(100, 366, 24.5f); 30 | enemy = new Enemy(600, 366, 24.5f); 31 | 32 | for(int i = 0; i < BULLETAMOUNT; ++i) 33 | { 34 | bullet[i] = new Bullet(0, 0, 2, 35.7f); 35 | } 36 | } 37 | 38 | void Game::End() 39 | { 40 | delete player; 41 | delete enemy; 42 | delete bullet[BULLETAMOUNT]; 43 | } 44 | 45 | float shotspeed = 0.2f; 46 | float startTime = 0; 47 | void Game::Update() 48 | { 49 | if (controller.ButtonHold(PAD_START)){gameRunning = false;} 50 | 51 | if (controller.ButtonHold(PAD_X)) 52 | { 53 | if (startTime < Time::time()) 54 | { 55 | for(int i = 0; i < BULLETAMOUNT; ++i) 56 | { 57 | if (!bullet[i]->GetActive()) 58 | { 59 | bullet[i]->SetDirection(player->GetDirection()); 60 | bullet[i]->Shoot(*player); 61 | goto out; 62 | } 63 | } 64 | 65 | 66 | out: 67 | 68 | startTime = Time::time() + shotspeed; 69 | } 70 | } 71 | 72 | enemy->Update(); 73 | player->Update(); 74 | for(int i = 0; i < BULLETAMOUNT; ++i) 75 | { 76 | bullet[i]->Update(); 77 | } 78 | 79 | } 80 | 81 | void Game::Render() 82 | { 83 | level->Render(); 84 | player->Render(); 85 | enemy->Render(); 86 | for(int i = 0; i < BULLETAMOUNT; ++i) 87 | { 88 | if (bullet[i]->GetActive()) 89 | { 90 | if (!bullet[i]->AABB(*enemy)) 91 | { 92 | bullet[i]->Render(); 93 | } 94 | } 95 | } 96 | } 97 | 98 | bool Game::Running() 99 | { 100 | return gameRunning; 101 | } -------------------------------------------------------------------------------- /src/Game.h: -------------------------------------------------------------------------------- 1 | #ifndef _GAME_ 2 | #define _GAME_ 3 | 4 | class Game 5 | { 6 | public: 7 | static void Start(); // call this only once 8 | static void Update(); // maybe will add dt later 9 | static void Render(); 10 | static void End(); 11 | static bool Running(); 12 | 13 | }; 14 | 15 | #endif //_GAME_ -------------------------------------------------------------------------------- /src/Level.cpp: -------------------------------------------------------------------------------- 1 | #include "Level.h" 2 | #include "Sprite.h" 3 | 4 | #define XOFFSET 0.5 5 | 6 | static RefPtr backGround; 7 | static RefPtr foreGround; 8 | 9 | static RefPtr lvlbg; 10 | static RefPtr lvlfg; 11 | 12 | Level::Level(float x, float y, float size) 13 | { 14 | lvlbg = new Texture("/rd/Sprite/Level/bg.png", true); 15 | lvlfg = new Texture("/rd/Sprite/Level/fg.png", true); 16 | 17 | backGround = new Banner(PVR_LIST_TR_POLY, lvlbg); 18 | foreGround = new Banner(PVR_LIST_TR_POLY, lvlfg); 19 | 20 | backGround->setScale(Vector(size + XOFFSET, size, 1)); 21 | foreGround->setScale(Vector(size + XOFFSET, size, 1)); 22 | 23 | backGround->setTranslate(Vector(x, y, 1)); 24 | foreGround->setTranslate(Vector(x, y, 50)); 25 | } 26 | 27 | Level::~Level() 28 | { 29 | delete backGround; 30 | delete foreGround; 31 | delete lvlbg; 32 | delete lvlfg; 33 | } 34 | 35 | void Level::Render() 36 | { 37 | backGround->draw(PVR_LIST_TR_POLY); 38 | foreGround->draw(PVR_LIST_TR_POLY); 39 | } 40 | 41 | -------------------------------------------------------------------------------- /src/Level.h: -------------------------------------------------------------------------------- 1 | #ifndef __LEVEL__ 2 | #define __LEVEL__ 3 | 4 | #include 5 | #include "Sprite.h" 6 | 7 | class Level 8 | { 9 | private: 10 | 11 | 12 | public: 13 | Level(float x, float y, float size); 14 | ~Level(); 15 | 16 | void Render(); 17 | }; 18 | 19 | #endif //__LEVEL__ -------------------------------------------------------------------------------- /src/Makefile: -------------------------------------------------------------------------------- 1 | 2 | # Put the filename of the output binary here 3 | TARGET = main.elf 4 | 5 | # List all of your C files here, but change the extension to ".o" 6 | # Include "romdisk.o" if you want a rom disk. 7 | OBJS = \ 8 | main.o \ 9 | Game.o \ 10 | Controller.o \ 11 | Sprite.o \ 12 | Player.o \ 13 | Enemy.o \ 14 | Bullet.o \ 15 | Time.o \ 16 | Renderer.o \ 17 | Level.o \ 18 | Animator.o 19 | 20 | 21 | # If you define this, the Makefile.rules will create a romdisk.o for you 22 | # from the named dir. 23 | KOS_ROMDISK_DIR = romdisk 24 | 25 | # The rm-elf step is to remove the target before building, to force the 26 | # re-creation of the rom disk. 27 | all: rm-elf $(TARGET) 28 | 29 | include $(KOS_BASE)/Makefile.rules 30 | 31 | clean: 32 | -rm -f $(TARGET) $(OBJS) romdisk.* 33 | 34 | rm-elf: 35 | -rm -f $(TARGET) romdisk.* 36 | 37 | $(TARGET): $(OBJS) romdisk.o 38 | $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) \ 39 | $(OBJS) romdisk.o $(OBJEXTRA) -lstdc++ -ltsunami -lparallax -lpng -ljpeg -lkmg -lz -lkosutils -lmp3 -lm $(KOS_LIBS) 40 | 41 | run: $(TARGET) 42 | $(KOS_LOADER) $(TARGET) 43 | 44 | dist: 45 | rm -f $(OBJS) romdisk.o romdisk.img 46 | $(KOS_STRIP) $(TARGET) 47 | -------------------------------------------------------------------------------- /src/Player.cpp: -------------------------------------------------------------------------------- 1 | #include "Player.h" 2 | #include "Controller.h" //for controller 3 | #include "Time.h" 4 | #include "PlayerAnimation.h" 5 | 6 | extern Controller controller; 7 | 8 | Player::Player(float x, float y, float speed):Drawable() 9 | { 10 | moveSpeed = speed; 11 | direction = 1; 12 | sprite = new Sprites("/rd/Sprite/Player/playerSheet.png"); 13 | animation = new Animator(sprite, animationSpeeds, animationLength, animationScales, 14 | idleUV, idleShotUV, runUV, jumpUV, dashUV, duckUV); 15 | animation->SetState(IDLE, true); 16 | 17 | sprite->flipSprite(false); 18 | setTranslate(Vector(x, y, 20)); 19 | sprite->SetTranslate(getPosition()); 20 | } 21 | 22 | Player::~Player() 23 | { 24 | 25 | } 26 | 27 | void Player::Update() 28 | { 29 | if (dash) 30 | { 31 | if (dashTimer < Time::time()) 32 | { 33 | dash = false; 34 | animation->SetState(JUMP, true); 35 | }else 36 | { 37 | velocity = Vector(direction * 35, 0, 0); 38 | } 39 | 40 | goto skip; //skip a few logics 41 | } 42 | 43 | if (onGround) 44 | { 45 | if (controller.JoystickY() > 0.7f) 46 | { 47 | animation->SetState(DUCK, true); 48 | animation->Update(); 49 | return; 50 | } 51 | 52 | if (controller.JoystickX() > 0.5f || controller.JoystickX() < -0.5f) 53 | { 54 | animation->SetState(RUN, true); 55 | }else 56 | { 57 | if (controller.ButtonHold(PAD_X)) 58 | { 59 | animation->SetState(IDLEST, true); 60 | } 61 | else 62 | { 63 | animation->SetState(IDLE, true); 64 | } 65 | } 66 | } 67 | 68 | if (controller.ButtonDown(PAD_A)) 69 | { 70 | if (canJump) 71 | { 72 | velocity = Vector(velocity[0], -50.0f, 20); 73 | animation->SetState(JUMP, false); 74 | canJump = false; 75 | } 76 | 77 | } 78 | 79 | if (controller.ButtonUp(PAD_A)) 80 | { 81 | velocity.zero(); 82 | } 83 | 84 | if (controller.ButtonDown(PAD_Y) && !dash) 85 | { 86 | animation->SetState(DASH, true); 87 | dash = true; 88 | dashTimer = Time::time() + dashAmount; 89 | } 90 | skip: 91 | //update the button press 92 | controller.ButtonUp(PAD_Y); 93 | 94 | translate(velocity * 0.333333f); 95 | 96 | velocity = Vector(controller.JoystickX() * moveSpeed, velocity[1], 0); 97 | velocity = velocity + gravity * 0.333333f; 98 | curPos = getPosition(); 99 | 100 | if (curPos[0] < 30) 101 | { 102 | curPos = Vector(31, curPos[1], 20); 103 | } 104 | else if (curPos[0] > 610) 105 | { 106 | curPos = Vector(609, curPos[1], 20); 107 | } 108 | 109 | if (curPos[1] < 30) 110 | { 111 | curPos = Vector(curPos[0], 31, 20); 112 | } 113 | else if (curPos[1] > 366) 114 | { 115 | curPos = Vector(curPos[0], 365, 20); 116 | onGround = true; 117 | canJump = true; 118 | velocity.zero(); 119 | }else 120 | { 121 | onGround = false; 122 | } 123 | 124 | setTranslate(curPos); 125 | sprite->SetTranslate(getPosition()); 126 | 127 | animation->Update(); 128 | } 129 | 130 | void Player::Render() 131 | { 132 | if (!dash) 133 | { 134 | if (controller.JoystickX() < -0.5f) 135 | { 136 | direction = -1; 137 | 138 | }else if (controller.JoystickX() > 0.5f) 139 | { 140 | direction = 1; 141 | } 142 | } 143 | 144 | sprite->flipSprite(direction < 0); 145 | sprite->Render(); 146 | } 147 | 148 | int Player::GetDirection() 149 | { 150 | return direction; 151 | } -------------------------------------------------------------------------------- /src/Player.h: -------------------------------------------------------------------------------- 1 | #ifndef _PLAYER_ 2 | #define _PLAYER_ 3 | 4 | //#include 5 | 6 | //#include "GameObject.h" 7 | #include "Animator.h" 8 | #include "Sprite.h" 9 | #include 10 | #include 11 | 12 | class Player : public Drawable 13 | { 14 | private : 15 | float moveSpeed; 16 | int direction; 17 | 18 | Animator *animation = NULL; 19 | Sprites *sprite = NULL; 20 | 21 | bool canJump = true; 22 | bool onGround = true; 23 | 24 | bool dash = false; 25 | float dashTimer = 0; 26 | float dashAmount = 0.3f; 27 | 28 | Vector gravity = Vector(0, 9.87f, 0, 1); 29 | Vector velocity; 30 | Vector curPos; 31 | public : 32 | Player(float x, float y, float speed);//:GameObject(x, y, size); 33 | ~Player(); 34 | 35 | void Update(); 36 | void Render(); 37 | int GetDirection(); 38 | }; 39 | 40 | #endif //_PLAYER_ -------------------------------------------------------------------------------- /src/PlayerAnimation.h: -------------------------------------------------------------------------------- 1 | #ifndef __PLAYERANIMATION__ 2 | #define __PLAYERANIMATION__ 3 | 4 | #include "Animator.h" 5 | #include "Sprite.h" 6 | 7 | static float animationSpeeds[]= 8 | { 9 | 0.045f, //idle 10 | 0.045f, //idleshoot 11 | 0.045f, //run 12 | 0.025f, //jump 13 | 0.045f, //dash 14 | 0.045f, //duck 15 | }; 16 | 17 | static Vector animationScales[]= 18 | { 19 | {0.09f,0.1f,0.0f,0.0f}, //idle 20 | {0.11f,0.1f,0.0f,0.0f}, //idleshot 21 | {0.12,0.12f,0.0f,0.0f}, //run 22 | {0.085f,0.085f,0.0f,0.0f}, //jump 23 | {0.12f,0.10f,0.0f,0.0f}, //dash 24 | {0.11f,0.11f,0.0f,0.0f}, //duck 25 | }; 26 | 27 | static animLimit_t animationLength[]= 28 | { 29 | {.length = 9, .clamp = false}, //IDLE; 30 | {.length = 3, .clamp = false}, //IDLESHOT; 31 | {.length = 16, .clamp = false}, //RUN; 32 | {.length = 8, .clamp = false}, //JUMP; 33 | {.length = 6, .clamp = false}, //DASH 34 | {.length = 3, .clamp = true }, //DUCK; 35 | }; 36 | 37 | static uv_t idleUV[]= 38 | { 39 | {.u = 0.000000, .v = 0.156250},{.u = 0.000000, .v = 0.000000}, 40 | {.u = 0.097656, .v = 0.156250},{.u = 0.097656, .v = 0.000000}, 41 | 42 | {.u = 0.097656, .v = 0.156250},{.u = 0.097656, .v = 0.000000}, 43 | {.u = 0.195312, .v = 0.156250},{.u = 0.195312, .v = 0.000000}, 44 | 45 | {.u = 0.195312, .v = 0.156250},{.u = 0.195312, .v = 0.000000}, 46 | {.u = 0.292969, .v = 0.156250},{.u = 0.292969, .v = 0.000000}, 47 | 48 | {.u = 0.292969, .v = 0.156250},{.u = 0.292969, .v = 0.000000}, 49 | {.u = 0.390625, .v = 0.156250},{.u = 0.390625, .v = 0.000000}, 50 | 51 | {.u = 0.390625, .v = 0.156250},{.u = 0.390625, .v = 0.000000}, 52 | {.u = 0.488281, .v = 0.156250},{.u = 0.488281, .v = 0.000000}, 53 | 54 | {.u = 0.292969, .v = 0.156250},{.u = 0.292969, .v = 0.000000}, 55 | {.u = 0.390625, .v = 0.156250},{.u = 0.390625, .v = 0.000000}, 56 | 57 | {.u = 0.195312, .v = 0.156250},{.u = 0.195312, .v = 0.000000}, 58 | {.u = 0.292969, .v = 0.156250},{.u = 0.292969, .v = 0.000000}, 59 | 60 | {.u = 0.097656, .v = 0.156250},{.u = 0.097656, .v = 0.000000}, 61 | {.u = 0.195312, .v = 0.156250},{.u = 0.195312, .v = 0.000000}, 62 | 63 | {.u = 0.000000, .v = 0.156250},{.u = 0.000000, .v = 0.000000}, 64 | {.u = 0.097656, .v = 0.156250},{.u = 0.097656, .v = 0.000000}, 65 | }; 66 | 67 | static uv_t idleShotUV[]= 68 | { 69 | {.u = 0.487997, .v = 0.156250},{.u = 0.487997, .v = 0.000000}, 70 | {.u = 0.614950, .v = 0.156250},{.u = 0.614950, .v = 0.000000}, 71 | 72 | {.u = 0.614950, .v = 0.156250},{.u = 0.614950, .v = 0.000000}, 73 | {.u = 0.741903, .v = 0.156250},{.u = 0.741903, .v = 0.000000}, 74 | 75 | {.u = 0.741903, .v = 0.156250},{.u = 0.741903, .v = 0.000000}, 76 | {.u = 0.868856, .v = 0.156250},{.u = 0.868856, .v = 0.000000}, 77 | }; 78 | 79 | static uv_t runUV[]= 80 | { 81 | {.u = 0.000000, .v = 0.412500},{.u = 0.000000, .v = 0.252500}, 82 | {.u = 0.146484, .v = 0.412500},{.u = 0.146484, .v = 0.252500}, 83 | 84 | {.u = 0.146484, .v = 0.412500},{.u = 0.146484, .v = 0.252500}, 85 | {.u = 0.292969, .v = 0.412500},{.u = 0.292969, .v = 0.252500}, 86 | 87 | {.u = 0.292969, .v = 0.412500},{.u = 0.292969, .v = 0.252500}, 88 | {.u = 0.439453, .v = 0.412500},{.u = 0.439453, .v = 0.252500}, 89 | 90 | {.u = 0.439453, .v = 0.412500},{.u = 0.439453, .v = 0.252500}, 91 | {.u = 0.585938, .v = 0.412500},{.u = 0.585938, .v = 0.252500}, 92 | 93 | {.u = 0.585938, .v = 0.412500},{.u = 0.585938, .v = 0.252500}, 94 | {.u = 0.732422, .v = 0.412500},{.u = 0.732422, .v = 0.252500}, 95 | 96 | {.u = 0.732422, .v = 0.412500},{.u = 0.732422, .v = 0.252500}, 97 | {.u = 0.878906, .v = 0.412500},{.u = 0.878906, .v = 0.252500}, 98 | 99 | {.u = 0.000000, .v = 0.568750},{.u = 0.000000, .v = 0.412500}, 100 | {.u = 0.146484, .v = 0.568750},{.u = 0.146484, .v = 0.412500}, 101 | 102 | {.u = 0.146484, .v = 0.568750},{.u = 0.146484, .v = 0.412500}, 103 | {.u = 0.292969, .v = 0.568750},{.u = 0.292969, .v = 0.412500}, 104 | 105 | {.u = 0.292969, .v = 0.568750},{.u = 0.292969, .v = 0.412500}, 106 | {.u = 0.439453, .v = 0.568750},{.u = 0.439453, .v = 0.412500}, 107 | 108 | {.u = 0.439453, .v = 0.568750},{.u = 0.439453, .v = 0.412500}, 109 | {.u = 0.585938, .v = 0.568750},{.u = 0.585938, .v = 0.412500}, 110 | 111 | {.u = 0.585938, .v = 0.568750},{.u = 0.585938, .v = 0.412500}, 112 | {.u = 0.732422, .v = 0.568750},{.u = 0.732422, .v = 0.412500}, 113 | 114 | {.u = 0.732422, .v = 0.568750},{.u = 0.732422, .v = 0.412500}, 115 | {.u = 0.878906, .v = 0.568750},{.u = 0.878906, .v = 0.412500}, 116 | 117 | {.u = 0.000000, .v = 0.718750},{.u = 0.000000, .v = 0.568750}, 118 | {.u = 0.146484, .v = 0.718750},{.u = 0.146484, .v = 0.568750}, 119 | 120 | {.u = 0.146484, .v = 0.718750},{.u = 0.146484, .v = 0.568750}, 121 | {.u = 0.292969, .v = 0.718750},{.u = 0.292969, .v = 0.568750}, 122 | 123 | {.u = 0.292969, .v = 0.718750},{.u = 0.292969, .v = 0.568750}, 124 | {.u = 0.439453, .v = 0.718750},{.u = 0.439453, .v = 0.568750}, 125 | 126 | {.u = 0.439453, .v = 0.718750},{.u = 0.439453, .v = 0.568750}, 127 | {.u = 0.585938, .v = 0.718750},{.u = 0.585938, .v = 0.568750}, 128 | }; 129 | 130 | static uv_t jumpUV[]= 131 | { 132 | {.u = 0.000000, .v = 0.255313},{.u = 0.000000, .v = 0.157656}, 133 | {.u = 0.097656, .v = 0.255313},{.u = 0.097656, .v = 0.157656}, 134 | 135 | {.u = 0.097656, .v = 0.255313},{.u = 0.097656, .v = 0.157656}, 136 | {.u = 0.195312, .v = 0.255313},{.u = 0.195312, .v = 0.157656}, 137 | 138 | {.u = 0.195312, .v = 0.255313},{.u = 0.195312, .v = 0.157656}, 139 | {.u = 0.292969, .v = 0.255313},{.u = 0.292969, .v = 0.157656}, 140 | 141 | {.u = 0.292969, .v = 0.255313},{.u = 0.292969, .v = 0.157656}, 142 | {.u = 0.390625, .v = 0.255313},{.u = 0.390625, .v = 0.157656}, 143 | 144 | {.u = 0.390625, .v = 0.255313},{.u = 0.390625, .v = 0.157656}, 145 | {.u = 0.488281, .v = 0.255313},{.u = 0.488281, .v = 0.157656}, 146 | 147 | {.u = 0.488281, .v = 0.255313},{.u = 0.488281, .v = 0.157656}, 148 | {.u = 0.585938, .v = 0.255313},{.u = 0.585938, .v = 0.157656}, 149 | 150 | {.u = 0.585938, .v = 0.255313},{.u = 0.585938, .v = 0.157656}, 151 | {.u = 0.683594, .v = 0.255313},{.u = 0.683594, .v = 0.157656}, 152 | 153 | {.u = 0.683594, .v = 0.255313},{.u = 0.683594, .v = 0.157656}, 154 | {.u = 0.781250, .v = 0.255313},{.u = 0.781250, .v = 0.157656}, 155 | 156 | {.u = 0.781250, .v = 0.255313},{.u = 0.781250, .v = 0.157656}, 157 | {.u = 0.878906, .v = 0.255313},{.u = 0.878906, .v = 0.157656}, 158 | }; 159 | 160 | static uv_t dashUV[]= 161 | { 162 | {.u = 0.000000, .v = 0.841313},{.u = 0.000000, .v = 0.724125}, 163 | {.u = 0.214844, .v = 0.841313},{.u = 0.214844, .v = 0.724125}, 164 | 165 | {.u = 0.214844, .v = 0.841313},{.u = 0.214844, .v = 0.724125}, 166 | {.u = 0.429688, .v = 0.841313},{.u = 0.429688, .v = 0.724125}, 167 | 168 | {.u = 0.429688, .v = 0.841313},{.u = 0.429688, .v = 0.724125}, 169 | {.u = 0.644531, .v = 0.841313},{.u = 0.644531, .v = 0.724125}, 170 | 171 | {.u = 0.000000, .v = 0.958313},{.u = 0.000000, .v = 0.841125}, 172 | {.u = 0.214844, .v = 0.958313},{.u = 0.214844, .v = 0.841125}, 173 | 174 | {.u = 0.214844, .v = 0.958313},{.u = 0.214844, .v = 0.841125}, 175 | {.u = 0.429688, .v = 0.958313},{.u = 0.429688, .v = 0.841125}, 176 | 177 | {.u = 0.429688, .v = 0.958313},{.u = 0.429688, .v = 0.841125}, 178 | {.u = 0.644531, .v = 0.958313},{.u = 0.644531, .v = 0.841125}, 179 | }; 180 | 181 | static uv_t duckUV[]= 182 | { 183 | {.u = 0.750906, .v = 0.745937},{.u = 0.750906, .v = 0.608750}, 184 | {.u = 0.926687, .v = 0.745937},{.u = 0.926687, .v = 0.608750}, 185 | 186 | {.u = 0.750906, .v = 0.863125},{.u = 0.750906, .v = 0.725937}, 187 | {.u = 0.926687, .v = 0.863125},{.u = 0.926687, .v = 0.725937}, 188 | 189 | {.u = 0.750906, .v = 0.960312},{.u = 0.750906, .v = 0.843125}, 190 | {.u = 0.926687, .v = 0.960312},{.u = 0.926687, .v = 0.843125}, 191 | }; 192 | 193 | #endif //__PLAYERANIMATION__ -------------------------------------------------------------------------------- /src/Renderer.cpp: -------------------------------------------------------------------------------- 1 | #include "Renderer.h" 2 | #include 3 | 4 | void Render::Init() 5 | { 6 | pvr_init_defaults(); 7 | pvr_set_bg_color(0.8f, 1.0f, 0.8f); 8 | } 9 | 10 | void Render::ShutDown() 11 | { 12 | pvr_mem_reset(); 13 | pvr_shutdown(); 14 | } 15 | 16 | void Render::TransparentBegin() 17 | { 18 | pvr_wait_ready(); 19 | pvr_scene_begin(); 20 | pvr_list_begin(PVR_LIST_TR_POLY); 21 | } 22 | 23 | void Render::OpequeBegin() 24 | { 25 | //maybe adding later 26 | } 27 | 28 | void Render::Finish() 29 | { 30 | pvr_scene_finish(); 31 | } -------------------------------------------------------------------------------- /src/Renderer.h: -------------------------------------------------------------------------------- 1 | #ifndef __RENDERER__ 2 | #define __RENDERER__ 3 | 4 | class Render 5 | { 6 | public: 7 | static void Init(); 8 | static void ShutDown(); 9 | static void TransparentBegin(); 10 | static void OpequeBegin(); 11 | static void Finish(); 12 | }; 13 | 14 | #endif //__RENDERER__ -------------------------------------------------------------------------------- /src/Sprite.cpp: -------------------------------------------------------------------------------- 1 | #include "Sprite.h" 2 | 3 | Sprites::Sprites(char *s) 4 | { 5 | printf("pvr vram: %d\n",pvr_mem_available()/1024); 6 | sheet = new Texture(s, true); 7 | sprite = new Banner(PVR_LIST_TR_POLY, sheet); 8 | printf("pvr vram: %d\n",pvr_mem_available()/1024); 9 | 10 | uv[0].u = 0; uv[0].v = 1; 11 | uv[1].u = 0; uv[1].v = 0; 12 | uv[2].u = 1; uv[2].v = 1; 13 | uv[3].u = 1; uv[3].v = 0; 14 | 15 | } 16 | 17 | Sprites::~Sprites() 18 | { 19 | delete sheet; 20 | delete sprite; 21 | } 22 | 23 | void Sprites::SetTranslate(Vector v) 24 | { 25 | sprite->setTranslate(v); 26 | } 27 | 28 | void Sprites::SetScale(Vector v) 29 | { 30 | sprite->setScale(v); 31 | } 32 | 33 | void Sprites::SetRotation(Vector v) //only obeys Z axis 34 | { 35 | sprite->setRotate(v); 36 | } 37 | 38 | void Sprites::setUV(uv_t *uv) 39 | { 40 | this->uv[0] = uv[0]; 41 | this->uv[1] = uv[1]; 42 | this->uv[2] = uv[2]; 43 | this->uv[3] = uv[3]; 44 | } 45 | 46 | void Sprites::flipSprite(bool flip) 47 | { 48 | if (flip) 49 | { 50 | sprite->setUV(uv[2].u, uv[2].v, 51 | uv[3].u, uv[3].v, 52 | uv[0].u, uv[0].v, 53 | uv[1].u, uv[1].v); 54 | }else{ 55 | sprite->setUV(uv[0].u, uv[0].v, 56 | uv[1].u, uv[1].v, 57 | uv[2].u, uv[2].v, 58 | uv[3].u, uv[3].v); 59 | } 60 | } 61 | 62 | void Sprites::Render() 63 | { 64 | sprite->draw(PVR_LIST_TR_POLY); 65 | } 66 | -------------------------------------------------------------------------------- /src/Sprite.h: -------------------------------------------------------------------------------- 1 | #ifndef _SPRITE_ 2 | #define _SPRITE_ 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | typedef struct 9 | { 10 | float u; 11 | float v; 12 | }uv_t; 13 | 14 | class Sprites 15 | { 16 | private: 17 | RefPtr sprite; 18 | RefPtr sheet; 19 | uv_t uv[4]; 20 | 21 | public: 22 | Sprites(char *s); 23 | ~Sprites(); 24 | 25 | void SetTranslate(Vector v); 26 | void SetScale(Vector v); 27 | void SetRotation(Vector v); //z axis and maybe 28 | 29 | void setUV(uv_t *uv); 30 | void flipSprite(bool flip); 31 | void Render(); 32 | }; 33 | 34 | #endif //_SPRITE_ -------------------------------------------------------------------------------- /src/StartScreen.h: -------------------------------------------------------------------------------- 1 | #ifndef __STARTSCREEN__ 2 | 3 | #include "Renderer.h" 4 | #include "Sprite.h" 5 | 6 | void IntroScreen() 7 | { 8 | Sprites *sprite = new Sprites("/rd/Sprite/StartScreen.png"); 9 | 10 | //move icon around 11 | sprite->SetTranslate(Vector(640/2, 480/2, 20)); 12 | sprite->SetScale(Vector(1.3f, 1.01f, 1)); 13 | 14 | Render::TransparentBegin(); 15 | sprite->Render(); 16 | Render::Finish(); 17 | } 18 | 19 | #endif //__STARTSCREEN__ -------------------------------------------------------------------------------- /src/Time.cpp: -------------------------------------------------------------------------------- 1 | #include "Time.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | /*limits for deltaTime*/ 8 | #define LOWDELTA 0.0167 9 | #define HIGHDELTA 0.1f 10 | 11 | /*worse code i have ever written*/ 12 | /*also fuck this shit i ain't using it */ 13 | 14 | static float timer; 15 | float dt = 0; 16 | uint64 lastFrame; 17 | uint64 begin, end; 18 | const int FPS = 30; 19 | const int frameDelay = 1000 / FPS; 20 | 21 | void Time::Init() 22 | { 23 | timer_prime(TMU0, 1, 1); 24 | timer_start(TMU0); 25 | } 26 | 27 | void Time::Update() 28 | { 29 | timer += 0.0212f; 30 | uint64 c = 1000/begin; 31 | dt = float(c - lastFrame); 32 | lastFrame = c; 33 | } 34 | 35 | float Time::time() 36 | { 37 | return timer; 38 | } 39 | 40 | float Time::deltaTime() 41 | { 42 | if (dt < LOWDELTA) {dt = LOWDELTA;} 43 | if(dt > HIGHDELTA) {dt = HIGHDELTA;} 44 | 45 | return dt; 46 | } 47 | 48 | void Time::StartFPStick() 49 | { 50 | begin = timer_ms_gettime64(); 51 | } 52 | 53 | void Time::EndFPStick() 54 | { 55 | end = timer_ms_gettime64(); 56 | } 57 | 58 | void Time::FPSlock() 59 | { 60 | uint64 fps = end - begin; 61 | if (frameDelay > fps) 62 | sleep((frameDelay-fps)/1000); 63 | } -------------------------------------------------------------------------------- /src/Time.h: -------------------------------------------------------------------------------- 1 | #ifndef __TIME_H__ 2 | #define __TIME_H__ 3 | 4 | class Time 5 | { 6 | public: 7 | static void Init(); 8 | static void Update(); 9 | static float time(); 10 | static float deltaTime(); 11 | static void StartFPStick(); 12 | static void EndFPStick(); 13 | static void FPSlock(); 14 | }; 15 | 16 | #endif //__TIME_H__ -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "Game.h" 4 | #include "Sprite.h" 5 | #include "Renderer.h" 6 | #include "Time.h" 7 | #include "Controller.h" 8 | #include "StartScreen.h" 9 | 10 | extern uint8 romdisk[]; 11 | KOS_INIT_FLAGS(INIT_DEFAULT); 12 | KOS_INIT_ROMDISK(romdisk); 13 | 14 | Controller controller; 15 | 16 | int main(int argc, char **argv) 17 | { 18 | Time::Init(); 19 | Render::Init(); 20 | 21 | IntroScreen(); 22 | 23 | Game::Start(); 24 | 25 | while (Game::Running()) 26 | { 27 | Time ::StartFPStick(); 28 | 29 | Time ::Update(); 30 | controller.UpdateControllerState(); 31 | Game ::Update(); 32 | 33 | Render::TransparentBegin(); 34 | Game ::Render(); 35 | Render::Finish(); 36 | 37 | Time ::deltaTime(); 38 | Time ::EndFPStick(); 39 | Time ::FPSlock(); 40 | } 41 | 42 | Game::End(); 43 | Render::ShutDown(); 44 | } -------------------------------------------------------------------------------- /src/romdisk/Sprite/Enemy/GoopeSheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/Enemy/GoopeSheet.png -------------------------------------------------------------------------------- /src/romdisk/Sprite/Level/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/Level/bg.png -------------------------------------------------------------------------------- /src/romdisk/Sprite/Level/fg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/Level/fg.png -------------------------------------------------------------------------------- /src/romdisk/Sprite/Player/playerSheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/Player/playerSheet.png -------------------------------------------------------------------------------- /src/romdisk/Sprite/StartScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/StartScreen.png -------------------------------------------------------------------------------- /src/romdisk/Sprite/shot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aionmagan/Cuphead_Dreamcast/c254c2538c345109475fb1ad371a2cfa3a59a511/src/romdisk/Sprite/shot.png --------------------------------------------------------------------------------