Игровой движок: Параметр класса

#c #game-engine

Вопрос:

Я работаю в университете над игровым движком, и нам нужно было написать агностический код. Они сказали нам сделать все остальное самостоятельно, и я на правильном пути, однако, когда я пытаюсь передать параметры функции, она говорит, что не передает аргументы? Я считаю, что это связано с параметром класса, который у меня там есть. Я веду себя как идиот или ?

Ошибка: (без компоновки буфера) аргументы функции не совпадают. Или с помощью кода, который вы можете видеть, написано «Ожидаемое выражение».

Пожалуйста, помогите!

Буфер вершин

 /* file OpenGLVertexBuffer.cpp */ #include "engine_pch.h" #include lt;glad/glad.hgt; #include "include/independent/platform/OpenGL/OpenGLVertexBuffer.h"   namespace Engine {  void BufferLayout::addElement(BufferElement element)  {  m_elements.push_back(element);  calcStrideAndOffset();  }   void BufferLayout::calcStrideAndOffset()  {  uint32_t l_offset = 0;   for (autoamp; element : m_elements)  {  element.m_offset = l_offset;  l_offset  = element.m_size;  }   m_stride = l_offset;  }    OpenGLVertexBuffer::OpenGLVertexBuffer(void * vertices, uint32_t size, BufferLayout layout) : m_layout(layout)  {  glCreateBuffers(1, amp;m_OpenGL_ID);  glBindBuffer(GL_ARRAY_BUFFER, m_OpenGL_ID);  glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_DYNAMIC_DRAW);  }   OpenGLVertexBuffer::~OpenGLVertexBuffer()  {  glDeleteBuffers(1, amp;m_OpenGL_ID);   }   void OpenGLVertexBuffer::edit(void * vertices, uint32_t size, uint32_t offset)  {  glBindBuffer(GL_ARRAY_BUFFER, m_OpenGL_ID);  glBufferSubData(GL_ARRAY_BUFFER, offset, size, vertices);  }  }  

API рендеринга

 /* file renderAPI.cpp */  #include "engine_pch.h"  #include "rendering/RenderAPI.h" #include "rendering/indexBuffer.h" #include "rendering/vertexBuffer.h"  #include "platform/OpenGL/OpenGLIndexBuffer.h" #include "platform/OpenGL/OpenGLVertexBuffer.h"  #include "systems/log.h"  namespace Engine {  RenderAPI::API Engine::RenderAPI::s_API = RenderAPI::API::OpenGL;   IndexBuffer * IndexBuffer::create(uint32_t * indices, uint32_t count)  {  switch (RenderAPI::getAPI())  {  case RenderAPI::API::None:  Log::error("No supported Rendering API");   case RenderAPI::API::OpenGL:  return new OpenGLIndexBuffer(indices, count);   case RenderAPI::API::Direct3D:  Log::error("Direct3D not currently Supported!");   case RenderAPI::API::Vulkan:  Log::error("Vulkan not currently Supported!");    }    }   VertexBuffer * VertexBuffer::edit(void* vertices, uint32_t size, uint32_t offset)  {  switch (RenderAPI::getAPI())  {  case RenderAPI::API::None:  Log::error("No Supported Rendering API");   case RenderAPI::API::OpenGL:  //return new OpenGLVertexBuffer(vertices, sizeof(size), offset);  new OpenGLVertexBuffer(vertices, size, lt;BufferLayoutgt; offset);  }  }  }  

Ответ №1:

Вызов «нового OpenGLVertexBuffer» ожидает трех аргументов

  • пустота*
  • uint32_t
  • a BufferLayout

Вы проходите

  • вершины, пустота* (хорошо)
  • sizeof(размер) — неверно. Он вычисляет размер переменной(!) size , который равен 4 (uint32 всегда 32 бита/4 байта). Таким образом, вы передаете константу 4 в качестве второго параметра. Не то, чего ты хочешь.
  • смещение — опять неправильно. Ожидается, что третий параметр будет иметь тип BufferLayout . Вы пытаетесь пройти а uint32_t , где вы должны были пройти а BufferLayout .

В общем, вам нужно прочитать о типах (почему uint32_t не a BufferLayout ), функциях (параметрах), конструкторах.

Кроме того break , в вашем коммутаторе отсутствуют операторы. Изучите это switch утверждение, чтобы понять, что я имею в виду.

И вы используете указатели (возврат new something ). Если вас этому учат в университете, то курс, который вы проходите, очень устарел. Как новичку, вам НИКОГДА не придется использовать указатели, НИКОГДА НЕ работайте с new ними . Вместо этого вы могли бы использовать стандартные способы C std::shared_ptrlt;VertexBuffergt; , используя std::make_shared... вместо new . Проблема с указателями заключается в том, что с ними слишком легко неправильно обращаться. Вы забудете позвонить delete в нужное место(ы), что приведет к утечке памяти. Или вы будете звонить delete в неправильных местах, что приведет к «использованию после бесплатного» или «вызову удаления для удаленного указателя». shared_ptr и подобные занятия снимут с вас бремя и сделают всю работу за вас.

Потребность в указателях значительно уменьшилась в современном C .

Наконец: Когда вы публикуете вопрос, пожалуйста, укажите a: точную ошибку компилятора b: точное место, где возникает эта ошибка.

Вы могли бы, например, включить // ERROR MESSAGE HERE комментарий в свой пример кода. Оба пункта повысят вероятность того, что кто-то ответит на ваши вопросы.

Комментарии:

1. Спасибо! У меня действительно есть базовое понимание, но мне нужно больше практиковаться с ними, чтобы по-настоящему разобраться в этом.