mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2025-12-16 13:30:07 +01:00
SceneMainLoop -> SceneTree
-=-=-=-=-=-=-=-=-=-=-=-=-=- *YOUR SOURCE MIGHT NOT WORK* For mor information on fix: https://github.com/okamstudio/godot/wiki/devel_scene_tree Other stuff: -Shower of bullets demo -Fixes all around
This commit is contained in:
BIN
2d/shower_of_bullets/bullet.png
Normal file
BIN
2d/shower_of_bullets/bullet.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 477 B |
76
2d/shower_of_bullets/bullets.gd
Normal file
76
2d/shower_of_bullets/bullets.gd
Normal file
@@ -0,0 +1,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(b.body)
|
||||
|
||||
Physics2DServer.free(shape)
|
||||
# Initalization here
|
||||
bullets.clear()
|
||||
|
||||
pass
|
||||
|
||||
|
||||
16
2d/shower_of_bullets/engine.cfg
Normal file
16
2d/shower_of_bullets/engine.cfg
Normal file
@@ -0,0 +1,16 @@
|
||||
[application]
|
||||
|
||||
name="Bullet Shower"
|
||||
main_scene="res://shower.scn"
|
||||
icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
|
||||
width=1024
|
||||
height=600
|
||||
resizable=true
|
||||
stretch_aspect="keep"
|
||||
|
||||
[physics_2d]
|
||||
|
||||
cell_size=64
|
||||
BIN
2d/shower_of_bullets/face_happy.png
Normal file
BIN
2d/shower_of_bullets/face_happy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
2d/shower_of_bullets/face_sad.png
Normal file
BIN
2d/shower_of_bullets/face_sad.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
2d/shower_of_bullets/icon.png
Normal file
BIN
2d/shower_of_bullets/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
32
2d/shower_of_bullets/shower.gd
Normal file
32
2d/shower_of_bullets/shower.gd
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
extends Node2D
|
||||
|
||||
# member variables here, example:
|
||||
# var a=2
|
||||
# var b="textvar"
|
||||
|
||||
var touching=0
|
||||
|
||||
func _input(ev):
|
||||
|
||||
if (ev.type==InputEvent.MOUSE_MOTION):
|
||||
get_node("player").set_pos(ev.pos-Vector2(0,16))
|
||||
|
||||
|
||||
func _on_player_body_enter_shape( body_id, body, body_shape, area_shape ):
|
||||
|
||||
touching+=1
|
||||
if (touching==1):
|
||||
get_node("player/sprite").set_frame(1)
|
||||
|
||||
|
||||
func _on_player_body_exit_shape( body_id, body, body_shape, area_shape ):
|
||||
|
||||
touching-=1
|
||||
if (touching==0):
|
||||
get_node("player/sprite").set_frame(0)
|
||||
|
||||
|
||||
func _ready():
|
||||
set_process_input(true)
|
||||
pass
|
||||
BIN
2d/shower_of_bullets/shower.scn
Normal file
BIN
2d/shower_of_bullets/shower.scn
Normal file
Binary file not shown.
@@ -12,12 +12,12 @@ func goto_scene(scene):
|
||||
#instance the new scene
|
||||
current_scene = s.instance()
|
||||
#add it to the active scene, as child of root
|
||||
get_scene().get_root().add_child(current_scene)
|
||||
get_tree().get_root().add_child(current_scene)
|
||||
|
||||
|
||||
func _ready():
|
||||
# get the current scene
|
||||
# it is always the last child of root,
|
||||
# after the autoloaded nodes
|
||||
var root = get_scene().get_root()
|
||||
var root = get_tree().get_root()
|
||||
current_scene = root.get_child( root.get_child_count() -1 )
|
||||
|
||||
@@ -5,11 +5,11 @@ extends Spatial
|
||||
func _on_pause_pressed():
|
||||
get_node("pause_popup").set_exclusive(true)
|
||||
get_node("pause_popup").popup()
|
||||
get_scene().set_pause(true)
|
||||
get_tree().set_pause(true)
|
||||
|
||||
|
||||
func _on_unpause_pressed():
|
||||
get_node("pause_popup").hide()
|
||||
get_scene().set_pause(false)
|
||||
get_tree().set_pause(false)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user