Skip to content

Commit d1eabd1

Browse files
committed
add first lines of sokoban02
1 parent 74fff4d commit d1eabd1

20 files changed

+457
-0
lines changed

01-beginner/code/template01.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <gf/Color.h>
2+
#include <gf/Event.h>
3+
#include <gf/RenderWindow.h>
4+
#include <gf/Window.h>
5+
6+
int main() {
7+
gf::Window window("sokoban01", { 800, 600 });
8+
gf::RenderWindow renderer(window);
9+
10+
renderer.clear(gf::Color::White);
11+
12+
while (window.isOpen()) {
13+
gf::Event event;
14+
15+
while (window.pollEvent(event)) {
16+
switch (event.type) {
17+
case gf::EventType::Closed:
18+
window.close();
19+
break;
20+
}
21+
}
22+
23+
renderer.clear();
24+
renderer.display();
25+
}
26+
27+
}

02-intermediate/CMakeLists.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
3+
project(SOKOBAN02
4+
VERSION 0.1.0
5+
LANGUAGES CXX
6+
)
7+
8+
include(GNUInstallDirs)
9+
10+
find_package(gf REQUIRED COMPONENTS graphics)
11+
12+
set(SOKOBAN_DATA_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/games/sokoban")
13+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/code/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY)
14+
15+
add_executable(sokoban02
16+
code/sokoban02.cc
17+
code/bits/Boxes.cc
18+
code/bits/Hero.cc
19+
code/bits/Level.cc
20+
)
21+
22+
target_include_directories(sokoban02
23+
PRIVATE
24+
${CMAKE_CURRENT_BINARY_DIR}
25+
)
26+
27+
target_link_libraries(sokoban02
28+
PRIVATE
29+
gf::graphics
30+
)
31+
32+
install(
33+
TARGETS sokoban02
34+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
35+
)
36+
37+
install(
38+
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/sokoban"
39+
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/games"
40+
)
41+

02-intermediate/code/bits/Boxes.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "Boxes.h"
2+
3+
namespace skb {
4+
5+
void Boxes::update(gf::Time time) {
6+
7+
}
8+
9+
void Boxes::render(gf::RenderTarget& target, const gf::RenderStates& states) {
10+
11+
}
12+
13+
}
14+

02-intermediate/code/bits/Boxes.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef SKB_BOXES_H
2+
#define SKB_BOXES_H
3+
4+
#include <gf/Entity.h>
5+
6+
namespace skb {
7+
8+
class Boxes : public gf::Entity {
9+
public:
10+
11+
void update(gf::Time time) override;
12+
void render(gf::RenderTarget& target, const gf::RenderStates& states) override;
13+
14+
};
15+
16+
}
17+
18+
#endif // SKB_BOXES_H

02-intermediate/code/bits/Hero.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "Hero.h"
2+
3+
namespace skb {
4+
5+
void Hero::update(gf::Time time) {
6+
7+
}
8+
9+
void Hero::render(gf::RenderTarget& target, const gf::RenderStates& states) {
10+
11+
}
12+
13+
}
14+

02-intermediate/code/bits/Hero.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef SKB_HERO_H
2+
#define SKB_HERO_H
3+
4+
#include <gf/Entity.h>
5+
6+
namespace skb {
7+
8+
class Hero : public gf::Entity {
9+
public:
10+
11+
void update(gf::Time time) override;
12+
void render(gf::RenderTarget& target, const gf::RenderStates& states) override;
13+
14+
};
15+
16+
}
17+
18+
#endif // SKB_HERO_H

02-intermediate/code/bits/Level.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "Level.h"
2+
3+
namespace skb {
4+
5+
void Level::update(gf::Time time) {
6+
7+
}
8+
9+
void Level::render(gf::RenderTarget& target, const gf::RenderStates& states) {
10+
11+
}
12+
13+
}
14+

02-intermediate/code/bits/Level.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef SKB_LEVEL_H
2+
#define SKB_LEVEL_H
3+
4+
#include <gf/Entity.h>
5+
6+
namespace skb {
7+
8+
class Level : public gf::Entity {
9+
public:
10+
11+
void update(gf::Time time) override;
12+
void render(gf::RenderTarget& target, const gf::RenderStates& states) override;
13+
14+
};
15+
16+
}
17+
18+
#endif // SKB_HERO_H

02-intermediate/code/config.h.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef CONFIG_H
2+
#define CONFIG_H
3+
4+
#define SOKOBAN_DATA_DIR "@SOKOBAN_DATA_DIR@"
5+
6+
#endif // CONFIG_H

