这里是GML的完全新手。我目前正在开发一款NVL视觉小说(使用GameMaker而不是Ren'Py这类VN引擎,因为我计划在其中加入其他游戏元素,如果用那个引擎做的话会非常痛苦),虽然我已经写了一些代码让对话能显示出来,但每当一行文本太长时,它不会自动换行,而是重叠在一起。
我猜最好添加一个类似text_height的设置,但我不确定如何有效地将其整合到我现有的代码中。以下是最重要的部分代码。任何帮助都将不胜感激!另外,如果我的代码展示方式不够高效,也请见谅,我不常逛编程相关的子版块。
创建事件
confirm_key = vk_space || vk_enter; /// 输入
max_input_delay = 5;
input_delay = max_input_delay;
/// 定位
margin = 16;
padding = 8;
width = display_get_gui_width();
height = display_get_gui_height();
x = (display_get_gui_width() - width) / 2;
y = (display_get_gui_height() - height) / 2;
confirm_key = vk_space || vk_enter; /// 输入
max_input_delay = 5;
input_delay = max_input_delay;
/// 定位
margin = 16;
padding = 8;
width = display_get_gui_width();
height = display_get_gui_height();
x = (display_get_gui_width() - width) / 2;
y = (display_get_gui_height() - height) / 2;
/// 方法
set_topic = function(topic) {
actions = global.topics[$ topic];
current_action = -1;
next();
}
next = function() {
current_action++;
if (current_action >= array_length(actions)) {
instance_destroy();
}
else {
actions[current_action].act(id);
}
}
set_text = function(newtext) {
text = newtext;
text_length = string_length(newtext);
text_progress = 0;
}
绘制GUI事件
draw_sprite_stretched(sprite_index, 0, x, y, width, height);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_font(text_font);
draw_set_color(text_color);
type(x + text_x, y + text_y, text, text_progress, text_width);
脚本(我直觉觉得应该关注这里,但再次不确定。)
function startDialogue(topic) {
if (instance_exists(obj_textbox))
return;
var inst = instance_create_depth(x, y, -999, obj_textbox);
inst.set_topic(topic);
}
function type(x, y, text, progress, width) {
var draw_x = 0;
var draw_y = 0;
for (var i = 1; i <= progress; i++) {
var char = string_char_at(text, i)
if (char == "\n") {
draw_x = 0;
draw_y += string_height("A");
}
else if (char == " ") {
draw_x += string_width(char);
var word_width = 0;
for (var ii = i + 1; ii <= string_length(text); ii++) {
var word_char = string_char_at(text, ii);
if (word_char == "\n" || word_char == " ") {
break;}
word_width += string_width(word_char);
if (draw_x + word_width > width) {
draw_x = 0;
draw_y = string_height("A");
break;}
}
}
else {
draw_text(x + draw_x, y + draw_y, char);
draw_x += string_width(char);
}
}
}
评论 (0)