Skip to content

Commit ade7bd9

Browse files
committed
增加Fps组建,增加小地图组建
其他修改
1 parent 839e67b commit ade7bd9

34 files changed

+1133
-23
lines changed

application/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ add_subdirectory(chapter-31)
3333
add_subdirectory(chapter-32)
3434
add_subdirectory(chapter-33)
3535
add_subdirectory(chapter-34)
36-
add_subdirectory(chapter-35)
36+
add_subdirectory(chapter-35)
37+
add_subdirectory(chapter-36)

application/chapter-19/MineSweeperScene.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ MineSweeperScene::MineSweeperScene()
1414
addMessageListener(listener);
1515

1616
tileMap = TileMap::createTileMap(TileMapType_Hex);
17-
tileMap->init(18, 12, 36);
17+
tileMap->init(20, 14, 64);
1818
tileMap->setTextVisible(true);
1919

2020
addChild(tileMap);

application/chapter-19/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;
@@ -40,7 +40,7 @@ void SpriteForwardState::onLeave()
4040

4141
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
4242
sprite->setVelocity(sf::Vector2f(0, 0));
43-
sprite->setPosition(targetPosition);
43+
sprite->setCenter(targetPosition);
4444
}
4545

4646
void SpriteForwardState::update(float deltaTime)
@@ -51,7 +51,7 @@ void SpriteForwardState::update(float deltaTime)
5151
return;
5252

5353
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
54-
auto spritePosition = sprite->getPosition();
54+
auto spritePosition = sprite->getCenter();
5555

5656
float distance = distance2(targetPosition.x, targetPosition.y, spritePosition.x, spritePosition.y);
5757
if(distance < 1.0f)

application/chapter-19/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ int main()
2020
auto size = sf::Vector2f(900, 720);
2121
auto setting = sf::ContextSettings();
2222
setting.antialiasingLevel = 12;
23-
auto window = std::make_shared<sf::RenderWindow>(sf::VideoMode(size.x, size.y), "Chapter-14",
23+
auto window = std::make_shared<sf::RenderWindow>(sf::VideoMode(size.x, size.y), "Chapter-19",
2424
sf::Style::Close, setting);
2525
window->setVerticalSyncEnabled(true);
2626

application/chapter-35/SpriteForwardState.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ void SpriteForwardState::update(float deltaTime)
5858
auto spritePosition = sprite->getCenter();
5959

6060
float distance = distance2(targetPosition.x, targetPosition.y, spritePosition.x, spritePosition.y);
61-
if(distance < 2.0f)
61+
if(distance < 3.0f)
6262
setFinished();
6363
}

application/chapter-35/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 24.0f
9+
#define ROTATE_SPEED 18.0f
1010

