Compare commits
3 Commits
787b25239e
...
4a9d85ba1c
Author | SHA1 | Date | |
---|---|---|---|
4a9d85ba1c | |||
d186b948a7 | |||
900504971b |
15
camera.cpp
15
camera.cpp
@ -1,4 +1,5 @@
|
|||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "maths.h"
|
#include "maths.h"
|
||||||
#include "level.h"
|
#include "level.h"
|
||||||
@ -54,22 +55,12 @@ void camera_destroy(Camera *camera)
|
|||||||
|
|
||||||
static void castRays(Camera* camera)
|
static void castRays(Camera* camera)
|
||||||
{
|
{
|
||||||
float rayDirection = 0;
|
|
||||||
float rayDirectionStep = camera->fov / (float)camera->resolution;
|
float rayDirectionStep = camera->fov / (float)camera->resolution;
|
||||||
bool isOddResolution = (camera->resolution % 2);
|
float rayDirection = camera->direction - camera->fov/2.f + rayDirectionStep/2.f;
|
||||||
float rayDirectionOffset = isOddResolution? 0 : rayDirectionStep / 2.f;
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < camera->resolution; i++) {
|
for (unsigned int i = 0; i < camera->resolution; i++) {
|
||||||
if (isOddResolution && i == 0)
|
|
||||||
rayDirection = camera->direction;
|
|
||||||
else if (i % 2)
|
|
||||||
rayDirection = camera->direction - rayDirectionOffset;
|
|
||||||
else
|
|
||||||
rayDirection = camera->direction + rayDirectionOffset;
|
|
||||||
|
|
||||||
camera->rays[i].direction = rayDirection;
|
camera->rays[i].direction = rayDirection;
|
||||||
camera->rays[i].distance = level_rayCastDistance(camera->pos, rayDirection);
|
camera->rays[i].distance = level_rayCastDistance(camera->pos, rayDirection);
|
||||||
|
|
||||||
if ((i + isOddResolution) % 2) rayDirectionOffset += rayDirectionStep;
|
rayDirection += rayDirectionStep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,16 +20,32 @@ int firstperson_init(unsigned int _width, unsigned int _height)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void firstperson_update(sf::RenderTarget* renderTarget)
|
void firstperson_update(sf::RenderTarget* renderTarget, Camera* camera)
|
||||||
{
|
{
|
||||||
|
const float columnWidth = (float)width/(float)camera->resolution;
|
||||||
|
float columnHeight = 0;
|
||||||
renderTexture.clear();
|
renderTexture.clear();
|
||||||
sf::CircleShape shape(50);
|
|
||||||
renderTexture.draw(shape);
|
|
||||||
renderTexture.display();
|
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < camera->resolution; i++) {
|
||||||
|
float distance = camera->rays[i].distance;
|
||||||
|
if (distance > 0.f) columnHeight = 0.5f * (float)height/camera->rays[i].distance;
|
||||||
|
|
||||||
|
float centeredHeight = (float)height/2.f - columnHeight/2.f;
|
||||||
|
float distanceScale = distance/10.f;
|
||||||
|
distanceScale = (distanceScale > 1.f)? 1.f : distanceScale;
|
||||||
|
float brightness = 255.f*(1.f-distanceScale);
|
||||||
|
|
||||||
|
sf::RectangleShape rectangle(sf::Vector2f(columnWidth, columnHeight));
|
||||||
|
rectangle.setPosition(sf::Vector2f(i*columnWidth, centeredHeight));
|
||||||
|
rectangle.setFillColor(sf::Color(brightness, brightness, brightness));
|
||||||
|
renderTexture.draw(rectangle);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTexture.display();
|
||||||
sf::Sprite sprite(renderTexture.getTexture());
|
sf::Sprite sprite(renderTexture.getTexture());
|
||||||
sprite.setPosition(renderTexturePosition);
|
sprite.setPosition(renderTexturePosition);
|
||||||
renderTarget->draw(sprite);
|
renderTarget->draw(sprite);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void firstperson_setTexturePosition(float x, float y)
|
void firstperson_setTexturePosition(float x, float y)
|
||||||
|
@ -2,9 +2,10 @@
|
|||||||
#define FIRSTPERSON_H
|
#define FIRSTPERSON_H
|
||||||
|
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include "camera.h"
|
||||||
|
|
||||||
int firstperson_init(unsigned int width, unsigned int height);
|
int firstperson_init(unsigned int width, unsigned int height);
|
||||||
void firstperson_update(sf::RenderTarget* renderTarget);
|
void firstperson_update(sf::RenderTarget* renderTarget, Camera* camera);
|
||||||
void firstperson_setTexturePosition(float x, float y);
|
void firstperson_setTexturePosition(float x, float y);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
19
level.cpp
19
level.cpp
@ -2,18 +2,23 @@
|
|||||||
|
|
||||||
#include "maths.h"
|
#include "maths.h"
|
||||||
|
|
||||||
#define WIDTH 5
|
#define WIDTH 10
|
||||||
#define HEIGHT 5
|
#define HEIGHT 10
|
||||||
|
|
||||||
static float castRay(sf::Vector2f point, float direction);
|
static float castRay(sf::Vector2f point, float direction);
|
||||||
static void getGridIndex(sf::Vector2f point, int* x, int* y);
|
static void getGridIndex(sf::Vector2f point, int* x, int* y);
|
||||||
|
|
||||||
static unsigned int level[WIDTH * HEIGHT] = {
|
static unsigned int level[WIDTH * HEIGHT] = {
|
||||||
0, 0, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
0, 0, 0, 0, 0,
|
1, 1, 1, 0, 0, 0, 0, 0, 1, 1,
|
||||||
1, 0, 1, 0, 1,
|
1, 1, 1, 0, 0, 0, 0, 1, 0, 1,
|
||||||
1, 0, 0, 0, 1,
|
1, 0, 0, 1, 0, 0, 0, 0, 0, 1,
|
||||||
1, 0, 1, 1, 1,
|
1, 0, 0, 1, 0, 0, 0, 1, 0, 1,
|
||||||
|
1, 0, 0, 1, 0, 0, 0, 0, 0, 1,
|
||||||
|
1, 0, 0, 1, 0, 0, 0, 1, 0, 1,
|
||||||
|
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
|
||||||
|
1, 0, 0, 1, 0, 0, 0, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
int level_init()
|
int level_init()
|
||||||
|
6
view.cpp
6
view.cpp
@ -7,7 +7,7 @@
|
|||||||
#include "minimap.h"
|
#include "minimap.h"
|
||||||
#include "firstperson.h"
|
#include "firstperson.h"
|
||||||
|
|
||||||
#define MINIMAP_SIZE 460
|
#define MINIMAP_SIZE 720
|
||||||
#define VIEW_SIZE MINIMAP_SIZE*2
|
#define VIEW_SIZE MINIMAP_SIZE*2
|
||||||
|
|
||||||
static int handleKeyCode(sf::Keyboard::Key key);
|
static int handleKeyCode(sf::Keyboard::Key key);
|
||||||
@ -21,7 +21,7 @@ static sf::Clock timer;
|
|||||||
int view_init()
|
int view_init()
|
||||||
{
|
{
|
||||||
printf("view_init()\n");
|
printf("view_init()\n");
|
||||||
if (!camera_init(&camera, sf::Vector2f(5.f/2.f, 5.f/2.f), 0.f, 100, 0.5f*PI)) return 0;
|
if (!camera_init(&camera, sf::Vector2f(10.f/2.f, 10.f/2.f), 0.f, 128, 0.5f*PI)) return 0;
|
||||||
if (!minimap_init(MINIMAP_SIZE)) return 0;
|
if (!minimap_init(MINIMAP_SIZE)) return 0;
|
||||||
if (!firstperson_init(VIEW_SIZE, MINIMAP_SIZE)) return 0;
|
if (!firstperson_init(VIEW_SIZE, MINIMAP_SIZE)) return 0;
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ int view_update()
|
|||||||
|
|
||||||
window.clear();
|
window.clear();
|
||||||
minimap_update(&window, &camera);
|
minimap_update(&window, &camera);
|
||||||
firstperson_update(&window);
|
firstperson_update(&window, &camera);
|
||||||
window.display();
|
window.display();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user