JNR
stageJR.cpp
1 /*
2 
3 Jump'n'Run Engine
4 http://www.atanaslaskov.com/jnr/
5 
6 BSD LICENSE
7 Copyright (c) 2007-2013, Atanas Laskov
8 All rights reserved.
9 
10 Redistribution and use in source and binary forms, with or without
11 modification, are permitted provided that the following conditions are met:
12 1. Redistributions of source code must retain the above copyright notice,
13 this list of conditions and the following disclaimer.
14 2. Redistributions in binary form must reproduce the above copyright notice,
15 this list of conditions and the following disclaimer in the documentation
16 and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL ATANAS LASKOV BE LIABLE FOR ANY
21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 */
29 
30 //
31 // FILE: stageJRGame.h
32 //
33 // Jumping Ronnin - Game Stage
34 //
35 // Copyright (C) 2007-2013 Atanas Laskov, <latanas@gmail.com>
36 //
37 #include "stdafx.h"
38 #include "laStagesJR.h"
39 
40 stageJR::stageJR()
41 {
42  _pMenu = NULL;
43  _pGame = NULL;
44 
45  _nCrSeg = _nColDomains = 0;
46  _pCrSeg = _pColFirstSeg = _pDrawFirstSeg = NULL;
47  _pColFirstDomain = NULL;
48 
49  // Default camera props
50  //
51  _dCamAngY = 0;
52  _dCamRotSpeed = M_CAMERA_ROT_SPEED;
53  _dCamRotMul = M_CAMERA_ROT_MUL;
54  _dCamDirAngle = M_CAMERA_DIRECTIONAL_ANGLE;
55  _dCamLimit = M_CAMERA_LIMIT;
56 }
57 
58 stageJR::~stageJR(void) {
59 }
60 
61 void stageJR::onInit() {
62  ERRORLEVEL_BEGIN;
63  _init_gui();
64  ERRORLEVEL_END;
65 }
66 
67 void stageJR::onActivate() {
68  ASSERT(_pGame, "Nil game object");
69 
70  laSystemIntegrator::getEnvironment()->setTitle(M_JRTITLE_STRING);
71 
72  _update_segment(); // Init segment and collision poitners; Must set _pCrSeg = NULL, cause
73  _pGame->pMusicLoop->play();
74 }
75 
76 void stageJR::onDeactivate()
77 {
78  // Invalidate collision ranges as these may be tampored with by another state
79  _pCrSeg = _pColFirstSeg = NULL;
80 }
81 
82 
83 void stageJR::onFini() {
84  if(_pMenu) {
85  delete _pMenu;
86  _pMenu = NULL;
87  }
88 }
89 
90 // For every frame
91 //
92 void stageJR::onFrame(laRenderer *pr, laInputManager *pi, laTimer *pt)
93 {
94  ERRORLEVEL_BEGIN;
95  ASSERT(_pGame, "Nil game object");
96 
97  // Print FPS
98  //
99  static char strTitle[128];
100  sprintf( strTitle, "%s - %.1f fps", M_JRTITLE_STRING, pt->fps_sampled() );
101  laSystemIntegrator::getEnvironment()->setTitle(strTitle);
102 
103  // Draw level sky
104  //
105  pr->modeInterface();
106  _pGame->level.drawSky(pr);
107 
108  // Draw 3D stuff & animate
109  //
110  _setup_3d_camera(pr, pt);
111  _draw_level(pr, pt);
112  _animate(pi, pt);
113 
114  // Draw GUI
115  //
116  pr->modeInterface();
117  pr->styleSet(laColor(255,255,255));
118 
119  _draw_UI(pr, pt);
120 
121  ERRORLEVEL_END;
122 }
123 
124 // Camera tracks terrain curviture / player rot along Y
125 //
126 void stageJR::_setup_3d_camera(laRenderer *pr, laTimer *pt)
127 {
128  PROFILE(stageJRMenu__setup_3d_camera);
129 
130  double x = _pGame->level.getPlayer()->getPivot()->x();
131  double dCamAngY_target = _pGame->level.terrainAngle_atPixel( x );
132 
133  int nDir = _pGame->level.getPlayer()->getFaceDirection() * (-1);
134  dCamAngY_target += nDir*_dCamDirAngle;
135  dCamAngY_target = M_CLAMP(-1*_dCamLimit, _dCamLimit, dCamAngY_target);
136 
137  if( dCamAngY_target > _dCamAngY + 1) _dCamAngY += pt->delta() * _dCamRotSpeed;
138  if( dCamAngY_target < _dCamAngY - 1) _dCamAngY -= pt->delta() * _dCamRotSpeed;
139 
140  double dCamAngX = 20;
141 
142  // Perspective mode
143  //
144  pr->modeWorld( laPoint3(0, -M_UNIT*5+_pGame->level.zoom()*M_UNIT, (M_UNIT*10)/_pGame->level.zoom()),
145  laPoint3(dCamAngX, _dCamAngY*_dCamRotMul) );
146 
147  _pGame->level.scroll( _pGame->level.getPlayer()->getPosition() );
148 }
149 
150 // Draw level object
151 //
152 void stageJR::_draw_level(laRenderer *pr, laTimer *pt) {
153  PROFILE(stageJR__draw_level);
154  _pGame->level.draw(pr, _pDrawFirstSeg, M_SEGMENT_RENDER_MARGIN + M_SEGMENT_RENDER_MARGIN + 1);
155 }
156 
157 // Animate dynamic objects
158 //
159 void stageJR::_animate_Dynamics(laInputManager *pi, laTimer *pt)
160 {
161  PROFILE(stageJR__animate_Dynamics);
162  ::laSystemIntegrator::getRenderer()->modeLight(M_FALSE);
163  ::laSystemIntegrator::getRenderer()->modeTexture(M_FALSE);
164 
165  unsigned nRange = _update_segment();
166  _pGame->level.animate(*pt, _pColFirstSeg, nRange);
167 }
168 
169 // Update segment pointer and collision range
170 //
171 unsigned stageJR::_update_segment()
172 {
173  PROFILE(stageJR__update_segment);
174  ERRORLEVEL_BEGIN;
175  int nLeft = M_SEGMENT_ANIMATE_MARGIN, nRight = M_SEGMENT_ANIMATE_MARGIN;
176 
177  laPlayer *pPlayer = _pGame->level.getPlayer();
178  int nCrSeg = _pGame->level.segmentIndex( pPlayer->getPosition().x() );
179 
180  if( (nCrSeg != _nCrSeg) || (!_pCrSeg) )
181  {
182  _nCrSeg = nCrSeg;
183  _pCrSeg = _pGame->level.segmentAtIndex(nCrSeg);
184  ASSERT(_pCrSeg, "Nil current segment");
185 
186  _pColFirstSeg = _pGame->level.segmentAtIndex(nCrSeg - nLeft);
187  ASSERT(_pColFirstSeg, "Nil first col segment");
188  _pColFirstDomain = _pColFirstSeg->firstNonemptyDomain();
189  ASSERT(_pColFirstDomain, "Nil first domain");
190  _nColDomains = _pColFirstSeg->countDomains(nLeft + nRight + 1);
191 
192  _pDrawFirstSeg = _pGame->level.segmentAtIndex(nCrSeg - M_SEGMENT_RENDER_MARGIN);
193  ASSERT(_pDrawFirstSeg, "Nil first draw segment");
194 
195  // Point laPivot to a range in the collision domain list
196  laPivot::colliderRange(_pColFirstDomain, _nColDomains);
197  }
198 
199  return nLeft + nRight + 1;
200  ERRORLEVEL_END;
201 }
Playable Character.
Definition: laPlayer.h:46
#define M_UNIT
Unit of 1 meter.
Virtual interface for the Engine graphics renderer.
Definition: laRenderer.h:98
virtual void modeInterface()=0
Switch to interface rendering (2D projection mode)
virtual void modeWorld(const laPoint3 &pos, const laPoint3 &ang=laPoint3())=0
Switch to "world rendering" (3D projection mode)