Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
J
jumpNrun
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
wise2023_jumpnrun
jumpNrun
Commits
891f3e34
Commit
891f3e34
authored
1 year ago
by
Janos
Browse files
Options
Downloads
Plain Diff
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
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
charac.c
+19
-13
19 additions, 13 deletions
charac.c
gameLoop.c
+18
-2
18 additions, 2 deletions
gameLoop.c
menu2.c
+5
-73
5 additions, 73 deletions
menu2.c
with
42 additions
and
88 deletions
charac.c
+
19
−
13
View file @
891f3e34
...
...
@@ -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
);
...
...
This diff is collapsed.
Click to expand it.
gameLoop.c
+
18
−
2
View file @
891f3e34
...
...
@@ -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
;
}
This diff is collapsed.
Click to expand it.
menu2.c
+
5
−
73
View file @
891f3e34
#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
);
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment