반응형

- ship.gd스크립트 수정

- armor_changed 시그널 추가

- set_armor함수에 emit_signal 추가

- Canvas2D노드 추가 후 hud로 이름 변경

- 하위에 sprite노드 추가 후 spr_armor로 이름 변경

- Sprite Texture에 armor.png파일 지정

- Centered는 해제하고,

- 총 수평방향으로 5개의 프레임이 존재(Hframes:5) 인식

- 현재 프레임은 4번째 프레임을(Frame: 4)인식시켜준다.

- spr_armor노드에 스크립트 추가 (Built-In-Script형태로 추가해준다.)

<Score시스템>

- TextureFrame TextureRect노드를 추가 후 tex_score로 이름 변경

- Texture에 score.png 파일 추가

- 노드 사이즈를 적절히 조정 후 Pos (123, 10) 으로 위치 지정

- tex_score하위에 label노드 추가하여 이름을 label로 변경

- Text: 0, Align: Right, Pos:(3,1), Size:(41,14) 지정

- 다이나믹 폰트 지정

- tex_score에 built-in-sciprt 추가

- Name: tex_score 지정

-  새로운 값이 들어오면 텍스트를 새 값으로 변경해줌

- 새 값을 전달해주는 함수는 enemy.gd에서 수정

 

<main메뉴 만들기>

- 빈 Node를 추가하여 이름을 main으로 바꾸고

- stage_menu.tscn으로 저장

- CanvasLayer2D노드 추가 후 hud로 이름 변경

- TextureButton 노드 추가 후 btn_start로 이름 변경

- Texture에서 각 경우에 맞게 텍스쳐 이미지 지정

    Normal: button_normal.png

    Pressed: button_pressed.png

    Hover: button_hover.png

- 위치 조정 (67, 134)

- 하위에 라벨 노드를 추가하고, Text: Start, Align:Center 지정

- 노드 사이즈를 이미지에 맞게 조정

- 폰트를 HUD의 다이나믹 폰트에서 복사/붙여넣기 한다.

<Quit버튼 만들기>

- btn_start를 복제하여 만들기

- 위치를 67,155로 변경

- Text: QUIT 로 변경하고 위치 미세조정

- btn_start에서 스크립트 추가(Attach Script)

- 이름을 btn_start로 지정 후 스크립트 생성

- btn_quit노드에도 built-in-script추가

- Name: btn_quit 지정

- btn_start의 스크립트를 복사 후, _on_pressed()함수에서 작동하는 부분만 수정

- Project Settings에서 시작씬으로 stage_menu.tscn을 지정

< 죽었을 때 메뉴버튼 나타내기>

- stage_game.tscn > hud노드에 Merge from Scene

- stage_menu.tscn > btn_start 버튼을 가져온다.

- 버튼 이름을 btn_menu로 변경하고,

- label노드의 Text: MENU로 변경한 뒤 노드 사이즈를 미세조정한다.

- 시작시에 이 버튼은 나타나지 않도록 숨겨줌

- 스크립트는 고유하게 변경해줌

- 스크립트 편집

시그널 " exit_tree" -> " tree_exited" 로 변경

 

반응형
반응형

<폭발 시 카마레 진동 효과>

- world씬에 camera2D노드 추가

- 카메라 스크립트 추가

<camera.gd>

<laser_ship.gd> 수정

<laser_enemy.gd>수정

<explosion.gd>수정

<붉은 화면 깜빡이기>

- 새로운 씬 생성하고 sprite노드를 추가하여 flash라고 이름을 바꿔 flash.tscn으로 저장한다.

- Texture에 rectangle.png파일을 지정하고

- Centered를 해제한 뒤, 화면 사이즈보다 약간 크게 확장한다.

- Modulate에 빨간색을 지정한다. 

- Z값을 15로 지정한다.

- 하위노드로 Merge from Scene > flare.tscn > anim노드를 추가한다.

- Make Sub-Resources Unique로 고유하게 변경한다.