02-intermediate/code/sokoban02.cc

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#include <gf/Action.h>
2+
#include <gf/Clock.h>
3+
#include <gf/Color.h>
4+
#include <gf/EntityContainer.h>
5+
#include <gf/Event.h>
6+
#include <gf/RenderWindow.h>
7+
#include <gf/ResourceManager.h>
8+
#include <gf/ViewContainer.h>
9+
#include <gf/Views.h>
10+
#include <gf/Window.h>
11+
12+
#include "bits/Hero.h"
13+
14+
#include "config.h"
15+
16+
int main() {
17+
static constexpr gf::Vector2i ScreenSize(800, 600);
18+
static constexpr gf::Vector2f ViewSize(100.0f, 100.0f);
19+
static constexpr gf::Vector2f ViewCenter(0.0f, 0.0f);
20+
21+
// initialization
22+
23+
gf::Window window("sokoban02", ScreenSize);
24+
window.setVerticalSyncEnabled(true);
25+
window.setFramerateLimit(60);
26+
27+
gf::RenderWindow renderer(window);
28+
29+
// ressources
30+
31+
gf::ResourceManager resources;
32+
resources.addSearchDir(SOKOBAN_DATA_DIR);
33+
34+
// views
35+
36+
gf::ViewContainer views;
37+
38+
gf::ExtendView mainView(ViewCenter, ViewSize);
39+
views.addView(mainView);
40+
41+
gf::ScreenView hudView;
42+
views.addView(hudView);
43+
44+
views.setInitialFramebufferSize(ScreenSize);
45+
46+
// actions
47+
48+
gf::ActionContainer actions;
49+
50+
gf::Action closeWindowAction("Close window");
51+
closeWindowAction.addCloseControl();
52+
closeWindowAction.addKeycodeKeyControl(gf::Keycode::Escape);
53+
actions.addAction(closeWindowAction);
54+
55+
gf::Action fullscreenAction("Fullscreen");
56+
fullscreenAction.addKeycodeKeyControl(gf::Keycode::F);
57+
actions.addAction(fullscreenAction);
58+
59+
gf::Action leftAction("Left");
60+
leftAction.addScancodeKeyControl(gf::Scancode::A);
61+
leftAction.addScancodeKeyControl(gf::Scancode::Left);
62+
actions.addAction(leftAction);
63+
64+
gf::Action rightAction("Right");
65+
rightAction.addScancodeKeyControl(gf::Scancode::D);
66+
rightAction.addScancodeKeyControl(gf::Scancode::Right);
67+
actions.addAction(rightAction);
68+
69+
gf::Action upAction("Up");
70+
upAction.addScancodeKeyControl(gf::Scancode::W);
71+
upAction.addScancodeKeyControl(gf::Scancode::Up);
72+
actions.addAction(upAction);
73+
74+
gf::Action downAction("Down");
75+
downAction.addScancodeKeyControl(gf::Scancode::S);
76+
downAction.addScancodeKeyControl(gf::Scancode::Down);
77+
actions.addAction(downAction);
78+
79+
// entities
80+
81+
gf::EntityContainer mainEntities;
82+
// add entities to mainEntities
83+
84+
skb::Hero hero;
85+
mainEntities.addEntity(hero);
86+
87+
gf::EntityContainer hudEntities;
88+
// add entities to hudEntities
89+
90+
// game loop
91+
92+
renderer.clear(gf::Color::White);
93+
94+
gf::Clock clock;
95+
96+
while (window.isOpen()) {
97+
// 1. input
98+
99+
gf::Event event;
100+
101+
while (window.pollEvent(event)) {
102+
actions.processEvent(event);
103+
views.processEvent(event);
104+
}
105+
106+
if (closeWindowAction.isActive()) {
107+
window.close();
108+
}
109+
110+
if (fullscreenAction.isActive()) {
111+
window.toggleFullscreen();
112+
}
113+
114+
if (rightAction.isActive()) {
115+
// do something
116+
} else if (leftAction.isActive()) {
117+
// do something
118+
} else if (upAction.isActive()) {
119+
// do something
120+
} else if (downAction.isActive()) {
121+
// do something
122+
} else {
123+
// do something
124+
}
125+
126+
127+
// 2. update
128+
129+
gf::Time time = clock.restart();
130+
mainEntities.update(time);
131+
hudEntities.update(time);
132+
133+
134+
// 3. draw
135+
136+
renderer.clear();
137+
138+
renderer.setView(mainView);
139+
mainEntities.render(renderer);
140+
141+
renderer.setView(hudView);
142+
hudEntities.render(renderer);
143+
144+
renderer.display();
145+
146+
actions.reset();
147+
}
148+
149+
return 0;
150+
}

0 commit comments

Comments
 (0)