Exemple #1
0
		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);
			}
		}