God beta (quite cool)
This commit is contained in:
parent
bc03a21b2e
commit
1af32bafd8
@ -1,4 +1,4 @@
|
||||
nom du joueur ecran 100*100 sans efacé le reste
|
||||
nom du joueur ecran 100*100 sans effacer le reste
|
||||
le joueur est gros
|
||||
basevector a change en variable x
|
||||
projectile style fusée
|
||||
|
16
config.yml
16
config.yml
@ -19,9 +19,9 @@ players:
|
||||
|
||||
# Enemies config
|
||||
invaders:
|
||||
fireCooldown: 0
|
||||
size: 40
|
||||
speed: 10
|
||||
fireCooldown: 20
|
||||
size: 25
|
||||
speed: 2
|
||||
distance: 10 # distance in pixels between invaders
|
||||
|
||||
typeA:
|
||||
@ -39,14 +39,16 @@ invaders:
|
||||
projectiles:
|
||||
missiles:
|
||||
color: yellow
|
||||
speed: 100
|
||||
speed: 10
|
||||
width: 10
|
||||
torpedos:
|
||||
color: green
|
||||
speed: 10
|
||||
width: 10
|
||||
|
||||
# Grid definition
|
||||
# You can add more rows, make rows longer and add spaces
|
||||
grid:
|
||||
- "AAAAAAAA"
|
||||
# - "B BBBBBBBB"
|
||||
# - " CCCCCCCC"
|
||||
- "AAAAAAAAAAAA"
|
||||
- "BBBBBBBBBBBB"
|
||||
- "CCCCCCCCCCCC"
|
||||
|
@ -29,12 +29,14 @@ public:
|
||||
|
||||
|
||||
// we do not use a Position because it is used for pixel X and Y
|
||||
unsigned throwedInvPosX;
|
||||
unsigned throwedInvPosY;
|
||||
unsigned thrownInvPosX;
|
||||
unsigned thrownInvPosY;
|
||||
InvaderType thrownInvType;
|
||||
Position thrownVector;
|
||||
Position thrownTransition;
|
||||
|
||||
Position getLeftHandPos(unsigned screenWidth) const;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -59,10 +59,10 @@ public:
|
||||
void askPlayerNameMenu(playerID pID, string& name) const;
|
||||
|
||||
// y will be negative sometimes, so not unsigned
|
||||
void displayGodBench(int y) const;
|
||||
void drawGodBench(int y) const;
|
||||
|
||||
void displayGodRightHand(const Position& pos, bool closed=false) const;
|
||||
void displayGodLeftHand(const Position& pos, bool closed=false) const;
|
||||
void drawGodRightHand(const Position& pos, bool closed= false) const;
|
||||
void drawGodLeftHand(const Position& pos, bool closed= false) const;
|
||||
|
||||
private:
|
||||
// Explanation for choices :
|
||||
|
@ -34,10 +34,13 @@ public:
|
||||
size_t getOutterInvader() const;
|
||||
};
|
||||
typedef vector<InvadersColumn> InvadersGrid;
|
||||
typedef nsGraphics::Vec2D Position; // in case we need to ad dmore methods, we defined our own type
|
||||
typedef nsGraphics::Vec2D Position; // TODO replace with Vec2D ?
|
||||
typedef unsigned playerID; // 0 for player 1, 1 for player 2
|
||||
|
||||
// didn't want to use Position because of the semantic with x and y
|
||||
bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2);
|
||||
|
||||
// change draw position for a specified size (keeps the same center)
|
||||
void applyTransformation(Position& pos, unsigned sizeFrom, unsigned sizeTo);
|
||||
|
||||
#endif
|
@ -64,45 +64,67 @@ void Game::displayGod() const {
|
||||
return;
|
||||
case GodState::AWAKE: {
|
||||
unsigned dividedCounter = god.counter/1;
|
||||
pm.displayGodBench(dividedCounter - GOD_BENCH_SIZE);
|
||||
pm.drawGodBench(dividedCounter - GOD_BENCH_SIZE);
|
||||
|
||||
Position leftHand(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, dividedCounter-GOD_BENCH_SIZE);
|
||||
Position rightHand(GOD_HAND_DISTANCE, dividedCounter-GOD_BENCH_SIZE);
|
||||
pm.displayGodLeftHand(leftHand);
|
||||
pm.displayGodRightHand(rightHand);
|
||||
pm.drawGodLeftHand(leftHand);
|
||||
pm.drawGodRightHand(rightHand);
|
||||
break;
|
||||
}
|
||||
case GodState::WAIT:{
|
||||
pm.displayGodBench(0);
|
||||
pm.drawGodBench(0);
|
||||
|
||||
Position leftHand(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, 0);
|
||||
Position rightHand(GOD_HAND_DISTANCE, 0);
|
||||
pm.displayGodLeftHand(leftHand);
|
||||
pm.displayGodRightHand(rightHand);
|
||||
Position leftHand(GOD_HAND_DISTANCE, 0);
|
||||
Position rightHand(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, 0);
|
||||
pm.drawGodLeftHand(leftHand);
|
||||
pm.drawGodRightHand(rightHand);
|
||||
break;
|
||||
}
|
||||
case GodState::RETRIEVE1:
|
||||
case GodState::RETRIEVE2:{
|
||||
// Bezier curve
|
||||
// counter goes [0-100]
|
||||
pm.displayGodBench(0);
|
||||
pm.drawGodBench(0);
|
||||
pm.drawGodLeftHand(Position(GOD_HAND_DISTANCE, 0));
|
||||
|
||||
Position pos(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, 0);
|
||||
Position endPos = invIndexToPos(god.throwedInvPosX, god.throwedInvPosY);
|
||||
Position endPos = invIndexToPos(god.thrownInvPosX, god.thrownInvPosY);
|
||||
|
||||
applyBezier(pos, god.thrownTransition, god.counter / 100.0);
|
||||
applyBezier(pos, endPos, god.counter / 100.0);
|
||||
cout << pos << endl;
|
||||
|
||||
// pos is now the position we need to draw our hand to
|
||||
pm.displayGodLeftHand(Position(GOD_HAND_DISTANCE, 0));
|
||||
pm.displayGodRightHand(pos);
|
||||
pm.drawGodRightHand(pos);
|
||||
// TODO remove "closed" arg
|
||||
if(god.state==GodState::RETRIEVE2){
|
||||
// TODO maybe a little transition to pos to better reflect the invader's position ?
|
||||
pos+=Position(GOD_HAND_SIZE/2, GOD_HAND_SIZE/2);
|
||||
pos-=Position(confData.invadersSize/2, confData.invadersSize/2);
|
||||
displayInvader(pos, god.thrownInvType);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GodState::THROW:{
|
||||
pm.drawGodBench(0);
|
||||
pm.drawGodLeftHand(Position(GOD_HAND_DISTANCE, 0));
|
||||
|
||||
// compute start position (not sure if we should store it or compute it each time ?)
|
||||
Position handPos = god.getLeftHandPos(pm.getScreenWidth());
|
||||
|
||||
Position invaderPos = handPos;
|
||||
applyTransformation(invaderPos, GOD_HAND_SIZE, confData.invadersSize);
|
||||
Position a = god.thrownVector * (god.counter / 100.0);
|
||||
invaderPos = invaderPos + a;
|
||||
|
||||
displayInvader(invaderPos, god.thrownInvType);
|
||||
if(god.counter>60){
|
||||
// handling hand retraction
|
||||
unsigned handCounter;
|
||||
if(god.counter>30)handCounter = 30-god.counter;
|
||||
else handCounter = god.counter;
|
||||
handPos = handPos + god.thrownVector * (handCounter / 100.0);
|
||||
pm.drawGodRightHand(handPos);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -84,12 +84,13 @@ WinValue Game::playGame(){ // returns when game is finished
|
||||
basePos = Position(200, 0);
|
||||
// GAMELOOP
|
||||
|
||||
#define MAX_FPS 60
|
||||
const int MAX_FPS = 60;
|
||||
|
||||
chrono::milliseconds fpsTime;
|
||||
unsigned tmpFps = 0;
|
||||
unsigned fps = 0;
|
||||
while(window.isOpen()){
|
||||
|
||||
chrono::time_point startTime = chrono::high_resolution_clock::now();
|
||||
|
||||
pm.startFrame();
|
||||
|
@ -5,51 +5,105 @@ void Game::awakeGod() {
|
||||
god.state = GodState::AWAKE;
|
||||
}
|
||||
|
||||
void Game::manageGod(){
|
||||
switch(god.state){
|
||||
case GodState::NONE:{
|
||||
void Game::manageGod() {
|
||||
switch (god.state) {
|
||||
case GodState::NONE: {
|
||||
break;
|
||||
}
|
||||
case GodState::AWAKE:{
|
||||
if(god.counter==GOD_BENCH_SIZE*1){
|
||||
case GodState::AWAKE: {
|
||||
if (god.counter == GOD_BENCH_SIZE) {
|
||||
god.counter = 0;
|
||||
god.state = GodState::WAIT;
|
||||
}else ++god.counter;
|
||||
} else ++god.counter;
|
||||
break;
|
||||
}
|
||||
case GodState::WAIT: {
|
||||
if (god.counter == 50) {
|
||||
cout << "init throw" << endl;
|
||||
// init throw
|
||||
god.counter = 0;
|
||||
god.state = GodState::RETRIEVE1;
|
||||
god.throwedInvPosX = rand() % grid.size();
|
||||
god.throwedInvPosY = rand() % grid[0].size();
|
||||
god.thrownInvPosX = rand() % grid.size();
|
||||
god.thrownInvPosY = rand() % grid[0].size();
|
||||
|
||||
god.thrownInvType = grid[god.throwedInvPosX][god.throwedInvPosY];
|
||||
god.thrownInvType = grid[god.thrownInvPosX][god.thrownInvPosY];
|
||||
|
||||
god.thrownTransition.setX(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE);
|
||||
god.thrownTransition.setY(basePos.getY()+INV_GET_POS(god.throwedInvPosY));
|
||||
god.thrownTransition.setX(pm.getScreenWidth() - GOD_HAND_DISTANCE - GOD_HAND_SIZE);
|
||||
god.thrownTransition.setY(basePos.getY() + INV_GET_POS(god.thrownInvPosY));
|
||||
} else ++god.counter;
|
||||
break;
|
||||
}
|
||||
case GodState::RETRIEVE1:{
|
||||
if(god.counter==100){
|
||||
grid[god.throwedInvPosX][god.throwedInvPosY] = InvaderType::NONE;
|
||||
case GodState::RETRIEVE1: {
|
||||
if (god.counter == 100) {
|
||||
grid[god.thrownInvPosX][god.thrownInvPosY] = InvaderType::NONE;
|
||||
updateColumns();
|
||||
god.state = GodState::RETRIEVE2;
|
||||
}else ++god.counter;
|
||||
} else god.counter += 2;
|
||||
break;
|
||||
}
|
||||
case GodState::RETRIEVE2:{
|
||||
if(god.counter==0){
|
||||
case GodState::RETRIEVE2: {
|
||||
if (god.counter == 0) {
|
||||
god.state = GodState::THROW;
|
||||
}else --god.counter;
|
||||
god.counter = 0;
|
||||
|
||||
// compute the launch vector
|
||||
|
||||
Position invaderMiddlePos(pm.getScreenWidth() - GOD_HAND_DISTANCE - GOD_HAND_SIZE / 2,
|
||||
GOD_HAND_SIZE / 2);
|
||||
|
||||
playerID target;
|
||||
if (players.size() == 1)target = 0; // don't want to use random if not needed
|
||||
else target = rand() % players.size();
|
||||
Position playerMiddlePos(players[target].x + confData.playersWidth / 2,
|
||||
pm.getScreenWidth() - PLAYER_HEIGHT / 2);
|
||||
|
||||
god.thrownVector = playerMiddlePos - invaderMiddlePos;
|
||||
god.thrownVector = god.thrownVector / (god.thrownVector.computeMagnitude() / 1000.0);
|
||||
// let's normalize it, but keep it's length big so x and y and non-zero
|
||||
// We will divide it in display
|
||||
} else god.counter -= 2;
|
||||
break;
|
||||
}
|
||||
case GodState::THROW:{
|
||||
cout << "FROM NOW ON ANYTHING CAN HAPPEN" << endl;
|
||||
break;
|
||||
case GodState::THROW: {
|
||||
++god.counter;
|
||||
|
||||
|
||||
Position invaderPos = god.getLeftHandPos(pm.getScreenWidth());
|
||||
applyTransformation(invaderPos, GOD_HAND_SIZE, confData.invadersSize);
|
||||
Position a = god.thrownVector * (god.counter / 100.0);
|
||||
invaderPos = invaderPos + a;
|
||||
|
||||
bool touched = false;
|
||||
|
||||
// check if OOB (Out Of Bounds)
|
||||
if (invaderPos.getY() >= pm.getScreenWidth() &&
|
||||
(invaderPos.getX() < 0 || invaderPos.getX() + confData.invadersSize >= pm.getScreenWidth())) {
|
||||
touched = true;
|
||||
// check player collision
|
||||
} else if (invaderPos.getY() + confData.invadersSize >= pm.getScreenWidth() - PLAYER_HEIGHT) {
|
||||
for (Player &p: players) {
|
||||
if (areLinesColliding(
|
||||
p.x, p.x + confData.playersWidth,
|
||||
invaderPos.getX(), invaderPos.getX() + confData.invadersSize
|
||||
)) {
|
||||
// TODO manage player death
|
||||
touched = true;
|
||||
// do not break, the other player also deserves to be hit
|
||||
}
|
||||
}
|
||||
}
|
||||
if (touched){
|
||||
god.state = GodState::WAIT;
|
||||
god.counter = 0;
|
||||
}
|
||||
/*
|
||||
* we do not need to reset other members, they'll be treated as non-initialized
|
||||
* When we cycle back between states
|
||||
*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Position God::getLeftHandPos(unsigned screenWidth) const {
|
||||
return Position(screenWidth - GOD_HAND_DISTANCE - GOD_HAND_SIZE, GOD_HAND_SIZE);
|
||||
}
|
@ -96,11 +96,11 @@ void PixelManager::endFrame() const {
|
||||
window.finishFrame();
|
||||
}
|
||||
|
||||
void PixelManager::displayGodBench(int y) const {
|
||||
void PixelManager::drawGodBench(int y) const {
|
||||
window << Rectangle(Position(0, y), Position(getScreenWidth(), y+GOD_BENCH_SIZE), nsGraphics::KGray);
|
||||
}
|
||||
|
||||
void PixelManager::displayGodRightHand(const Position& pos, bool closed) const {
|
||||
void PixelManager::drawGodRightHand(const Position& pos, bool closed) const {
|
||||
if(closed){
|
||||
drawSprite(rightHandClosed, pos);
|
||||
}else{
|
||||
@ -108,7 +108,7 @@ void PixelManager::displayGodRightHand(const Position& pos, bool closed) const {
|
||||
}
|
||||
}
|
||||
|
||||
void PixelManager::displayGodLeftHand(const Position& pos, bool closed) const {
|
||||
void PixelManager::drawGodLeftHand(const Position& pos, bool closed) const {
|
||||
if(closed){
|
||||
drawSprite(leftHandClosed, pos);
|
||||
}else{
|
||||
|
@ -16,3 +16,8 @@ size_t InvadersColumn::getOutterInvader() const {
|
||||
}
|
||||
return size();
|
||||
}
|
||||
|
||||
void applyTransformation(Position& pos, unsigned sizeFrom, unsigned sizeTo){
|
||||
pos += Position(sizeFrom/2, sizeFrom/2);
|
||||
pos -= Position(sizeTo/2, sizeTo/2);
|
||||
}
|
Loading…
Reference in New Issue
Block a user