1111
class SpriteTurnLeftState : public State
1212
{

application/chapter-36/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-36 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-36 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+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
#include <Animation.h>
3+
#include <StateMachine.h>
4+
5+
class WayFindingScene;
6+
7+
class SpriteAnimationState : public State
8+
{
9+
public:
10+
SpriteAnimationState(std::shared_ptr<WayFindingScene> inputScene, ObjectPointer inputSprite):
11+
State(inputSprite),
12+
scene(inputScene)
13+
{
14+
animation = createAnimation();
15+
auto fn = std::bind(&SpriteAnimationState::onFinished, this);
16+
animation->finished.connect(fn);
17+
}
18+
public:
19+
void onEnter() override;
20+
void onLeave() override;
21+
void update(float deltaTime) override;
22+
private:
23+
void onFinished()
24+
{
25+
setFinished();
26+
}
27+
28+
AnimationPointer createAnimation();
29+
private:
30+
std::shared_ptr<Animation> animation;
31+
std::weak_ptr<WayFindingScene> scene;
32+
uint32_t tileID;
33+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include "SpriteErrorState.h"
2+
3+
SpriteErrorState::SpriteErrorState()
4+
{
5+
setName("error");
6+
}
7+
8+
void SpriteErrorState::update(float deltaTime)
9+
{
10+
(void)deltaTime;
11+
}
12+
13+
void SpriteErrorState::onEnter()
14+
{
15+
}
16+
17+
void SpriteErrorState::onLeave()
18+
{
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
#include <StateMachine.h>
3+
4+
class SpriteErrorState final : public State
5+
{
6+
public:
7+
SpriteErrorState();
8+
public:
9+
void update(float deltaTime) override;
10+
private:
11+
void onEnter() override;
12+
void onLeave() override;
13+
};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <Util.h>
2+
#include "SpriteForwardState.h"
3+
4+
SpriteForwardState::SpriteForwardState(std::shared_ptr<TileMap> inputTileMap, ObjectPointer inputSprite):
5+
State(inputSprite),
6+
tileMap(inputTileMap)
7+
{
8+
setName("forward");
9+
}
10+
11+
void SpriteForwardState::onEnter()
12+
{
13+
if(getTarget().expired())
14+
return;
15+
16+
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
17+
auto spritePosition = sprite->getCenter();
18+
19+
if(tileMap.expired())
20+
return;
21+
22+
auto tileMapPointer = tileMap.lock();
23+
auto tileIndex = tileMapPointer->getTileIndexByWorldPosition(spritePosition.x, spritePosition.y);
24+
std::optional<sf::Vector2i> option = tileMap.lock()->getAdjacentTileByDirection(tileIndex.x, tileIndex.y, (TileDirection)(int)sprite->getRotate());
25+
if(option.has_value()) {
26+
tileIndex = option.value();
27+
auto tile = tileMapPointer->getTileByIndex(tileIndex.x, tileIndex.y);
28+
targetPosition = tile->getPosition();
29+
30+
auto diffPosition = targetPosition - spritePosition;
31+
sprite->setVelocity(sf::Vector2f(diffPosition.x * FORWARD_SPEED, diffPosition.y * FORWARD_SPEED));
32+
}
33+
34+
lastDistance = std::numeric_limits<float>::max();
35+
}
36+
37+
void SpriteForwardState::onLeave()
38+
{
39+
if(getTarget().expired())
40+
return;
41+
42+
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
43+
sprite->setVelocity(sf::Vector2f(0, 0));
44+
sprite->setCenter(targetPosition);
45+
46+
std::shared_ptr<TileMap> tileMapPointer = tileMap.lock();
47+
48+
auto tile = tileMapPointer->getTileIndexByWorldPosition(targetPosition.x, targetPosition.y);
49+
tileMapPointer->getTileByIndex(tile)->setFillColor(sf::Color(120, 180, 120, 120));
50+
}
51+
52+
void SpriteForwardState::update(float deltaTime)
53+
{
54+
(void)deltaTime;
55+
56+
if(getTarget().expired())
57+
return;
58+
59+
auto sprite = std::dynamic_pointer_cast<MovingSprite>(getTarget().lock());
60+
auto spritePosition = sprite->getCenter();
61+
62+
float distance = distance2(targetPosition.x, targetPosition.y, spritePosition.x, spritePosition.y);
63+
if(distance <= lastDistance)
64+
lastDistance = distance;
65+
else {
66+
sprite->setCenter(targetPosition);
67+
setFinished();
68+
}
69+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
#include <cmath>
3+
#include <optional>
4+
#include <MovingSprite.h>
5+
#include <StateMachine.h>
6+
#include <TileMap.h>
7+
#include <Util.h>
8+
9+
#define FORWARD_SPEED 3.0f
10+
11+
class SpriteForwardState : public State
12+
{
13+
public:
14+
SpriteForwardState(std::shared_ptr<TileMap> inputTileMap, ObjectPointer inputSprite);
15+
public:
16+
void onEnter() override;
17+
void onLeave() override;
18+
void update(float deltaTime) override;
19+
private:
20+
std::weak_ptr<TileMap> tileMap;
21+
sf::Vector2f targetPosition;
22+
float lastDistance = 0;
23+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "SpriteIdleState.h"
2+
3+
SpriteIdleState::SpriteIdleState(std::shared_ptr<TileMap> inputTileMap,
4+
ObjectPointer inputTank):
5+
State(inputTank)
6+
{
7+
setName("idle");
8+
tileMapWeak = inputTileMap;
9+
tankWeak = std::dynamic_pointer_cast<WayFindingTank>(inputTank);
10+
}
11+
12+
void SpriteIdleState::onEnter()
13+
{
14+
//std::cout << "enter idel" << std::endl;
15+
}
16+
17+
void SpriteIdleState::onLeave()
18+
{
19+
// std::cout << "enter leave" << std::endl;
20+
}
21+
22+
void SpriteIdleState::update(float deltaTime)
23+
{
24+
(void)deltaTime;
25+
setFinished();
26+
}
27+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
#include <StateMachine.h>
3+
#include <TileMap.h>
4+
#include "WayFindingTank.h"
5+
6+
class WayFindingTank;
7+
class SpriteIdleState : public State
8+
{
9+
public:
10+
SpriteIdleState() = delete;
11+
SpriteIdleState(std::shared_ptr<TileMap> inputTileMap, ObjectPointer inputTank);
12+
public:
13+
void onEnter() override;
14+
void onLeave() override;
15+
void update(float deltaTime) override;
16+
private:
17+
std::weak_ptr<TileMap> tileMapWeak;
18+
std::weak_ptr<WayFindingTank> tankWeak;
19+
};

0 commit comments

Comments
 (0)