mirror of
https://github.com/fazo96/AIrium.git
synced 2025-03-31 22:38:38 +02:00
107 lines
3.7 KiB
Java
107 lines
3.7 KiB
Java
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
package logic.creatures;
|
|
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
|
import com.mygdx.game.Game;
|
|
import com.mygdx.game.Log;
|
|
import logic.Element;
|
|
import logic.Vegetable;
|
|
|
|
/**
|
|
*
|
|
* @author fazo
|
|
*/
|
|
public class Eye extends BodyPart {
|
|
|
|
private Sight sights[];
|
|
private int seen;
|
|
public static float fov = 2, sightRange = 30;
|
|
|
|
public Eye(int nSights, float angle, Creature creature) {
|
|
super(6 * nSights, 0, angle, 0.8f, creature);
|
|
sights = new Sight[nSights];
|
|
seen = 0;
|
|
}
|
|
|
|
@Override
|
|
public float[] act() {
|
|
float ret[] = new float[inputNeuronsUsed];
|
|
int j = 0;
|
|
for (int i = 0; i < sights.length; i++) {
|
|
if (i < seen) {
|
|
// Saw something
|
|
ret[j] = 1;
|
|
ret[j + 1] = sights[i].getElement() instanceof Creature ? 1 : 0;
|
|
ret[j + 2] = sights[i].getDistance() / sightRange;
|
|
ret[j + 3] = sights[i].getAngle();
|
|
if (sights[i].getElement() instanceof Creature) {
|
|
ret[i + 4] = ((Creature) sights[i].getElement()).getBeak() / Beak.max_length;
|
|
ret[i + 5] = ((Creature) sights[i].getElement()).getTorso().getHp() / Torso.max_hp;
|
|
} else {
|
|
ret[i + 4] = ((Vegetable) sights[i].getElement()).getSize() / Vegetable.default_radius;
|
|
ret[i + 5] = 0;
|
|
}
|
|
} else {
|
|
// Saw nothing
|
|
for (int z = 0; z < 6; z++) {
|
|
ret[j + z] = 0;
|
|
}
|
|
}
|
|
j += 6;
|
|
}
|
|
seen = 0;
|
|
sights = new Sight[sights.length];
|
|
return ret;
|
|
}
|
|
|
|
|
|
@Override
|
|
public void interactWithElement(Element e, float distance, float angle) {
|
|
if (e != creature && distance < sightRange && Math.abs(angle) < fov / 2) {
|
|
if (seen < sights.length) {
|
|
sights[seen] = new Sight(e, distance, angle);
|
|
Log.log(Log.DEBUG, "Saw " + e.getClass().getName() + " at " + distance + " with relative angle " + angle);
|
|
seen++;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void draw(ShapeRenderer s, float relX, float relY) {
|
|
// Draw eye
|
|
s.setColor(1, 1, 1, 1);
|
|
s.circle(creature.getX() + relX, creature.getY() + relY, 3);
|
|
// Draw FOV cone
|
|
float degrees = fov * 360f / (float) Math.PI;
|
|
float orient = (creature.getDirection() + angle) * 180f / (float) Math.PI - degrees / 2;
|
|
if (Game.get().getWorld().getOptions().getOrDefault("draw_view_cones", 0f) > 0) {
|
|
s.setColor(0.3f, 0.3f, 0.3f, 1);
|
|
s.arc((float) relX + creature.getX(), (float) relY + creature.getY(), sightRange, orient, degrees);
|
|
}
|
|
// Sight Lines
|
|
float c = 0;
|
|
if (Game.get().getWorld().getOptions().getOrDefault("draw_sight_lines", 0f) > 0) {
|
|
for (Sight sight : sights) {
|
|
if (sight != null) {
|
|
c = sight.getDistance() / sightRange * 2 + sightRange;
|
|
if (sight.getElement() instanceof Creature) {
|
|
s.setColor(c, 0, 0, 1);
|
|
} else if (sight.getElement() instanceof Vegetable) {
|
|
s.setColor(0, c, 0, 1);
|
|
}
|
|
s.line(relX + creature.getX(), creature.getY() + relY, sight.getElement().getX(), sight.getElement().getY());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void readFromBrain(float[] data) {
|
|
}
|
|
|
|
}
|