-1

弾丸クラスでは、ゲームの角度を変更する必要があります。移動メソッドで角度を増やしましたが、実際には画像が移動し、角度が変更されていません。STD "cout"bullet angle in render :"bullets[i]->getangle()" を使用して、コンソールで設定角度の結果をリダイレクトしました。正しい結果が得られたように思えますが、画像の角度が変わらない理由はわかりません。

 //bullet.h 
        #ifndef BULLET_H_INCLUDED
    #define BULLET_H_INCLUDED
    #include <SDL/SDL.h>
    #include <iostream>
    class bullet
        {
            SDL_Rect box;
            int xvel,yvel,angle;
            SDL_Surface *image,*bull;
        public:
            bullet ();
            bullet(SDL_Surface* img,int x,int y,int xvel,int yvel,int angle);
            void move();
            void show(SDL_Surface* screen);
            SDL_Rect* getRect();
            SDL_Surface* load_image(const char* filename,SDL_Surface* screen);
            int getangle();
            void setangle(int angle);
        };
        #endif // BULLET_H_INCLUDED
        //bullet.cpp 
        #include "bullet.h"
    #include "SDL_rotozoom.h"
    //first  construc
    bullet::bullet(SDL_Surface* img,int x,int y,int xVel,int yVel,int ang)
    {
    box.x=x;
    box.y=y;
    image=img;
    box.w=image->w;
    box.h=image->h;
    xvel=xVel;
    yvel=yVel;
    angle=ang;
    }
    //second construc
    bullet::bullet()
    {
    angle+=30;
    }
    //move methode
    void bullet::move()
    {
    box.x+=xvel;
    box.y+=yvel;
    angle+=20;
    }
    //get the angle
    int bullet::getangle()
    {
    return angle;
    }
    // set the angle
    void bullet::setangle(int agl)
    {
    angle = ((((angle + agl) % 360) + 360) % 360)
    }
    //methode to show bullet
    void bullet::show(SDL_Surface* screen)
    {
        SDL_BlitSurface(image,NULL,screen,&box);
    }
    // methode to get bullet rectangle
    SDL_Rect* bullet::getRect()
    {
    return &box ;
    }
    // methode that load the image
     SDL_Surface* bullet::load_image(const char* filename,SDL_Surface* screen)
     {
    SDL_Surface* tmp=SDL_LoadBMP(filename);
    SDL_Surface* tmp2=SDL_DisplayFormat(tmp);
    SDL_SetColorKey(tmp2,SDL_SRCCOLORKEY,SDL_MapRGB(screen->format,0x00,0xff,0xff));
    SDL_Surface* rotozoomimage=rotozoomSurface(tmp2,angle,1.0,0);
    SDL_FreeSurface(tmp);
    SDL_FreeSurface(tmp2);
    return rotozoomimage;
    }

        // loadimage methode 
        SDL_Surface* bullet::load_image(const char* filename,SDL_Surface* screen)
        {
          SDL_Surface* tmp=SDL_LoadBMP(filename);
          SDL_Surface* tmp2=SDL_DisplayFormat(tmp);
          SDL_SetColorKey(tmp2,SDL_SRCCOLORKEY,SDL_MapRGB(screen->format,0x00,0xff,0xff));
          SDL_Surface* rotozoomimage=rotozoomSurface(tmp2,angle,1.0,0);
          SDL_FreeSurface(tmp);
          SDL_FreeSurface(tmp2);
          return rotozoomimage;
        }

        // move methode 
        void bullet::move()
        {
          box.x+=xvel;
          box.y+=yvel;
          angle+=20;
        }

        // getter and setter 
        int bullet::getangle()
        {
          return angle;
        }
        void bullet::setangle(int agl)
        {
          if (angle>=360)
          {
            angle-=360;
          }
          else if (angle<=-360)
          {
            angle+=360;
          }
          angle+=agl;
        }

        //class game 
        //logique part 
        // game.cpp
        // logique
        .
        .
        .
        for (int i=0;i<bullets.size();i++)
        {
          bullets[i]->setangle(20);
          std::cout<<"bullet angle :"<<bullets[i]->getangle()<<std::endl;
          bullets[i]->move();
        }
        //render part 
        for (int i=0;i<bullets.size();i++)
        {
          bullets[i]->show(screen);
          std::cout<<"bullet angle in render :"<<bullets[i]->getangle()<<std::endl;
        }
        SDL_Flip(screen);
4

1 に答える 1

1

私が見る限りangle、画像を読み込んだ後は何にも使用しません。
角度が変わったら画像を回転させる必要があります。

于 2013-06-13T12:38:37.477 に答える