public bool Collision(int xa, int ya) //TODO ENTITY COLLISION { xa += (x); ya += (y); if (Collision(new Vector2(xa, ya), level)) { return(true); } foreach (var coll in level.CurrentMap.teleporters) { if (CollisionDetector.Collison(new Rectangle(xa + hitbox.X, ya + hitbox.Y, hitbox.Width, hitbox.Height), coll.position)) { if (this == level.getClientPlayer()) { if (level.ChangeMap(coll.mapID)) { mapid = coll.mapID; x = (int)coll.tpCoordinates.X; y = (int)coll.tpCoordinates.Y; Position = new Vector2(x, y); } } } } return(false); }
public virtual bool Collision(Vector2 position, Level level) { int xa = (int)position.X; int ya = (int)position.Y; if (xa + hitbox.Left < 0 || ya + hitbox.Top < 0 || xa + hitbox.Right >= level.mapWidth * level.CurrentMap.TileWidth || ya + hitbox.Bottom >= level.mapHeight * level.CurrentMap.TileHeight) { return(true); } foreach (var coll in level.maps[mapid].collisions) //MAP Collisions { if (CollisionDetector.Collison(new Rectangle(xa + hitbox.X, ya + hitbox.Y, hitbox.Width, hitbox.Height), coll)) //Level Collisions { LastCollision = null; return(true); } } foreach (var coll in level.entities) //Mobs Collisions { if (coll != this && coll.mapid == level.mapID && coll.solid) { if (xa + hitbox.Left < coll.x + coll.hitbox.Right && xa + hitbox.Right > coll.x + coll.hitbox.Left && ya + hitbox.Top < coll.y + coll.hitbox.Bottom && ya + hitbox.Bottom > coll.y + coll.hitbox.Top) //Level Collisions { if (coll is ChessFigure && this is ChessFigure) { continue; } LastCollision = coll; return(true); } } } return(false); }
public override void Update() { if (CollisionDetector.Collison(Global.addVector2(hitbox, Position), Global.addVector2(level.getClientPlayer().hitbox, level.getClientPlayer().Position))) { if (!wiggle) { wiggle = true; wigglecount++; wigglerot = 0.0d; } } if (wiggle) { if (wigglerot > 0.04d) { wiggledir = false; } if (wigglerot < -0.04d) { wiggledir = true; wigglecount = 0; } if (wiggledir) { wigglerot += (0.001d * wigglecount); } else { wigglerot -= (0.001d * wigglecount); } if (wigglecount <= 0) { wiggle = false; wigglerot = 0.0d; } } base.Update(); }
public void Update() { Vector2 mousePos = input.MousePos; Vector2 tilesetPos = TilesetView.ScreenToWorld(input.MousePos); Vector2 mapPos = input.GetMapPos(input.MousePos); if (!tilesetScroll) { if (input.CurrentMouseState.ScrollWheelValue > input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) Global.camera.AdjustZoom(0.2f); if (input.CurrentMouseState.ScrollWheelValue < input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) Global.camera.AdjustZoom(-0.2f); } if (input.KeyPressed(Keys.Z) && input.KeyDown(Keys.LeftControl)) Undo(); if (input.KeyPressed(Microsoft.Xna.Framework.Input.Keys.C) || input.MouseRightButtonPressed()) { currentItemIDs = new int[0, 0]; sourceRectangle = new Rectangle(); currentEditorMode = EditorMode.Default; } foreach (var button in components) { button.update(input); } if (input.KeyPressed(Keys.E)) { currentItemIDs = new int[1, 1] { { 0 } }; sourceRectangle = new Rectangle(); currentEditorMode = EditorMode.Rubber; } if (mousePos.X > TileSelectorField.X && mousePos.X < TileSelectorField.X + TileSelectorField.Width && mousePos.Y > TileSelectorField.Y && mousePos.Y < TileSelectorField.Y + TileSelectorField.Height) { if (input.CurrentMouseState.ScrollWheelValue > input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) zoomTileset(0.2f); if (input.CurrentMouseState.ScrollWheelValue < input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) zoomTileset(-0.2f); tilesetScroll = true; if (input.ButtonDown(input.CurrentMouseState.LeftButton)) { currentEditorMode = EditorMode.TileSelector; } }else { tilesetScroll = false; } if(currentEditorMode == EditorMode.TileSelector) { if (mousePos.X > TileSelectorField.X && mousePos.X < TileSelectorField.X + TileSelectorField.Width && mousePos.Y > TileSelectorField.Y && mousePos.Y < TileSelectorField.Y + TileSelectorField.Height) { if (input.ButtonDown(input.CurrentMouseState.LeftButton)) { if (!Drag) { startID = ((int)tilesetPos.X / level.CurrentMap.TileWidth) + ((int)tilesetPos.Y - TileSelectorField.Y) / level.CurrentMap.TileHeight * (currentTileset.width) + 1; Drag = true; } } if (!input.ButtonDown(input.CurrentMouseState.LeftButton)) { if (Drag) { endID = ((int)tilesetPos.X / level.CurrentMap.TileWidth) + ((int)tilesetPos.Y - TileSelectorField.Y) / level.CurrentMap.TileHeight * (currentTileset.width) + 1; Rectangle endid = new Rectangle(level.CurrentMap.getSourceRectangle(endID, currentTileset).X / level.CurrentMap.TileWidth + 1, level.CurrentMap.getSourceRectangle(endID, currentTileset).Y / level.CurrentMap.TileHeight, level.CurrentMap.TileHeight, level.CurrentMap.TileHeight); Rectangle startid = new Rectangle(level.CurrentMap.getSourceRectangle(startID, currentTileset).X / level.CurrentMap.TileWidth + 1, level.CurrentMap.getSourceRectangle(startID, currentTileset).Y / level.CurrentMap.TileHeight, level.CurrentMap.TileHeight, level.CurrentMap.TileHeight); if (startID > endID || startid.X > endid.X || startid.Y > endid.Y) return; currentItemIDs = new int[endid.X - startid.X + 1, endid.Y - startid.Y + 1]; for (int y = startid.Y; y <= endid.Y; y++) { for (int x = startid.X; x <= endid.X; x++) { currentItemIDs[x - startid.X, y - startid.Y] = Tiles[x + y * currentTileset.width]-1; } }; sourceRectangle = new Rectangle((startid.X-1) * level.CurrentMap.TileWidth, startid.Y * level.CurrentMap.TileHeight, (endid.X - startid.X) * level.CurrentMap.TileWidth + level.CurrentMap.TileWidth, (endid.Y - startid.Y) * level.CurrentMap.TileHeight + level.CurrentMap.TileHeight); Drag = false; currentEditorMode = EditorMode.Place; } } } } if (input.MousePos.X < TileSelectorBackground.Width) return; // STOP IF CURSOR IS AT OVERLAY switch (currentEditorMode) { case EditorMode.Default: break; case EditorMode.Place: if (input.ButtonDown(input.CurrentMouseState.LeftButton)) { int mapX = (int)(mapPos.X) / level.CurrentMap.TileWidth; int mapY = (int)(mapPos.Y) / level.CurrentMap.TileHeight; if (mapX < 0 || mapY < 0 || mapX + currentItemIDs.GetLength(0) > level.CurrentMap.MapWidth || mapY + currentItemIDs.GetLength(1) > level.CurrentMap.MapHeight) return; int[,] restoreIDs = new int[currentItemIDs.GetLength(0), currentItemIDs.GetLength(1)]; bool change = false; for (int y = mapY; y < mapY + currentItemIDs.GetLength(1); y++) { for (int x = mapX; x < mapX + currentItemIDs.GetLength(0); x++) { if (currentLayer[x + y * level.CurrentMap.MapWidth] != currentItemIDs[x - mapX, y - mapY]) change = true; restoreIDs[x - mapX, y - mapY] = currentLayer[x + y * level.CurrentMap.MapWidth]; currentLayer[x + y * level.CurrentMap.MapWidth] = currentItemIDs[x - mapX, y - mapY]; } } if (change) undo.Push(new Backup(new Vector2(mapX, mapY), restoreIDs, currentLayerID)); } break; case EditorMode.Rubber: if (input.ButtonDown(input.CurrentMouseState.LeftButton)) { int mapX = (int)(mapPos.X) / level.CurrentMap.TileWidth; int mapY = (int)(mapPos.Y) / level.CurrentMap.TileHeight; if (mapX < 0 || mapY < 0 || mapX + currentItemIDs.GetLength(0) > level.CurrentMap.MapWidth || mapY + currentItemIDs.GetLength(1) > level.CurrentMap.MapHeight) return; int[,] restoreIDs = new int[1, 1]; bool change = false; if (currentLayer[mapX + mapY * level.CurrentMap.MapWidth] != 0) change = true; restoreIDs[0, 0] = currentLayer[mapX + mapY * level.CurrentMap.MapWidth]; currentLayer[mapX + mapY * level.CurrentMap.MapWidth] = 0; if (change) undo.Push(new Backup(new Vector2(mapX, mapY), restoreIDs, currentLayerID)); } break; case EditorMode.ObjectAdd: if (input.ButtonDown(input.CurrentMouseState.LeftButton) && !objectdrag) { objectposition.X = (int)mapPos.X; objectposition.Y = (int)mapPos.Y; objectdrag = true; } if (objectdrag) { objectposition.Width = (int)mapPos.X - objectposition.X; objectposition.Height = (int)mapPos.Y - objectposition.Y; } if (!input.ButtonDown(input.CurrentMouseState.LeftButton) && objectdrag) { if (objectposition.X < 0) { objectposition.Width += objectposition.X; objectposition.X = 0; } if (objectposition.Y < 0) { objectposition.Height += objectposition.Y; objectposition.Y = 0; } if (objectposition.Width + objectposition.X > level.CurrentMap.MapWidth * level.CurrentMap.TileWidth) objectposition.Width = level.CurrentMap.MapWidth * level.CurrentMap.TileWidth - objectposition.X; if (objectposition.Height + objectposition.Y > level.CurrentMap.MapHeight * level.CurrentMap.TileHeight) objectposition.Height = level.CurrentMap.MapHeight * level.CurrentMap.TileHeight - objectposition.Y; if (objectposition.Width > 0 && objectposition.Height > 0) { if (currentObjectAddmode == ObjectAddMode.Collision) level.CurrentMap.collisions.Add(objectposition); else if (currentObjectAddmode == ObjectAddMode.Teleporter) { level.CurrentMap.teleporters.Add(new Teleporter(objectposition, teleporterparams.mapID, teleporterparams.tpCoordinates)); currentEditorMode = EditorMode.Default; } //ADD COllison or teleporter } objectposition = new Rectangle(); objectdrag = false; } break; case EditorMode.ObjectEdit: if (input.MouseLeftButtonPressed()) { Rectangle obj = new Rectangle(); foreach (var coll in level.CurrentMap.collisions) { if (CollisionDetector.Collison(coll, mapPos)) { obj = coll; break; } } Furniture fur = null; foreach (var coll in level.CurrentMap.entities) { if (CollisionDetector.Collison(new Rectangle((int)coll.Position.X + coll.clickbox.X, (int)coll.Position.Y + coll.clickbox.Y, coll.clickbox.Width, coll.clickbox.Height), mapPos)) { fur = coll; break; } } Teleporter tp = null; foreach (var coll in level.CurrentMap.teleporters) { if (CollisionDetector.Collison(coll.position, mapPos)) { tp = coll; break; } } if (obj.Width != 0) { level.CurrentMap.collisions.Remove(obj); } if (fur != null) { level.CurrentMap.entities.Remove(fur); level.entities.Remove(fur); } if (tp != null) { level.CurrentMap.teleporters.Remove(tp); } } break; } }
public void Update(Input input) { UpdateSlot(input); CurrentItem = inventory[currentSlot + Scroll]; if (CurrentItem is GunItem <Projectile> ) { CurrentItem.Update(input); } else { if (!drag) { if (input.CurrentMouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) { if (input.MousePos.X > barPos.X && input.MousePos.X < barPos.X + barPos.Width && input.MousePos.Y > barPos.Y && input.MousePos.Y < barPos.Y + barPos.Height) { CurrentSlot = (int)((input.MousePos.X - barPos.X) / (barPos.Width / 9)); if (CurrentItem.placeable) { drag = true; } } } else { if (!CurrentItem.placeable) { CurrentItem.Update(input); } } } else { CurrentItem.Update(input); } } if (input.MouseLeftButtonPressed()) { // ONCLICK Furniture bool unselect = true; foreach (var furn in level.furniture) { if (furn.mapid == level.mapID && CollisionDetector.Collison(new Rectangle(furn.clickbox.X + (int)furn.Position.X, furn.clickbox.Y + (int)furn.Position.Y, furn.clickbox.Width, furn.clickbox.Height), input.GetMapPos(input.MousePos))) { if (Game1.online) { netcode.NetCode.OnClick(furn, (Item)StaticItems.transparent); } else { furn.OnClick(CurrentItem); level.getClientPlayer().SelectedEntity = furn; unselect = false; } } } if (unselect) { level.getClientPlayer().SelectedEntity = null; } } if (input.CurrentMouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) { if (!dragEntity) //SELECT NEW ENTITY { foreach (var furn in level.furniture) { if (furn.mapid == level.mapID && CollisionDetector.Collison(new Rectangle(furn.clickbox.X + (int)furn.Position.X, furn.clickbox.Y + (int)furn.Position.Y, furn.clickbox.Width, furn.clickbox.Height), input.GetMapPos(input.MousePos))) { level.getClientPlayer().SelectedEntity = furn; dragEntity = true; } } } else { ((Furniture)level.getClientPlayer().SelectedEntity).Drag = true; } } else { dragEntity = false; level.getClientPlayer().SelectedEntity = null; } }