- 재생 길이를 0.3으로 변경하고 마지막 프레임도 0.3 위치에 놓는다.

- 다시 0프레임에 위치시킨 후 스크립트를 추가한다.

 <flash.gd>

- 적용을 위해 ship.gd파일 수정

<ship.gd>

- flash.tscn을 미리 불러오기

- 아머가 하나씩 줄 때마다 flash씬을 실행(자식노드로 추가)

반응형
반응형

<폭발>

 

- 새로운 씬 생성

- sprite노드 추가 후 explosion 으로 변경

- Texture 지정

- Z 값을 5 정도로 상향 조정

- explosion에 하위노드로 Particles2D 노드 추가

- 이름을 p_smoke로 변경

- 각종 파라미터 적절히 변경

- Texture 를 클릭하여 smoke.png를 할당

 

- 추가 설정

- 추가 설정

- 추가 설정

- emmiting 기능으로 애니메이션 확인

- p_smoke 노드를 복사하여 p_flare노드 생성

- Texture에 flare.png파일을 할당하여 애니메이션 확인

- 노드 추가 > Merge from scene > flare.tscn 선택

- anim노드 선택

- 애니메이션이 영향받지 않도록 유니크하게 만들기

- length를 0.7초로 변경하고,

- 마지막 프레임을 0.7초 위치로 변경시킨다.

- explosion노드에 explosion.gd 스크립트를 추가

<ship.gd>에서 폭발 애니메이션 스크립트 추가 

<enemy.gd>스크립트 수정 (enemy.tscn)

- 소스코드는 ship.gd의 함수와 동일

- 충돌 시 폭발하는 부분도 동일하게 추가하는 것 주의

- ship에서 발사되는 레이저가 2개인 관계로, enemy와 충돌할 시 폭발이 2번 발생하는 오류가 있음

- 따라서 enemy가 폭발중일 때에는 처리하지 않도록 문구 추가 필요

반응형
반응형

<ship.gd> 수정

- 스크립트에 체력(armor) 변수를 설정

- "ship"그룹에 추가

- 체력이 0 이하로 가면 삭제되는 set_armor함수 추가

<enemy.gd> 수정

- 스크립트에 체력(armor) 변수를 설정

- "enemy"그룹에 추가

- 체력이 0 이하로 가면 삭제되는 set_armor함수 추가

- enemy_kamikaze.tscn의 Armor값은 2로 설정

- enemy_clever.tscn의 Armor값은 6으로 설정

<laser 수정>

- laser_ship.tscn을 불러와서 기존의 laser.gd스크립트를 제거

- 새로운 스크립트 laser_ship.gd 생성

- 속도를 -350으로 설정

<laser_ship.gd>

- "area_enter"이벤트 발생 시 "_on_area_enter"함수와 연결

- 접촉한 외부물체가 "enemy"이면 Armor를 -1 차감

- 플레어 생성

- 레이저 자체는 삭제됨(queue_free())

- 아직 enemy가 죽지 않음. laser_ship.tscn의 상위인 laser.tscn의 shape에 아무것도 지정되지 않음

- laser.tscn > shape에 RectangleShape2D 설정

<laser_enemy.gd>

- laser_enemy.tscn에서 기존의 스크립트 laser.gd 제거

- 새로운 스크립트 laser_enemy.gd 생성

- 기존의 laser_ship.gd의 내용을 복사해옴

- 충돌 감지 대상만 "enemy" -> "ship"으로 변경

- laser_enemy의 속도는 150으로 재설정

 

- 마지막으로 enemy.tscn에서

- enemy와 충돌했을 때에 ship의 armor를 -1 차감하고

- 충돌한 enemy는 사라지는 함수(_on_area_enter) 구현

반응형
반응형

<enemy_clever>

- Laser 씬을 상속하여 새로운 씬 생성

- New Inherited Scene... > laser.tscn 

- 노드 이름을 laser_enemy로 변경하고, laser_enemy.tscn으로 저장

- sprite에 enemy_laser.png 지정

