簡體   English   中英

如何在 Conrod 中正確定位東西

[英]How do I position things properly in Conrod

我使用的嘗試寫代碼連桿與winit / glium后端。 Conrod 是 Rust 的中間模式圖形用戶界面庫,而 wininit 提供事件模型和 OpenGL 綁定。

我的代碼使用 (row,col) 在屏幕上繪制一個值網格,即 (0,0) 處的“text1”、(0,0) 處的“text2”、(1,0)、(0,1) 處的“text3”等。其中 (row,col) 被轉換為絕對 (x,y) 坐標。

基本流程是這樣的:

  1. 對於我想呈現為文本的每個值
  2. 計算值的列/行,即(idx % num_cols, idx / num_cols)
  3. 從列和行計算 x 和 y。 即(列 * 寬度,行 * 高度)。
  4. 在 (x, y) 創建一個 widget::Text 包含值

下面以稍微簡化的形式顯示了執行此操作的代碼。 整個文件在這里在線。

這應該是實現的簡單代碼,但是當我運行它時,文本框不是從 x=0, y=0 繪制的,而是從兩個軸上的視圖中心的某處但不完全偏移。

據我所知,這不應該發生,因為我明確設置了絕對位置並確認坐標正確。 所以我希望它們從屏幕的左上角渲染。 我不明白是什么導致了偏移。

有任何想法嗎?

計算位置的代碼是這樣的:

fn draw_ui(ui: &mut Ui, model: &mut UiModel) {
    let ui = &mut ui.set_widgets();

    // Canvas is the backdrop to the view
    widget::Canvas::new()
        .color(BACKGROUND_COLOUR)
        .set(model.static_ids.canvas, ui);

    // Create text widgets for each value
    let state = model.session_state.read().unwrap();

    // Create / update the widgets
    if state.values.is_empty() {
        // ... removed
    } else {
        let num_cols: usize = 2;

        state.values.iter().enumerate().for_each(|(i, v)| {
            // Create / update the cell and its state
            let (node_id, value) = v;
            if let Some(id) = model.value_ids.get(node_id) {
                let (col, row) = (i % num_cols, i / num_cols);
                let valid = value.is_valid();
                let value = if let Some(ref value) = value.value {
                    value.to_string()
                } else {
                    "None".to_string()
                };
                // Turn the value into a string to render it
                let (x, y) = (col as f64 * (CELL_WIDTH + PADDING), row as f64 * (CELL_HEIGHT + PADDING));
                value_widget(&value, valid, x, y, CELL_WIDTH, CELL_HEIGHT, model.static_ids.canvas)
                    .set(*id, ui);
            }
        });
    }
}

fn value_widget(value: &str, valid: bool, x: f64, y: f64, w: f64, h: f64, canvas_id: conrod::widget::Id) -> widget::Text {
    let color = if valid { GOOD_COLOUR } else { BAD_COLOUR };
    widget::Text::new(value)
        .x_y(x, y)
        .w(w).h(h)
        .color(color)
}

我認為0,0位置在窗口的中心。 您看到的輕微偏移來自指定文本框角的文本框位置。 要在窗口的左上角得到一些東西,你會想要做一些類似x_position - 0.5 * window_width + x_margin (類似於 y)的x_position - 0.5 * window_width + x_margin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM