2011-07-05 16 views
1

SDLで練習中です。私は現在、星、太陽、地球のクラスで空間を描いています。私は画面にレンダリングするためのすべてを得ることができますが、私は右矢印キーで太陽を移動するとき、私はビューが太陽の周りを回転していることをシミュレートするために古い太陽を削除する方法を見つけることができません。それは単に画面全体に大きな線を作成します。私はキーがダウンするたびに、画面をクリアし、星、太陽、そして地球を再描画する必要があると思う。しかし、範囲が外れるので星を再描画することはできません。再作成すると、場所をランダム化するためにrand()を使用するため、別の位置に配置されます。大きな壁に当たったことがあり、助言をいただければ幸いです。スペース内の画像を再描画できません

コード:

// Planet.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <SDL.h> 
#include <SDL_gfxPrimitives.h> 
#include <stdlib.h> 
#include <time.h> 

class Star 
{ 
private: 
    int x,y,rad,r,g,b,a; 
    SDL_Surface* screen; 
public: 
    Star(SDL_Surface* sc, int xx, int yy, int ra, int rr, int gg, int bb, int aa){screen=sc;x=xx;y=yy;rad=ra;r=rr;g=gg;b=bb;a=aa;} 
    ~Star(){} 
    void Show() 
    { 
     filledCircleRGBA(screen, x, y, rad, r, g, b, a); 
    } 
}; 

class Sun 
{ 
private: 
    int x,y,rad,r,g,b,a; 
    SDL_Surface* screen; 
public: 
    Sun(SDL_Surface* sc, int xx, int yy, int ra, int rr, int gg, int bb, int aa){screen=sc;x=xx;y=yy;rad=ra;r=rr;g=gg;b=bb;a=aa;} 
    ~Sun(){} 
    void Show() 
    { 
     for (int light=10;light<241;light+=10){ 
     filledCircleRGBA(screen, x, y, rad+(light/7), r, g, b+(light/2), a-light); 
     } 
    } 
    void Move(int a, int b) 
    { 
     x+=a; 
     y+=b; 
    } 
}; 

class Earth 
{ 
private: 
    int x,y,rad,r,g,b,a; 
    SDL_Surface* screen; 
public: 
    Earth(SDL_Surface* sc, int xx, int yy, int ra, int rr, int gg, int bb, int aa){screen=sc;x=xx;y=yy;rad=ra;r=rr;g=gg;b=bb;a=aa;} 
    ~Earth(){} 
    void Show() 
    { 
     for (int light=10;light<241;light+=10){ 
     filledCircleRGBA(screen, x, y, rad+(light/7), r, g, b+(light/2), a-(light/2)); 
     } 
     for (double light=0;light<.25;light+=.01){ 
     filledEllipseRGBA(screen, x, y-(rad*1.05), rad*(.60+light), rad*(.1+light), 170+(light*100), 170+(light*100), 170+(light*100), 255-(light*1000)); 
     } 
    } 
}; 

int main(int argc, char* args[]) 
{ 
    //Start SDL 
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Surface* screen = NULL; 
    screen = SDL_SetVideoMode(1366, 768, 32, SDL_FULLSCREEN | SDL_SWSURFACE); 
    srand((unsigned)time(NULL)); 
    //Stars 
    for (int x=0;x<1361;x+=25){ 
     for (int y=0;y<766;y+=25){ 
      int Special = rand()%3; 
      if(Special==0||Special==1){ 
      Star star(screen, x+(rand()%30), y+(rand()%30), 0+(rand()%1), 235+rand()%21, 235+rand()%21, 235+rand()%21, 205+rand()%51); 
      star.Show(); 
      } 
      if(Special==2){ 
      Star star(screen, x+(rand()%30), y+(rand()%30), 0+(rand()%2), 235+rand()%21, 235+rand()%21, 235+rand()%21, 205+rand()%51); 
      star.Show(); 
      } 
     } 
    } 
    //Sun 
    Sun sun(screen, 200, 300, 10, 255, 255, 0, 255); 
    sun.Show(); 
    //Earth 
    Earth earth(screen, 700, 400, 100, 0, 80, 255, 255); 
    earth.Show(); 
    SDL_Event event; 
    bool Running=1; 
    bool keysHeld[323]={false}; 
    while (Running) 
    { 
     // Handle input 
     if (SDL_PollEvent(&event)) 
     { 
     if (event.type == SDL_QUIT) 
     { 
      Running = false; 
     } 

     if (event.type == SDL_KEYDOWN) 
     { 
      keysHeld[event.key.keysym.sym] = true; 
     } 
     if (event.type == SDL_KEYUP) 
     { 
      keysHeld[event.key.keysym.sym] = false; 
     } 
     } 

     if (keysHeld[SDLK_ESCAPE]) 
     { 
     Running = false; 
     } 

     if (keysHeld[SDLK_LEFT]) 
     { 

     } 
     if (keysHeld[SDLK_RIGHT]) 
     { 
     SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); 
     sun.Move(4,0); 
     sun.Show(); 
     } 
     if (keysHeld[SDLK_UP]) 
     { 

     } 
     if (keysHeld[SDLK_DOWN]) 
     { 

     } 


     SDL_Flip(screen); 

    } 
    //Quit SDL 
    SDL_Quit(); 
    return 0; 
} 

答えて

0

EDIT

私の最後の答えはゴミだったので、私はもう一度試してください。

はい、彼らはあるので、実際に、星がスコープの外に行きますループで宣言されています。あなたができることは、配列内のすべての星を保存することですが、これは巨大なバイトの無駄です。

私の意見では、すべての星をサーフェスに描画し、必要なときにいつでもスクリーン上に描画する方がよいでしょう。これは、高速かつメモリ効率的でなければなりません。

Uint32 rmask, gmask, bmask, amask; 

    /* SDL interprets each pixel as a 32-bit number, so our masks must depend 
     on the endianness (byte order) of the machine */ 
#if SDL_BYTEORDER == SDL_BIG_ENDIAN 
    rmask = 0xff000000; 
    gmask = 0x00ff0000; 
    bmask = 0x0000ff00; 
    amask = 0x000000ff; 
#else 
    rmask = 0x000000ff; 
    gmask = 0x0000ff00; 
    bmask = 0x00ff0000; 
    amask = 0xff000000; 
#endif 
SDL_Surface* star_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, 1361, 766, 32, rmask, gmask, bmask, amask); 

そして今、あなたはこの表面にあなたの星を描く::私は、短いサンプル翔ます

... 
Star star(star_surface, x+(rand()%30), y+(rand()%30), 0+(rand()%1), 235+rand()%21, 235+rand()%21, 235+rand()%21, 205+rand()%51); 
star.Show(); 
... 

にあなたがそれを必要とする任意の時間を、あなたの画面の背景を使用して、この表面をブリットこの機能:

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); 
+0

申し訳ありませんが、私はより明確にすべきでした。私は画面をクリアすることができますが、星のインスタンスがもう存在しないため、同じイメージを再描画することはできません。これはSDLよりもC++の問題です。 – Vince

+0

素晴らしい!これはまさに私が探していたものでした。ありがとう! – Vince

関連する問題