Ball.h
------------------
#include"Point.h"
#include<math.h>
#define PI 3.141592654
class Ball
{
public:
Ball(Point* cen,float rad,float vx,float vy,float r,float g,float b)
{
center= cen ;
radius = rad;
velX = vx;
velY = vy;
red = r;
green = g;
blue = b;
}
void setCenter(Point* nCen)
{
center = nCen;
}
void setVelX(float vx)
{
velX = vx;
}
void setVelY(float vy)
{
velY = vy;
}
float getVelX()
{
return velX;
}
float getVelY()
{
return velY;
}
void drawBall()
{
float theta = 0;
float angInc = 2* PI/360;
double x,y;
glColor3f(red,green,blue);
glBegin(GL_POLYGON);
for(int i= 0;i<360;i++)
{
x = (*center).getX() + radius *cos(theta);
y= (*center).getY() + radius* sin(theta);
glVertex2d(x,y);
theta+=angInc;
}
glEnd();
}
void setRGB(float r,float g,float b)
{
red = r;
green = g;
blue = b;
}
float getCenX()
{
return (*center).getX();
}
float getCenY()
{
return (*center).getY();
}
float getRadius()
{
return radius;
}
//ball(){}
private:
Point* center;
float radius;
//float theta;;
float velX,velY;
float red,green,blue;
};
Paddle.h
-----------------
#include"Point.h"
#include<gl/glut.h>
class Paddle
{
public:
Paddle()
{
posX = 0.0;
}
Paddle(float px,float py,float w ,float h ,float vy,float r,float g,float b)
{
posX = px;
posY = py ;
width = w;
height = h ;
velY = vy;
red = r;
green = g;
blue = b;
}
void setY(float py)
{
posY = py;
}
float getY()
{
return posY;
}
float getX()
{
return posX;
}
void drawPaddle()
{
glColor3f(red,green,blue);
glRectf(posX,posY,posX-width,posY+height);
}
void setVY(float vy)
{
velY = vy;
}
float getVY()
{
return velY;
}
float getWidth()
{
return width;
}
float getHeight()
{
return height;
}
void setRGB(float r,float g,float b)
{
red = r;
green = g;
blue = b;
}
private:
float posY,width,height;
float posX;
float velY;
float red,green,blue;
};
maincode.cpp
----------------
#pragma once
#include<gl/glut.h>
#include<iostream>
#include"Point.h"
#include"Ball.h"
#include"paddle.h"
using namespace std;
//screen parameters
const int swidth = 640;
const int sheight = 480;
//global game parameter
Paddle* player = new Paddle(320,0,10,30,0,.487,.987,.111);
Paddle* computer = new Paddle(-310,0,10,30,0.6,.789,.326,.369);
Ball* pBall = new Ball(new Point(0,0),6,.2,.2,.6245,.9428,.7985);
//controlling paramerts
bool paddleMiss = false;
bool playerPaddleMiss = false;
bool compPaddleMiss = false;
bool start = true;
//scoring paramerters
int pscore=48,cscore=48;
//user-defined functions
void myInit();
//callbacks
void myDisplay();
void myMouseHover(int,int);
void motion();
void reset();
void mouseClick(int ,int,int,int);
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
glutInitWindowSize(swidth,sheight);
glutInitWindowPosition(200,200);
glutCreateWindow("PONG");
myInit();
glutDisplayFunc(myDisplay);
glutPassiveMotionFunc(myMouseHover);
glutMouseFunc(mouseClick);
glutIdleFunc(motion);
glutMainLoop();
return 0;
}
void myInit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glClearColor(1,1,1,1);
gluOrtho2D(-swidth/2,swidth/2,-sheight/2,sheight/2);
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0,0,640,480);
glColor3f(128/255,64/255,64/255);
glRecti(-swidth/2,-sheight/2,swidth/2,-sheight/2+10);
glRecti(-swidth/2,sheight/2,swidth/2,sheight/2-10);
glLineWidth(3.0);
glLineStipple(1,9);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2d(0,sheight/2-10);
glVertex2d(0,-sheight/2+10);
glEnd();
glRasterPos2f(150,150);
if(pscore>=58)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'1');
//glRasterPos2f(165,150);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'0');
pscore ++;
glRasterPos2f(135,125);
char* ch="You win";
while(*ch!= '\0')
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,*ch);
ch++;
}
}
else
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, pscore);
glRasterPos2f(-150,150);
if(cscore>=58)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'1');
//glRasterPos2f(165,150);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'0');
cscore++;
glRasterPos2f(135,125);
char* ch="You lose";
while(*ch!= '\0')
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,*ch);
ch++;
}
}
else
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,cscore);
(*player).drawPaddle();
(*pBall).drawBall();
(*computer).drawPaddle();
glutSwapBuffers();
}
void myMouseHover(int x,int y)
{
float py = sheight/2-y;
if(py < (-sheight/2+10))
{
py = -sheight/2+10;
(*player).setY(py);
cout<<py<<"\n";
}
if((py + (*player).getHeight())>=(sheight/2 - 10))
{
py =sheight/2 - 10 - (*player).getHeight();
(*player).setY(py);
cout<<py<<"\n";
}
else
(*player).setY(py);
glutPostRedisplay();
}
void motion()
{
if(paddleMiss)
{
reset();
}
if(start)
{
}
else
{
float nCenX = (*pBall).getVelX()+(*pBall).getCenX();
float nCenY = (*pBall).getVelY()+(*pBall).getCenY();
(*pBall).setCenter(new Point(nCenX,nCenY));
if(((*pBall).getCenY()-(*pBall).getRadius())<= (-sheight/2+10))
{
(*pBall).setVelY((*pBall).getVelY()* -1);
}
if(((*pBall).getCenY()+(*pBall).getRadius())>= (sheight/2-10))
{
(*pBall).setVelY((*pBall).getVelY()* -1);
}
//ball is on the right
if( ((*pBall).getCenX()+6) >= ((*player).getX()-10) && ((*pBall).getCenX()+6 ) <= ((*player).getX()
- 9))
{
if( (*pBall).getCenY() >= (*player).getY() && ((*pBall).getCenY() -3) < (*player).getY()+
(*player).getHeight())
{
(*pBall).setVelX((*pBall).getVelX()* -1);
cout<<"right"<<(*pBall).getVelX()<<endl;
(*pBall).setVelX((*pBall).getVelX()-.05);
cout<<"right"<<(*pBall).getVelX()<<endl;
if((*pBall).getVelY()>=0)
(*pBall).setVelY((*pBall).getVelY()+.05);
else
(*pBall).setVelY((*pBall).getVelY()-.05);
cout<<"called\n";
}
}
//ball is on the left
if( ((*pBall).getCenX()-6) <= (*computer).getX() && ((*pBall).getCenX() -6) >= (*computer).getX()-
1)
{
if( (*pBall).getCenY() >=(*computer).getY() && ((*pBall).getCenY()-3) < (*computer).getY()
+(*computer).getHeight() )
{
(*pBall).setVelX((*pBall).getVelX()* -1);
cout<<"left"<<(*pBall).getVelX()<<endl;
(*pBall).setVelX((*pBall).getVelX() + .05);
cout<<"left"<<(*pBall).getVelX()<<endl;
if((*pBall).getVelY()>=0)
(*pBall).setVelY((*pBall).getVelY()+.05);
else
(*pBall).setVelY((*pBall).getVelY()-.05);
}
}
//set computer paddle pos AI
if( (*pBall).getCenY()> (*computer).getY() )
{
(*computer).setY((*computer).getY()+(*computer).getVY());
}
else
{
(*computer).setY((*computer).getY()-(*computer).getVY());
}
//Ball hits the left wall
if(((*pBall).getCenX()-(*pBall).getRadius())<= (-swidth/2) )
{
(*pBall).setVelX((*pBall).getVelX()* -1);
pscore++;
paddleMiss = true;
compPaddleMiss = true;
cout<<"miss\n";
}
//ball hits the right wall
if(((*pBall).getCenX()+(*pBall).getRadius())>= (swidth/2))
{
(*pBall).setVelX((*pBall).getVelX()* -1);
cscore++;
paddleMiss = true;
playerPaddleMiss = true;
cout<<"miss\n";
}
glutPostRedisplay();
}
}
void reset()
{
(*player).setY(0);
(*computer).setY(0);
(*computer).setVY(.6);
(*pBall).setCenter(new Point(0,0));
(*pBall).setVelX(.2);
(*pBall).setVelY(.2);
paddleMiss = false;
start = true;
//if(pscore>58 || cscore> 58)
//{
// pscore = cscore=48;
//}
glutPostRedisplay();
}
void mouseClick(int button,int state,int x,int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
if(pscore >=59 || cscore>=59 )
pscore=cscore=48;
if(playerPaddleMiss)
{
(*pBall).setVelX((*pBall).getVelX() * -1);
playerPaddleMiss = false;
}
if(compPaddleMiss)
{
(*pBall).setVelX((*pBall).getVelX() * 1);
compPaddleMiss = false;
}
start = false;
}
}
------------------
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:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
by: ozoPosted on 2009-08-25 at 03:57:02ID: 25176167
> when the player hits the ball with the edge of the paddle, the ball speed increases.
How is that more realistic?
Neglecting spin, given a ball velocity b, a paddle unit normal vector v, and paddle velocity p
the ball velocity after hitting the paddle would be b - 2*(b-p)·n