Simple Soccer GAM 376 Robin Burke Fall 2006 Outline Game Implementation Project #1 Admin Homework #3 Grading due today I am behind but no other homework due for awhile Upcoming 10/9: Design phase of Soccer project 10/11: Midterm 10/17: Soccer project Simple Soccer A 2D sports game 5 agents per team 4 field players 1 goal keeper 1 ball 1 field 2 goals Architecture Main loop Update SoccerPitch Redraw SoccerPitch responsible for updating what is on the field SoccerPitch Walls on all four sides no throw-ins or goal kicks Regions 18 rectangular regions for positioning players Goals each tracks number of goals scored MovingEntity Abstract class for all moving objects has steering behaviors Subclasses SoccerBall FieldPlayer SoccerBall embeds some of the physics of its motion FuturePosition Δx = v Δt + ½ af Δt2 where af is the deceleration due to friction TimeToCoverDistance Δt = (v' – v) / af but what is v' v v 2 2a f x issues • what if inner part is negative? • then the ball won't get that far • what is the initial velocity, v? Velocity Reset What really happens? a player swings a foot moment of interaction with ball • impulse new velocity results really it is a foot/ball collision But not necessary to model it this way assume that the ball is stopped before a kick • players can't add to existing velocity • OK, because it looks OK Initial velocity much easier to model equals impulse acceleration equals F / m So we can calculate TimeToCoverDistance given two points and a force Simple Soccer Implementation of a 5-player soccer team Two state machines "Team state" "Player state" Tiered state machines common in tactical FPS games teams have a tactical state • "flanking" and each member has its own role • "covering fire" Team state kickoff offense everybody go to default position not true soccer kickoff look for opportunities to get a pass upfield from the player with the ball defense go to defensive position closest player chases ball other team possession Offense our team possession goal scored Defense play starts goal scored Kickoff Team Behaviors Tracks passes Tracks ball closest player to the ball constantly updated Controlling player receiving player of a pass set when a pass is made the player with the ball Supporting player a player that will get into position for a pass Support Spot Considers 30 positions on the opponent's half of the field Calculates which position can receive a pass and can shoot a goal and are close enough to ball Supporting player will try to go to the best support spot Player state defense chase ball if you're the closest offense move toward goal with ball • pass if possible without ball (if supporting player) • move to support spot • ask for pass otherwise • do nothing Steering behaviors tracking the ball "visually" chasing the ball steering to support position goalie has special behavior to get in blocking position State Machine Global state Wait ReceiveBall try to take possession of the ball ReturnToHomeRegion try to move the ball downfield ChaseBall make a pass Dribble accept a pass KickBall routes messages go home for kickoff SupportAttacker go to supporting position MSG: Support MSG: Receive_Ball SupportAttacker ReceiveBall not closest MSG: Go_Home in receiving range kicked ChaseBall Dribble ReturnToHR can't shoot or pass in range can't kick closest KickBall goal or pass attempt Wait at home Goal Keeper Different states TendGoal InterceptBall interpose self between ball and goal midpoint if within tending range PutBallBackIntoPlay passes to nearest player Key Calculations Is a pass safe? predict trajectory of ball predict closest intercept of each opponent Is it possible to shoot? test positions along the goal mouth does this randomly Who to pass to? tests all of the teammates for validity and nearness to goal Where to place the pass? out of opponents range within receivers range Demo SteeringSoccerLab Not the same as Buckland's Allows multiple team implementations Records the CPU time used by each AI implementation Don't use Buckland's code Abstract class AbstSoccerTeam all soccer teams must subclass Abstract functions CreatePlayers • teams can have different player setups InitStateMachine • for team state machine • teams can have different team FSMs InitPlayers Name How to allow different opponents? Need students to make their own soccer teams need to run tournament in which teams compete don't want to recompile when adding a team How to make extensible code that doesn't need recompilation? In particular how can I create an instance if I don't know the name of the class AbstractFactory Registration How to know which factory object to use? Static instance that registers a name on instantiation Table associating factories with names Result dynamic object creation (A bit easier in Java using reflection) Implementation TeamMaker class includes a static "registry" member • table of name, class pairs has a newTeam method • looks up the factory class in the table • calls its makeTeam method The class stored here is a subclass of TeamMaker must implement makeTeam • makes an instance of the right team object must include a static member with an instance of itself • when that instance is created • it calls the TeamMaker constructor with a name • the factory class is then registered under that name Project #1 Two parts Design (10/6) Implementation (5 pm, 10/17) tell me what you want to do to create a better team deliver implementation I will compile and check compatibility Tournament (10/18) In class Last minute changes OK Tournament rules Round-robin 1 game matches 5 minutes / match Scoring Lower scoring team • get a bonus if they used less CPU time • 20% less CPU = 1 point Ties go to the most efficient team Degenerate strategies disqualified Randomized elements must stay Monday Lab using SimpleSoccer