Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 19.09.2006, 16:36   #1
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
пример

Помогите плиз

в Блитце есть тип
Type a
Field x
Fiels y
Fiels z
End Type

Скажите как мне передать в ДЛЛ этот тип, в ДЛЛке допустим назначить новые значения поля объектам этого типа и вернуть все в блитц

Или например:
в блитце вызываем функцию из ДЛЛ
DistanceCamera(PosCamX,PosCamY,PosCamZ),
которая определяет нужно ли включать в тип и передавать в блитц данные об объектах Type'а а
и только полученные объекты рендерить

Если не трудно
объясните на примере.. в коде...(BLITZ3D, c++)

ДЛЛ хочу писать на с++

заранее спасибки за помощь...
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 17:02   #2
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: пример

Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно
__________________
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 17:10   #3
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

Сообщение от tormoz
Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно
подскажи как... ну пример функции на с++ что-ли, я так быстрее пойму... плиз....
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 17:14   #4
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: пример

Visual Studio:
Создаешь новый проект Win32 Dynamic-Link Library. Проект долджен быть пустым. После создания добавляешь cpp файл. В нем пишешь:
[highlight=cpp]
#define BLITZDECL extern "C" _declspec(dllexport)

struct list {
int a;
float b;
};

BLITZDECL void _stdcall DLLFunction(list* var)
{
var->a = var->a + 10;
var->b = var->b - 0.6f;
}
[/highlight]

BlitzBasic:
[highlight=blitzbasic]
Type TList
Field int_val%
Field float_val#
End Type

var.TList = New TList

var\int_val = 5
var\float_val = 7.3

Print var\int_val
Print var\float_val
Print

WaitKey()

DLLFunction(var)
Print var\int_val
Print var\float_val
Print

WaitKey()

Delete Each TList

End
[/highlight]

decls-файл:
.lib "dll.dll"

DLLFunction(void*):"_DLLFunction@4"
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 17:46   #5
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

спасибо... понял...но вытекает следующий вопрос...

получается список типа Tlist состоит из одного элемента, значение полей которого мы и меняем в длл...правильно...

а как сделать так чтобы длл возвращала определенное кол-во элементов списка типа Tlist
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?

мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 18:53   #6
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: пример

Сообщение от GoodWin
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?

мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?
Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.

Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 22:00   #7
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

Сообщение от alcoSHoLiK
Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.

Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.
т.е. перебрать список типа из 2000-10000 элементов...сравнить и двадцать элементов передать в длл для того чтобы поменять значение полей?

я то думал возможно наоборот в дллке получить из базы данных список, прогнать через условие и элементы, удовлетворящие условию, послать в блитц...
а так, придется сначала через длл определять кол-во элементов а уже потом в цикле из длл работать с полями.... криво как-то
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 22:26   #8
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: пример

Возможно все, если четко сформулировать задачу.

Если ты хочешь в Блиц послать только 20 элементов, то кто тебе мешает сделать это следующим образом:
[highlight=blitzbasic]
CallDllFunction() ;в этот момент происходит работа дллки с БД
...
while DllResult()
var.TList = New TList
DLLFunction(var)
wend
[/highlight]

Суть в том, что дллка подготавливает всю необходимую информацию. Допустим в результате вызова CallDllFunction() произошло считывание из БД, выборка результатов и занесение их в массив определенного пользователем типа.
list* data[20];
Необходимо создать переменную, которая будет подсчитывать количество найденных элементов, отвечающих заданному требованию. В конце обработки в это переменной будет хранится число 20.
[highlight=cpp]
int result_num=0;
[/highlight]

Функция DllResult() возвращает значение result_num.
[highlight=cpp]
int DllResult() { return result_num; }
[/highlight]

А сама DLLFunction работает с текущим элементом.
void DLLFunction(list* var)
{
   result_num--;
   var->a = data[result_num]->a;
   var->b = data[result_num]->b;
   //...
}
Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.
(Offline)
 
Ответить с цитированием
Старый 19.09.2006, 22:49   #9
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

Сообщение от alcoSHoLiK
Возможно все, если четко сформулировать задачу.

Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.
А как с ней работать, если не тудно объясни....
(Offline)
 
Ответить с цитированием
Старый 20.09.2006, 01:27   #10
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: пример

В MSDN ищи описания для: 1) malloc, realloc, free для С и 2) new, new[], delete, delete[] для C++.
(Offline)
 
Ответить с цитированием
Старый 03.11.2006, 20:46   #11
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

Люди, помогите плиз....
Вот код...

Блитц
Const MAX%=10
Type Part
 Field x
 Field y
End Type 
Type EM
 Field count%
 Field s.Part[MAX%]
End Type
p.EM=New EM
p\count=10
Print "p\count-"+p\count
For i=1 To 10
 p\s.Part[i]=New Part
 p\s.Part[i]\x=Rand(100)
 Print "p\s.Part["+I+"]\x -"+p\s.Part[i]\x
 p\s.Part[i]\y=Rand(100)
 Print "p\s.Part["+I+"]\y -"+p\s.Part[i]\y
Next
WaitKey()
c.EM =Last EM
m=MilliSecs()
 For a=1 To 1000000
  For i=1 To 10
   c\s.Part[i]\x=1
   c\s.Part[i]\y=2
  Next
 Next
m=MilliSecs()-m
Print "M="+m
WaitKey()
m=MilliSecs()
 Update(c)
m=MilliSecs()-m
Print "M="+m
WaitKey()
Delete Each Part
Delete Each EM
End
MSVC++ (DLL)
#define B3DDLL extern "C" _declspec(dllexport)
const MAX=10;
struct Part
{
 int x;
 int y;
};
struct EM
 {
    int count;
    Part c[MAX];
  };
B3DDLL void _stdcall Update(EM* v)
{
   for(int a=1;1000000;a++)
 {
  for(int i=1;10;i++)
  {
   v->c[i].x=1;
   v->c[i].y=2;
  };
 };
};
При попытке обращения к длл вылетает... как быть?
или я ерунду пытаюсь сделать?
(Offline)
 
Ответить с цитированием
Старый 07.11.2006, 22:40   #12
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: пример

Во-первых, что это за безобразие?!
for(int a=1;1000000;a++)

for(int i=1;10;i++)
Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.

А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то
(Offline)
 
Ответить с цитированием
Старый 08.11.2006, 10:19   #13
GoodWin
ПроЭктировщик
 
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений
(для 19 пользователей)
Re: пример

Во-первых, что это за безобразие?!
Цитата:
for(int a=1;1000000;a++)

for(int i=1;10;i++)
Первый цикл для теста, второй для перебора массива...
или я неправильно опреатор использую?
Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.
т.е. надо как-то получить адрес структуры Парт и только потом работать с ней? а как это сделать?
А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то
Т.Е. у тебя работает, а пример показать не трудно... плиз
(Offline)
 
Ответить с цитированием
Старый 08.11.2006, 13:55   #14
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: пример

for(int a=1;a<=1000000;a++)
И что у всех за привычка ставить точку с запятой после операторных скобок цикла?! В каждой 2ой программе. Не надо.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 08.11.2006, 16:47   #15
jimon
 
Сообщений: n/a
Re: пример

GoodWin
совет - сначала лутче научись на C++ прогать
потом уже сойденение либ делай

а то еще чисто философский цикл
#define правда true
#define правдой true
#define пока while (
#define есть ==
#define то ) {
#define вот_так_вот }
#define правда_нихера_не_правда break;

пока правда есть правдой то
std::cout << "hello world ! :)\n";
правда_нихера_не_правда
вот_так_вот
название юникодом вроде препроцесор msvc2005 разбирает
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример использования либ + Триал GRAY_WOLF Проекты на MidletPascal 16 24.08.2010 01:48
пример травы Illidan 3D-программирование 8 29.12.2009 22:53
Дайте пример mp3 плеера Ваня1993 Основной форум 2 20.09.2007 17:45


Часовой пояс GMT +4, время: 15:05.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com