-
Notifications
You must be signed in to change notification settings - Fork 21
/
hello4_animation.c
108 lines (90 loc) · 2.85 KB
/
hello4_animation.c
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
/**
* hello4_animation.c - Animates hello.png scrolling up the window
*/
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_image.h>
#define WINDOW_WIDTH (640)
#define WINDOW_HEIGHT (480)
// speed in pixels/second
#define SCROLL_SPEED (300)
int main(void)
{
// attempt to initialize graphics and timer system
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
{
printf("error initializing SDL: %s\n", SDL_GetError());
return 1;
}
SDL_Window* win = SDL_CreateWindow("Hello, CS50!",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH, WINDOW_HEIGHT,0);
if (!win)
{
printf("error creating window: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
// create a renderer, which sets up the graphics hardware
Uint32 render_flags = SDL_RENDERER_ACCELERATED;
SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags);
if (!rend)
{
printf("error creating renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// load the image into memory using SDL_image library function
SDL_Surface* surface = IMG_Load("resources/hello.png");
if (!surface)
{
printf("error creating surface\n");
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// load the image data into the graphics hardware's memory
SDL_Texture* tex = SDL_CreateTextureFromSurface(rend, surface);
SDL_FreeSurface(surface);
if (!tex)
{
printf("error creating texture: %s\n", SDL_GetError());
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// struct to hold the position and size of the sprite
SDL_Rect dest;
// get the dimensions of texture
SDL_QueryTexture(tex, NULL, NULL, &dest.w, &dest.h);
// position the sprite at the bottom center of the window
// origin is the top left corner, positive y is down
dest.x = (WINDOW_WIDTH - dest.w) / 2;
// require float resolution for y position
float y_pos = WINDOW_HEIGHT;
// animation loop
while (dest.y >= -dest.h)
{
// clear the window
SDL_RenderClear(rend);
// set the y position in the struct
dest.y = (int) y_pos;
// draw the image to the window
SDL_RenderCopy(rend, tex, NULL, &dest);
SDL_RenderPresent(rend);
// update sprite position
y_pos -= (float) SCROLL_SPEED / 60;
// wait 1/60th of a second
SDL_Delay(1000/60);
}
// clean up resources before exiting
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
}