⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worker.java

📁 很好的windows驱动开发书记,基于WDM的,,可以很好的学习
💻 JAVA
字号:
package bb;

import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.geom.*;

/*
A worked is just good for gathering resources. It always picks up its load 
from the nearest non-empty resource pool. Then it dumps if off at the city
specified by its mission. If it has no mission, it dumps it off at the nearest
city.

@author naimad
*/

public class Worker extends Agent {

    class GatherSkill extends Skill {
    
    	public final static String GATHER = "gather";
    	public final static double DIST_THRESHOLD = 10.0;

    	public GatherSkill(Agent agent, double prof) {
    		this(GATHER, agent, prof);
    	}
    	
    	public GatherSkill(String name, Agent agent, double prof) {
    		super(name, agent, prof);
    	}

		Vec2 vtemp = new Vec2();
		private City pickCity(Mission mission) {
			City city = null;
			if (mission==null) {
				city = agent.world.getNearestAlliedCityWithinRange(agent, agent.pos, 2000.0);
			}
			else if (mission instanceof LocatableMission) {
				LocatableMission lmission = (LocatableMission)mission;
				lmission.getTargetPosition(vtemp);
				city = agent.world.getNearestAlliedCityWithinRange(agent, vtemp, 2000.0);
			}
			return city;
		}
		
		private Resource pickResource() {
    		return agent.world.getNearestResourceInRange(agent.pos, 2000.0);
		}
		
		double resources = 0.0;
		City targetCity = null;
		Resource targetResource = null;
		
    	public void apply(double time, Mission mission) {
    		//find the nearest res source and go there and get res!
    		if (resources > Worker.CAPACITY) {
    			//go back to city
    			if (targetCity==null) targetCity = pickCity(mission);
    			if (targetCity!=null) {
    				targetCity.getPosition(agent, vtemp);
    				Vec2.sub(vtemp, agent.pos, vtemp);
    				
    				double dist = vtemp.mag();
    				
    				if (dist < DIST_THRESHOLD) {
    					targetCity.addResources(resources);
    					resources = 0.0;
    					bb.removeFromMission(agent, mission);
    					agent.currentMission = null;
    					agent.currentSkill = null;
    					targetResource=null;
    				}
    				else {
    					vtemp.normalize();
    					agent.addForce(vtemp);
    				}
    			}
    		}
    		else {
    			//go to the appropriate resource
    			if (targetResource==null || targetResource.resources <= 0.0) targetResource = pickResource();
    			if (targetResource!=null) {
    				vtemp.set(targetResource.pos);
    				Vec2.sub(vtemp, agent.pos, vtemp);
    				
    				double dist = vtemp.mag();
    				
    				if (dist < DIST_THRESHOLD) {
    					resources += targetResource.extractResources();
    					targetCity=null;
    				}
    				else {
    					vtemp.normalize();
    					agent.addForce(vtemp);
    				}
    			}
    		}
    	}
    }

    public final static int COST = 30;
    public final static double CAPACITY = 50.0;

    public Worker(int team, Vec2 pos, Blackboard bb, World world) {
        super(team, 0, pos, 5.0, 10.0, 250.0, bb, world);

        //subclasses should add skills to their skill hashTable...
        Skill gather = new GatherSkill(this, 1.0);
        skills.put(gather.getName(), gather);

        defaultSkill = gather;
    }

    //Give workers the ability to avoid enemies (since we know they can't defend themselves)
	Vector elist = new Vector();
	Vec2 vtemp = new Vec2();
	public void updatePhysics(double time) {
		
		elist.removeAllElements();
		world.getEnemiesWithinRegion(this, pos, 110.0, elist);
		
		for (int c=0; c < elist.size(); c++) {
			Agent a = (Agent)elist.elementAt(c);
			if (!(a instanceof Worker)) {	//we're not scared of workers!
				a.getPosition(this, vtemp);
				Vec2.sub(pos, vtemp, vtemp);
				double d = vtemp.mag();
				if (d == 0.0) {
					vtemp.set(1.0, 0.0);
					d = 1.0;
				}
				else vtemp.normalize();
				vtemp.scale((110.0-d)/40.0);
				this.addForce(vtemp);
			}
		}
		
		super.updatePhysics(time);
	}
    
    public Shape createShape() {
    	return new Rectangle2D.Double(-4.0, 4.0, 8.0, 8.0) ;
    }    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -