Tank Battle - A simple game powered by JMonkey engine
-
Upload
farzad-nozarian -
Category
Education
-
view
142 -
download
0
Transcript of Tank Battle - A simple game powered by JMonkey engine
Tank battleFarzad Nozarian - Vahid RanaeiAmirkabir university of technology
References
Problem DefinitionTank Movement
Android Devices Orientation Sensors
Desktops ‘WASD’ Control Keys
VS.
Problem DefinitionTank Movement/Android Devices
public void onSensorChanged(SensorEvent sensorEvent) { if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float headingAngle = sensorEvent.values[0];float pitchAngle = sensorEvent.values[1];float rollAngle = sensorEvent.values[2];// TODO Apply the orientation changes to your application.
}}
Problem DefinitionTank Movement/Desktop Devices
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_H));inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_K));inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_U));inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_J));inputManager.addListener(this, "Lefts");inputManager.addListener(this, "Rights");
Problem DefinitionTank Movement/Desktop Devices
onActionhandler
if (binding.equals("Ups")) { if (value) { accelerationValue -= 800; } else { accelerationValue += 800; } player.accelerate(accelerationValue); } else if (binding.equals("Rights")) {
if (value) { steeringValue += -.5f; } else { steeringValue += .5f; } player.steer(steeringValue); }
Problem DefinitionTank Movement
Some Abstractions
Fire
Move Forward (Accelerate)
Move Around (Steer)…
Problem DefinitionTank Movement
vehicle.steer(steeringValue) vehicle.accelerate(accelerationValue)applyImpulse
resetSuspension
setPhysicsLocation
setPhysicsRotation
setLinearVelocity
Pattern Definition
• Decouple an abstraction from its implementation so that the two can vary independently
• When abstractions and implementations should be extensible through subclassing
Bridge!
Pattern Definition
Pattern SolutionBridge
Problem DefinitionTank Shooting
Shooting In Real World !
Burst mode
Selective fire
Automatic firearm
Bump firing
Same ‘Fire’ Different Behaviors ?!
Pattern DefinitionTank Shooting
• Many related classes differ only in their behavior
• We need different variant of algorithm
• We need run-time shooting variationStrategy
!
Pattern SolutionStrategy
Problem DefinitionWorld of Complexity!
Geometrypolygon mesh
material
specifying its shape
colortextureopacity/transparency
Problem DefinitionWorld of Complexity!
Spatial
Purpose: Abstract data structure that stores user data and transformations(= translation, rotation, scale) of elements of the 3D
Geometry Node
Visibility: visible 3D object invisible "handle" for a group of Spatials
Purpose: represent an object's lookstructure and group Geometries and other Nodes
Examples: Box, sphere, player, building, terrain, vehicle, missiles …
rootNode, audioNode, vehicleNode or shipNode with passengers attached, etc.
Pattern DefinitionWorld of Complexity!
• Compose objects into tree structures to represent part-whole hierarchies
• Clients treat individual objects and compositions of objects uniformly
• We want clients to be able to ignore the difference between compositions of objects and individual objects
Composite
Pattern SolutionWorld of Complexity!
Problem DefinitionFamily of Game Entities
Problem Definitiongame configuration Resolution
Brightness
Full screen
Master volumeVoice Volume
Menu music in-game volume
..move buttons
Action buttons
..
Bunch of configurations !!
:\
Problem Definitiongame configuration
public static class UserBuilder { private final String firstName; private final String lastName; .. public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this; } .. public User build() { return new User(this); } }
}
public class User { private final String firstName; // required private final String lastName; // required private final int age; // optional private final String phone; // optional private final String address; // optional private User(UserBuilder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; .. } public String getFirstName() { return firstName; } public String getLastName() { return lastName; }
public user getUser(){return new
User.UserBuilder(‘John’,’Doe’)
.age(30)
.phone(‘3235345)
.address(‘’Fake address 33)
.build();
Problem Definitiongame configuration
public class Configuration {
private int displayResolution;// display resolution
private int displayMode;// full screen? private int soundVolume;//Sound volumeprivate int musicVolume; //Music volume//....
private Configuration(ConfigBuilder builder) { this.displayResolution = builder.displayResolution; this.displayMode = builder.displayMode;
.. }
public int getDisplayResolution() {return displayResolution;
}public int getDisplayMode() {
return displayMode;}..public static class ConfigBuilder{
private int displayResolution=0;// display resolution
private int displayMode=0;// full screen?
private int soundVolume=0;//Sound volume
private int musicVolume=0; //Music volume
//....
public ConfigBuilder displayResolution(int dr)
{this.displayResolution =
dr;return this;
}public ConfigBuilder
displayMode(int dm){
this.displayMode = dm;return this;
}..public Configuration build(){
return new Configuration(this);
}}
}
Problem Definitiongame configuration
But it is not all of it ..
Problem Definitiongame configuration
Builderton pattern !? :o
Problem Definitiongame configuration
public class Configuration {private static Configuration c;private int displayResolution; // display resolutionprivate int displayMode; // full screen? private int soundVolume; //Sound volumeprivate int musicVolume; //Music volume//....
private Configuration(ConfigBuilder builder) { this.displayResolution = builder.displayResolution; this.displayMode = builder.displayMode; this.soundVolume = builder.soundVolume; this.musicVolume = builder.soundVolume; }
public int getDisplayResolution() {return displayResolution;
}public int getDisplayMode() {
return displayMode;}…public static class ConfigBuilder{
private int displayResolution=0;private int displayMode=0;
private int soundVolume=0;private int musicVolume=0; //....public ConfigBuilder displayResolution(int dr){
this.displayResolution = dr;return this;
}public ConfigBuilder displayMode(int dm){
this.displayMode = dm;return this;
}…public Configuration build(){
if (c == null){ c=new
Configuration(this);return c;
}else return c;
}}
}
To Be Continue …