Beispiel #1
0
void updatePlayer(PLAYER* player)
{
	int8_t dx = 0;
	int8_t dy = 0;

	uint8_t row_top = 0;
	uint8_t row_bottom = 0;
	uint8_t column_left = 0;
	uint8_t column_right = 0;

	uint16_t right = player->x_position + PLAYER_WIDTH - 1;
	uint16_t left = player->x_position;
	uint16_t top = player->y_position;
	uint16_t bottom = player->y_position + PLAYER_HEIGHT - 1;

	row_bottom = getCurrentRow (bottom);
	column_left = getCurrentColumn (left);
	column_right = getCurrentColumn (right);

	if (player->left)
	{
		dx -= player->speed;
		column_left = getCurrentColumn (left + dx);
		row_bottom = getCurrentRow (bottom);
		row_top = getCurrentRow (top + dy);

		if (map[row_top][column_left] == BLOCKED || map[row_bottom][column_left] == BLOCKED)
		{
			dx = -(dx + ((left - dx) % CELL_WIDTH));
		}
	}

	if (player->right)
	{
		dx += player->speed;
		column_right = getCurrentColumn (right + dx);
		row_bottom = getCurrentRow (bottom);
		row_top = getCurrentRow (top + dy);

		if (map[row_top][column_right] == BLOCKED || map[row_bottom][column_right] == BLOCKED)
		{
			dx = dx - ((left + dx) % CELL_WIDTH);
		}
	}

	row_bottom = getCurrentRow (bottom);
	column_left = getCurrentColumn (left + dx);
	column_right = getCurrentColumn (right + dx);

	if (player->jumping)
	{
		dy -= player->jump_speed;
		player->current_jump_height += player->jump_speed;
		if (player->current_jump_height > MAX_JUMP_HEIGHT)
		{
			player->jumping = 0;
			player->falling = 1;
			player->current_jump_height = 0;
		}
		row_top = getCurrentRow (top + dy);
		column_left = getCurrentColumn (left + dx);
		column_right = getCurrentColumn (right + dx);

		if (map[row_top][column_left] == BLOCKED || map[row_top][column_right] == BLOCKED)
		{
			dy = -(dy + ((player->y_position - dy) % CELL_HEIGHT));
			player->jumping = 0;
			player->falling = 1;
			player->current_jump_height = 0;
		}
	}
	else if (map[row_bottom][column_left] == AIR && map[row_bottom][column_right] == AIR)
	{
		player->falling = 1;
		dy += GRAVITY;

		row_bottom = getCurrentRow (bottom + dy);
		column_left = getCurrentColumn (left + dx);
		column_right = getCurrentColumn (right + dx);

		if (map[row_bottom][column_left] == BLOCKED || map[row_bottom][column_right] == BLOCKED)
		{
			dy = dy - ((player->y_position + dy) % CELL_HEIGHT);
			player->falling = 0;
		}

	}

	player->x_position += dx;
	player->y_position += dy;
}
Beispiel #2
0
int TApp::getCurrentImageType() {
  /*-- 現在のセルの種類に関係無く、Splineを選択中はベクタを編集できるようにする
   * --*/
  if (getCurrentObject()->isSpline()) return TImage::VECTOR;

  TXshSimpleLevel *sl = 0;

  if (getCurrentFrame()->isEditingScene()) {
    int row = getCurrentFrame()->getFrame();
    int col = getCurrentColumn()->getColumnIndex();
    if (col < 0)
#ifdef LINETEST
      return TImage::RASTER;
#else
    {
      int levelType = Preferences::instance()->getDefLevelType();
      return (levelType == PLI_XSHLEVEL)
                 ? TImage::VECTOR
                 :  // RASTER image type includes both TZI_XSHLEVEL
                 (levelType == TZP_XSHLEVEL)
                     ? TImage::TOONZ_RASTER
                     : TImage::RASTER;  // and OVL_XSHLEVEL level types
    }
#endif

    TXsheet *xsh  = getCurrentXsheet()->getXsheet();
    TXshCell cell = xsh->getCell(row, col);
    if (cell.isEmpty()) {
      int r0, r1;
      xsh->getCellRange(col, r0, r1);
      if (0 <= r0 && r0 <= r1) {
        /*-- Columnに格納されている一番上のLevelのTypeに合わせる--*/
        cell = xsh->getCell(r0, col);
      } else /*-- Columnが空の場合 --*/
      {
#ifdef LINETEST
        return TImage::RASTER;
#else
        int levelType = Preferences::instance()->getDefLevelType();
        return (levelType == PLI_XSHLEVEL)
                   ? TImage::VECTOR
                   : (levelType == TZP_XSHLEVEL) ? TImage::TOONZ_RASTER
                                                 : TImage::RASTER;
#endif
      }
    }

    sl = cell.getSimpleLevel();
  } else if (getCurrentFrame()->isEditingLevel())
    sl = getCurrentLevel()->getSimpleLevel();

  if (sl) {
    switch (sl->getType()) {
    case TZP_XSHLEVEL:
      return TImage::TOONZ_RASTER;
    case OVL_XSHLEVEL:
      return TImage::RASTER;
    case PLI_XSHLEVEL:
    default:
      return TImage::VECTOR;
    case MESH_XSHLEVEL:
      return TImage::MESH;
    }
  }

  return TImage::VECTOR;
}