Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Арканоид OpenGL


Автор: DKey 26.1.2007, 16:12
Всем привет! Помогите написать арканоид, вот нерабочий код:
Код

#include <gl\gl.h>
#include <gl\glu.h>    
#include <gl\glut.h>

GLfloat l = -0.3;
GLfloat p = 0.3;

GLfloat lr = 0.0;

GLfloat lp = 0.0;
GLfloat vn = 0.0;

GLfloat dr = 0.01;
GLfloat dr2 = 0.01;

void keys(unsigned char key, int x, int y)
{
if(key=='a'){lr = lr - 0.02;}
if(key=='d'){lr = lr + 0.02;}
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Сфера
glPushMatrix();
glTranslatef(lp, vn, 0.0);
glColor3f(0.5, 0.01, 0.01);
glutWireSphere(0.1, 20, 20);
vn = vn + dr;
lp = lp + dr2;
//Условия сферы (прикосновение к стенкам)
if(vn>=0.9){vn = vn-dr; dr=-dr; lp = lp + dr2;}
if(lp>=1.0){vn = vn + dr; lp=lp-dr2; dr2=-dr2;}
if(lp<=-1.0){vn = vn+dr; lp = lp + dr2; dr2=0.01;}
//Условия сферы (прикосновение к платформе)
if((lp>=l)&&(lp<=p)&&(vn<=-0.7)){vn = vn + dr; dr = 0.01; lp = lp + dr2; dr2 = 0.01;}
if((lp<=l)&&(vn<=-0.7)){vn = vn - 1; dr=-dr; }
if((lp>=p)&&(vn<=-0.7)){vn = vn - 1; dr=-dr; }
glPopMatrix();

//Платформа
glPushMatrix();
glTranslatef(lr, -0.8, 0.0);
glBegin(GL_POLYGON);
glColor3d(0.4, 0.2, 0.5);
glVertex2d(l, 0.0);
glVertex2d(p, 0.0);
glVertex2d(p, -0.1);
glVertex2d(l, -0.1);
glEnd();
//Пересечение платформы со стенками
if(lr <= -0.7){lr = lr+0.005;}
if(lr >= 0.7){lr = lr-0.005;}
glPopMatrix();

glutSwapBuffers();
}



int main(int argc,char **argv)
{ 
glutInit(&argc,argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(640,480); 
glutInitWindowPosition(100,0); 
glutCreateWindow("Arcanoid beta2"); 
glClearColor(1,1,1,1);
glutDisplayFunc(display); 
glutKeyboardFunc(keys);
glutIdleFunc(display);
glutMainLoop();
} 

И ещё, если можно, скажите как узнать столкнулись-ли обьекты? Спс.

Автор: nerezus 26.1.2007, 16:37
DKey, ты сразу без навыков программирования за OGL взялся? Ты уверен, что это то, что тебе нужно?

Автор: AssassinFX 26.1.2007, 16:43
Цитата

 Помогите написать арканоид, вот нерабочий код:

У меня есть движок Reality Extend он рабочий но много чего там ещё нету,может допишите,и мне код отправите?! smile  

DKey, Ты понял да! smile 

Автор: DKey 26.1.2007, 17:25
AssassinFX, в смысле??? 

Автор: AssassinFX 26.1.2007, 21:31
DKey,В том смысле что вопос из разряда "я делаю игру,может поможете сделать",если какойто конкретный вопрос есть то задавай но игру писать,это....... smile 
My ICQ Number: 281596059

Автор: RDN_ResidentS 28.2.2007, 20:31
Народ! Тут такая проблема, тоже связанная с игрой арканоид...
Начинаю писать игру, и появилась одна загвоздка.
Вот текст


Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;


    HBRUSH hBrush, hOldBrush;
    HRGN RoundBall;
    BOOL Down = false;
    BOOL Up = false;

POINT point[2] = {{20, 20},{60, 60}};
RECT RoundBallRect = {point[0].x, point[0].y, point[1].x, point[1].y};
RECT RectangleField = {20, 20, 350, 450};
    


    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        case IDC_BUTTON1:
            SetTimer(hWnd, 1, 250, NULL);
            break;
        case IDC_BUTTON2:
            KillTimer(hWnd, 1);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        
        hBrush = CreateSolidBrush(RGB(255, 200, 255));
        hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

        Rectangle(hdc, 20, 20, 350, 450);
        SelectObject(hdc,hOldBrush);
        DeleteObject(hBrush);

        hBrush = CreateHatchBrush(HS_DIAGCROSS,RGB(0, 255, 128));
        hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

        RoundBall = CreateEllipticRgnIndirect(&RoundBallRect);
        FillRgn(hdc, RoundBall, hBrush);
        SelectObject(hdc,hOldBrush);
        DeleteObject(hBrush);
        
        EndPaint(hWnd, &ps);
        break;
    case WM_TIMER:
        
        if (Down)
        {
            Down = true;
        }

        else
        {
        
            while (Down);
            {
                if (RoundBallRect.top == 100)
                {
                    Down = true;
                    Up = false;
                }

                else
                {
                    RoundBallRect.top+=10;
                    RoundBallRect.bottom+=10;
                    Up = true;
                }
            }
        }
        if (Up)
        {
            Up = true;
        }

        else
        {
            while (Up);
            {
                if (RoundBallRect.bottom == 20)
                {
                    Up = true;
                    Down = false;
                }
                else
                {
                    RoundBallRect.top-=10;
                    RoundBallRect.bottom-=10;
                    Down = true;
                    //Up = false;
                }
            }
        }
        
        
        InvalidateRect(hWnd, &RoundBallRect, TRUE);
        InvalidateRect(hWnd, &RectangleField, TRUE);
        break;



Шарик двигается вниз, доходит до  RoundBallRect.top == 100 , потом поднимается вверх на один шаг  (RoundBallRect.top == 90) и зацикливается переходом вниз-вверх.
 Может гдето запорол.. подскажите.

Заранее благодарен.

Автор: Rickert 6.3.2007, 08:57
Чую я ни один писал в 11 классе арканоида. Приведи код расчёта координат

Автор: cipher 6.3.2007, 17:02
Это точно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)