Now the sprites are rendered in the 3d scene with just SFML sprites.
This commit is contained in:
parent
da7075864b
commit
ad38f575a3
5 changed files with 49 additions and 41 deletions
BIN
assets/armored_knight_1-256.png
Normal file
BIN
assets/armored_knight_1-256.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 59 KiB |
|
@ -41,6 +41,7 @@ Raycaster::Raycaster(sf::RenderWindow& window, Matrix &map, int width, int heigh
|
||||||
$view_sprite.setPosition({0, 0});
|
$view_sprite.setPosition({0, 0});
|
||||||
$pixels = make_unique<RGBA[]>($width * $height);
|
$pixels = make_unique<RGBA[]>($width * $height);
|
||||||
$textures.load_textures();
|
$textures.load_textures();
|
||||||
|
$view_texture.setSmooth(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Raycaster::set_position(int x, int y) {
|
void Raycaster::set_position(int x, int y) {
|
||||||
|
@ -111,11 +112,21 @@ void Raycaster::sprite_casting() {
|
||||||
// calculate width the the sprite
|
// calculate width the the sprite
|
||||||
// same as height of sprite, given that it's square
|
// same as height of sprite, given that it's square
|
||||||
int spriteWidth = abs(int($height / transformY)) / sprite_rec.uDiv;
|
int spriteWidth = abs(int($height / transformY)) / sprite_rec.uDiv;
|
||||||
|
|
||||||
int drawStartX = -spriteWidth / 2 + spriteScreenX;
|
int drawStartX = -spriteWidth / 2 + spriteScreenX;
|
||||||
if(drawStartX < 0) drawStartX = 0;
|
if(drawStartX < 0) drawStartX = 0;
|
||||||
int drawEndX = spriteWidth / 2 + spriteScreenX;
|
int drawEndX = spriteWidth / 2 + spriteScreenX;
|
||||||
if(drawEndX > $width) drawEndX = $width;
|
if(drawEndX > $width) drawEndX = $width;
|
||||||
|
|
||||||
|
int stripe = drawStartX;
|
||||||
|
for(; stripe < drawEndX; stripe++) {
|
||||||
|
//the conditions in the if are:
|
||||||
|
//1) it's in front of camera plane so you don't see things behind you
|
||||||
|
//2) ZBuffer, with perpendicular distance
|
||||||
|
if(!(transformY > 0 && transformY < ZBuffer[stripe])) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int texX_end = int(256 * (stripe - (-spriteWidth / 2 + spriteScreenX)) * textureWidth / spriteWidth) / 256;
|
||||||
|
|
||||||
if(drawStartX < drawEndX && transformY > 0 && transformY < ZBuffer[drawStartX]) {
|
if(drawStartX < drawEndX && transformY > 0 && transformY < ZBuffer[drawStartX]) {
|
||||||
int vMoveScreen = int(sprite_rec.elevation * -1 / transformY);
|
int vMoveScreen = int(sprite_rec.elevation * -1 / transformY);
|
||||||
|
@ -125,18 +136,18 @@ void Raycaster::sprite_casting() {
|
||||||
int drawEndY = spriteHeight / 2 + $height / 2 + vMoveScreen;
|
int drawEndY = spriteHeight / 2 + $height / 2 + vMoveScreen;
|
||||||
if(drawEndY >= $height) drawEndY = $height - 1;
|
if(drawEndY >= $height) drawEndY = $height - 1;
|
||||||
|
|
||||||
|
int texX = int(256 * (drawStartX - (-spriteWidth / 2 + spriteScreenX)) * textureWidth / spriteWidth) / 256;
|
||||||
|
|
||||||
float x = float(drawStartX + RAY_VIEW_X);
|
float x = float(drawStartX + RAY_VIEW_X);
|
||||||
float y = float(drawStartY + RAY_VIEW_Y);
|
float y = float(drawStartY + RAY_VIEW_Y);
|
||||||
float sprite_w = float(spriteWidth) / float(textureWidth);
|
float sprite_w = float(spriteWidth) / float(textureWidth);
|
||||||
float sprite_h = float(spriteHeight) / float(textureHeight);
|
float sprite_h = float(spriteHeight) / float(textureHeight);
|
||||||
int texX = int(256 * (drawStartX - (-spriteWidth / 2 + spriteScreenX)) * textureWidth / spriteWidth) / 256;
|
|
||||||
int texX_end = int(256 * (drawEndX - (-spriteWidth / 2 + spriteScreenX)) * textureWidth / spriteWidth) / 256;
|
|
||||||
|
|
||||||
int d = (y - vMoveScreen) * 256 - $height * 128 + spriteHeight * 128;
|
int d = (y - vMoveScreen) * 256 - $height * 128 + spriteHeight * 128;
|
||||||
int texY = ((d * textureHeight) / spriteHeight) / 256;
|
int texY = ((d * textureHeight) / spriteHeight) / 256;
|
||||||
|
|
||||||
sf_sprite->setScale({sprite_h, sprite_w});
|
sf_sprite->setScale({sprite_w, sprite_h});
|
||||||
sf_sprite->setTextureRect(sf::IntRect({texX, texY}, {texX_end, textureHeight}));
|
sf_sprite->setTextureRect(sf::IntRect({texX, texY}, {texX_end - texX, textureHeight}));
|
||||||
sf_sprite->setPosition({x, y});
|
sf_sprite->setPosition({x, y});
|
||||||
$window.draw(*sf_sprite);
|
$window.draw(*sf_sprite);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2004-2020, Lode Vandevenne
|
Copyright (c) 2004-2020, Lode Vandevenne
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -30,9 +30,9 @@
|
||||||
using namespace QuickCG;
|
using namespace QuickCG;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
g++ *.cpp -lSDL -O3 -W -Wall -ansi -pedantic
|
g++ *.cpp -lSDL -O3 -W -Wall -ansi -pedantic
|
||||||
g++ *.cpp -lSDL
|
g++ *.cpp -lSDL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define screenWidth 640
|
#define screenWidth 640
|
||||||
|
@ -135,14 +135,14 @@ int main(int /*argc*/, char */*argv*/[])
|
||||||
|
|
||||||
//load some textures
|
//load some textures
|
||||||
unsigned long tw, th, error = 0;
|
unsigned long tw, th, error = 0;
|
||||||
error |= loadImage(texture[0], tw, th, "assets/eagle.png");
|
error |= loadImage(texture[0], tw, th, "pics/eagle.png");
|
||||||
error |= loadImage(texture[1], tw, th, "assets/redbrick.png");
|
error |= loadImage(texture[1], tw, th, "pics/redbrick.png");
|
||||||
error |= loadImage(texture[2], tw, th, "assets/purplestone.png");
|
error |= loadImage(texture[2], tw, th, "pics/purplestone.png");
|
||||||
error |= loadImage(texture[3], tw, th, "assets/greystone.png");
|
error |= loadImage(texture[3], tw, th, "pics/greystone.png");
|
||||||
error |= loadImage(texture[4], tw, th, "assets/bluestone.png");
|
error |= loadImage(texture[4], tw, th, "pics/bluestone.png");
|
||||||
error |= loadImage(texture[5], tw, th, "assets/mossy.png");
|
error |= loadImage(texture[5], tw, th, "pics/mossy.png");
|
||||||
error |= loadImage(texture[6], tw, th, "assets/wood.png");
|
error |= loadImage(texture[6], tw, th, "pics/wood.png");
|
||||||
error |= loadImage(texture[7], tw, th, "assets/colorstone.png");
|
error |= loadImage(texture[7], tw, th, "pics/colorstone.png");
|
||||||
if(error) { std::cout << "error loading images" << std::endl; return 1; }
|
if(error) { std::cout << "error loading images" << std::endl; return 1; }
|
||||||
|
|
||||||
//load some sprite textures
|
//load some sprite textures
|
||||||
|
@ -335,11 +335,7 @@ int main(int /*argc*/, char */*argv*/[])
|
||||||
for(int i = 0; i < numSprites; i++)
|
for(int i = 0; i < numSprites; i++)
|
||||||
{
|
{
|
||||||
spriteOrder[i] = i;
|
spriteOrder[i] = i;
|
||||||
spriteDistance[i] =
|
spriteDistance[i] = ((posX - sprite[i].x) * (posX - sprite[i].x) + (posY - sprite[i].y) * (posY - sprite[i].y)); //sqrt not taken, unneeded
|
||||||
((posX - sprite[i].x) *
|
|
||||||
(posX - sprite[i].x) +
|
|
||||||
(posY - sprite[i].y) *
|
|
||||||
(posY - sprite[i].y)); //sqrt not taken, unneeded
|
|
||||||
}
|
}
|
||||||
sortSprites(spriteOrder, spriteDistance, numSprites);
|
sortSprites(spriteOrder, spriteDistance, numSprites);
|
||||||
|
|
||||||
|
@ -363,9 +359,9 @@ int main(int /*argc*/, char */*argv*/[])
|
||||||
int spriteScreenX = int((w / 2) * (1 + transformX / transformY));
|
int spriteScreenX = int((w / 2) * (1 + transformX / transformY));
|
||||||
|
|
||||||
//parameters for scaling and moving the sprites
|
//parameters for scaling and moving the sprites
|
||||||
#define uDiv 1
|
#define uDiv 1
|
||||||
#define vDiv 1
|
#define vDiv 1
|
||||||
#define vMove 0.0
|
#define vMove 0.0
|
||||||
int vMoveScreen = int(vMove / transformY);
|
int vMoveScreen = int(vMove / transformY);
|
||||||
|
|
||||||
//calculate height of the sprite on screen
|
//calculate height of the sprite on screen
|
||||||
|
|
|
@ -29,7 +29,8 @@ void TexturePack::load_textures() {
|
||||||
floor = load_image(assets["floor"]);
|
floor = load_image(assets["floor"]);
|
||||||
ceiling = load_image(assets["ceiling"]);
|
ceiling = load_image(assets["ceiling"]);
|
||||||
|
|
||||||
sf::Texture* sprite_texture = new sf::Texture("assets/undead_peasant-256.png");
|
sf::Texture* sprite_texture = new sf::Texture("assets/evil_eye_test-256.png");
|
||||||
|
sprite_texture->setSmooth(false);
|
||||||
sf::Sprite* sf_sprite = new sf::Sprite(*sprite_texture);
|
sf::Sprite* sf_sprite = new sf::Sprite(*sprite_texture);
|
||||||
|
|
||||||
sprites.push_back({4.0, 3.55, 6, sf_sprite, sprite_texture});
|
sprites.push_back({4.0, 3.55, 6, sf_sprite, sprite_texture});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue