From 5e2536e4517c3f4041083c18b82b76598d805745 Mon Sep 17 00:00:00 2001
From: KosmX <kosmx.mc@gmail.com>
Date: Mon, 10 May 2021 17:48:33 +0200
Subject: [PATCH] issue with olc screen offset

---
 DungeonGenerator.h |  7 ++++++-
 Entity.cpp         |  2 +-
 TestGenerator.cpp  |  7 +++++--
 TestGenerator.h    |  2 +-
 mainGame.cpp       | 16 +++++++++++++---
 mainGame.h         |  3 +++
 6 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/DungeonGenerator.h b/DungeonGenerator.h
index ba83889..d100a2c 100644
--- a/DungeonGenerator.h
+++ b/DungeonGenerator.h
@@ -1,4 +1,9 @@
 #pragma once
+#include <memory>
+
+namespace entities {
+	class PlayerEntity;
+}
 
 class GameClient;
 
@@ -8,6 +13,6 @@ class GameClient;
 class DungeonGenerator
 {
 public:
-	virtual void generate(GameClient& client) = 0;
+	virtual std::shared_ptr<entities::PlayerEntity> generate(GameClient& client) = 0;
 };
 
diff --git a/Entity.cpp b/Entity.cpp
index ff0c886..8f54a5c 100644
--- a/Entity.cpp
+++ b/Entity.cpp
@@ -5,7 +5,7 @@ using namespace std;
 using namespace olc;
 
 // fine tuning the collision engine, the edges of a box won't collide
-const float ignoreDistance = 0.08f;
+const float ignoreDistance = 0.1f;
 
 namespace entities {
 	/*
diff --git a/TestGenerator.cpp b/TestGenerator.cpp
index ee0244d..e1dd538 100644
--- a/TestGenerator.cpp
+++ b/TestGenerator.cpp
@@ -8,7 +8,7 @@
 using namespace entities;
 using namespace std;
 
-void TestGenerator::generate(GameClient& client)
+shared_ptr<PlayerEntity> TestGenerator::generate(GameClient& client)
 {
 	auto* asd = new WallEntity({ -1, 0 });
 	//some random walls, just because why not???
@@ -19,5 +19,8 @@ void TestGenerator::generate(GameClient& client)
 	client += make_shared<WallEntity>(*new WallEntity(olc::vf2d(-1, -1)));
 	client += make_shared<WallEntity>(*asd);
 
-	client += make_shared<PlayerEntity>(*new PlayerEntity({ 0, -4 }, render::CharacterTexture::EngineerTexture));
+	shared_ptr<PlayerEntity> player(new PlayerEntity({ 0, -4 }, render::CharacterTexture::MageTexture));
+
+	client += player;
+	return player;
 }
diff --git a/TestGenerator.h b/TestGenerator.h
index dd534e9..a16fa5f 100644
--- a/TestGenerator.h
+++ b/TestGenerator.h
@@ -4,6 +4,6 @@ class TestGenerator :
     public DungeonGenerator
 {
 public:
-	void generate(GameClient& client) override;
+	std::shared_ptr<entities::PlayerEntity> generate(GameClient& client) override;
 };
 
diff --git a/mainGame.cpp b/mainGame.cpp
index 7f8c3a1..5c3678d 100644
--- a/mainGame.cpp
+++ b/mainGame.cpp
@@ -9,6 +9,9 @@ using namespace std;
 using namespace entities;
 using namespace olc;
 
+const float screenMoveScale = 8;
+const int worldToScreenScale = 16;
+
 GameClient& GameClient::createInstance(bool debug)
 {
 	instance = new GameClient(debug);
@@ -26,6 +29,12 @@ DynamicArray<std::shared_ptr<entities::Entity>>& GameClient::getEntities()
 	return this->entities;
 }
 
+void GameClient::updateWorldOffset(float dTick)
+{
+	vf2d delta = scene.GetWorldOffset() + this->GetScreenPixelSize()/2.f + vf2d(4, 0);
+	scene.MoveWorldOffset((player->getPos() - delta) * dTick * screenMoveScale);
+}
+
 GameClient& GameClient::getInstance()
 {
 	return *instance;
@@ -37,10 +46,10 @@ bool GameClient::OnUserCreate()
 	//Set resource parent!
 	render::ResourceManager::createInstance();
 
-	scene.Initialise(this->GetWindowSize(), {16, 16}); // uh. idk. maybe that's the best option
+	scene.Initialise(this->GetScreenPixelSize(), {worldToScreenScale, worldToScreenScale}); // uh. idk. maybe that's the best option
 	
 	TestGenerator generator;
-	generator.generate(*this);
+	player = generator.generate(*this);
 
 	
 	return true;
@@ -69,7 +78,8 @@ bool GameClient::OnUserUpdate(float fElapsedTime)
 			return !entity->isAlive();
 		});
 
-	scene.SetWorldOffset(this->viewArea);
+	this->updateWorldOffset(fElapsedTime);
+	
 	
 	for(auto& entity : entities){
 		// I literally add entities to the scene :D
diff --git a/mainGame.h b/mainGame.h
index 2a67543..aa0dd5d 100644
--- a/mainGame.h
+++ b/mainGame.h
@@ -3,6 +3,7 @@
 #include "DynamicArray.hpp"
 #include <memory>
 #include "Entity.h"
+#include "PlayerEntity.h"
 
 
 class GameClient :
@@ -17,6 +18,8 @@ private:
 	//olc::vf2d viewScale = {2, 2};
 	bool debug;
 	olc::TransformedView scene;
+	std::shared_ptr<entities::PlayerEntity>	player;
+	void updateWorldOffset(float dTick);
 public:
 	static GameClient& getInstance();
 
-- 
GitLab