- shape에 rectangleShape2D 지정 후 Edit

- Extents: (4.5, 7) 지정

- vis_notifier의 Rect값 지정(x:-4.5, y:-7, w:9, h:14)

- 속도 (0,150) 지정

- 아래방향으로 이동하는지 테스트

- 원점으로 복귀시켜 놓음

 

<enemy_clever>

- 상속으로 새로운 씬 생성 > enemy.tscn 선택

- 노드 이름을 enemy_clever로 변경

- 다른 이름으로 저장하기 > enemy_clever.tscn으로 저장

- sprite에 enemy_clever.png 지정

- shape에서 Make Unique 지정하여 다른 노드에 영향받지 않도록 함

- Position2D노드를 추가하여 cannon으로 이름 변경하고,

- Pos를 (0, 16) 지정

- 속도 50 지정

- 속도를 x:50, y:50 지정

- 기존의 스크립트 제거

- 새로운 스크립트 생성

- enemy_clever.gd

 

- spawner_enemy.gd 스크립트 수정

- enemy_kamikaze, enemy_clever를 미리 불러와 배열로 저장

- utils.choose함수로 랜덤하게 선택하여 생성

반응형
반응형

<플레어>

- Flare 씬 생성

- sprite 노드 생성 후 이름을 flare로 변경

- flare 첫번째 이미지를 지정해줌

- 애니메이션 노드 추가 후 이름을 anim으로 변경, fade_out 애니메이션 추가

- 0초에서 flare 스프라이트의 Opacity 1로 하여 키를 추가 (Modulate의 Opacity속성을 255)

- 0.1초에서 Opacity 0으로 하여 키를 추가 (Modulate의 Opacity속성을 0)

- length를 0.1초로 변경

- flare sprite노드에 스크립트 추가(flare.gd)

 

 

<flare.gd>

시그널 "finished"은 "animation_finished"로 변경

 

<레이저>

- Laser 씬 생성(enemy용, player용 공통), Area2D 노드를 추가 후 laser로 변경

- Sprite, CollisionShape2D, VisibilityNotifier2D 노드를 추가하고, 아래와 같이 이름을 변경해준다.

- 세부 설정은 추후 상속 노드에서 할 예정이므로 더이상의 설정은 진행하지 않는다.

- laser노드에 스크립트 추가

extends Area2D

export var velocity = Vector2()
const scn_flare = preload("res://scenes/flare.tscn")

func _ready():
	set_process(true)
	create_flare()
    
	yield(get_node("vis_notifier"), "screen_exited")
	queue_free()
	pass
    
func _process(delta):
	translate(velocity * delta)
	pass
    
func create_flare():
	var flare = scn_flare.instance()
	flare.set_global_position(get_global_position())
	utils.main_node.add_child(flare)
	pass

 

- 상속으로 Player의 laser씬 만들기

- laser_ship.tscn으로 저장

- sprite에는 laser_ship.png 지정

- shape에는 rectangle, extends (3,6)

- vis_notifier에는 Rect w:6, h:12, x:-3, y:-6 으로 설정

- y속도: 350으로 설정

- laser_ship노드를 화면 중앙에 놓고 잘 실행되는지 확인

- Debugger > Remote Inspector에 보면 해당 노드가 사라졌음을 확인할 수 있다.

- 확인 후 원점으로 되돌려놓는다.

 

<Ship에 레이저 발사 구현하기>

- ship 노드를 불러와서 하위에 Node2D (cannons로 변경) 추가

- cannons노드 하위에 position2D(left로 변경) 추가

- cannons > Node2D > Transform > Pos에 (-12, -8) 입력하여 위치 수정

- left를 복사하여 right노드로 변경

- Pos값을 (12, -8)로 변경

- ship.gd 수정

반응형
반응형

2 타입의 Enemy 생성

Area2D 노드를 추가하여 enemy로 변경

- colisionShape2D 추가 > RectangleShape2D > Extents (16,16) 설정

- enemy 스크립트 추가

