Nim和SDL2与Rect有关

时间:2015-06-13 16:25:12

标签: sdl sdl-2 nim nimrod

我有以下Nim +官方libsdl2 wrapper代码

import sdl2

discard sdl2.init(INIT_EVERYTHING)

let
  window = createWindow("Tic-Tac-Toe", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 390, SDL_WINDOW_SHOWN)
  renderer = createRenderer(window, -1, Renderer_Accelerated or Renderer_PresentVsync or Renderer_TargetTexture)

proc loadImage(file: string): TexturePtr =
  let loadedImage = loadBMP(file)
  let texture = createTextureFromSurface(renderer, loadedImage)
  freeSurface(loadedImage)
  return texture

proc applySurface(x: cint, y: cint, tex: TexturePtr, rend: RendererPtr) =
  var pos: Rect
  pos.x = x
  pos.y = y
  queryTexture(tex, nil, nil, pos.w, pos.h)
  copy(rend, tex, nil, pos)

let
  background = loadImage("resources/bg.bmp")

clear(renderer)
applySurface(0, 0, background, renderer)
present(renderer)

var
  evt = sdl2.defaultEvent
  runGame = true

while runGame:
  while pollEvent(evt):
    if evt.kind == QuitEvent:
      runGame = false
      break

destroy window

编译期间出错:

source.nim(19, 15) Error: type mismatch: got (TexturePtr, nil, nil, cint, cint)
but expected one of: 
sdl2.queryTexture(texture: TexturePtr, format: ptr uint32, access: ptr cint, w: ptr cint, h: ptr cint)

第20行相同:

source.nim(20, 7) Error: type mismatch: got (RendererPtr, TexturePtr, nil, Rect)
but expected one of: 
system.copy(s: string, first: int)
system.copy(s: string, first: int, last: int)
sdl2.copy(renderer: RendererPtr, texture: TexturePtr, srcrect: ptr Rect, dstrect: ptr Rect)

如果用复制()中的 nil 替换 pos 并注释 queryTexture(),一切都会好起来的。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:3)

您的问题是,procs需要ptr各自的数据类型,而不是数据本身。例如,ptr cint是必需的,但您传递的是普通cint。您需要做的是获取addr的{​​{1}}来获得cint。例如:

ptr cint

注意,为了"取地址"您需要var w = pos.w var h = pos.h queryTexture(tex, nil, nil, w.addr, h.addr) 类型的变量(有关详细信息,请参阅this question)。由于varposvarpos.w.addr也应该有效。同样,您必须使用pos.h.addr作为pos.addr的最后一个参数。