-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsmoler_pong.c
15 lines (15 loc) · 3.7 KB
/
smoler_pong.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#if 0
EXEC=${0%.*}
#test -x "/tmp/$EXEC" ||
cc "$0" -w -o "/tmp/$EXEC" -lX11 -lm
exec "/tmp/$EXEC"
#endif
#include <X11/Xlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>
typedef struct {long flags;int x,y,width,height,min_width,min_height,max_width,max_height,width_inc,height_inc;struct{int x,y;}min_aspect,max_aspect;int base_width,base_height,win_gravity;}XSizeHints;
extern void* XAllocSizeHints(void);extern void XSetWMSizeHints(void*,Window,void*,Atom);extern void XSetWMNormalHints(void*,Window,void*);
Display *di;int sc;Window wi;int go=0;float lp(float s,float e,float p){return(s+(e-s)*p);}typedef struct{float x,y;}V;typedef struct{float h;int l;float n;int p;}P;typedef struct{V p;V d;int sp;int s;}B;typedef struct{int x,y,w,h;}R;void dt(int* a,int s,int x,int y){for(int i=0;i<s;i+=4){XDrawLine(di,wi,DefaultGC(di,sc),a[i]+x,a[i+1]+y,a[i+2]+x,a[i+3]+y);}}void dr(R r,int w){if(w){XSetForeground(di,DefaultGC(di,sc),WhitePixel(di,sc));}else{XSetForeground(di,DefaultGC(di,sc),BlackPixel(di,sc));}XFillRectangle(di,wi,DefaultGC(di,sc),r.x,r.y,r.w,r.h);}void dc(int x,int y,int r){XFillArc(di,wi,DefaultGC(di,sc),x-r-1,y-r-1,r*2+1,r*2+1,0,23040);}float de;P P1,P2; B b;int im=1,kc[256]={0};float tx=0,mbx=512,mby=384,myv=0,g=69;int pt[]={0,0,0,110,0,0,50,30,50,30,0,55,110,0,70,55,70,55,110,110,110,110,150,55,150,55,110,0,180,0,180,110,180,0,240,110,240,0,240,110,310,0,270,55,270,55,310,110,310,110,350,55,350,55,310,55};void mb(float d){b.p.x+=b.d.x*b.sp*d;b.p.y+=b.d.y*b.sp*d;if(b.p.y+b.s>=768){b.d.y*=-1;b.p.y=767-b.s;}else if(b.p.y-b.s<=0){b.d.y*=-1;b.p.y=1+b.s;}if(b.d.x>0){float p=954;if(fabs(p-b.p.x)<20){if(P2.h<=b.p.y&&(P2.h+P2.l>=b.p.y)){b.d.x*=-1;b.sp+=100;}}}else{float p=70;if(fabs(p-b.p.x)<20){if(P1.h<=b.p.y&&(P1.h+P1.l>=b.p.y)){b.d.x*=-1;b.sp+=100;}}}}void hk(int k,int p){if(k>0&&k<256)kc[k]=p;}void hp(){if(b.p.x>1024){if(++P1.p == 10){go=1;}b.p.x=512;b.p.y=384;b.d=(V){-0.42,0.42};b.sp=2500;}if(b.p.x<0){if(++P2.p == 10){go=1;}b.p.x=512;b.p.y=384;b.d=(V){0.42,0.42};b.sp=2500;}}void gu(){if(kc[24]||kc[9]){go=1;}if(im){tx=lp(tx,346,2.5*de);myv+=g*de;mby+=myv;if(mby+30>=768){myv*=-0.98;mby=737;}if(kc[65])im=0;}else{if(kc[25]&&P1.n>=0){P1.n-=4;}if(kc[39]&&P1.n+P1.l<768){P1.n+=4;}if(kc[111]&&P2.n>=0){P2.n-=4;}if(kc[116]&&P2.n+P2.l<768){P2.n+=4;}mb(de);hp();}}void dg(){XSetForeground(di,DefaultGC(di,sc),WhitePixel(di,sc));if(im){dt(pt,56,tx,20);dc(mbx,mby,26);}else{for(int i=0;i<P1.p;i++){dr((R){122+(20*i),25,15,15},1);}for(int i=0;i<P2.p;i++){dr((R){880 - (20*i),25,15,15},1);}dr((R){50,P1.h,20,P1.l},1);P1.h=lp(P1.h,P1.n,0.06);dr((R){954,P2.h,20,P2.l},1);P2.h=lp(P2.h,P2.n,0.06);dc(b.p.x,b.p.y,b.s);}}int main(){XEvent e;di=XOpenDisplay(0);if(!di){return 1;}sc=DefaultScreen(di);wi=XCreateSimpleWindow(di,RootWindow(di,sc),10,10,640,480,1,BlackPixel(di,sc),WhitePixel(di,sc));XSelectInput(di,wi,ExposureMask|KeyPressMask|KeyReleaseMask);XMapWindow(di,wi);Atom wm_delete=XInternAtom(di,"WM_DELETE_WINDOW",0);XSetWMProtocols(di,wi,&wm_delete,1);XSizeHints *hints=XAllocSizeHints();hints->flags=(1L << 4)|(1L << 5);hints->min_width=1024;hints->max_width=1024;hints->min_height=768;hints->max_height=768;XSetWMSizeHints(di,wi,hints,(1L << 4)|(1L << 5));XSetWMNormalHints(di,wi,hints);srand(time(0));XStoreName(di,wi,"PONG GAME");de=0.0016;P1.h=50;P1.n=P1.h;P2.h=50;P2.n=P2.h;P1.l=200;P2.l=200;b.p=(V){512.0,384.0};b.d=(V){-0.42,-0.42};b.sp=2500;b.s=15;while(1){if(go){break;}XNextEvent(di,&e);if(e.type==Expose){dr((R){0,0,1024,768},0);dg();gu();usleep(4000-de*6000);XClearArea(di,wi,1023,767,1,1,1);XFlush(di);}if(e.type==KeyPress){hk(e.xkey.keycode,1);}if(e.type==KeyRelease){hk(e.xkey.keycode,0);}if(e.type==ClientMessage){break;}}puts(P2.p-10?"P1 wins":"P2 wins");XCloseDisplay(di);return 0;}