OSDN Git Service

視界処理の追加実装。 / Extend implementation of creature sight.
authorDeskull <desull@users.sourceforge.jp>
Tue, 6 Jan 2015 12:36:16 +0000 (21:36 +0900)
committerDeskull <desull@users.sourceforge.jp>
Tue, 6 Jan 2015 12:36:16 +0000 (21:36 +0900)
Deeangband/Creature.cpp
Deeangband/Creature.h
Deeangband/Deeangband.h
Deeangband/GameSurfaceSDL.cpp

index 7fccc51..5c85968 100644 (file)
@@ -428,6 +428,7 @@ namespace Deeangband
        {
                std::vector<Coordinates> rangeVec;
                std::vector<Coordinates>::iterator rangeIt;
+               this->sight.clear();
                this->position.GetRoundRange(rangeVec, 0, 12);
                //std::for_each(rangeVec.begin(), rangeVec.end(), [&](const Coordinates r) { this->lore.GetFieldLore(0, r->GetX(), r.GetY()); });
                for(rangeIt = rangeVec.begin(); rangeIt != rangeVec.end(); rangeIt++)
@@ -435,6 +436,7 @@ namespace Deeangband
                        if(fieldPtr->HaveSight(this->position.GetX(), this->position.GetY(), rangeIt->GetX(), rangeIt->GetY()))
                        {
                                this->lore.PutFieldLore(0, rangeIt->GetX(), rangeIt->GetY());
+                               this->sight[rangeIt->GetY()][rangeIt->GetX()] = true;
                        }
                }
        }
@@ -447,4 +449,9 @@ namespace Deeangband
                oa << boost::serialization::make_nvp("Creature", *this);
        }
 
+       bool Creature::InSight(int x, int y)
+       {
+               return this->sight[y][x];
+       }
+
 }
\ No newline at end of file
index b659491..b3d65e5 100644 (file)
@@ -109,6 +109,7 @@ namespace Deeangband
                HP hpTable[CREATURE_MAX_LEVEL]; //!< \83q\83b\83g\83_\83C\83X\82É\8aî\82Ã\82«\90\90¬\82³\82ê\82½\83\8c\83x\83\8b\96\88\82Ì\8aî\96{HP
 
                Lore lore; //!< \8bL\89¯\8fî\95ñ
+               std::map<int, std::map<int, bool>> sight; //!<\8e\8b\8aE\8fî\95ñ
 
                /*!
                * @brief \83N\83\8a\81[\83`\83\83\81[\8e\80\96S\8e\9e\82Ì\8f\88\97\9d\82ð\8ds\82¤
@@ -494,11 +495,16 @@ namespace Deeangband
                Lore* Creature::GetLore() {return &this->lore; }
 
                /*!
-                * @brief \83N\83\8a\81[\83`\83\83\81[\82É\83t\83B\81[\83\8b\83h\94F\92m\8fî\95ñ\82ð\8dX\90V\82·\82é
+                * @brief \83N\83\8a\81[\83`\83\83\81[\82Ì\83t\83B\81[\83\8b\83h\94F\92m\8fî\95ñ\82ð\8dX\90V\82·\82é
                 * @return \82È\82µ
                 */
                void Creature::UpdateFieldLore(Field *fieldPtr);
 
+               /*!
+                * @brief \8ew\92è\92n\93_\82ª\83N\83\8a\81[\83`\83\83\81[\82Ì\8e\8b\8aE\82É\93ü\82Á\82Ä\82¢\82é\82©\82ð\95Ô\82·\81B
+                * @return \8e\8b\8aE\82É\93ü\82Á\82Ä\82¢\82é\82È\82ç true
+                */
+               bool Creature::InSight(int x, int y);
 
        };
 
index 3b390f0..b3acfb4 100644 (file)
 #define CREATURE_MAX_GOLD 999999999L //!< \8dÅ\91å\83S\81[\83\8b\83h\92l
 #define CREATURE_MAX_MORTAL_LEVEL 30 //!< \92è\96½\8dÅ\91å\83\8c\83x\83\8b
 #define CREATURE_MAX_DIVINE_LEVEL 30 //!< \90_\8ai\8dÅ\91å\92l
