Class: Zyps::Environment

Inherits:
Object
  • Object
show all
Includes:
Observable
Defined in:
lib/zyps.rb

Overview

A virtual environment.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Environment

Takes a hash with these keys and defaults: :objects => [], :environmental_factors => []



36
37
38
39
40
41
42
43
# File 'lib/zyps.rb', line 36

def initialize (options = {})
	options = {
		:objects => [], 
		:environmental_factors => []
	}.merge(options)
	self.objects, self.environmental_factors = options[:objects], options[:environmental_factors]
	@clock = Clock.new
end

Instance Attribute Details

#environmental_factorsObject

An array of EnvironmentalFactor objects that act on any GameObject in the Environment.



31
32
33
# File 'lib/zyps.rb', line 31

def environmental_factors
  @environmental_factors
end

#objectsObject

An array of GameObject objects that reside in the Environment.



29
30
31
# File 'lib/zyps.rb', line 29

def objects
  @objects
end

Instance Method Details

#copyObject

Make a deep copy.



46
47
48
49
50
51
52
53
54
55
# File 'lib/zyps.rb', line 46

def copy
	copy = self.clone #Currently, we overwrite everything anyway, but we may add some clonable attributes later.
	#Make a deep copy of all objects.
	copy.objects = []
	@objects.each {|object| copy.objects << object.copy}
	#Make a deep copy of all environmental_factors.
	copy.environmental_factors = []
	@environmental_factors.each {|environmental_factor| copy.environmental_factors << environmental_factor.copy}
	copy
end

#interactObject

Allow everything in the environment to interact with each other. Objects are first moved according to their preexisting vectors and the amount of time since the last call. Then, each GameObject with an act() method is allowed to act on the environment. Finally, each EnvironmentalFactor is allowed to act on the Environment.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/zyps.rb', line 61

def interact

	#Get time since last interaction.
	elapsed_time = @clock.elapsed_time
	
	objects.each do |object|
	
		#Move each object according to its vector.
		begin
			object.move(elapsed_time)
		#Remove misbehaving objects.
		rescue Exception => exception
			puts exception, exception.backtrace
			objects.delete(object)
			next
		end
		
		#Have all creatures interact with the environment.
		if object.respond_to?(:act)
			begin
				#Have creature act on all GameObjects other than itself.
				object.act(objects.reject{|target| target.equal?(object)})
			#Remove misbehaving objects.
			rescue Exception => exception
				puts exception, exception.backtrace
				objects.delete(object)
				next
			end
		end
			
		
	end
	
	#Have all environmental factors interact with environment.
	environmental_factors.each do |factor|
		begin
			factor.act(self)
		#Remove misbehaving environmental factors.
		rescue Exception => exception
			environmental_factors.delete(factor)
			puts exception, exception.backtrace
			next
		end
	end
		
	#Mark environment as changed.
	changed
	
	#Alert observers.
	notify_observers(self)
	
end