From 997343e4aee1805c6622a4d32c2299d4429a7a35 Mon Sep 17 00:00:00 2001 From: ayabusa Date: Mon, 22 Sep 2025 20:30:32 +0200 Subject: [PATCH] finished neko --- .vscode/settings.json | 3 +- build.sh | 3 +- res/main | Bin 27064 -> 27200 bytes res/oneko.gif | Bin 0 -> 3316 bytes res/real_oneko.gif | Bin 0 -> 4805 bytes src/main.c | 1 + src/neko.c | 147 ++++++++++++++++++++++++++++++++---------- 7 files changed, 117 insertions(+), 37 deletions(-) create mode 100644 res/oneko.gif create mode 100644 res/real_oneko.gif diff --git a/.vscode/settings.json b/.vscode/settings.json index 5d84152..dfb5941 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,7 @@ "array": "c", "string": "c", "string_view": "c", - "shape.h": "c" + "shape.h": "c", + "xfixes.h": "c" } } \ No newline at end of file diff --git a/build.sh b/build.sh index ee0dd38..06d5562 100755 --- a/build.sh +++ b/build.sh @@ -5,4 +5,5 @@ echo gcc src/main.c -o res/main $(pkg-config --cflags --libs sdl3 x11 xfixes sdl gcc src/main.c src/neko.c -I src/ -o res/main $(pkg-config --cflags --libs sdl3 x11 xfixes sdl3-image) -lm echo Running... -DISPLAY=:1 ./res/main +#DISPLAY=:1 ./res/main +./res/main diff --git a/res/main b/res/main index 059b97b768f4dba4600c74caa795342516fb702e..141aa85699d80e47b4ec486eeb3c3a9b26f5bb14 100755 GIT binary patch delta 5076 zcma)A3vg7`89sM+Z(b&BHY6k)fdm9hfIJa-_zDSIE}bAWJd+?v$OE=K3!8uzSTMY{ z*I?pNi;f+giViAv&`_IpD&0jSz&H{pwQ)pU6mdhML=rTj_V)YFy}K?MI@6Q6=Rg1d zfB)m0`=66Nx9y*j_q^1cVcNdDW&9^GO+%SzO+$HtlpVd^qOjn@_c*@Z5-8>03fcSAqzK}rP9gP2 zT6n)Xk?)7?{zyeS)p{}VGbwd`t!rj&T~+;R*Mi#3uKEqN^Q)^?*Unj2Q_GJ=bIa_t zP8VNRK8*h^Cd*Rgs#?q6irF)K{>7f70)g#s>sjI&z{UnZ_9U^ zm|6Tu=!1`$SuiHf%w*Ark4PS2NOcTpBViNtWWrLC{V+3Q@ffG$$zApcR$XSlgp3;L z?=~}c2vDEujAn3B9tOw^bKqZ<0lk^62{uaSVxWHF({> zDdazQDOt7di`{Iuj(}xxle}JLOleAbvNdVk5tH;RKb`SwDThzaY>?Xcp-j75Zn&GV zqcl6k(;n!$p=pYmR0f%%%H>2nACO`(5P{oC>p7-0IXaZ4xU<7Z`#!X76g99_*g^&P zuf8XwJX-g2JCR-9`mDhBLViq933fthlHJb;FNTYIpl+jFx}qe?KzH^pGE(IaCNrio zkK-i9r)gYZ@i^WC^R{53l>JAejA=|75aAC&0sTuvC_Lg7gok@?KpR4yw-NwZe>K40 z9-rba7iRO~RmX8QjpEqFHGgKEzn1uJ0(WxzTZ4 z0(vOH3ZkYtj&FGdtVI|Xq+kxdztM^zoj?Cb1}8jc0wZbaLK?3w4AdwS631qMb;*I3 zc+CVyWrc9<2*8o+F2-gE>|e=1_&O>~F^4Z{>Z&{s7@ATPnW;(Bh*jn3LMmS9=VF27 z3&P1m70(y*mByZ_if8Ld#Z&LCQB;daN%1%Wd0wU6;is5^ z{UR|c3O|bC*+h!_b5Yz7@u5O4?|(~^mCsBPxtt^-ilV{rpt=c1RZ%Cr7)8+rGrcGV z5D!HmoRtX2awEK8LFIDYsf$?Dg*;d1YXl!&8n0d#NzB*v#YB+Acm$11bb|?2a}g!0 z%3}zC+-rhKbZ=^RT%d_}&xBeQZm3i)+*~Sgefh{FByAdwfJG)}KIhrHcdz2Rk}e(d-7xzG(mXy-N9M^o>s2@ykH_ZdQRVl8 z`2PbQXm^~a)l%i1uxcDIy9&`+_q>PlYaB4SGSFG~90j+_>vG354oI%-uESte`8hK1 zCU_j@yIz0*j?lBNC-pHo?b?emP3B=hLF3j4y3B`!FZEf={B??T8+B{FfnoicMl2?= zO`e^=7>PUUtPAjDymJjR>r~vTqf?+!4XJ=oF;L9FbQoVloY7=w&2e;EckhNAA{bb6 zxrDgtwdVL5CXwKyFo8{#Pl9dq4xve%f(KRpix9++l{BfN(Jy6oc;sft0!6U#$U87Z zG{*qWN&Qg5IhoO?X<>UoP1*#MDwm=UONU-+APdmuheGEZ_DwGKO{d#af8MjOBmAVp z)wxVdnE}V?zrVY3=QViVKig#eN%WK_vMqniCt^^1W)6tJQ zSFCtF6*SE^vxGFsq-PTMs^Cj8&1G}?gL7@tL9)jHf2h;At+xW#WZ{QX*CB*$mmdNE z#~%wU>802G1lX=8zz6g24M85U?eb(OkRI!H1+sxunwk~tR8_8m9PfPEv4-+?IUWqP z?zutpM`6Cn)Lqmr_fKSues2V>UPT~9&IGo5V&F4yaF&Aq&Z?Xga+c68ABTa67}4Bq zX-3V{ZxnSQ6=LWg_JQ8k-MPDC-z-Rx@PABiV>fQ7ty*2NZf)(Vb^JoX6!+M=pbAve z8|{D5YBy$0E%Eg}pi}gZB6}tq1f+Pz%yr`njgj ziaIW7+HmlDK<@>8>(T;ETZ)1E3r*Vs>b$IJ&w;)G`ghQeyEM%Y8g)g}Xn`6*(?MSZ zoe4UxN7GhtFIkMI$A~>xjS3fh7q`$8!V*i-CC^G=w3i z&r2bvozVHQP7&dO%|Dq4KN(3`E&m{+~XXD?E z+Tnw=Lxnt*RSuG; z8S?9r?d5g6!Z(3rm@+O(_MkuJ9tRGy^=VTJa3to7JavH zlgL){Qzdui%>>8TP!_yM6Gv^aK&7zeWjY`1*YHvElkL;7)ah6tRvDD*v_agPJ)(b^ zdfWX#CeW>Mtd1DRTP$hzkKvu9)3FN*dUFx|ioIAg#&9w&RCvcq=ok`i;X=6gdEO;!gjF=%3W1+hi;|^G(Lc!F zSd^SsPDs?rT?R5ZFDC}HzB7&YAkHE9sTa1*+_pGbdRdH5iT-QRTlsGmC)=}dIVamg zM#{f6;@?Z!ydr4h5pj$W(NMCvhSiqP&U=>H)4cF}i$R;_D+vwGFW0`b{L|KLNP zf(pXE`m|nHy3=g`pC6N2*HoU6TBk05LBa|5VRcUQzT5PK_O;q-B2A`kLwIUkc1&;& z;4mzy`-SO%1nEfLRu>-~-1i6g*}5sVsYdyQXsdmNTf*nBXI8r7dhtPr8lA6W_*mzJ X=z=mK09Wdq5>r#9bEy(9TR!r?M=h#y delta 3962 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 yo73M10028!@k;#w literal 0 HcmV?d00001 diff --git a/res/real_oneko.gif b/res/real_oneko.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f17625b2b7fa5b09f6afb3a47d434c7230a6071 GIT binary patch literal 4805 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 QoSGJdUd3$rodg~K53Z$~rvLx| literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index faeaeeb..a64bf3e 100644 --- a/src/main.c +++ b/src/main.c @@ -97,6 +97,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) make_window_clickthrough(); set_override_redirect(); + SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_PIXELART); neko_init(renderer, window); diff --git a/src/neko.c b/src/neko.c index 0f40fb7..67211df 100644 --- a/src/neko.c +++ b/src/neko.c @@ -2,7 +2,6 @@ #include "common.h" #include -static SDL_Texture *texture = NULL; static int texture_width = 0; static int texture_height = 0; @@ -12,19 +11,40 @@ static float speed = 5.0; #define TIME_BEFORE_SPLEEP 3000 #define TIME_BEFORE_RUNNING 1000 +#define TIME_ANIM_INTERVAL 300 enum CatState { - SLEEPING, - RUNNING, - WAKING_UP, - STAND_BY, -} cat_state = RUNNING; + ST_SLEEPING, + ST_RUNNING, + ST_WAKING_UP, + ST_STAND_BY, +} cat_state = ST_RUNNING; + +enum CatFrames { + STAND_BY=0, + WAKING_UP=1, + UP=2, + DOWN=4, + LEFT=6, + RIGHT=8, + UP_LEFT=10, + UP_RIGHT=12, + DOWN_RIGHT=14, + DOWN_LEFT=16, + SLEEPING=18, +}; static int state_timer; +static int anim_timer = 0; +static int current_frame = 0; + +static float diffx, diffy; + +static IMG_Animation *anim; +static SDL_Texture **anim_textures; int neko_init(SDL_Renderer *renderer, SDL_Window *window){ - SDL_Surface *surface = NULL; - char *neko_bmp_path = NULL; + char *neko_gif_path = NULL; /* Textures are pixel data that we upload to the video hardware for fast drawing. Lots of 2D engines refer to these as "sprites." We'll do a static texture (upload once, draw many @@ -32,25 +52,26 @@ int neko_init(SDL_Renderer *renderer, SDL_Window *window){ /* SDL_Surface is pixel data the CPU can access. SDL_Texture is pixel data the GPU can access. Load a .bmp into a surface, move it to a texture from there. */ - SDL_asprintf(&neko_bmp_path, "%ssample.bmp", SDL_GetBasePath()); /* allocate a string of the full file path */ - surface = SDL_LoadBMP(neko_bmp_path); - if (!surface) { - SDL_Log("Couldn't load bitmap: %s", SDL_GetError()); + SDL_asprintf(&neko_gif_path, "%sreal_oneko.gif", SDL_GetBasePath()); + anim = IMG_LoadAnimation(neko_gif_path); + if (!anim) { + SDL_Log("Couldn't load %s: %s\n", neko_gif_path, SDL_GetError()); return SDL_APP_FAILURE; } + SDL_free(neko_gif_path); /* done with this, the file is loaded. */ - SDL_free(neko_bmp_path); /* done with this, the file is loaded. */ + texture_width = anim->w; + texture_height = anim->h; - texture_width = surface->w; - texture_height = surface->h; - - texture = SDL_CreateTextureFromSurface(renderer, surface); - if (!texture) { - SDL_Log("Couldn't create static texture: %s", SDL_GetError()); + anim_textures = (SDL_Texture **)SDL_calloc(anim->count, sizeof(*anim_textures)); + if (!anim_textures) { + SDL_Log("Couldn't allocate textures\n"); + IMG_FreeAnimation(anim); return SDL_APP_FAILURE; } - - SDL_DestroySurface(surface); /* done with this, the texture has a copy of the pixels now. */ + for (int i = 0; i < anim->count; ++i) { + anim_textures[i] = SDL_CreateTextureFromSurface(renderer, anim->frames[i]); + } SDL_AddTimer(50, move_cat, window); } @@ -60,18 +81,74 @@ void neko_render(SDL_Renderer *renderer, SDL_Window *window){ dst_rect.x = catx; dst_rect.y = caty; - dst_rect.h = WINDOW_HEIGHT/10; - dst_rect.w = WINDOW_HEIGHT/10; - SDL_RenderTexture(renderer, texture, NULL, &dst_rect); + dst_rect.h = WINDOW_HEIGHT/15; + dst_rect.w = WINDOW_HEIGHT/15; + + int texture_index = 0; + switch (cat_state) + { + case ST_SLEEPING: + texture_index = SLEEPING+current_frame; + break; + case ST_WAKING_UP: + texture_index = WAKING_UP; + break; + case ST_STAND_BY: + texture_index = STAND_BY; + break; + case ST_RUNNING: + // We do this to know if our cat is moving in diagonals + double angle = fabs(atan((double) (diffy/diffx))); + if(angleSDL_PI_D/6){ // Diagonals + if(diffy<0){ + if(diffx<0){ + texture_index = DOWN_RIGHT+current_frame; + }else{ + texture_index = DOWN_LEFT+current_frame; + } + }else{ + if(diffx<0){ + texture_index = UP_RIGHT+current_frame; + }else{ + texture_index = UP_LEFT+current_frame; + } + } + }else{ // pas diagonals + if(fabs(diffy) > fabs(diffx)){ + if(diffy<0){ + texture_index = DOWN+current_frame; + }else{ + texture_index = UP+current_frame; + } + }else{ + if(diffx<0){ + texture_index = RIGHT+current_frame; + }else{ + texture_index = LEFT+current_frame; + } + } + } + break; + + default: + break; + } + + SDL_RenderTexture(renderer, anim_textures[texture_index], NULL, &dst_rect); + + if(SDL_GetTicks()-anim_timer > TIME_ANIM_INTERVAL){ + current_frame = (current_frame+1) % 2; + anim_timer=SDL_GetTicks(); + } } void neko_quit(){ - SDL_DestroyTexture(texture); + SDL_DestroyTexture(anim_textures[current_frame]); } Uint32 move_cat(void *window, SDL_TimerID timerID, Uint32 interval){ float mousex, mousey; - float diffx, diffy, hypo; + float hypo; int windowx, windowy; SDL_GetGlobalMouseState(&mousex, &mousey); @@ -82,31 +159,31 @@ Uint32 move_cat(void *window, SDL_TimerID timerID, Uint32 interval){ hypo = sqrt(diffx*diffx + diffy*diffy); switch (cat_state) { - case RUNNING: + case ST_RUNNING: if (hypo>50){ catx -= (diffx*speed/hypo); caty -= (diffy*speed/hypo); }else{ - cat_state = STAND_BY; + cat_state = ST_STAND_BY; state_timer = SDL_GetTicks(); } break; - case STAND_BY: + case ST_STAND_BY: if (hypo>50){ - cat_state = RUNNING; + cat_state = ST_RUNNING; }else if (SDL_GetTicks()-TIME_BEFORE_SPLEEP > state_timer){ - cat_state = SLEEPING; + cat_state = ST_SLEEPING; } break; - case SLEEPING: + case ST_SLEEPING: if (hypo>50){ - cat_state = WAKING_UP; + cat_state = ST_WAKING_UP; state_timer = SDL_GetTicks(); } break; - case WAKING_UP: + case ST_WAKING_UP: if (SDL_GetTicks()-TIME_BEFORE_RUNNING > state_timer){ - cat_state = RUNNING; + cat_state = ST_RUNNING; } break;