Skip to content

Commit 839e67b

Browse files
committed
摄像机跟踪的寻路坦克
1 parent 2a0bada commit 839e67b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1185
-34
lines changed

application/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ add_subdirectory(chapter-29)
3131
add_subdirectory(chapter-30)
3232
add_subdirectory(chapter-31)
3333
add_subdirectory(chapter-32)
34-
add_subdirectory(chapter-33)
34+
add_subdirectory(chapter-33)
35+
add_subdirectory(chapter-34)
36+
add_subdirectory(chapter-35)

application/chapter-25/SpriteForwardState.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void SpriteForwardState::onEnter()
1414
return;
1515

1616
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
17-
auto spritePosition = sprite->getPosition();
17+
auto spritePosition = sprite->getCenter();
1818

1919
if(tileMap.expired())
2020
return;
@@ -39,7 +39,7 @@ void SpriteForwardState::onLeave()
3939

4040
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
4141
sprite->setVelocity(sf::Vector2f(0, 0));
42-
sprite->setPosition(targetPosition);
42+
sprite->setCenter(targetPosition);
4343

4444
std::shared_ptr<TileMap> tileMapPointer = tileMap.lock();
4545

@@ -55,7 +55,7 @@ void SpriteForwardState::update(float deltaTime)
5555
return;
5656

5757
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
58-
auto spritePosition = sprite->getPosition();
58+
auto spritePosition = sprite->getCenter();
5959

6060
float distance = distance2(targetPosition.x, targetPosition.y, spritePosition.x, spritePosition.y);
6161
if(distance < 2.0f)

application/chapter-25/SpriteForwardState.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <TileMap.h>
77
#include <Util.h>
88

9-
#define FORWARD_SPEED 2.0f
9+
#define FORWARD_SPEED 1.0f
1010

