[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.97,1.98 actor.h,1.51,1.52 script.cpp,1.52,1.53 sprite.cpp,1.41,1.42 sprite.h,1.14,1.15
Andrew Kurushin
h00ligan at users.sourceforge.net
Tue Jan 18 15:17:44 CET 2005
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.96,1.97 actor.h,1.50,1.51 interface.cpp,1.68,1.69 objectdata.cpp,1.4,1.5 objectdata.h,1.4,1.5 saga.cpp,1.95,1.96 saga.h,1.79,1.80 script.cpp,1.51,1.52 script.h,1.55,1.56 sfuncs.cpp,1.81,1.82
- Next message: [Scummvm-cvs-logs] CVS: scummvm/saga saga.cpp,1.96,1.97
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1296
Modified Files:
actor.cpp actor.h script.cpp sprite.cpp sprite.h
Log Message:
implemented Sprite::hitTest
Actors & Objects can be hited
Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -d -r1.97 -r1.98
--- actor.cpp 18 Jan 2005 21:13:23 -0000 1.97
+++ actor.cpp 18 Jan 2005 23:15:22 -0000 1.98
@@ -1055,6 +1055,24 @@
}
+uint16 Actor::hitTest(const Point &testPoint) {
+ CommonObjectOrderList::iterator drawOrderIterator;
+ CommonObjectDataPointer drawObject;
+ int frameNumber;
+ SpriteList *spriteList;
+ createDrawOrderList();
+ for (drawOrderIterator = _drawOrderList.begin(); drawOrderIterator != _drawOrderList.end(); ++drawOrderIterator) {
+ drawObject = drawOrderIterator.operator*();
+ if (!getSpriteParams(drawObject, frameNumber, spriteList)) {
+ continue;
+ }
+
+ if (_vm->_sprite->hitTest(*spriteList, frameNumber, drawObject->screenPosition, drawObject->screenScale, testPoint)) {
+ return drawObject->id;
+ }
+ }
+ return ID_NOTHING;
+}
void Actor::createDrawOrderList() {
int i;
@@ -1082,6 +1100,26 @@
}
}
+bool Actor::getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber, SpriteList *&spriteList) {
+ if (_vm->_scene->currentSceneNumber() == RID_ITE_OVERMAP_SCENE) {
+ if (!(commonObjectData->flags & kProtagonist)){
+ warning("not protagonist");
+ return false;
+ }
+ frameNumber = 8;
+ spriteList = &_vm->_sprite->_mainSprites;
+ } else {
+ frameNumber = commonObjectData->frameNumber;
+ spriteList = &commonObjectData->spriteList;
+ }
+
+ if ((frameNumber < 0) || (spriteList->spriteCount <= frameNumber)) {
+ warning("Actor::getSpriteParams frameNumber invalid for object id 0x%X", commonObjectData->id);
+ return false;
+ }
+ return true;
+}
+
int Actor::drawActors() {
CommonObjectOrderList::iterator drawOrderIterator;
CommonObjectDataPointer drawObject;
@@ -1096,24 +1134,11 @@
for (drawOrderIterator = _drawOrderList.begin(); drawOrderIterator != _drawOrderList.end(); ++drawOrderIterator) {
drawObject = drawOrderIterator.operator*();
-
- if (_vm->_scene->currentSceneNumber() == RID_ITE_OVERMAP_SCENE) {
- if (!(drawObject->flags & kProtagonist)){
- warning("not protagonist");
- continue;
- }
- frameNumber = 8;
- spriteList = &_vm->_sprite->_mainSprites;
- } else {
- frameNumber = drawObject->frameNumber;
- spriteList = &drawObject->spriteList;
- }
-
- if ((frameNumber < 0) || (spriteList->spriteCount <= frameNumber)) {
- warning("Actor::drawActors frameNumber invalid for object id 0x%X", drawObject->id);
+ if (!getSpriteParams(drawObject, frameNumber, spriteList)) {
continue;
}
+
if (_vm->_scene->getFlags() & kSceneFlagISO) {
//todo: it
} else {
Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- actor.h 18 Jan 2005 21:13:26 -0000 1.51
+++ actor.h 18 Jan 2005 23:15:28 -0000 1.52
@@ -327,7 +327,7 @@
void drawPathTest();
- uint16 testHit(const Point& mousePointer){ return ID_NOTHING;}; //TODO: do it
+ uint16 hitTest(const Point &testPoint);
void takeExit(uint16 actorId, const HitZone *hitZone);
bool actorEndWalk(uint16 actorId, bool recurse);
bool actorWalkTo(uint16 actorId, const Location &toLocation);
@@ -357,6 +357,7 @@
void createDrawOrderList();
void calcScreenPosition(CommonObjectData *commonObjectData);
+ bool getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber, SpriteList *&spriteList);
bool followProtagonist(ActorData *actor);
void findActorPath(ActorData *actor, const Point &fromPoint, const Point &toPoint);
Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- script.cpp 18 Jan 2005 21:13:40 -0000 1.52
+++ script.cpp 18 Jan 2005 23:15:29 -0000 1.53
@@ -904,7 +904,7 @@
if (_vm->_actor->_protagonist->currentAction == kActionWalkDir) {
} else {
- newObjectId = _vm->_actor->testHit(mousePoint);
+ newObjectId = _vm->_actor->hitTest(mousePoint);
if (newObjectId != ID_NOTHING) {
if (objectTypeId(newObjectId) == kGameObjectObject) {
Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- sprite.cpp 11 Jan 2005 21:10:36 -0000 1.41
+++ sprite.cpp 18 Jan 2005 23:15:41 -0000 1.42
@@ -173,10 +173,10 @@
int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale) {
const byte *spriteBuffer;
int i, j;
- byte *buf_row_p;
- const byte *src_row_p;
- int clip_width;
- int clip_height;
+ byte *bufRowPointer;
+ const byte *srcRowPointer;
+ int clipWidth;
+ int clipHeight;
int width;
int height;
int xAlign;
@@ -197,34 +197,79 @@
return 0;
}
- buf_row_p = (byte *)ds->pixels + ds->pitch * spritePointer.y;
- src_row_p = spriteBuffer;
+ bufRowPointer = (byte *)ds->pixels + ds->pitch * spritePointer.y;
+ srcRowPointer = spriteBuffer;
- // Clip to right side of surface
- clip_width = width;
+ clipWidth = width;
if (width > (ds->w - spritePointer.x)) {
- clip_width = (ds->w - spritePointer.x);
+ clipWidth = (ds->w - spritePointer.x);
}
- // Clip to bottom side of surface
- clip_height = height;
+ clipHeight = height;
if (height > (ds->h - spritePointer.y)) {
- clip_height = (ds->h - spritePointer.y);
+ clipHeight = (ds->h - spritePointer.y);
}
- for (i = 0; i < clip_height; i++) {
- for (j = 0; j < clip_width; j++) {
- if (*(src_row_p + j) != 0) {
- *(buf_row_p + j + spritePointer.x) = *(src_row_p + j);
+ for (i = 0; i < clipHeight; i++) {
+ for (j = 0; j < clipWidth; j++) {
+ if (*(srcRowPointer + j) != 0) {
+ *(bufRowPointer + j + spritePointer.x) = *(srcRowPointer + j);
}
}
- buf_row_p += ds->pitch;
- src_row_p += width;
+ bufRowPointer += ds->pitch;
+ srcRowPointer += width;
}
return SUCCESS;
}
+bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
+ const byte *spriteBuffer;
+ int i, j;
+ const byte *srcRowPointer;
+ int clipWidth;
+ int clipHeight;
+ int width;
+ int height;
+ int xAlign;
+ int yAlign;
+ Point spritePointer;
+
+
+ getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
+
+ spritePointer.x = screenCoord.x + xAlign;
+ spritePointer.y = screenCoord.y + yAlign;
+
+ if (spritePointer.x < 0) {
+ return false;
+ }
+ if (spritePointer.y < 0) {
+ return false;
+ }
+
+ clipWidth = width;
+ if (width > (_vm->getDisplayWidth() - spritePointer.x)) {
+ clipWidth = (_vm->getDisplayWidth() - spritePointer.x);
+ }
+
+ clipHeight = height;
+ if (height > (_vm->getDisplayHeight() - spritePointer.y)) {
+ clipHeight = (_vm->getDisplayHeight() - spritePointer.y);
+ }
+
+ if ((testPoint.y < spritePointer.y) || (testPoint.y >= spritePointer.y + clipHeight)) {
+ return false;
+ }
+ if ((testPoint.x < spritePointer.x) || (testPoint.x >= spritePointer.x + clipWidth)) {
+ return false;
+ }
+ i = testPoint.y - spritePointer.y;
+ j = testPoint.x - spritePointer.x;
+ srcRowPointer = spriteBuffer + j + i * width;
+ return *srcRowPointer != 0;
+}
+
int Sprite::drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth) {
const byte *spriteBuffer;
int x, y;
Index: sprite.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- sprite.h 9 Jan 2005 15:07:49 -0000 1.14
+++ sprite.h 18 Jan 2005 23:15:41 -0000 1.15
@@ -70,7 +70,7 @@
int loadList(int resourceId, SpriteList &spriteList); // load or append spriteList
int draw(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale);
int drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
-
+ bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
private:
void decodeRLEBuffer(const byte *inputBuffer, size_t inLength, size_t outLength);
void scaleBuffer(const byte *src, int width, int height, int scale);
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.96,1.97 actor.h,1.50,1.51 interface.cpp,1.68,1.69 objectdata.cpp,1.4,1.5 objectdata.h,1.4,1.5 saga.cpp,1.95,1.96 saga.h,1.79,1.80 script.cpp,1.51,1.52 script.h,1.55,1.56 sfuncs.cpp,1.81,1.82
- Next message: [Scummvm-cvs-logs] CVS: scummvm/saga saga.cpp,1.96,1.97
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list