/* Input SimplePoint from a text file. */ istream& SimplePoint::ReadShape(istream &s) { long int skip; ReadID(s); GenUtils::SkipTillNumber(s); #ifdef WORDS_BIGENDIAN s >> skip; char q[16], t; double m1, m2; s.read((char*)q, sizeof(double) * 2); GDA_SWAP(q[0], q[7], t); GDA_SWAP(q[1], q[6], t); GDA_SWAP(q[2], q[5], t); GDA_SWAP(q[3], q[4], t); memcpy(&m1, &q[0], sizeof(double)); GDA_SWAP(q[8], q[15], t); GDA_SWAP(q[9], q[14], t); GDA_SWAP(q[10], q[13], t); GDA_SWAP(q[11], q[12], t); memcpy(&m2, &q[8], sizeof(double)); p = BasePoint(m1, m2); #else s >> skip >> p; #endif return s; }
void AdActor::followPath() { // skip current position _path->getFirst(); while (_path->getCurrent() != nullptr) { if (_path->getCurrent()->x != _posX || _path->getCurrent()->y != _posY) { break; } _path->getNext(); } // are there points to follow? if (_path->getCurrent() != nullptr) { _state = STATE_FOLLOWING_PATH; initLine(BasePoint(_posX, _posY), *_path->getCurrent()); } else { if (_afterWalkDir != DI_NONE) { turnTo(_afterWalkDir); } else { _state = STATE_READY; } } }
iShapeFile& SimplePoint::ReadShape(iShapeFile &s) { Identify(s.Record()); #ifdef WORDS_BIGENDIAN char q[16], t; double m1, m2; s.read((char*)q, sizeof(double) * 2); GDA_SWAP(q[0], q[7], t); GDA_SWAP(q[1], q[6], t); GDA_SWAP(q[2], q[5], t); GDA_SWAP(q[3], q[4], t); memcpy(&m1, &q[0], sizeof(double)); GDA_SWAP(q[8], q[15], t); GDA_SWAP(q[9], q[14], t); GDA_SWAP(q[10], q[13], t); GDA_SWAP(q[11], q[12], t); memcpy(&m2, &q[8], sizeof(double)); p = BasePoint(m1, m2); return s; #else return s >> p; #endif };
void AdActor::getNextStep() { if (_walkSprite) { _currentSprite = _walkSprite->getSprite(_dir); } else { AdSpriteSet *anim = getAnimByName(_walkAnimName); if (anim) { _currentSprite = anim->getSprite(_dir); } } if (!_currentSprite) { return; } _currentSprite->getCurrentFrame(_zoomable ? ((AdGame *)_gameRef)->_scene->getZoomAt(_posX, _posY) : 100, _zoomable ? ((AdGame *)_gameRef)->_scene->getZoomAt(_posX, _posY) : 100); if (!_currentSprite->isChanged()) { return; } int maxStepX, maxStepY; maxStepX = abs(_currentSprite->_moveX); maxStepY = abs(_currentSprite->_moveY); maxStepX = MAX(maxStepX, maxStepY); maxStepX = MAX(maxStepX, 1); while (_pFCount > 0 && maxStepX >= 0) { _pFX += _pFStepX; _pFY += _pFStepY; _pFCount--; maxStepX--; } if (((AdGame *)_gameRef)->_scene->isBlockedAt((int)_pFX, (int) _pFY, true, this)) { if (_pFCount == 0) { _state = _nextState; _nextState = STATE_READY; return; } goTo(_targetPoint->x, _targetPoint->y); return; } _posX = (int)_pFX; _posY = (int)_pFY; afterMove(); if (_pFCount == 0) { if (_path->getNext() == nullptr) { _posX = _targetPoint->x; _posY = _targetPoint->y; _path->reset(); if (_afterWalkDir != DI_NONE) { turnTo(_afterWalkDir); } else { _state = _nextState; _nextState = STATE_READY; } } else { initLine(BasePoint(_posX, _posY), *_path->getCurrent()); } } }
bool AdActor::update() { _currentSprite = nullptr; if (_state == STATE_READY) { if (_animSprite) { delete _animSprite; _animSprite = nullptr; } if (_animSprite2) { _animSprite2 = nullptr; } } // finished playing animation? if (_state == STATE_PLAYING_ANIM && _animSprite != nullptr && _animSprite->isFinished()) { _state = _nextState; _nextState = STATE_READY; _currentSprite = _animSprite; } if (_state == STATE_PLAYING_ANIM_SET && _animSprite2 != nullptr && _animSprite2->isFinished()) { _state = _nextState; _nextState = STATE_READY; _currentSprite = _animSprite2; } if (_sentence && _state != STATE_TALKING) { _sentence->finish(); } // default: stand animation if (!_currentSprite) { if (_sprite) { _currentSprite = _sprite; } else { if (_standSprite) { _currentSprite = _standSprite->getSprite(_dir); } else { AdSpriteSet *anim = getAnimByName(_idleAnimName); if (anim) { _currentSprite = anim->getSprite(_dir); } } } } bool already_moved = false; switch (_state) { ////////////////////////////////////////////////////////////////////////// case STATE_PLAYING_ANIM: _currentSprite = _animSprite; break; ////////////////////////////////////////////////////////////////////////// case STATE_PLAYING_ANIM_SET: _currentSprite = _animSprite2; break; ////////////////////////////////////////////////////////////////////////// case STATE_TURNING_LEFT: if (_tempSprite2 == nullptr || _tempSprite2->isFinished()) { if (_dir > 0) { _dir = (TDirection)(_dir - 1); } else { _dir = (TDirection)(NUM_DIRECTIONS - 1); } if (_dir == _targetDir) { _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { if (_turnLeftSprite) { _tempSprite2 = _turnLeftSprite->getSprite(_dir); } else { AdSpriteSet *anim = getAnimByName(_turnLeftAnimName); if (anim) { _tempSprite2 = anim->getSprite(_dir); } } if (_tempSprite2) { _tempSprite2->reset(); if (_tempSprite2->_looping) { _tempSprite2->_looping = false; } } _currentSprite = _tempSprite2; } } else { _currentSprite = _tempSprite2; } break; ////////////////////////////////////////////////////////////////////////// case STATE_TURNING_RIGHT: if (_tempSprite2 == nullptr || _tempSprite2->isFinished()) { _dir = (TDirection)(_dir + 1); if ((int)_dir >= (int)NUM_DIRECTIONS) { _dir = (TDirection)(0); } if (_dir == _targetDir) { _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { if (_turnRightSprite) { _tempSprite2 = _turnRightSprite->getSprite(_dir); } else { AdSpriteSet *anim = getAnimByName(_turnRightAnimName); if (anim) { _tempSprite2 = anim->getSprite(_dir); } } if (_tempSprite2) { _tempSprite2->reset(); if (_tempSprite2->_looping) { _tempSprite2->_looping = false; } } _currentSprite = _tempSprite2; } } else { _currentSprite = _tempSprite2; } break; ////////////////////////////////////////////////////////////////////////// case STATE_SEARCHING_PATH: // keep asking scene for the path if (((AdGame *)_gameRef)->_scene->getPath(BasePoint(_posX, _posY), *_targetPoint, _path, this)) { _state = STATE_WAITING_PATH; } break; ////////////////////////////////////////////////////////////////////////// case STATE_WAITING_PATH: // wait until the scene finished the path if (_path->_ready) { followPath(); } break; ////////////////////////////////////////////////////////////////////////// case STATE_FOLLOWING_PATH: getNextStep(); already_moved = true; break; ////////////////////////////////////////////////////////////////////////// case STATE_TALKING: { _sentence->update(_dir); if (_sentence->_currentSprite) { _tempSprite2 = _sentence->_currentSprite; } bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->getTimer()->getTime() - _sentence->_startTime); if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { if (timeIsUp) { _sentence->finish(); _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { _tempSprite2 = getTalkStance(_sentence->getNextStance()); if (_tempSprite2) { _tempSprite2->reset(); _currentSprite = _tempSprite2; ((AdGame *)_gameRef)->addSentence(_sentence); } } } else { _currentSprite = _tempSprite2; ((AdGame *)_gameRef)->addSentence(_sentence); } } break; ////////////////////////////////////////////////////////////////////////// case STATE_READY: if (!_animSprite && !_animSprite2) { if (_sprite) { _currentSprite = _sprite; } else { if (_standSprite) { _currentSprite = _standSprite->getSprite(_dir); } else { AdSpriteSet *anim = getAnimByName(_idleAnimName); if (anim) { _currentSprite = anim->getSprite(_dir); } } } } break; default: error("AdActor::Update - Unhandled enum"); } if (_currentSprite && !already_moved) { _currentSprite->getCurrentFrame(_zoomable ? ((AdGame *)_gameRef)->_scene->getZoomAt(_posX, _posY) : 100, _zoomable ? ((AdGame *)_gameRef)->_scene->getZoomAt(_posX, _posY) : 100); if (_currentSprite->isChanged()) { _posX += _currentSprite->_moveX; _posY += _currentSprite->_moveY; afterMove(); } } //_gameRef->QuickMessageForm("%s", _currentSprite->_filename); updateBlockRegion(); _ready = (_state == STATE_READY); updatePartEmitter(); updateSpriteAttachments(); return STATUS_OK; }
BasePoint GetPointIntoSeg( BasePoint p1, BasePoint p2, double k ) { return BasePoint( p1.GetX() + (p2.GetX() - p1.GetX()) * k, p1.GetY() + (p2.GetY() - p1.GetY()) * k, p1.GetZ() + (p2.GetZ() - p1.GetZ()) * k ); }
/* 浮いているか判定する関数 */ bool isAboveBase(const GameTable* const gameStat, PlayerID player) { return gameStat->Player[player].PlayerScore >= BasePoint(); }