1111
class SpriteForwardState : public State
1212
{

application/chapter-25/SpriteIdleState.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ void SpriteIdleState::onEnter()
1717
void SpriteIdleState::onLeave()
1818
{
1919
// std::cout << "enter leave" << std::endl;
20-
21-
2220
}
2321

2422
void SpriteIdleState::update(float deltaTime)

application/chapter-25/SpriteRotateState.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <StateMachine.h>
77
#include <Util.h>
88

9-
#define ROTATE_SPEED 60.0f
9+
#define ROTATE_SPEED 24.0f
1010

1111
class SpriteTurnLeftState : public State
1212
{

application/chapter-25/WayFindingState.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <iostream>
12
#include "WayFindingTileVisitor.h"
23
#include "WayFindingState.h"
34

@@ -22,7 +23,7 @@ void WayFindingState::onEnter()
2223
else
2324
tank->makeTurnRight();
2425
} else {
25-
auto position = tank->getPosition();
26+
auto position = tank->getCenter();
2627
auto index = tileMapWeak.lock()->getTileIndexByWorldPosition(position.x, position.y);
2728
tileVisitor.lock()->compute(index);
2829
onEnter();
@@ -46,7 +47,7 @@ void WayFindingState::update(float deltaTime)
4647
std::optional<int> WayFindingState::getRotate()
4748
{
4849
auto tank = tankWeak.lock();
49-
auto position = tank->getPosition();
50+
auto position = tank->getCenter();
5051

5152
auto tileMap = tileMapWeak.lock();
5253
auto index = tileMap->getTileIndexByWorldPosition(position.x, position.y);

application/chapter-25/WayFindingTank.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ WayFindingTank::WayFindingTank(const std::string &image, float x, float y)
1717
setSize(size.x, size.y);
1818
}
1919

20-
void WayFindingTank::init(TileMapPointer tileMap)
20+
void WayFindingTank::init(TileMapPointer inputTileMap)
2121
{
22-
this->tileMap = tileMap;
22+
tileMap = inputTileMap;
2323

2424
tankStateMachine = std::make_shared<StateMachine>();
2525

2626
errorState = std::make_shared<SpriteErrorState>();
27-
idleState = std::make_shared<SpriteIdleState>(tileMap, shared_from_this());
28-
forwardState = std::make_shared<SpriteForwardState>(tileMap, shared_from_this());
27+
idleState = std::make_shared<SpriteIdleState>(inputTileMap, shared_from_this());
28+
forwardState = std::make_shared<SpriteForwardState>(inputTileMap, shared_from_this());
2929
turnLeftState = std::make_shared<SpriteTurnLeftState>(shared_from_this());
3030
turnRightState = std::make_shared<SpriteTurnRightState>(shared_from_this());
3131

@@ -79,7 +79,7 @@ std::shared_ptr<State> WayFindingTank::getCurrentState() const
7979

8080
bool WayFindingTank::shouldForward()
8181
{
82-
auto position = getPosition();
82+
auto position = getCenter();
8383
auto tileIndex = tileMap.lock()->getTileIndexByWorldPosition(position.x, position.y);
8484
int direction = getRotate();
8585
auto targetTileIndex = tileMap.lock()->getAdjacentTileByDirection(tileIndex.x, tileIndex.y,

application/chapter-25/WayFindingTileVisitor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "WayFindingTileVisitor.h"
2+
#include <iostream>
23

34
WayFindingTileVisitor::WayFindingTileVisitor(TileMapPointer inputTileMap)
45
{
@@ -8,7 +9,6 @@ WayFindingTileVisitor::WayFindingTileVisitor(TileMapPointer inputTileMap)
89

910
void WayFindingTileVisitor::compute(const sf::Vector2i &inputStart)
1011
{
11-
std::cout << inputStart.x << " ->" << inputStart.y << std::endl;
1212
start = inputStart;
1313

1414
blocks.clear();
@@ -21,7 +21,7 @@ void WayFindingTileVisitor::compute(const sf::Vector2i &inputStart)
2121
std::vector<uint32_t> output;
2222
int steps = shortestPathFinder->search(getIDByPosition(inputStart.x, inputStart.y),
2323
getIDByPosition(end.x,
24-
end.y), output);
24+
end.y), output);
2525
if (steps > 0) {
2626
auto itr = output.begin();
2727
while (itr != output.end()) {

application/chapter-32/main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class RectMapScene : public Scene, public TileVisitor
104104
}
105105
private:
106106
std::shared_ptr<TileMap> tileMap;
107+
sf::FloatRect tileMapArea;
107108
};
108109

109110
int main()
@@ -118,7 +119,7 @@ int main()
118119
Application::getInstance()->setWindow(window);
119120
auto camera = std::make_shared<Camera>();
120121
Application::getInstance()->addComponent(camera);
121-
camera->setArea(sf::FloatRect(0, 0, APP_SIZE.x, APP_SIZE.y));
122+
camera->setWindowArea(sf::FloatRect(0, 0, APP_SIZE.x, APP_SIZE.y));
122123

123124
auto scene = std::make_shared<RectMapScene>();
124125
auto sceneManager = std::make_shared<SceneManager>();

application/chapter-34/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
add_executable(chapter-34 main.cpp)
2+
target_link_libraries(chapter-34 framework sfml-audio sfml-system sfml-graphics sfml-window)

application/chapter-34/main.cpp

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#include <SFML/Graphics/RenderWindow.hpp>
2+
#include <Application.h>
3+
#include <Text.h>
4+
#include <Scene.h>
5+
#include <TileMap.h>
6+
#include <SoundManager.h>
7+
#include <Camera.h>
8+
#include <Util.h>
9+
#include <ResourceManager.h>
10+
#include <HelpListener.h>
11+
#include <Widget/Desktop.h>
12+
#include <Widget/TableLayout.h>
13+
#include <Widget/ImageBox.h>
14+
#include <Widget/Label.h>
15+
#include <Widget/Panel.h>
16+
#include <CameraTrackingObject.h>
17+
#include <iostream>
18+
19+
using namespace std;
20+
21+
#define APP_SIZE sf::Vector2f(960,720)
22+
23+
class MouseListener : public MessageListener
24+
{
25+
public:
26+
MouseListener(TileMapPointer map)
27+
{
28+
tileMap = map;
29+
}
30+
31+
bool onListener(std::shared_ptr<Message> message) override
32+
{
33+
if (message->getType() == Message_SFML) {
34+
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
35+
auto camera = Application::getInstance()->getComponent<Camera>();
36+
auto view = camera->getView();
37+
auto center = view.getCenter();
38+
center.x -= 5.0f;
39+
camera->setCenter(center);
40+
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
41+
auto camera = Application::getInstance()->getComponent<Camera>();
42+
auto view = camera->getView();
43+
auto center = view.getCenter();
44+
center.x += 5.0f;
45+
camera->setCenter(center);
46+
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
47+
auto camera = Application::getInstance()->getComponent<Camera>();
48+
auto view = camera->getView();
49+
auto center = view.getCenter();
50+
center.y -= 5.0f;
51+
camera->setCenter(center);
52+
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
53+
auto camera = Application::getInstance()->getComponent<Camera>();
54+
auto view = camera->getView();
55+
auto center = view.getCenter();
56+
center.y += 5.0f;
57+
camera->setCenter(center);
58+
} else if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
59+
auto mousePosition = sf::Mouse::getPosition(*Application::getInstance()->getWindow());
60+
sf::Vector2f position = Application::getInstance()->getWindow()->mapPixelToCoords(mousePosition);
61+
auto index = tileMap.lock()->getTileIndexByWorldPosition(position.x, position.y);
62+
auto tile = tileMap.lock()->getTileByIndex(index);
63+
if (tile) {
64+
tile->setFillColor(sf::Color::Blue);
65+
}
66+
}
67+
return true;
68+
}
69+
70+
return false;
71+
}
72+
private:
73+
std::weak_ptr<TileMap> tileMap;
74+
};
75+
76+
class RectMapScene : public Scene, public TileVisitor
77+
{
78+
public:
79+
RectMapScene()
80+
{
81+
tileMap = TileMap::createTileMap(TileMapType_Hex);
82+
tileMap->init(56, 44, 48);
83+
84+
addChild(tileMap);
85+
86+
setName("scene");
87+
88+
auto text = createToastText();
89+
text->setText(L"摄像机跟随", false);
90+
91+
auto cameraTracking = std::make_shared<CameraTrackingObject>();
92+
cameraTracking->setTarget(text);
93+
cameraTracking->setTargetPosition(sf::Vector2f(20, 20));
94+
95+
addChild(cameraTracking);
96+
97+
tileMap->setTextVisible(true);
98+
tileMap->accept(this);
99+
100+
Application::getInstance()->getComponent<Camera>()->setGlobalArea(tileMapArea);
101+
102+
auto mouseListener = std::make_shared<MouseListener>(tileMap);
103+
addMessageListener(mouseListener);
104+
}
105+
106+
void visit(uint32_t x, uint32_t y, std::shared_ptr<Tile> tile) override
107+
{
108+
(void)x, (void)y;
109+
tile->setScale(0.95f, 0.95f);
110+
tile->setVisible(true);
111+
tile->setFillColor(sf::Color(rand() % 250, rand() % 250, rand() % 250));
112+
113+
auto box = tile->getGlobalBounds();
114+
tileMapArea = expandRect(tileMapArea, box);
115+
}
116+
private:
117+
std::shared_ptr<TileMap> tileMap;
118+
sf::FloatRect tileMapArea;
119+
};
120+
121+
int main()
122+
{
123+
auto size = sf::Vector2f(APP_SIZE);
124+
auto setting = sf::ContextSettings();
125+
setting.antialiasingLevel = 12;
126+
auto window = std::make_shared<sf::RenderWindow>(sf::VideoMode(size.x, size.y), "Chapter-34",
127+
sf::Style::Close, setting);
128+
window->setVerticalSyncEnabled(true);
129+
130+
Application::getInstance()->setWindow(window);
131+
auto camera = std::make_shared<Camera>();
132+
Application::getInstance()->addComponent(camera);
133+
camera->setWindowArea(sf::FloatRect(0, 0, APP_SIZE.x, APP_SIZE.y));
134+
135+
auto scene = std::make_shared<RectMapScene>();
136+
auto sceneManager = std::make_shared<SceneManager>();
137+
sceneManager->addScene(scene);
138+
sceneManager->setInitialScene(scene);
139+
140+
Application::getInstance()->execute(sceneManager);
141+
return 0;
142+
}

application/chapter-35/CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
add_executable(chapter-35 main.cpp
3+
SpriteIdleState.h
4+
SpriteIdleState.cpp
5+
SpriteForwardState.h
6+
SpriteForwardState.cpp
7+
SpriteRotateState.h
8+
SpriteRotateState.cpp
9+
SpriteErrorState.h
10+
SpriteErrorState.cpp
11+
WayFindingScene.cpp
12+
WayFindingScene.h
13+
WayFindingTank.cpp
14+
WayFindingTank.h
15+
WayFindingTileVisitor.cpp
16+
WayFindingTileVisitor.h
17+
WayFindingState.cpp
18+
WayFindingState.h
19+
)
20+
21+
target_link_libraries(chapter-35 framework sfml-system sfml-graphics sfml-window)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include <MovingSprite.h>
2+
#include "MineSweeperScene.h"
3+
#include "SpriteAnimationState.h"
4+
5+
void SpriteAnimationState::onEnter()
6+
{
7+
if(getTarget().expired())
8+
return;
9+
10+
if(scene.expired())
11+
return;
12+
13+
auto tileMap = scene.lock()->getTileMap();
14+
auto sprite = std::dynamic_pointer_cast<Sprite>(getTarget().lock());
15+
auto spritePosition = sprite->getPosition();
16+
auto tileIndex = tileMap->getTileIndexByWorldPosition(spritePosition.x, spritePosition.y);
17+
tileID = getTileIDByPosition(tileIndex.x, tileIndex.y);
18+
19+
//animation->setPosition(sprite->getPosition().x * 0.5, 0.5 * sprite->getPosition().y);
20+
auto box = animation->getBoundingBox();
21+
animation->setPosition(box.width, box.height);
22+
sprite->addChild(animation);
23+
animation->start();
24+
}
25+
26+
void SpriteAnimationState::onLeave()
27+
{
28+
getTarget().lock()->removeChild(animation);
29+
if(scene.expired())
30+
return;
31+
}
32+
33+
void SpriteAnimationState::update(float deltaTime)
34+
{
35+
36+
}
37+
38+
AnimationPointer SpriteAnimationState::createAnimation()
39+
{
40+
std::vector<sf::IntRect> areas;
41+
42+
for(int i = 0; i < 6; i++) {
43+
auto area = sf::IntRect(i * 85, 0, 85, 85);
44+
areas.push_back(area);
45+
}
46+
47+
std::shared_ptr<Animation> animation = std::make_shared<Animation>();
48+
animation->setDurationPerFrame(0.2f);
49+
animation->setSingleShot(true);
50+
51+
animation->setBackgroundColor(sf::Color::White);
52+
animation->setTexture("../resource/images/blast2.png", areas);
53+
return animation;
54+
}

0 commit comments

Comments
 (0)