godot导出android原理,导出 — Godot Engine (latest) 简体中文文档

准备项目¶

In Dodge the Creeps, we used keyboard controls to move the player's character.

This is fine if your game is being played on a PC platform, but on a phone

or tablet, you need to support touchscreen input. Because a click event can

be treated the same as a touch event, we'll convert the game to a click-and-move

input style.

By default, Godot emulates mouse input from touch input. That means that if

anything is coded to happen on a mouse event, touch will trigger it as well.

Godot can also emulate touch input from mouse clicks, which we will need to be

able to keep playing our game on our computer after we switch to touch input.

In Project > Project Settings, under Input Devices > Pointing, enable

Emulate Touch From Mouse.

bfe2f2b0f76513eccb28a09e8aa85c6e.png

We also want to ensure that the game scales consistently on different-sized screens,

so in the project settings go to Display, then click on Window. In the Stretch

options, set Mode to 2d" and Aspect to keep.

Since we are already in the Window settings, we should also set under Handheld

the Orientation to portrait.

edbe16d848b110a55945993e56339c31.png

接下来,我们需要修改 Player.gd 脚本来改变输入方式。我们将移除键盘输入并使 Player 移动到触摸(或点击)事件设置的 目标。

这是 Player 的完整脚本,注释指出了我们做了哪些改变:

GDScript

C#

extends Area2D

signal hit

export var speed = 400

var screen_size

# Add this variable to hold the clicked position.

var target = Vector2()

func _ready():

hide()

screen_size = get_viewport_rect().size

func start(pos):

position = pos

# Initial target is the start position.

target = pos

show()

$CollisionShape2D.disabled = false

# Change the target whenever a touch event happens.

func _input(event):

if event is InputEventScreenTouch and event.pressed:

target = event.position

func _process(delta):

var velocity = Vector2()

# Move towards the target and stop when close.

if position.distance_to(target) > 10:

velocity = target - position

# Remove keyboard controls.

# if Input.is_action_pressed("ui_right"):

# velocity.x += 1

# if Input.is_action_pressed("ui_left"):

# velocity.x -= 1

# if Input.is_action_pressed("ui_down"):

# velocity.y += 1

# if Input.is_action_pressed("ui_up"):

# velocity.y -= 1

if velocity.length() > 0:

velocity = velocity.normalized() * speed

$AnimatedSprite.play()

else:

$AnimatedSprite.stop()

position += velocity * delta

# We still need to clamp the player's position here because on devices that don't

# match your game's aspect ratio, Godot will try to maintain it as much as possible

# by creating black borders, if necessary.

# Without clamp(), the player would be able to move under those borders.

position.x = clamp(position.x, 0, screen_size.x)

position.y = clamp(position.y, 0, screen_size.y)

if velocity.x != 0:

$AnimatedSprite.animation = "walk"

$AnimatedSprite.flip_v = false

$AnimatedSprite.flip_h = velocity.x < 0

elif velocity.y != 0:

$AnimatedSprite.animation = "up"

$AnimatedSprite.flip_v = velocity.y > 0

func _on_Player_body_entered( body ):

hide()

emit_signal("hit")

$CollisionShape2D.set_deferred("disabled", true)

using Godot;

using System;

public class Player : Area2D

{

[Signal]

public delegate void Hit();

[Export]

public int Speed = 400;

private Vector2 _screenSize;

// Add this variable to hold the clicked position.

private Vector2 _target;

public override void _Ready()

{

Hide();

_screenSize = GetViewport().Size;

}

public void Start(Vector2 pos)

{

Position = pos;

// Initial target us the start position.

_target = pos;

Show();

GetNode("CollisionShape2D").Disabled = false;

}

// Change the target whenever a touch event happens.

public override void _Input(InputEvent @event)

{

if (@event is InputEventScreenTouch eventMouseButton && eventMouseButton.Pressed)

{

_target = (@event as InputEventScreenTouch).Position;

}

}

public override void _Process(float delta)

{

var velocity = new Vector2();

// Move towards the target and stop when close.

if (Position.DistanceTo(_target) > 10)

{

velocity = _target - Position;

}

// Remove keyboard controls.

//if (Input.IsActionPressed("ui_right"))

//{

// velocity.x += 1;

//}

//if (Input.IsActionPressed("ui_left"))

//{

// velocity.x -= 1;

//}

//if (Input.IsActionPressed("ui_down"))

//{

// velocity.y += 1;

//}

//if (Input.IsActionPressed("ui_up"))

//{

// velocity.y -= 1;

//}

var animatedSprite = GetNode("AnimatedSprite");

if (velocity.Length() > 0)

{

velocity = velocity.Normalized() * Speed;

animatedSprite.Play();

}

else

{

animatedSprite.Stop();

}

Position += velocity * delta;

// We still need to clamp the player's position here because on devices that don't

// match your game's aspect ratio, Godot will try to maintain it as much as possible

// by creating black borders, if necessary.

// Without clamp(), the player would be able to move under those borders.

Position = new Vector2(

x: Mathf.Clamp(Position.x, 0, _screenSize.x),

y: Mathf.Clamp(Position.y, 0, _screenSize.y)

);

if (velocity.x != 0)

{

animatedSprite.Animation = "walk";

animatedSprite.FlipV = false;

animatedSprite.FlipH = velocity.x < 0;

}

else if(velocity.y != 0)

{

animatedSprite.Animation = "up";

animatedSprite.FlipV = velocity.y > 0;

}

}

public void OnPlayerBodyEntered(PhysicsBody2D body)

{

Hide(); // Player disappears after being hit.

EmitSignal("Hit");

GetNode("CollisionShape2D").SetDeferred("disabled", true);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值