private void DrawLogic() { mNewState = Keyboard.GetState(); mCamera.X = MapHScrollBar.Value * mCamera.TileWidth; mCamera.Y = MapVScrollBar.Value * mCamera.TileHeight; // seltsamer Bug... if (mMarkerRectangle.Width == 0 || mMarkerRectangle.Height == 0) { mMarkerRectangle = Rectangle.Empty; } if (mCurrentLayer == -1 && (mDrawMode & EDrawMode.Collision) == 0) { return; } Mouse.WindowHandle = RenderDisplayMap.Handle; mCursorCell = new Point2D(Mouse.GetState().X, Mouse.GetState().Y); if (mCursorCell.X < 0 || mCursorCell.Y < 0 || mCursorCell.X >= RenderDisplayMap.Width || mCursorCell.Y >= RenderDisplayMap.Height) { mCursorCell.X = mCursorCell.Y = -1; return; } mCursorCell.X /= mCamera.TileWidth; mCursorCell.Y /= mCamera.TileHeight; if (MapHScrollBar.Visible) { mCursorCell.X += MapHScrollBar.Value; } if (MapVScrollBar.Visible) { mCursorCell.Y += MapVScrollBar.Value; } if (mCursorCell.X >= mTileMap.Width || mCursorCell.Y >= mTileMap.Height) { SetStatus("Zelle: n/a"); mCursorCell.X = mCursorCell.Y = -1; return; } mCursorCell.X = (int)MathHelper.Clamp(mCursorCell.X, 0, mTileMap.Width - 1); mCursorCell.Y = (int)MathHelper.Clamp(mCursorCell.Y, 0, mTileMap.Height - 1); var celltext = String.Format("Zelle: {0} / {1}", mCursorCell.X, mCursorCell.Y); if (mCurrentLayer != -1) { var statusCell = mTileMap.Layers[mCurrentLayer].GetCell(mCursorCell); celltext += String.Format(" [Tileset: {0}] [Move: {1}] [Rotation: {2}°] [Autotile: {3}] [Flip: {4}]", statusCell.TextureSource.TextureIndex, mTileMap.CollisionLayer.GetCell(mCursorCell.X, mCursorCell.Y), statusCell.Rotation * 60f, statusCell.AutoTextureType, statusCell.FlipEffect); } SetStatus(celltext); var startPoint = mCursorCell; var endPoint = new Point2D(mTileMap.Width, mTileMap.Height); if (mMarkerRectangle != Rectangle.Empty) { if (mDrawMode.Has(EDrawMode.Fill) || startPoint.X < mMarkerRectangle.X || startPoint.X >= (mMarkerRectangle.X + mMarkerRectangle.Width)) { startPoint.X = mMarkerRectangle.X; } if (mDrawMode.Has(EDrawMode.Fill) || startPoint.Y < mMarkerRectangle.Y || startPoint.Y >= (mMarkerRectangle.Y + mMarkerRectangle.Height)) { startPoint.Y = mMarkerRectangle.Y; } endPoint = new Point2D(mMarkerRectangle.X + mMarkerRectangle.Width, mMarkerRectangle.Y + mMarkerRectangle.Height); } if (mCurrentLayer == -1 && mDrawMode.HasNot(EDrawMode.Collision)) { return; } // "Pipetten" Funktion if (mDrawMode.HasNot(EDrawMode.Collision) && (mMouseOnMapLeftButton || mMouseOnMapRightButton) && mNewState.IsKeyDown(XnaKeys.LeftAlt)) { var cell = GetCell(startPoint); if (cell.TextureSource.TextureIndex == string.Empty) { return; } List<FileListEntry> searchList = (cell.IsAutoTexture ? FileLists.Instance.Autotiles : FileLists.Instance.Tilesets); for (var i = 0; i < searchList.Count; i++) { if (searchList[i].Filename == cell.TextureSource.TextureIndex) { if (cell.IsAutoTexture) { comboAutotiles.SelectedIndex = i; TextureTabControl.SelectedIndex = 1; } else { comboTilesets.SelectedIndex = i; TextureTabControl.SelectedIndex = 0; } break; } } return; } if (mMouseOnMapLeftButton) { // Delete tile(s) if (mDrawMode.Has(EDrawMode.Erase) && mDrawMode.HasNot(EDrawMode.Rotate | EDrawMode.Flipping)) { // Delete normal tiles from start to end if (mDrawMode.Has(EDrawMode.Fill) && mDrawMode.HasNot(EDrawMode.Animation)) { SetCells(startPoint, endPoint, TileCell.Empty); if (MenuSettingsOneTimeFill.Checked) { MenuToolStripDrawFillButton.PerformClick(); } // Delete single tile } else if (mDrawMode.HasNot(EDrawMode.Animation)) { SetCell(startPoint, TileCell.Empty, false); // Delete a animation cell } else if (mDrawMode.Has(EDrawMode.Animation)) { mTileMap.AnimationLayer.SetCell(startPoint, null); } // Draw a normal tile } else if (mDrawMode.Has(EDrawMode.Draw) && mDrawMode.HasNot(EDrawMode.Rotate | EDrawMode.NotTilesetMode | EDrawMode.Flipping)) { // Nee a valid texture selection if (mTextureRect.Width > 0 || mTextureRect.Height > 0) { // Draw more than once? if (mDrawMode.Has(EDrawMode.Fill)) { // Draw from start to end SetCellGroups(startPoint, endPoint); if (MenuSettingsOneTimeFill.Checked) { MenuToolStripDrawFillButton.PerformClick(); } } else { // Draw a single tile SetCellGroup(startPoint, false); } } // Draw a collision tile } else if (mDrawMode.Has(EDrawMode.Collision)) { // Get type of collision var drawType = ECollisionType.NotMoveable; if (mNewState.IsCtrlDown() || GetCapsLock) { drawType = ECollisionType.Moveable; } else if (mNewState.IsShiftDown() || GetScrollLock) { drawType = ECollisionType.Water; } else if (mNewState.IsKeyDown(XnaKeys.LeftAlt) /* || GetNumLock*/) { drawType = ECollisionType.Underwater; } // Fill collisions from start to end? if (mDrawMode.Has(EDrawMode.Fill)) { var baseType = mTileMap.CollisionLayer.GetCell(startPoint.X, startPoint.Y); for (var x = startPoint.X; x < endPoint.X; x++) { for (var y = startPoint.Y; y < endPoint.Y; y++) { if (MenuSettingsFillSameTexture.Checked && mTileMap.CollisionLayer.GetCell(x, y) != baseType) { continue; } mTileMap.CollisionLayer.SetCell(x, y, drawType); } } if (MenuSettingsOneTimeFill.Checked) { MenuToolStripDrawFillButton.PerformClick(); } } else { // Just a single draw mTileMap.CollisionLayer.SetCell(startPoint, drawType); } } } if (mCurrentLayer == -1) { return; } if ((mMouseOnMapRightButton || mMouseOnMapLeftButton) && mDrawMode.Has(EDrawMode.Rotate) && mDrawMode.HasNot(EDrawMode.NotTilesetMode | EDrawMode.Flipping | EDrawMode.Collision)) { var cell = mTileMap.Layers[mCurrentLayer].GetCell(startPoint.X, startPoint.Y); if (cell.IsEqualTo(TileCell.Empty) == false && cell.TextureSource.TextureIndex != string.Empty && CanRotate(startPoint)) { var rotation = (mMouseOnMapRightButton ? 1.5f : -1.5f); if (mNewState.IsCtrlDown()) { rotation /= 10f; } cell.Rotation += rotation; if (cell.Rotation >= 6f || cell.Rotation <= -6f) { cell.Rotation = 0f; } mTileMap.Layers[mCurrentLayer].SetCell(startPoint, cell); Debug.WriteLine("Rotation: " + cell.Rotation); } } else if (mMouseOnMapLeftButton && mDrawMode.Has(EDrawMode.Autotile) && mDrawMode.HasNot(EDrawMode.Rotate | EDrawMode.Erase | EDrawMode.Collision)) { if (mDrawMode.Has(EDrawMode.Fill)) { for (var x = startPoint.X; x < endPoint.X; x++) { for (var y = startPoint.Y; y < endPoint.Y; y++) { UpdateAutoTiles(new Point2D(x, y), true); } } if (MenuSettingsOneTimeFill.Checked) { MenuToolStripDrawFillButton.PerformClick(); } } else { UpdateAutoTiles(startPoint, true); } } else if (mMouseOnMapLeftButton && mDrawMode.Has(EDrawMode.Animation) && mDrawMode.HasNot(EDrawMode.Rotate | EDrawMode.Erase | EDrawMode.Collision)) { mTileMap.AnimationLayer.SetCell(startPoint, mPreviewAnimation); } }