Я работаю над кодированием игры в понг, и у меня возникают проблемы при создании объектов. У меня был рабочий код, но он не включал в себя класс или какие-либо объекты, и, поскольку он предназначен для класса объектно-ориентированного программирования, мне нужно было это исправить. Однако теперь я получаю кучу разных сообщений об ошибках (перестает отображаться после 100). Большинство из них, кажется, имеют дело со мной, не создавая объекты правильно.
Я никогда не работал с объектами в C ++ (вероятно, должен был, но только что пробирался через этот класс и получал баллы по этой самой причине), но так как семестр подходит к концу, мне действительно нужно преуспеть в этом проекте ,
Обновить
Мне удалось избавиться от большинства ошибок, но есть еще несколько, которые поставили меня в тупик. Я отредактировал свой код, чтобы отразить внесенные изменения, и обновил список ошибок.
Вот мой код:
Мой заголовочный файл:
#include "stdafx.h"#include <string>
#include <Windows.h>
#include <iostream>
//#include <conio.h>
#include <sstream>
#include <math.h>
//#include <gl\gl.h>
//#include <gl\glu.h>
#include "GL/freeglut.h"#pragma comment(lib, "Opengl32.lib")
#define VK_W 0x57
#define VK_S 0x53
using namespace std;
class Pong {
public:
Pong();
std::string int2str;
void drawText(float x, float y, std::string text);
void drawPaddle(float x, float y, float width, float height);
void draw();
void enable2D(int width, int height);
void keyboard();
void vec2_norm(float& x, float &y);
void updateBall();
void gameOverCheck();
void update(int value);
//window size and update rate
int width;
int height;
int interval; // 60 frames per-second
//scoring
int p1Score; //Player 1's score
int p2Score; //Player 2's score
int winner;
//the paddles
int paddleWidth;
int paddleHeight;
int paddleSpeed;
float paddleLeftX;
float paddleLeftY;
float paddleRightX;
float paddleRightY;
//the ball
float ballPositionX;
float ballPositionY;
float ballDirectionX;
float ballDirectionY;
int ballSize;
int ballSpeed;
};
Мой файл .cpp:
#include "stdafx.h"#include "PongGame.h"#include <string>
#include <Windows.h>
#include <iostream>
//#include <conio.h>
#include <sstream>
#include <math.h>
//#include <gl\gl.h>
//#include <gl\glu.h>
#include "GL/freeglut.h"#pragma comment(lib, "Opengl32.lib")
#define VK_W 0x57
#define VK_S 0x53
using namespace std;
Pong pong;
Pong::Pong() {
width = 500;
height = 300;
interval = 1000/60;
p1Score = 0;
p2Score = 0;
winner = 0;
paddleWidth = 10;
paddleHeight = 80;
paddleSpeed = 3;
paddleLeftX = 10.0f;
paddleLeftY = 50.0f;
paddleRightX = width - paddleWidth - 10;
paddleRightY = 50;
ballPositionX = width / 2;
ballPositionY = height / 2;
ballDirectionX = -1.0f;
ballDirectionY = 0.0f;
ballSize = 8;
ballSpeed = 3;
}
std::string int2str(int x) { //used to convert an integer to a string
std::stringstream ss;
ss << x;
return ss.str( );
}
void drawText(float x, float y, std::string text) {
glRasterPos2f(x, y);
glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
void drawPaddle(float x, float y, float width, float height) {
glBegin(GL_QUADS);
glVertex2f(x, y);
glVertex2f(x + width, y);
glVertex2f(x + width, y + height);
glVertex2f(x, y + height);
glEnd();
}
void draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//draws the paddles
drawPaddle(pong.paddleLeftX, pong.paddleLeftY, pong.paddleWidth, pong.paddleHeight);
drawPaddle(pong.paddleRightX, pong.paddleRightY, pong.paddleWidth, pong.paddleHeight);
//draws the ball
drawPaddle(pong.ballPositionX - pong.ballSize / 2, pong.ballPositionY- pong.ballSize / 2, pong.ballSize, pong.ballSize);
//draws the score at the top center of the screen
drawText(pong.width / 2 - 10, pong.height - 15, int2str(pong.p1Score) + ":" + int2str(pong.p2Score));
glutSwapBuffers();
}
void enable2D(int width, int height) {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, width, 0.0f, height, 0.0f, 1.0f);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
}
void keyboard() { //allows teh paddles to be controled from the keyboard
//moves left paddle (player 1)
if (GetAsyncKeyState(VK_W))
pong.paddleLeftY += pong.paddleSpeed; //move paddle up with "W" key
if (GetAsyncKeyState(VK_S))
pong.paddleLeftY -= pong.paddleSpeed; //move paddle down with "S" key
//moves right paddle (player 2)
if (GetAsyncKeyState(VK_UP))
pong.paddleRightY += pong.paddleSpeed; //move paddle up with "up" arrow
if (GetAsyncKeyState(VK_DOWN))
pong.paddleRightY -= pong.paddleSpeed; //move paddle down with "down" arrow
}
void vec2_norm(float& x, float &y) {
float length = sqrt((x * x) + (y * y));
if(length != 0.0f) {
length = 1.0f / length;
x *= length;
y *= length;
}
}
void updateBall() { //allows teh ball to move
pong.ballPositionX += pong.ballDirectionX * pong.ballSpeed;
pong.ballPositionY += pong.ballDirectionY * pong.ballSpeed;
if(pong.ballPositionX < pong.paddleLeftX + pong.paddleWidth && pong.ballPositionX > pong.paddleLeftX && pong.ballPositionY < pong.paddleLeftY + pong.paddleHeight && pong.ballPositionY > pong.paddleLeftY) { //if ball is hit by player 1's paddle
float t = ((pong.ballPositionY - pong.paddleLeftY) / pong.paddleHeight) - 0.5f;
pong.ballDirectionX = fabs(pong.ballDirectionX);
pong.ballDirectionY = t;
}
if (pong.ballPositionX > pong.paddleRightX && pong.ballPositionX < pong.paddleRightX + pong.paddleWidth && pong.ballPositionY < pong.paddleRightY + pong.paddleHeight && pong.ballPositionY > pong.paddleRightY) { //if ball is hit by player 2's paddle
float t = ((pong.ballPositionY - pong.paddleRightY) / pong.paddleHeight) - 0.5f;
pong.ballDirectionX = -fabs(pong.ballDirectionX);
pong.ballDirectionY = t;
}
if (pong.ballPositionX < 0) { //if ball hits the top wall
++pong.p2Score;
pong.ballPositionX = pong.width / 2;
pong.ballPositionY = pong.height / 2;
pong.ballDirectionX = fabs(pong.ballDirectionX);
pong.ballDirectionY = 0;
}
if (pong.ballPositionX > pong.width) { //if ball hits the right wall
++pong.p1Score;
pong.ballPositionX = pong.width / 2;
pong.ballPositionY = pong.height / 2;
pong.ballDirectionX = -fabs(pong.ballDirectionX);
pong.ballDirectionY = 0;
}
if (pong.ballPositionY > pong.height) { //ball hits top wall
pong.ballDirectionY = -fabs(pong.ballDirectionY);
}
if (pong.ballPositionY < 0) { //ball hits bottom wall
pong.ballDirectionY = fabs(pong.ballDirectionY);
}
vec2_norm(pong.ballDirectionX, pong.ballDirectionY);
}
void gameOverCheck() {
const int maxScore = 10;
if(pong.p1Score == maxScore) {
cout << "Player 1 Wins!" << endl;
pong.winner = 1;
}
else if(pong.p2Score == maxScore) {
cout << "Player 2 Wins!" << endl;
pong.winner = 2;
}
}
void update(int value) {
keyboard();
if(pong.winner == 0) {
updateBall();
glutTimerFunc(pong.interval, update, 0);
glutPostRedisplay();
gameOverCheck();
}
}
Мой основной файл:
//PongGameTest.cpp
#include "stdafx.h"#include "PongGame.h"#include <string>
#include <Windows.h>
#include <iostream>
//#include <conio.h>
#include <sstream>
#include <math.h>
//#include <gl\gl.h>
//#include <gl\glu.h>
#include "GL/freeglut.h"#pragma comment(lib, "Opengl32.lib")
#define VK_W 0x57
#define VK_S 0x53
using namespace std;
int _tmain(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 200);
glutCreateWindow("Pong");
glutDisplayFunc(pong.draw);
glutTimerFunc(pong.interval, pong.update, 0);
pong.enable2D(pong..width, pong.height);
glColor3f(1.0f, 0.0f, 0.0f);
glutMainLoop();
return 0;
}
И я уверен, что вы все меня возненавидите за это, но вот ошибки, которые я получаю при компиляции:
1> PongGameTest.cpp
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(25): error C2065: 'pong' : undeclared identifier
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(25): error C2228: left of '.draw' must have class/struct/union
1> type is ''unknown-type''
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(26): error C2065: 'pong' : undeclared identifier
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(26): error C2228: left of '.interval' must have class/struct/union
1> type is ''unknown-type''
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(26): error C2065: 'pong' : undeclared identifier
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(26): error C2228: left of '.update' must have class/struct/union
1> type is ''unknown-type''
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(28): error C2065: 'pong' : undeclared identifier
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(28): error C2228: left of '.enable2D' must have class/struct/union
1> type is ''unknown-type''
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(28): error C2065: 'pong' : undeclared identifier
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(28): error C2059: syntax error : '.'
1>c:\users\hitechredneck\desktop\fall 2014\object-oriented programming\game\ponggame\ponggame\ponggametest.cpp(29): error C2228: left of '.glColor3f' must have class/struct/union
1> type is ''unknown-type''
Я хорошо знаю, что никто не собирается читать все эти сообщения (я знаю, что я уверен, что не будет), но не могли бы вы просмотреть их и посмотреть, сможете ли вы понять, что я делаю неправильно? Как я уже сказал, я почти на 100% уверен, что многие из них связаны со мной, когда я не создаю объект правильно и не использую его члены должным образом.
1.
Pong Pong;
недопустимо: вы не можете объявить объект с именем типа в качестве идентификатора. Это могло бы быть Pong pong
,
2.
Pong::enable2D()
незаконно enable2D
это не статическая функция, а функция-член (для каждого экземпляра), и поэтому вы должны вызывать ее через объект, например pong.enable2D();
,
3.
extern Pong pong; // in the header
Pong pong; // and both of these in the source
Pong Pong;
Это определенно неправильно. Что ты пытаешься сделать? Глобальный или нет, вы не можете объявить объект с именем Pong
типа Pong
как объяснено выше (1). Также вы, возможно, не хотите глобальную, а просто автоматическую переменную в main
функция.
ошибка C2143: синтаксическая ошибка: отсутствует ‘;’ до ‘.’
Если у компилятора нет объявления идентификатора, он не сможет принять токен .
и будет ожидать ;
вместо.
ошибка C2248: «Pong :: height»: невозможно получить доступ к закрытому члену, объявленному в классе «Pong»
Это так же ясно, как и ошибки компилятора C ++.
Пожалуйста, прочитайте хорошая книга для начинающих на C ++ и убери такие проблемы с логистикой. Интернет не является хорошим учителем, это хорошая справочная библиотека, но в основном он не может заменить хорошую книгу.