summaryrefslogtreecommitdiff
path: root/demos/2d/shower_of_bullets/bullets.gd
blob: 79f4faaae6a6823c6dacc25c7deba52a100f536e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

extends Node2D

# This demo is an example of controling a high number of 2D objects with logic and collision without using scene nodes.
# This technique is a lot more efficient than using instancing and nodes, but requires more programming and is less visual

const BULLET_COUNT = 500
const SPEED_MIN = 20
const SPEED_MAX = 50

var bullets=[]
var shape

class Bullet:
	var pos = Vector2()
	var speed = 1.0
	var body = RID()
	

func _draw():

	var t = preload("res://bullet.png")
	var tofs = -t.get_size()*0.5
	for b in bullets:
		draw_texture(t,b.pos+tofs)	
		
	
func _process(delta):
	var width = get_viewport_rect().size.x*2.0
	var mat = Matrix32()
	for b in bullets:
		b.pos.x-=b.speed*delta
		if (b.pos.x < -30):
			b.pos.x+=width
		mat.o=b.pos		
		
		Physics2DServer.body_set_state(b.body,Physics2DServer.BODY_STATE_TRANSFORM,mat)
		
	update()
		
			
func _ready():

	shape = Physics2DServer.shape_create(Physics2DServer.SHAPE_CIRCLE)
	Physics2DServer.shape_set_data(shape,8) #radius

	for i in range(BULLET_COUNT):
		var b = Bullet.new()
		b.speed=rand_range(SPEED_MIN,SPEED_MAX)
		b.body = Physics2DServer.body_create(Physics2DServer.BODY_MODE_KINEMATIC)
		Physics2DServer.body_set_space(b.body,get_world_2d().get_space())
		Physics2DServer.body_add_shape(b.body,shape)
		
		b.pos = Vector2( get_viewport_rect().size * Vector2(randf()*2.0,randf()) ) #twice as long
		b.pos.x += get_viewport_rect().size.x # start outside
		var mat = Matrix32()
		mat.o=b.pos
		Physics2DServer.body_set_state(b.body,Physics2DServer.BODY_STATE_TRANSFORM,mat)
		
		bullets.append(b)
		
		
	set_process(true)
		
	
func _exit_tree():
	for b in bullets:
		Physics2DServer.free_rid(b.body)
	
	Physics2DServer.free_rid(shape)
	# Initalization here
	bullets.clear()
	
	pass