mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-03-10 04:40:10 +07:00
Implemented a basic unit
This commit is contained in:
parent
ed0b796c5a
commit
ba84bb82b4
@ -1,7 +1,7 @@
|
|||||||
#Autogenerated file. Do not modify.
|
#Autogenerated file. Do not modify.
|
||||||
#Fri Mar 16 22:18:26 EDT 2018
|
#Sat Mar 17 00:38:14 EDT 2018
|
||||||
version=release
|
version=release
|
||||||
androidBuildCode=531
|
androidBuildCode=533
|
||||||
name=Mindustry
|
name=Mindustry
|
||||||
code=3.4
|
code=3.4
|
||||||
build=custom build
|
build=custom build
|
||||||
|
@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Color;
|
|||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.State;
|
||||||
import io.anuke.mindustry.entities.Player;
|
import io.anuke.mindustry.entities.Player;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
|
import io.anuke.mindustry.game.Team;
|
||||||
import io.anuke.mindustry.game.Tutorial;
|
import io.anuke.mindustry.game.Tutorial;
|
||||||
import io.anuke.mindustry.game.UpgradeInventory;
|
import io.anuke.mindustry.game.UpgradeInventory;
|
||||||
import io.anuke.mindustry.graphics.Fx;
|
import io.anuke.mindustry.graphics.Fx;
|
||||||
@ -158,7 +159,7 @@ public class Control extends Module{
|
|||||||
Events.on(ResetEvent.class, () -> {
|
Events.on(ResetEvent.class, () -> {
|
||||||
upgrades.reset();
|
upgrades.reset();
|
||||||
player.weaponLeft = player.weaponRight = Weapon.blaster;
|
player.weaponLeft = player.weaponRight = Weapon.blaster;
|
||||||
player.team = state.team;
|
player.team = Team.blue;
|
||||||
|
|
||||||
player.add();
|
player.add();
|
||||||
player.heal();
|
player.heal();
|
||||||
|
@ -22,9 +22,8 @@ public class GameState{
|
|||||||
public GameMode mode = GameMode.waves;
|
public GameMode mode = GameMode.waves;
|
||||||
public Difficulty difficulty = Difficulty.normal;
|
public Difficulty difficulty = Difficulty.normal;
|
||||||
public boolean friendlyFire;
|
public boolean friendlyFire;
|
||||||
public Team team = Team.none; //the team that the player is on
|
|
||||||
public ObjectSet<Team> enemyTeams = new ObjectSet<>(), //enemies to the player team
|
public ObjectSet<Team> enemyTeams = new ObjectSet<>(), //enemies to the player team
|
||||||
allyTeams = new ObjectSet<>(); //allies to the player team
|
allyTeams = new ObjectSet<>(); //allies to the player team, includes the player team
|
||||||
|
|
||||||
public void set(State astate){
|
public void set(State astate){
|
||||||
Events.fire(StateChangeEvent.class, state, astate);
|
Events.fire(StateChangeEvent.class, state, astate);
|
||||||
|
@ -55,9 +55,9 @@ public class Logic extends Module {
|
|||||||
state.gameOver = false;
|
state.gameOver = false;
|
||||||
state.inventory.clearItems();
|
state.inventory.clearItems();
|
||||||
state.allyTeams.clear();
|
state.allyTeams.clear();
|
||||||
|
state.allyTeams.add(Team.blue);
|
||||||
state.enemyTeams.clear();
|
state.enemyTeams.clear();
|
||||||
state.enemyTeams.add(Team.red);
|
state.enemyTeams.add(Team.red);
|
||||||
state.team = Team.blue;
|
|
||||||
|
|
||||||
Timers.clear();
|
Timers.clear();
|
||||||
Entities.clear();
|
Entities.clear();
|
||||||
@ -129,7 +129,15 @@ public class Logic extends Module {
|
|||||||
Entities.update(playerGroup);
|
Entities.update(playerGroup);
|
||||||
|
|
||||||
for(EntityGroup group : unitGroups){
|
for(EntityGroup group : unitGroups){
|
||||||
if(!group.isEmpty()) Entities.collideGroups(bulletGroup, group);
|
if(!group.isEmpty()){
|
||||||
|
Entities.collideGroups(bulletGroup, group);
|
||||||
|
|
||||||
|
for(EntityGroup other : unitGroups){
|
||||||
|
if(!other.isEmpty()){
|
||||||
|
Entities.collideGroups(group, other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Entities.collideGroups(bulletGroup, playerGroup);
|
Entities.collideGroups(bulletGroup, playerGroup);
|
||||||
|
@ -2,6 +2,7 @@ package io.anuke.mindustry.entities;
|
|||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.Color;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
|
import io.anuke.mindustry.game.Team;
|
||||||
import io.anuke.mindustry.graphics.Fx;
|
import io.anuke.mindustry.graphics.Fx;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.net.NetEvents;
|
import io.anuke.mindustry.net.NetEvents;
|
||||||
@ -291,6 +292,7 @@ public class Player extends Unit{
|
|||||||
buffer.putInt(Color.rgba8888(color));
|
buffer.putInt(Color.rgba8888(color));
|
||||||
buffer.putFloat(x);
|
buffer.putFloat(x);
|
||||||
buffer.putFloat(y);
|
buffer.putFloat(y);
|
||||||
|
buffer.put((byte)team.ordinal());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -306,6 +308,7 @@ public class Player extends Unit{
|
|||||||
color.set(buffer.getInt());
|
color.set(buffer.getInt());
|
||||||
x = buffer.getFloat();
|
x = buffer.getFloat();
|
||||||
y = buffer.getFloat();
|
y = buffer.getFloat();
|
||||||
|
team = Team.values()[buffer.get()];
|
||||||
setNet(x, y);
|
setNet(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ public class Units {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Unit getClosestEnemies(Team team, float x, float y, float range, Predicate<Unit> predicate){
|
/**Returns the closest enemy of this team. Filter by predicate.*/
|
||||||
|
public static Unit getClosestEnemy(Team team, float x, float y, float range, Predicate<Unit> predicate){
|
||||||
Unit[] result = {null};
|
Unit[] result = {null};
|
||||||
float[] cdist = {0};
|
float[] cdist = {0};
|
||||||
|
|
||||||
@ -70,7 +71,11 @@ public class Units {
|
|||||||
/**Iterates over all units that are enemies of this team.*/
|
/**Iterates over all units that are enemies of this team.*/
|
||||||
public static void getNearbyEnemies(Team team, Rectangle rect, Consumer<Unit> cons){
|
public static void getNearbyEnemies(Team team, Rectangle rect, Consumer<Unit> cons){
|
||||||
//check if it's an ally team to the 'main team'
|
//check if it's an ally team to the 'main team'
|
||||||
boolean ally = state.team == team || state.allyTeams.contains(team);
|
boolean ally = state.allyTeams.contains(team);
|
||||||
|
boolean enemy = state.enemyTeams.contains(team);
|
||||||
|
|
||||||
|
//this team isn't even in the game, so target nothing!
|
||||||
|
if(!ally && !enemy) return;
|
||||||
|
|
||||||
ObjectSet<Team> targets = ally ? state.enemyTeams : state.allyTeams;
|
ObjectSet<Team> targets = ally ? state.enemyTeams : state.allyTeams;
|
||||||
|
|
||||||
@ -92,8 +97,8 @@ public class Units {
|
|||||||
/**Returns whether these two teams are enemies.*/
|
/**Returns whether these two teams are enemies.*/
|
||||||
public static boolean areEnemies(Team team, Team other){
|
public static boolean areEnemies(Team team, Team other){
|
||||||
if(team == other) return false; //fast fail to be more efficient
|
if(team == other) return false; //fast fail to be more efficient
|
||||||
boolean ally = state.team == team || state.allyTeams.contains(team);
|
boolean ally = state.allyTeams.contains(team);
|
||||||
boolean ally2 = state.team == other || state.allyTeams.contains(other);
|
boolean ally2 = state.allyTeams.contains(other);
|
||||||
return ally == ally2;
|
return ally == ally2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@ package io.anuke.mindustry.entities.units;
|
|||||||
import io.anuke.mindustry.entities.Bullet;
|
import io.anuke.mindustry.entities.Bullet;
|
||||||
import io.anuke.mindustry.entities.BulletType;
|
import io.anuke.mindustry.entities.BulletType;
|
||||||
import io.anuke.mindustry.entities.Unit;
|
import io.anuke.mindustry.entities.Unit;
|
||||||
import io.anuke.ucore.entities.Entity;
|
import io.anuke.mindustry.game.Team;
|
||||||
|
import io.anuke.ucore.core.Timers;
|
||||||
import io.anuke.ucore.entities.SolidEntity;
|
import io.anuke.ucore.entities.SolidEntity;
|
||||||
|
import io.anuke.ucore.util.Mathf;
|
||||||
import io.anuke.ucore.util.Timer;
|
import io.anuke.ucore.util.Timer;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@ -14,15 +16,28 @@ import static io.anuke.mindustry.Vars.unitGroups;
|
|||||||
public class BaseUnit extends Unit {
|
public class BaseUnit extends Unit {
|
||||||
public UnitType type;
|
public UnitType type;
|
||||||
public Timer timer = new Timer(5);
|
public Timer timer = new Timer(5);
|
||||||
public Entity target;
|
public float walkTime = 0f;
|
||||||
|
public Unit target;
|
||||||
|
|
||||||
public BaseUnit(UnitType type){
|
public BaseUnit(UnitType type, Team team){
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
this.team = team;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**internal constructor used for deserialization, DO NOT USE*/
|
/**internal constructor used for deserialization, DO NOT USE*/
|
||||||
public BaseUnit(){}
|
public BaseUnit(){}
|
||||||
|
|
||||||
|
public void rotate(float angle){
|
||||||
|
rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void move(float x, float y){
|
||||||
|
walkTime += Timers.delta();
|
||||||
|
baseRotation = Mathf.slerpDelta(baseRotation, Mathf.atan2(x, y), type.baseRotateSpeed);
|
||||||
|
super.move(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMass() {
|
public float getMass() {
|
||||||
return type.mass;
|
return type.mass;
|
||||||
@ -88,6 +103,7 @@ public class BaseUnit extends Unit {
|
|||||||
public void added(){
|
public void added(){
|
||||||
maxhealth = type.health;
|
maxhealth = type.health;
|
||||||
|
|
||||||
|
//hitbox.solid = true;
|
||||||
hitbox.setSize(type.hitsize);
|
hitbox.setSize(type.hitsize);
|
||||||
hitboxTile.setSize(type.hitsizeTile);
|
hitboxTile.setSize(type.hitsizeTile);
|
||||||
|
|
||||||
@ -102,6 +118,7 @@ public class BaseUnit extends Unit {
|
|||||||
@Override
|
@Override
|
||||||
public void writeSpawn(ByteBuffer buffer) {
|
public void writeSpawn(ByteBuffer buffer) {
|
||||||
buffer.put(type.id);
|
buffer.put(type.id);
|
||||||
|
buffer.put((byte)team.ordinal());
|
||||||
buffer.putFloat(x);
|
buffer.putFloat(x);
|
||||||
buffer.putFloat(y);
|
buffer.putFloat(y);
|
||||||
buffer.putShort((short)health);
|
buffer.putShort((short)health);
|
||||||
@ -110,6 +127,7 @@ public class BaseUnit extends Unit {
|
|||||||
@Override
|
@Override
|
||||||
public void readSpawn(ByteBuffer buffer) {
|
public void readSpawn(ByteBuffer buffer) {
|
||||||
type = UnitType.getByID(buffer.get());
|
type = UnitType.getByID(buffer.get());
|
||||||
|
team = Team.values()[buffer.get()];
|
||||||
x = buffer.getFloat();
|
x = buffer.getFloat();
|
||||||
y = buffer.getFloat();
|
y = buffer.getFloat();
|
||||||
health = buffer.getShort();
|
health = buffer.getShort();
|
||||||
|
@ -5,7 +5,10 @@ import io.anuke.ucore.util.Mathf;
|
|||||||
import io.anuke.ucore.util.Translator;
|
import io.anuke.ucore.util.Translator;
|
||||||
|
|
||||||
public abstract class GroundUnitType extends UnitType{
|
public abstract class GroundUnitType extends UnitType{
|
||||||
protected Translator tr = new Translator();
|
//only use for drawing!
|
||||||
|
protected Translator tr1 = new Translator();
|
||||||
|
//only use for updating!
|
||||||
|
protected Translator tr2 = new Translator();
|
||||||
|
|
||||||
public GroundUnitType(String name) {
|
public GroundUnitType(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
@ -13,13 +16,13 @@ public abstract class GroundUnitType extends UnitType{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(BaseUnit unit) {
|
public void draw(BaseUnit unit) {
|
||||||
float walktime = 0; //TODO!
|
float walktime = unit.walkTime; //TODO!
|
||||||
|
|
||||||
float ft = Mathf.sin(walktime, 6f, 2f);
|
float ft = Mathf.sin(walktime, 6f, 2f);
|
||||||
|
|
||||||
for (int i : Mathf.signs) {
|
for (int i : Mathf.signs) {
|
||||||
tr.trns(unit.baseRotation, ft * i);
|
tr1.trns(unit.baseRotation, ft * i);
|
||||||
Draw.rect(name + "-leg", unit.x + tr.x, unit.y + tr.y, 12f * i, 12f - Mathf.clamp(ft * i, 0, 2), unit.baseRotation - 90);
|
Draw.rect(name + "-leg", unit.x + tr1.x, unit.y + tr1.y, 12f * i, 12f - Mathf.clamp(ft * i, 0, 2), unit.baseRotation - 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.rect(name + "-base", unit.x, unit.y, unit.baseRotation- 90);
|
Draw.rect(name + "-base", unit.x, unit.y, unit.baseRotation- 90);
|
||||||
@ -29,6 +32,9 @@ public abstract class GroundUnitType extends UnitType{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void behavior(BaseUnit unit) {
|
public void behavior(BaseUnit unit) {
|
||||||
|
tr2.set(unit.target.x, unit.target.y).sub(unit.x, unit.y).limit(speed);
|
||||||
|
|
||||||
|
unit.move(tr2.x, tr2.y);
|
||||||
|
unit.rotate(tr2.angle());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package io.anuke.mindustry.entities.units;
|
|||||||
|
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
import io.anuke.mindustry.entities.BulletType;
|
import io.anuke.mindustry.entities.BulletType;
|
||||||
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.graphics.Fx;
|
import io.anuke.mindustry.graphics.Fx;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.net.NetEvents;
|
import io.anuke.mindustry.net.NetEvents;
|
||||||
@ -16,6 +17,10 @@ public abstract class UnitType {
|
|||||||
private static byte lastid = 0;
|
private static byte lastid = 0;
|
||||||
private static Array<UnitType> types = new Array<>();
|
private static Array<UnitType> types = new Array<>();
|
||||||
|
|
||||||
|
private static int timerIndex = 0;
|
||||||
|
|
||||||
|
protected static final int timerTarget = timerIndex++;
|
||||||
|
|
||||||
public final String name;
|
public final String name;
|
||||||
public final byte id;
|
public final byte id;
|
||||||
|
|
||||||
@ -23,8 +28,9 @@ public abstract class UnitType {
|
|||||||
protected float hitsize = 5f;
|
protected float hitsize = 5f;
|
||||||
protected float hitsizeTile = 4f;
|
protected float hitsizeTile = 4f;
|
||||||
protected float speed = 0.4f;
|
protected float speed = 0.4f;
|
||||||
protected float range = 60;
|
protected float range = 160;
|
||||||
protected float rotatespeed = 0.1f;
|
protected float rotatespeed = 0.1f;
|
||||||
|
protected float baseRotateSpeed = 0.1f;
|
||||||
protected float mass = 1f;
|
protected float mass = 1f;
|
||||||
protected boolean isFlying;
|
protected boolean isFlying;
|
||||||
protected float drag = 0.1f;
|
protected float drag = 0.1f;
|
||||||
@ -47,6 +53,8 @@ public abstract class UnitType {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTargeting(unit);
|
||||||
|
|
||||||
//TODO logic
|
//TODO logic
|
||||||
|
|
||||||
unit.x += unit.velocity.x / mass;
|
unit.x += unit.velocity.x / mass;
|
||||||
@ -54,20 +62,27 @@ public abstract class UnitType {
|
|||||||
|
|
||||||
unit.velocity.scl(Mathf.clamp(1f-drag* Timers.delta()));
|
unit.velocity.scl(Mathf.clamp(1f-drag* Timers.delta()));
|
||||||
|
|
||||||
behavior(unit);
|
if(unit.target != null) behavior(unit);
|
||||||
|
|
||||||
unit.x = Mathf.clamp(unit.x, 0, world.width() * tilesize);
|
unit.x = Mathf.clamp(unit.x, 0, world.width() * tilesize);
|
||||||
unit.y = Mathf.clamp(unit.y, 0, world.height() * tilesize);
|
unit.y = Mathf.clamp(unit.y, 0, world.height() * tilesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**Only runs when the unit has a target.*/
|
||||||
public abstract void behavior(BaseUnit unit);
|
public abstract void behavior(BaseUnit unit);
|
||||||
|
|
||||||
public void updateTargeting(BaseUnit unit){
|
public void updateTargeting(BaseUnit unit){
|
||||||
//TODO
|
if(unit.target == null || unit.target.isDead()){
|
||||||
|
unit.target = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(unit.timer.get(timerTarget, 30)){
|
||||||
|
unit.target = Units.getClosestEnemy(unit.team, unit.x, unit.y, range, e -> true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onShoot(BaseUnit unit, BulletType type, float rotation){
|
public void onShoot(BaseUnit unit, BulletType type, float rotation){
|
||||||
//TODO
|
//TODO remove?
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDeath(BaseUnit unit){
|
public void onDeath(BaseUnit unit){
|
||||||
|
@ -120,6 +120,7 @@ public class Save16 extends SaveFileVersion {
|
|||||||
byte teams = stream.readByte();
|
byte teams = stream.readByte();
|
||||||
|
|
||||||
for(int i = 0; i < teams; i ++){
|
for(int i = 0; i < teams; i ++){
|
||||||
|
Team team = Team.values()[i];
|
||||||
EntityGroup<BaseUnit> group = unitGroups[i];
|
EntityGroup<BaseUnit> group = unitGroups[i];
|
||||||
|
|
||||||
int amount = stream.readInt();
|
int amount = stream.readInt();
|
||||||
@ -130,7 +131,7 @@ public class Save16 extends SaveFileVersion {
|
|||||||
float y = stream.readFloat();
|
float y = stream.readFloat();
|
||||||
int health = stream.readShort();
|
int health = stream.readShort();
|
||||||
|
|
||||||
BaseUnit enemy = new BaseUnit(UnitType.getByID(type));
|
BaseUnit enemy = new BaseUnit(UnitType.getByID(type), team);
|
||||||
enemy.health = health;
|
enemy.health = health;
|
||||||
enemy.x = x;
|
enemy.x = x;
|
||||||
enemy.y = y;
|
enemy.y = y;
|
||||||
|
@ -5,6 +5,7 @@ import com.badlogic.gdx.files.FileHandle;
|
|||||||
import io.anuke.mindustry.entities.Player;
|
import io.anuke.mindustry.entities.Player;
|
||||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||||
import io.anuke.mindustry.entities.units.UnitTypes;
|
import io.anuke.mindustry.entities.units.UnitTypes;
|
||||||
|
import io.anuke.mindustry.game.Team;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.ucore.core.Timers;
|
import io.anuke.ucore.core.Timers;
|
||||||
import io.anuke.ucore.scene.builders.button;
|
import io.anuke.ucore.scene.builders.button;
|
||||||
@ -54,7 +55,7 @@ public class DebugFragment implements Fragment {
|
|||||||
row();
|
row();
|
||||||
new button("wave", () -> state.wavetime = 0f);
|
new button("wave", () -> state.wavetime = 0f);
|
||||||
row();
|
row();
|
||||||
new button("spawn", () -> new BaseUnit(UnitTypes.scout).set(player.x, player.y).add());
|
new button("spawn", () -> new BaseUnit(UnitTypes.scout, Team.red).set(player.x, player.y).add());
|
||||||
row();
|
row();
|
||||||
}}.end();
|
}}.end();
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ public class Turret extends Block{
|
|||||||
if(hasAmmo(tile) || (debug && infiniteAmmo)){
|
if(hasAmmo(tile) || (debug && infiniteAmmo)){
|
||||||
|
|
||||||
if(entity.timer.get(timerTarget, targetInterval)){
|
if(entity.timer.get(timerTarget, targetInterval)){
|
||||||
entity.target = Units.getClosestEnemies(tile.getTeam(),
|
entity.target = Units.getClosestEnemy(tile.getTeam(),
|
||||||
tile.worldx(), tile.worldy(), range, e -> !e.isDead());
|
tile.worldx(), tile.worldy(), range, e -> !e.isDead());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user