Skip to content
Snippets Groups Projects
Commit 891f3e34 authored by Janos's avatar Janos
Browse files

Merge branch 'main' of git.imp.fu-berlin.de:wise2023_jumpnrun/jumpnrun

parents c237a728 94257831
No related branches found
No related tags found
No related merge requests found
......@@ -6,31 +6,36 @@ Vorbedingung: Es wurde eine Taste gedrückt
Nachbedingung: Position des Characters hat sich je nach Tasteneingabe verändert. Wenn keine Steuertaste gedrückt wird, dann passiert nichts.
*/
// playerscore = interne Darstellung der ingesamt gelaufenen Schritte minus der zurückgelaufenen Schritte
// playerhighscore = externe Darstellung; höchste Anzahl an nach oben gelaufenen Schritten
// ROW_SIZE = 100
// SDL_SCANCODE_X = MACRO von SDL anstall "magic numbers" zu verwenden
void jump(int input){
switch(input) {
case SDL_SCANCODE_D: //right
if(player->x < 770){
player->x += ROW_SIZE; //ROW_SIZE == 100
if(player->x < 770){ // Überprüfe Grenzen
player->x += ROW_SIZE;
}
break;
case SDL_SCANCODE_A: //left
if(player->x > 30){
if(player->x > 30){ // Überprüfe Grenzen
player->x -= ROW_SIZE;
}
break;
case SDL_SCANCODE_S: //down
if(player->y < 820){
if(player->y < 820){ // Überprüfe Grenzen
playerscore--;
player->y += ROW_SIZE;
}
break;
case SDL_SCANCODE_W: //up
if(player->y >120){
if(player->y >120){ // Überprüfe Grenzen
playerscore++;
if(playerscore > playerhighscore){
if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore
playerhighscore = playerscore;
}
player->y -= ROW_SIZE;
......@@ -38,9 +43,9 @@ void jump(int input){
break;
case SDL_SCANCODE_Q: // Taste q => gehe nach oben links
if(player->y >120 && player->x > 30){
if(player->y >120 && player->x > 30){ // Überprüfe Grenezen
playerscore++;
if(playerscore > playerhighscore){
if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore
playerhighscore = playerscore;
}
player->y -= ROW_SIZE;
......@@ -49,10 +54,10 @@ void jump(int input){
break;
case SDL_SCANCODE_E: // Taste e => gehe nach oben rechts
if(player->y >120 && player->x < 770){
if(player->y >120 && player->x < 770){ // Überprüfe Grenzen
playerscore++;
if(playerscore > playerhighscore){
playerhighscore = playerscore;
if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore
playerhighscore = playerscore; // Update playerhighscore, wenn playerscore größer ist
}
player->y -= ROW_SIZE;
player->x += ROW_SIZE;
......@@ -71,9 +76,10 @@ Nachbedingung: Der Character bewegt sich mit der Map mit.
*/
int update_character(int speed, SDL_Renderer *renderer){
// Bewege die Spielfigur um speed Pixel nach unten
player->y +=speed;
player->y +=speed; // Bewege den Spieler um speed pixel nach unten
// Fehlerbehandlung
if (SDL_RenderCopy(renderer, img_duck, NULL,player) != 0) {
SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError());
return(1);
......
......@@ -5,11 +5,15 @@ SDL_Rect *player;
int playerscore;
int playerhighscore;
//V: enum vehicle exists with 4 correct themes, Renderer exists
//N: renderer still exists, all objects are still exist or have been correctly removed
//E: game has been played for one round, which was at least 16ms long
void gameLoop(enum vehicle theme,SDL_Renderer* renderer) {
SDL_Event e;
int speed = 0;
// Character wird in der Mitte des vorletzten Feldes gestartet
SDL_Rect character = {
.x = 420,
.y = 810,
......@@ -22,23 +26,30 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer) {
playerscore = 0;
playerhighscore = 0;
//start_game prevents game start before player input has been received
bool start_game = false;
//ends game if game over criteria have been met
bool end_game = false;
//used to implement rows and allows to remove rows out of view
struct LinkedList *map = init_map(theme);
//every at least 16ms this loop is called
while (!end_game) {
//prevents overlap of menu and game
SDL_RenderClear(renderer);
//used to standardize time to at least 16ms per tick
Uint32 start_time = SDL_GetTicks();
while (SDL_PollEvent(&e)) {
switch (e.type){
// if user closes window exit frees all used space
case SDL_QUIT:
exit(0);
// any key input starts game and takes player input
case SDL_KEYDOWN:
start_game = true;
jump(e.key.keysym.scancode);
......@@ -70,17 +81,22 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer) {
//Position des Spielers wird aktualisiert und gezeichnet
update_character(speed, renderer);
//Der aktuelle Score wird oben rechts angezeigt
paste_score (renderer);
//Hier wird der aktuelle Stand des Spiels dem Spieler angezeigt
SDL_RenderPresent(renderer);
// Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps
// Tick dauert mindestens 16ms
Uint32 end_time = SDL_GetTicks();
while (end_time - start_time < 16) {
end_time = SDL_GetTicks();
}
}
//Wenn das Spiel game over ist schreiben wir den aktuellen Score in die score.txt
write_table(theme);
//wir löschen die map
free_map(map);
return;
}
#include "menu2.h"
// Die Funktion zeigt die möglichen Reihen des Spiels
// Wenn man auf eine Reihe klickt, dann wir das Spiel mit einer bestimmten
// Vorb.: Die Funktion zeigt die möglichen Reihen des Spiels
// Nachb.: Wenn man auf eine Reihe klickt, dann wir das Spiel mit einer bestimmten
// Konfiguration gestartet
enum vehicle startscreen(SDL_Renderer* renderer){
// Definiere rect
......@@ -203,7 +203,8 @@ enum vehicle startscreen(SDL_Renderer* renderer){
/*
Vorb.: Das Spiel ist angehalten und es wird "Nochmal (y)/(n)" angezeigt
Nachb.: Das Spiel wird erneut gestartet, wenn y gedrückt wird. Wenn n gedrückt wird, wird die Levelauswahl geöffnet
*/
bool end_screen(SDL_Renderer* renderer) {
......@@ -241,76 +242,8 @@ bool end_screen(SDL_Renderer* renderer) {
SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage);
SDL_RenderCopy(renderer, Message, NULL, &rect);
/*
// Ausgabe Highscore der entsprechenden Karte
int map = theme;
FILE *my_file;
//FILE *my_wfile = fopen("Highscore2.txt","w");
switch(map) { // Öffne die entsprechende Datei für den Highscore der Karte theme
case coin:
my_file = fopen("HighscoreCoin.txt","r+");
break;
case car:
my_file = fopen("HighscoreCar.txt","r+");
break;
case boat:
my_file = fopen("HighscoreBoat.txt","r+");
break;
case train:
my_file = fopen("HighscoreTrain.txt","r+");
break;
}
bool notEOF = true;
while (notEOF) { // Lese bis Datei leer
char buf[64]; // initialise buffer
size_t n = fread(buf,sizeof buf[0], sizeof buf, my_file);
//printf("n = %zu\n",n);
if (n == 0) {
notEOF = false;
} else {
//printf("Read text: \n %s\n",buf);
//fwrite(buf,sizeof buf[0], n, my_file);
// Definiere rect
// Erstelle Rechteck für das Schreiben des Highscores
SDL_Rect rect2 = {
.x = 0,
.y = 900,
.w = 600,
.h = 200 };
if (SDL_RenderFillRect(renderer,&rect2)!=0) {
SDL_Log("Malen des Rechtecks fehlgeschlagen! SDL_Error %s\n",SDL_GetError());
return(-1);
}
SDL_Surface* surfaceMessage2 = TTF_RenderText_Blended_Wrapped (font, buf, (SDL_Color) {255, 255, 255, 255}, 200);
if (surfaceMessage2 == NULL)
printf("Text Surface loading failed: %s\n", TTF_GetError());
SDL_Texture* Message2 = SDL_CreateTextureFromSurface(renderer, surfaceMessage2);
SDL_RenderCopy(renderer, Message2, NULL, &rect2);
}
}
SDL_RenderCopy(renderer, Message, NULL, &rect);
//fclose(my_file);
*/
SDL_Event e;
int input;
bool quit = false;
......@@ -343,7 +276,6 @@ bool end_screen(SDL_Renderer* renderer) {
}
}
}
//fclose(my_file);
return(true);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment