Zireael |
Отправлено: 09 Декабря, 2023 - 23:44:25
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Могу ли использовать код написанный на C или C++ в Кибор?
Нет. Можно переписать используя синтаксис кибор. Но, не всё можно сделать и не всегда удобно.
Цитата: Я думал о Dll, но не до конца уверен что это сработает.
В длл можно любой код выполнить.
Цитата: если это будет Dll, смогу ли я объявлять новые значения переменным находящимся внутри dll, если да, то как?
Код длл C++:
CODE:#include "pch.h"
int X = 0;
extern "C" __declspec(dllexport)void SetValue(int NewValue)
{
X = NewValue;
}
extern "C" __declspec(dllexport)int GetValue()
{
return X;
}
Код кибор:
CODE:external(VOID, "SetValue", "SetValue", "MyDllKib.dll");
external(INT, "GetValue", "GetValue", "yDllKib.dll");
SetValue(5);
messagebox(GetValue());
SetValue(99);
messagebox(GetValue()); |
|
|
petyanka |
Отправлено: 10 Декабря, 2023 - 00:05:30
|
Участник
Покинул форум
Сообщений всего: 92
Дата рег-ции: Сент. 2014
Репутация: 1
|
Zireael пишет: Цитата: Могу ли использовать код написанный на C или C++ в Кибор?
Нет. Можно переписать используя синтаксис кибор. Но, не всё можно сделать и не всегда удобно.
Цитата: Я думал о Dll, но не до конца уверен что это сработает.
В длл можно любой код выполнить.
Цитата: если это будет Dll, смогу ли я объявлять новые значения переменным находящимся внутри dll, если да, то как?
Код длл C++:
CODE:#include "pch.h"
int X = 0;
extern "C" __declspec(dllexport)void SetValue(int NewValue)
{
X = NewValue;
}
extern "C" __declspec(dllexport)int GetValue()
{
return X;
}
Код кибор:
CODE:external(VOID, "SetValue", "SetValue", "MyDllKib.dll");
external(INT, "GetValue", "GetValue", "yDllKib.dll");
SetValue(5);
messagebox(GetValue());
SetValue(99);
messagebox(GetValue());
Спасибо! Буду пробовать. |
|
|
petyanka |
Отправлено: 11 Декабря, 2023 - 23:45:12
|
Участник
Покинул форум
Сообщений всего: 92
Дата рег-ции: Сент. 2014
Репутация: 1
|
Я чего-то явно не понимаю, написал DLL, Вот часть кода:
С++ (Отобразить)
//Dll принимает string и присваивает его в структуру
extern "C" __declspec(dllexport) void Set_New_Text(std::string New_Text) {
ST s;
s.Text_pars = New_Text;
s.main_parse(s.x1, s.y1, s.x2, s.y2, s.azimuth, s.Text_pars);
}
//Вот и сама структура
struct ST {
std::string Text_pars; // Добавление `Text_pars` как члена структуры
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
int azimuth = 0;
void main_parse(int& x1, int& y1, int& x2, int& y2, int& azimuth, std::string& Text_pars) {
//Text_pars = New_Text;
parseText(Text_pars, x1, y1, x2, y2, azimuth);
}
/*
Далее я беру значения из функции, которые получились после ее выполнения.
Превращаю их в string и складываю в формате x1,y1,x2,y2,azimuth, после чего код в киборе делает запрос
и принимает значения в string для дальней работы бота.
*/
extern "C" __declspec(dllexport) std:: string Get_New_Text() {
ST s;
s.main_parse(s.x1, s.y1, s.x2, s.y2, s.azimuth, s.Text_pars);
std::string Text_Out=std::to_string(s.x1) + ',' + std::to_string(s.y1) + ',' + std::to_string(s.x2) + ',' +
std::to_string(s.y2) + ',' + std::to_string(s.azimuth) + ',' + s.Text_pars;;
return Text_Out;
}
Но как только я пытаюсь присвоить новые значения для s.Text_pars, кибор просто закрывается, без каких либо ошибок. Что же я делаю не так?
Код кибора (Отобразить)
external(VOID, "Set_New_Text", "Set_New_Text", "test.dll" );
Set_New_Text(1000,1000,992,976,0);
//external(STRING, "Get_New_Text", "Get_New_Text", "test.dll" );
//messagebox(Get_New_Text());
(Отредактировано автором: 11 Декабря, 2023 - 23:46:08) |
|
|
Zireael |
Отправлено: 12 Декабря, 2023 - 01:32:02
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Лучше напишите что вы хотите сделать.
Пример передачи в функцию массива int и строки:
C++ (Отобразить)CODE:#include "pch.h"
#include <stdlib.h>
extern "C" __declspec(dllexport) void MyFunc(int* arr, int SizeArr)
{
wchar_t str[99];
for (int i = 0; i < SizeArr; i++)
{
_itow_s(arr[i], str, 99, 10);
MessageBox(0, str, L"Kibor", MB_OK);
}
}
extern "C" __declspec(dllexport) void MyFunc2(char* Text)
{
MessageBoxA(0, Text, "Kibor", MB_OK);
}
Kibor (Отобразить)CODE:external(VOID, "MyFunc", "MyFunc", "MyDllKib.dll");
external(VOID, "MyFunc2", "MyFunc2", "MyDllKib.dll");
int array[5] = {10, 20, 30, 40, 50};
MyFunc(address(#array[0]), 3);
MyFunc2("Hello, Привет");
char Text[99];
strcpy(#Text[0], "Какой-то текст");
MyFunc2(address(#Text[0])); (Отредактировано автором: 12 Декабря, 2023 - 01:33:53) |
|
|
petyanka |
Отправлено: 12 Декабря, 2023 - 10:14:20
|
Участник
Покинул форум
Сообщений всего: 92
Дата рег-ции: Сент. 2014
Репутация: 1
|
Zireael пишет: Лучше напишите что вы хотите сделать.
Если в кратце, то в игре есть:
x1,y1 - координаты персонажа
x2,y2 - координаты точки куда мне нужно бежать
azimuth - азимут куда я смотрю
Что я хочу сделать?
Написать Dll, которая будет универсальной для любой игры, где есть эти значения
Как я это реализовал? Вот код
C++ (Отобразить)Скрытый текст:Для просмотра Вам необходимо авторизоваться и оставить не менее 50 сообщений
Если в кратце, Dll принимает текст в string от кибора, дальше разбирает этот текст на переменные в формате x1,y1,x2,y2,azimuth . Потом вызываются функции, которые считают угол поворота камеры в игре.
На выходе, кибор получает x1,y1,x2,y2,azimuth,angle_deg (x1,y1,x2,y2 - не обязательно получать в финальной версии, это скорее для проверки что длл исправно работает) |
|
|
Zireael |
Отправлено: 12 Декабря, 2023 - 11:21:35
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
А зачем передавать параметры строкой и потом разбирать её?
Так не проще?:
C++ (Отобразить)CODE:#include "pch.h"
#include <iostream>
using namespace std;
double M_PI = 3.1415926535;
extern "C" __declspec(dllexport) int Get_Angle(int x1, int y1, int x2, int y2, int azimuth)
{
// Вычисляем азимут в радианах
double azimuth_rad = azimuth * M_PI / 180.0;
// Вычисляем угол между вектором и азимутом
int dx = x2 - x1;
int dy = y2 - y1;
int angle_rad = atan2(dy, dx) - azimuth_rad;
// Преобразуем угол в градусы
int angle_deg = angle_rad * 180.0 / M_PI;
// Приводим угол к диапазону от -180 до 180 градусов
if (angle_deg > 180.0) angle_deg -= 360.0;
else if (angle_deg < -180.0) angle_deg += 360.0;
// это можно удалить
char buf[999];
snprintf(buf, sizeof(buf), "%d%c %d%c %d%c %d%c %d", x1, ',', y1, ',', x2, ',', y2, ',', azimuth);
MessageBoxA(0, buf, "Kibor", MB_OK);
/////
return angle_deg;
}
Kibor (Отобразить)CODE:external(INT, "Get_Angle", "Get_Angle", "MyDllKib.dll");
int result = Get_Angle(100, 200, 300, 400, 350);
messagebox(result); |
|
|
sedoi |
Отправлено: 12 Декабря, 2023 - 21:17:33
|
Наблюдатель
Покинул форум
Сообщений всего: 47
Дата рег-ции: Апр. 2016
Репутация: 1
|
Zireael пишет: А зачем передавать параметры строкой и потом разбирать её?
Так не проще?:
C++ (Отобразить)CODE:#include "pch.h"
#include <iostream>
using namespace std;
double M_PI = 3.1415926535;
extern "C" __declspec(dllexport) int Get_Angle(int x1, int y1, int x2, int y2, int azimuth)
{
// Вычисляем азимут в радианах
double azimuth_rad = azimuth * M_PI / 180.0;
// Вычисляем угол между вектором и азимутом
int dx = x2 - x1;
int dy = y2 - y1;
int angle_rad = atan2(dy, dx) - azimuth_rad;
// Преобразуем угол в градусы
int angle_deg = angle_rad * 180.0 / M_PI;
// Приводим угол к диапазону от -180 до 180 градусов
if (angle_deg > 180.0) angle_deg -= 360.0;
else if (angle_deg < -180.0) angle_deg += 360.0;
// это можно удалить
char buf[999];
snprintf(buf, sizeof(buf), "%d%c %d%c %d%c %d%c %d", x1, ',', y1, ',', x2, ',', y2, ',', azimuth);
MessageBoxA(0, buf, "Kibor", MB_OK);
/////
return angle_deg;
}
Kibor (Отобразить)CODE:external(INT, "Get_Angle", "Get_Angle", "MyDllKib.dll");
int result = Get_Angle(100, 200, 300, 400, 350);
messagebox(result);
Добрый вечер, а как её использовать? создал текстовый документ вставил этот код в него, назвал MyDllKib и сменил расширение на dll закинул рядом с кибором в папку ,в киборе ввёл вызов функций те что ниже описаны. пишет что MyDllKib.dll не подключен, что я не так сделал? |
|
|
|