none
Перевод консольного приложения на WinForms RRS feed

  • Вопрос

  • Написал простенькую игру в пустом проекте, код С++ прилагается

    #pragma comment (lib, "glaux.lib")
    #include <stdlib.h>
    #include <glut.h>
    #include <glaux.h>
    #include  <math.h>
    #include <iostream>
    #include <time.h>

    int w=600;
    int h=800;
    AUX_RGBImageRec *fon;

    float gravity=3;
    int score=0;
    const int NUM=25;
    bool life=true;
    char str[10];

    class PER{
    public:
    float dx,dy;
    int x,y;
    bool Right,Left;
    AUX_RGBImageRec *image;
    void move(){    

    if(Right) x+=25;
    if(Left) x-=25;
    dy=dy-gravity;
    y+=int(dy);
    if (y>=500) y=500;

    x+=int(dx);

    if(y<0){ y=0; dy=40; dx=dx; }    
    if(x<0)    { x=0; dx=-dx;}
    if(x>w)    { x=w; dx=-dx;}

    }
    void Draw(){
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_NOTEQUAL,0);
    glRasterPos2d(x,y);
    glDrawPixels(image->sizeX,image->sizeY,GL_RGBA,GL_UNSIGNED_BYTE,image->data);
    glDisable(GL_ALPHA_TEST);
    }

    } person;

    class Platforms{
    public:
    int x,y;
    AUX_RGBImageRec *platform;

    Platforms(){
    x=rand()%w-100;
    y=rand()%h;
    }
    void New(){
    x=rand()%w-100;
    y=800;
    }
    void move(){
    if(person.y==500){
    y-=int(person.dy);
    }
    }

    void Draw(){
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_NOTEQUAL,0);
    glRasterPos2d(x,y);
    glDrawPixels(platform->sizeX,platform->sizeY,GL_RGBA,GL_UNSIGNED_BYTE,platform->data);
    glDisable(GL_ALPHA_TEST);
    }

    } platform[NUM];


    ////вспомогательная функция, выводит текст
    void TextOut(int x, int y, char *string) {  
      char *c; glRasterPos2f(x, y);
      for (c=string; *c != '\0'; c++) {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *c);
      }
    }



    void tick(){
    person.move();    

    for(int i=0;i<NUM;i++){
    platform[i].move();    

    if(platform[i].y<-50)
    platform[i].New();
    }
    for(int i=0;i<NUM;i++)
    if((person.x+40>=platform[i].x)&&(person.x+30<=platform[i].x+68)&&
    (person.y>=platform[i].y-10)&&(person.y+60<=platform[i].y+90)&&person.dy<0)
    person.dy=40;
    if(person.y==500)
    score++; 
    if(person.y==0){
    life=false;
    }
    }





    void ShowFon(){
    glRasterPos2d(0,0);
    glDrawPixels(fon->sizeX,fon->sizeY,GL_RGB,GL_UNSIGNED_BYTE,fon->data);
    }



    void display() {

    glClear(GL_COLOR_BUFFER_BIT);
    if(life){
    ShowFon();
    person.Draw();
    for(int i=0;i<NUM;i++)
    platform[i].Draw();

    itoa(score,str,10);
    glColor3f(0,0,0);  
    TextOut(w-65,h-25,str);
    }
    else
    {
    glColor3f(1,1,1); 
    TextOut(100,500,"GAME OVER");

    TextOut(w-45,h-25,str);
    }
    glFlush();
    glutSwapBuffers();
    }



    void Keyboard(unsigned char key, int a, int b)
    {   
        switch(key)
        {
    case 'd' :case 226:  person.Right=true; break;
    case 'a' :case 244:  person.Left=true; break;
    case 13 : case 32:   person.y=400; person.x=w/2; life=true; score=0;  break;       
         }
    }

    void KeyboardUp(unsigned char key, int a, int b)
    {   
        switch(key)
        {
    case 'd' :case 226: person.Right=false; break;
    case 'a' :case 244: person.Left=false; break;

         }
    }




    void timer(int = 0)
    {
      display();
      tick();
      glutTimerFunc(33,timer,0);
    }

    void SetAlpha(AUX_RGBImageRec *image) 
    {
    int w=image->sizeX; 
    int h=image->sizeY;
    unsigned char *m_pbits = new unsigned char [4* w * h]; //3 для RGB +1 для альфа-канала.

    for (int i=0; i<w*h; i++){ 
    m_pbits[4 * i + 0] =image->data[3 * i + 0]; 
     m_pbits[4 * i + 1] =image->data[3 * i + 1]; 
     m_pbits[4 * i + 2] =image->data[3 * i + 2];
    if ((image->data[3*i+0]==0) && (image->data[3*i+1]==0) && (image->data[3*i+2]==0) )  
    m_pbits[4*i+3] = 0;   
    else 
    m_pbits[4*i+3]=255; 
    }

    image->data = m_pbits;
    }



    int main(int argc, char **argv) {
    srand(time(0));
    person.dx=0;
    person.dy=50;
    person.x=300;
    person.y=0;
    fon = auxDIBImageLoad("fon.bmp");
    for(int i=0;i<NUM;i++){
    platform[i].platform = auxDIBImageLoad("platform.bmp");
    SetAlpha(platform[i].platform);
    }
    person.image = auxDIBImageLoad("normleft.bmp");
    SetAlpha(person.image);

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize (w, h);
    glutCreateWindow ("Test"); 
    glClearColor(0.0,0.0,0.0,1.0);  
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,w,0,h);

    glutDisplayFunc (display);
    glutKeyboardFunc(Keyboard);
    glutKeyboardUpFunc(KeyboardUp);
    glutTimerFunc(50,timer,0);

    glutMainLoop();
    }

    Нужно реализовать его на Windows Forms, не могли бы вы подсказать последовательность действий, и что вообще нужно для этого сделать?

                      
    17 апреля 2017 г. 0:27

Все ответы

  • Уточните, что именно вы хотите сделать, переделать рисование OpenGL на GDI+ или просто впихнуть OpenGL-рисование в проект Windows Forms? Вы уверены, что вам *действительно* нужен Windows Forms?
    17 апреля 2017 г. 7:48