[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


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);





More information about the Scummvm-git-logs mailing list