- y 속도 100으로 설정

- 화면을 넘어가면 삭제되도록 수정

 

- 첫번째 enemy: enemy_kamikaze

- sprite에 enemy_kamikaze 이미지를 불러옴

- CollisionShape2D에서 Make Unique를 설정하고, 사이즈를 12,16으로 변경

- 속도를 350으로 설정

- enemy spawn

- 자주 사용하는 함수를 utils.gd로 묶어서 스크립트 수정

# script: utils

extends Node

var main_node setget , _get_main_node
var view_size setget , _get_view_size
var mouse_pos setget , _get_mouse_pos

func _ready():
	pass

func create_timer(wait_time):
	var timer = Timer.new()
	timer.set_wait_time(wait_time)
	timer.set_one_shot(true)
	timer.connect("timeout", timer, "queue_free")
	add_child(timer)
	timer.start()
	return timer
	pass

func choose(choises):
	randomize()
	var rand_index = randi() % choises.size()
	return choises[rand_index]
	pass

func find_node(node):
	return self.main_node.find_node(node)
	pass

func attach(src_node, src_signal, trg_node, trg_func):
	if typeof(src_node) == TYPE_STRING:
		src_node = find_node(src_node)
	
	if typeof(trg_node) == TYPE_STRING:
		trg_node = find_node(trg_node)
	
	if src_node != null and trg_node != null:
		src_node.connect(src_signal, trg_node, trg_func)
	pass

func remote_call(src_node, method, arg0 = null, arg1 = null):
	src_node = find_node(src_node)
	
	if src_node and src_node.has_method(method):
		if arg0 and arg1:
			return src_node.call(method, arg0, arg1)
		if arg0:
			return src_node.call(method, arg0)
		
		return src_node.call(method)
	pass

func _get_mouse_pos():
	return get_viewport().get_mouse_pos()
	pass

func _get_main_node():
	var root = get_tree().get_root()
	return root.get_child( root.get_child_count()-1 )
	pass

func _get_view_size():
	return get_tree().get_root().get_visible_rect().size
	pass

- Project Settings > Autoload에 utils.gd 추가

- 수정된 함수 (계속 랜덤시기에 생성하는 부분 추가 while, yield)

- world씬에 추가

반응형
반응형

마우스 따라가는 동작 스크립팅

 

(수정..'2024.01.09) godot 버전 상승으로 get_pos()함수는 사용되지 않습니다. 그 외의 변경사항은 아래와 같습니다.

- get_pos() -->  get_global_pos()

- set_pos() -->  set_position()

- view_size.width --> view_size.x

extends Area2D 

func _ready():
	set_process(true)
	pass # Replace with function body.

func _process(delta):	
	var motion = (get_global_mouse_position().x - get_global_position().x) * 0.2
	translate(Vector2(motion, 0))
	
	var view_size = get_viewport_rect().size
	var pos = get_global_position()
	pos.x = clamp(pos.x, 0+16, view_size.x-16)
	set_position(pos)	
	pass

 

흐르는 별 배경화면 만들기

- 빈 노드를 추가하여 stars로 이름 변경

- sprite노드 추가하여 star_far_0로 이름 변경

- 이미지를 불러오고 Centered on을 해제

- star_far_0에 star.gd스크립트 붙이기

- 배경 이미지의 속도를 50으로 설정

- 배경을 다시 복사하여 위치를 0,0으로

- 배경을 다시 복사하여 위치를 0,+180으로

- 지금까지 만든것을 빈 노드를 하나 더 추가하여 stars_far로 이름짓고, 그 하위노드로 옮긴다.

- 이걸 통째로 복사하여 stars_close를 만들고 stars_close이미지로 바꿔 넣는다.

- world 씬에 stars씬을 추가하고, 위치를 상단으로 조정하여 화면 뒤쪽에 보이도록 한다.

- star_close의 Z값을 10정도로 하여, 우주선보다 위에 보이도록 설정한다.

 

반응형

+ Recent posts