-#define FIELD_MAX_WIDTH  65535  //!< \83t\83B\81[\83\8b\83h\8dÅ\91å\95\9d 
-#define FIELD_MAX_HEIGHT 65535  //!< \83t\83B\81[\83\8b\83h\8dÅ\91å\8d\82\82³
+#define FIELD_MAX_WIDTH  512  //!< \83t\83B\81[\83\8b\83h\8dÅ\91å\95\9d 
+#define FIELD_MAX_HEIGHT 512  //!< \83t\83B\81[\83\8b\83h\8dÅ\91å\8d\82\82³
+#define FIELD_BUFFER_SIZE (FIELD_MAX_WIDTH * FIELD_MAX_HEIGHT)
+#define FIELD_BUFFER(X, Y) (FIELD_MAX_HEIGHT * Y + X) 
 #define CREATURE_MAX_LEVEL CREATURE_MAX_MORTAL_LEVEL+CREATURE_MAX_DIVINE_LEVEL //!< \90_\8ai\8d\9e\82Ý\8dÅ\91å\83\8c\83x\83\8b
 
 #define SPECIAL_NAME_UNKNOWN "UNKNOWN" //!< \96¼\8fÌ\82Ì\83_\83~\81[\96¼
index 3c77b36..674b228 100644 (file)
@@ -139,7 +139,7 @@ namespace Deeangband
 
                //! @note \8e\8b\8aE\8aO\92n\8c`\83O\83\89\83t\83B\83b\83N\82Ì\93Ç\82Ý\8d\9e\82Ý
 
-               rwop = SDL_RWFromFile("img\\seenField.png", "rb");
+               rwop = SDL_RWFromFile("img\\UnseenField.png", "rb");
                unseenFieldSurface = IMG_LoadPNG_RW(rwop);
 
 
@@ -161,7 +161,7 @@ namespace Deeangband
                        symbolSurface = TTF_RenderUTF8_Blended(font, toUTF8(symBuf).c_str(), sdlSymCol);
                        blitRect.x += (24 - symbolSurface->w) / 2;
                        blitRect.y += (24 - symbolSurface->h) / 2;
-                       SDL_BlitSurface(symbolSurface, &symbolRect, surface, &blitRect); 
+                       SDL_BlitSurface(symbolSurface, &symbolRect, surface, &blitRect);
                        SDL_FreeSurface(symbolSurface);
 
                        floorSurfaces.insert(std::map<TAG, SDL_Surface*>::value_type(floorIt->first, surface));
@@ -560,6 +560,7 @@ void GameSurfaceSDL::drawField(const CREATURE_IT &subjectCreatureIt, GameWorld *
 {      
        SDL_Rect symbolRect = {0, 0, squareGraphicWidth, squareGraphicHeight};
        CREATURE_IT creatureIt;
+       Creature *subJectCreaturePtr = subjectCreatureIt->second.get();
 
        int px, py;
        for(py = y; py < y + h; py++)
@@ -569,10 +570,15 @@ void GameSurfaceSDL::drawField(const CREATURE_IT &subjectCreatureIt, GameWorld *
                        if(px < fieldPtr->GetWidth() && py < fieldPtr->GetHeight())
                        {
                                SDL_Rect blitRect = {GameSurfaceSDL::sideBarWidth + (px - x) * squareGraphicWidth, 30 + (py - y) * squareGraphicHeight , squareGraphicWidth, squareGraphicHeight};
-                               if(subjectCreatureIt->second->GetLore()->GetFieldLore(0, px, py) > 0)
+                               if(subJectCreaturePtr->GetLore()->GetFieldLore(0, px, py) > 0)
                                {
                                        TAG tag = fieldPtr->GetSquare(px, py)->GetFloorTag();
-                                       SDL_BlitSurface(floorSurfaces[tag], &symbolRect, windowSurface, &blitRect); 
+                                       SDL_BlitSurface(floorSurfaces[tag], &symbolRect, windowSurface, &blitRect);
+                                       if(subJectCreaturePtr->InSight(px, py) == false)
+                                       {
+                                               SDL_Rect fieldRect = {blitRect.x % 128, blitRect.y % 128, blitRect.x % 128 + squareGraphicWidth, blitRect.y % 128 + squareGraphicHeight};
+                                               SDL_BlitSurface(unseenFieldSurface, &fieldRect, windowSurface, &blitRect); 
+                                       }
                                }
                                else
                                {