植物明星大乱斗5
能帮到你的话,就给个赞吧 😘
文章目录
- timer.h
- timer.cpp
- camera.h
- camera.cpp
- menuScene.cpp
timer.h
#pragma once
#include <functional>class Timer {public:void reStart();void setTimer(int timerMs);void setIsOneShot(bool isOneShot);void setCallback(const std::function<void()>& cb);
public:void setTimer(int timerMs, bool isOneShot, const std::function<void()>& cb);
public:void pause();void resume(); //恢复运行public:void update(int runTimeMs); //让定时器运行runTimeMsprivate:int timer = 0; //定时时间int time = 0; //计时器已经经过的时间bool isPause = false;bool isOneShot = false; //是否只计时一次bool isShotted = false; //是否触发std::function<void()> callback;
};
timer.cpp
#include "timer.h"void Timer::reStart(){time = 0;isShotted = false;
}void Timer::setTimer(int timerMs){this->timer = timerMs;
}void Timer::setIsOneShot(bool isOneShot){this->isOneShot = isOneShot;
}void Timer::setCallback(const std::function<void()>& cb){callback = cb;
}void Timer::setTimer(int timerMs, bool isOneShot, const std::function<void()>& cb){setTimer(timerMs);setIsOneShot(isOneShot);setCallback(cb);
}void Timer::pause(){isPause = true;
}void Timer::resume(){isPause = false;
}void Timer::update(int runTimeMs){if (isPause)return;time += runTimeMs; // 让定时器运行runTimeMsif (time >= timer) {if ((!isOneShot || isOneShot && !isShotted) && callback)callback();isShotted = true;time = 0;}
}
camera.h
#pragma once#include "vector2.h"
#include "timer.h"class Camera {public:void reset();const Vector2& getPostion() const;
public:void update(int runTimeMs); //让摄像机执行runTimeMsvoid shake(float shakingAmplitude, int shakingTimeMs);public:Camera();private:Vector2 pos;bool isShaking; //是否正在抖动float shakingAmplitude = 0; Timer shakeTimer;
};
camera.cpp
#include "camera.h"void Camera::reset(){pos.x = 0;pos.y = 0;
}void Camera::update(int runTimeMs){shakeTimer.update(runTimeMs);//设置以抖动幅度为半径的圆进行抖动if (isShaking) {pos.x = shakingAmplitude * ((rand() % 100 - 50) / 50.0f);pos.y = shakingAmplitude * ((rand() % 100 - 50) / 50.0f);}}void Camera::shake(float shakingAmplitude, int shakingTimeMs){isShaking = true;this->shakingAmplitude = shakingAmplitude;shakeTimer.setTimer(shakingTimeMs);shakeTimer.reStart();
}const Vector2& Camera::getPostion() const{return pos;
}Camera::Camera(){shakeTimer.setIsOneShot(true);shakeTimer.setCallback([&] {//取消抖动this->isShaking = false;//重置摄像机this->reset();});
}
menuScene.cpp
#include "menuScene.h"
#include <iostream>void MenuScene::enter(){//设置动画aniPeaShooterRunRight.setAnimation(&atlasPeaShooterRunRight, 75, true, [] {});//设置定时器timer.setTimer(5000, false, [] {std::cout << "shot" << std::endl;});}void MenuScene::receiveInput(const ExMessage& msg){if (msg.message == WM_KEYDOWN)camera.shake(20, 35000);
}void MenuScene::update(int runTimeMs){//让定时器运行runTimeMstimer.update(runTimeMs);//让摄像机运行runTimeMscamera.update(runTimeMs);aniPeaShooterRunRight.update(runTimeMs);
}void MenuScene::render(){auto cameraPos = camera.getPostion();aniPeaShooterRunRight.render(100 - cameraPos.x, 100 - cameraPos.y);
}void MenuScene::exit(){std::cout << "菜单场景退出" << std::endl;
}