[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Enigma-cvs] enigma/src actors.cc,1.47,1.48
From: |
Ralf Westram <address@hidden> |
Subject: |
[Enigma-cvs] enigma/src actors.cc,1.47,1.48 |
Date: |
Thu, 30 Oct 2003 19:04:12 +0000 |
Update of /cvsroot/enigma/enigma/src
In directory subversions:/tmp/cvs-serv17945/src
Modified Files:
actors.cc
Log Message:
- actor_inside is now even called if the actor is only
partly inside a stone
Index: actors.cc
===================================================================
RCS file: /cvsroot/enigma/enigma/src/actors.cc,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -d -r1.47 -r1.48
*** actors.cc 27 Oct 2003 22:27:53 -0000 1.47
--- actors.cc 30 Oct 2003 19:04:10 -0000 1.48
***************
*** 324,327 ****
--- 324,341 ----
}
+ namespace {
+ inline void maybe_call_actor_inside(Actor *ac, const GridPos&
surroundingPos) {
+ if (Stone *st = GetStone(surroundingPos)) {
+ ActorInfo *ai = ac->get_actorinfo();
+ double dist = length(surroundingPos.center()-ai->pos) -
ai->radius;
+
+ if (dist < 0.65) { // otherwise actor is crashed by stones with
round edges
+ // st->warning("actordist is %f", dist);
+ st->actor_inside(ac);
+ }
+ }
+ }
+ }
+
void Actor::move() {
using namespace world;
***************
*** 349,352 ****
--- 363,391 ----
st->actor_inside(this);
+ // check whether marble overlaps with surrounding fields and
+ // call actor_inside for all stones on overlapped fields
+ {
+ double radius = actorinfo.radius-0.05; // allow a very small overlap
+ GridPos lu_field(actorinfo.pos+V2(-radius, -radius));
+ GridPos rl_field(actorinfo.pos+V2( radius, radius));
+ bool ov_top = lu_field.y != field.y;
+ bool ov_bot = rl_field.y != field.y;
+
+ if (lu_field.x != field.x) { // overlaps into left field
+ if (ov_top) maybe_call_actor_inside(this, GridPos(field.x-1,
field.y-1));
+ maybe_call_actor_inside (this, GridPos(field.x-1,
field.y));
+ if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x-1,
field.y+1));
+ }
+
+ if (rl_field.x != field.x) { // overlaps into right field
+ if (ov_top) maybe_call_actor_inside(this, GridPos(field.x+1,
field.y-1));
+ maybe_call_actor_inside (this, GridPos(field.x+1,
field.y));
+ if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x+1,
field.y+1));
+ }
+
+ if (ov_top) maybe_call_actor_inside(this, GridPos(field.x,
field.y-1));
+ if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x,
field.y+1));
+ }
+
m_sprite.move (actorinfo.pos);
on_motion(actorinfo.pos);
***************
*** 698,702 ****
m_shield_rest_time += SHIELD_TIME;
update_halo();
! }
else if (m == "booze") {
m_drunk_rest_time += 5.0; // Drunken for 5 more seconds
--- 737,741 ----
m_shield_rest_time += SHIELD_TIME;
update_halo();
! }
else if (m == "booze") {
m_drunk_rest_time += 5.0; // Drunken for 5 more seconds
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Enigma-cvs] enigma/src actors.cc,1.47,1.48,
Ralf Westram <address@hidden> <=