-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
174 lines (151 loc) · 5.55 KB
/
Copy pathmain.cpp
File metadata and controls
174 lines (151 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// A Simple Raycaster
// Written in C++ with SDL2
#include <SDL2/SDL.h>
#include <iostream>
#include <cmath>
// Fensterabmessungen
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
// SDL-Variablen
SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
// Spielerposition und Blickwinkel
float playerX = 10.0f;
float playerY = 10.0f;
float playerAngle = 0.0f;
// Karte (0: leerer Raum, 1: Wand)
const int MAP_WIDTH = 12;
const int MAP_HEIGHT = 12;
int map[MAP_WIDTH][MAP_HEIGHT] = {
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,2,2,0,0,0,0,1},
{1,0,0,0,0,3,3,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
// Initialisiert SDL und erstellt das Fenster und Renderer
bool initSDL() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "SDL initialization failed: " << SDL_GetError() << std::endl;
return false;
}
window = SDL_CreateWindow("Simple Raycaster", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "Window creation failed: " << SDL_GetError() << std::endl;
return false;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
std::cerr << "Renderer creation failed: " << SDL_GetError() << std::endl;
return false;
}
return true;
}
// Zeichnet die Szene
void drawScene() {
int FOV=M_PI /3.0
;
int col=0;
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 100, 100, 255, 255);
SDL_Rect Celing={0,0,WINDOW_WIDTH,WINDOW_HEIGHT/2};
SDL_RenderFillRect(renderer,&Celing);
SDL_SetRenderDrawColor(renderer, 80, 0, 0, 255);
SDL_Rect Ground={0,WINDOW_HEIGHT/2,WINDOW_WIDTH,WINDOW_HEIGHT};
SDL_RenderFillRect(renderer,&Ground);
// Durchlaufe die vertikalen Bildschirmspalten
for (int x = 0; x < WINDOW_WIDTH; x++) {
// Berechne den Winkel des aktuellen Strahls
float rayAngle = (playerAngle - FOV / 2.0f) + ((float)x / WINDOW_WIDTH) * FOV;
float distanceToWall = 0.0f;
bool hitWall = false;
bool boundary = false;
float wallX=0.0f;
// Bewege den Strahl, bis eine Wand getroffen wird
while (!hitWall && distanceToWall < 20.0f) {
distanceToWall += 0.1f;
int testX = (int)(playerX + distanceToWall * std::cos(rayAngle));
int testY = (int)(playerY + distanceToWall * std::sin(rayAngle));
int mapX=static_cast<int>(testX);
int mapY=static_cast<int>(testY);
if (testX < 0 || testX >= MAP_WIDTH || testY < 0 || testY >= MAP_HEIGHT) {
hitWall = true; // Außerhalb der Karte
} else {
if (map[testX][testY] > 0) {
hitWall = true;
col=map[testX][testY];
// Überprüfe, ob der Strahl eine Wandkante trifft
float wallDistance = std::sqrt((testX - playerX) * (testX - playerX) + (testY - playerY) * (testY - playerY));
boundary = (wallDistance < 0.5f);
wallX=testX-mapX;
}
}
}
// Berechne die Wandhöhe auf dem Bildschirm
int wallHeight = WINDOW_HEIGHT / distanceToWall;
Uint8 shade=0;
if (wallX> 0.5f)
shade/=2;
// Zeichne die Wand
if (col==1){
shade= static_cast<Uint8>(255-distanceToWall*15);
SDL_SetRenderDrawColor(renderer, shade, shade, shade, 255);}
if (col==2){
shade= static_cast<Uint8>(255-distanceToWall*15);
SDL_SetRenderDrawColor(renderer, shade, 0, 0, 255);}
if (col==3){
shade= static_cast<Uint8>(255-distanceToWall*15);
SDL_SetRenderDrawColor(renderer, 0, shade, 0, 255);}
SDL_RenderDrawLine(renderer, x, (WINDOW_HEIGHT - wallHeight) / 2, x, (WINDOW_HEIGHT + wallHeight) / 2);
if (boundary) {
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderDrawPoint(renderer, x, WINDOW_HEIGHT / 2);
}
}
std::cout << "PLayerX: "<<playerX<<" PlayerY: "<<playerY<<std::endl;
SDL_RenderPresent(renderer);
}
int main(int argc, char* args[]) {
if (!initSDL()) {
return 1;
}
bool quit = false;
while (!quit) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
// Tastatursteuerung
const Uint8* state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_LEFT]) playerAngle -= 0.05f;
if (state[SDL_SCANCODE_RIGHT]) playerAngle += 0.05f;
if (state[SDL_SCANCODE_UP]) {
playerX += 0.05f * std::cos(playerAngle);
playerY += 0.05f * std::sin(playerAngle);
if (map[(int)playerX,(int)playerY]>0){
playerX += 0.05f * std::cos(playerAngle);
playerY += 0.05f * std::sin(playerAngle);}
}
if (state[SDL_SCANCODE_DOWN]) {
playerX -= 0.02f * std::cos(playerAngle);
playerY -= 0.02f * std::sin(playerAngle);
}
// Zeichne die Szene
drawScene();
SDL_Delay(16);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}