View Javadoc

1   package erland.game.tileadventure;
2   
3   import org.apache.commons.logging.Log;
4   import org.apache.commons.logging.LogFactory;
5   
6   
7   /*
8    * Copyright (C) 2004 Erland Isaksson (erland_i@hotmail.com)
9    *
10   * This program is free software; you can redistribute it and/or
11   * modify it under the terms of the GNU General Public License
12   * as published by the Free Software Foundation; either version 2
13   * of the License, or (at your option) any later version.
14   *
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Public License for more details.
19   *
20   * You should have received a copy of the GNU General Public License
21   * along with this program; if not, write to the Free Software
22   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23   *
24   */
25  
26  public class MovableObject extends AnimatedObject implements GameObjectUpdateInterface {
27      /*** Logging instance */
28      private static Log LOG = LogFactory.getLog(MovableObject.class);
29      private boolean bMoving;
30      private Action movingAction;
31      private int movingProgress = 0;
32      private final int MOVING_PROGRESS_MAX = 20;
33      private int movingSpeed=0;
34      private boolean bDropping;
35      private float droppingProgress = 0;
36      private int droppingHeight = 0;
37      private float droppingSpeed = 0;
38      private final int DROPPING_PROGRESS_MAX = 20;
39  /*
40      protected Action isActionPossible(Action action) {
41          if(!bMoving && (action.isMove() || action.isPush())) {
42              return getActionMap().isActionPossibleOnObject(this,action);
43          }
44          return Action.NONE;
45      }
46      protected boolean actionChild(Action action) {
47          if(!bMoving && (action.isMove() || action.isPush())) {
48              Action a = getActionMap().startActionOnObject(this,action);
49              if(a.isMove()||a.isPush()) {
50                  bMoving = true;
51                  movingAction = a;
52                  movingProgress = 0;
53                  if(a.isMove()) {
54                      movingSpeed = 2;
55                  }else {
56                      movingSpeed = 1;
57                  }
58              }
59              return true;
60          }
61          return false;
62      }
63  
64  
65      protected boolean isMovableChild(Direction direction) {
66          if(!bMoving) {
67              float newX=getPosX();
68              float newY=getPosY();
69              float newZ=getPosZ();
70              if(direction==Direction.WEST) {
71                  newX--;
72              }else if(direction==Direction.EAST) {
73                  newX++;
74              }else if(direction==Direction.NORTH) {
75                  newY--;
76              }else if(direction==Direction.SOUTH) {
77                  newY++;
78              }else if(direction==Direction.DOWN) {
79                  newZ--;
80              }else if(direction==Direction.UP) {
81                  newZ++;
82              }
83              if(getActionMap().isFree(this,newX,newY,newZ)) {
84                  return true;
85              }
86          }else {
87              if(movingAction.getDirection()==direction) {
88                  return true;
89              }
90          }
91          return false;
92      }
93  
94      public boolean update() {
95          boolean bUpdated = false;
96          if(bMoving) {
97              movingProgress+=movingSpeed;
98              if(movingProgress>=MOVING_PROGRESS_MAX) {
99                  getActionMap().endActionOnObject(this,movingAction);
100                 bMoving = false;
101             }
102             bUpdated = true;
103         }
104         if(bDropping) {
105             droppingProgress+=droppingSpeed;
106             LOG.debug(getMovingProgressZ()+","+droppingProgress+","+droppingHeight);
107             if(getMovingProgressZ()<=-1) {
108                 getActionMap().endActionOnObject(this,Action.DROP);
109                 droppingHeight++;
110                 bDropping=false;
111             }
112             bUpdated = true;
113         }else {
114             droppingHeight=0;
115             droppingProgress=0;
116         }
117         if(!bDropping) {
118             ActionInterface a = getActionMap().startActionOnObject(this,Action.DROP);
119             if(a==Action.DROP) {
120                 LOG.debug("dropping from "+getPosZ());
121                 bDropping = true;
122                 droppingSpeed = 1f/DROPPING_PROGRESS_MAX;
123                 bUpdated = true;
124             }
125         }
126         return super.update()?true:bUpdated;
127     }
128     protected float getMovingProgressX() {
129         if(bMoving) {
130             if(movingAction.getDirection()==Direction.WEST) {
131                 return -(float)movingProgress/MOVING_PROGRESS_MAX;
132             }else if(movingAction.getDirection()==Direction.EAST) {
133                 return (float)movingProgress/MOVING_PROGRESS_MAX;
134             }
135         }
136         return 0;
137     }
138     protected float getMovingProgressY() {
139         if(bMoving) {
140             if(movingAction.getDirection()==Direction.NORTH) {
141                 return -(float)movingProgress/MOVING_PROGRESS_MAX;
142             }else if(movingAction.getDirection()==Direction.SOUTH) {
143                 return (float)movingProgress/MOVING_PROGRESS_MAX;
144             }
145         }
146         return 0;
147     }
148     protected float getMovingProgressZ() {
149         if(bDropping) {
150             return -(float)((droppingProgress)*(droppingProgress)-(droppingHeight));
151         }
152         return 0;
153     }
154     public int getDrawingPosX(float dx, float dy, float dz) {
155         return super.getDrawingPosX(dx+getMovingProgressX(),dy+getMovingProgressY(),dz+getMovingProgressZ());
156     }
157 
158     public int getDrawingPosY(float dx, float dy, float dz) {
159         return super.getDrawingPosY(dx+getMovingProgressX(),dy+getMovingProgressY(),dz+getMovingProgressZ());
160     }
161     public int getPixelPosX() {
162         return getContainer().getPositionX(getPosX()+getMovingProgressX(),getPosY()+getMovingProgressY(),getPosZ()+getMovingProgressZ());
163     }
164     public int getPixelPosY() {
165         return getContainer().getPositionY(getPosX()+getMovingProgressX(),getPosY()+getMovingProgressY(),getPosZ()+getMovingProgressZ());
166     }
167 
168     public boolean isMoving() {
169         return bMoving;
170     }
171 
172     protected boolean isDropping() {
173         return bDropping;
174     }
175 
176     public float getMovingPosX() {
177         if(isMoving() && getMovingProgressX()!=0) {
178             return (int)(getPosX()+getMovingProgressX()/Math.abs(getMovingProgressX()));
179         }else {
180             return getPosX();
181         }
182     }
183 
184     public float getMovingPosY() {
185         if(isMoving() && getMovingProgressY()!=0) {
186             return (int)(getPosY()+getMovingProgressY()/Math.abs(getMovingProgressY()));
187         }else {
188             return getPosY();
189         }
190     }
191 
192     public float getMovingPosZ() {
193         if(isMoving() && getMovingProgressZ()!=0) {
194             return (int)(getPosZ()+getMovingProgressZ()/Math.abs(getMovingProgressZ()));
195         }else {
196             return getPosZ();
197         }
198     }
199     */
200 }