forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Вопрос-Ответ (для новичков BlitzMax) (http://forum.boolean.name/showthread.php?t=13756)

is.SarCasm 21.11.2010 13:15

Вопрос-Ответ (для новичков BlitzMax)
 
Сюда предлагаю писать легкие вопросы по бмаксу.

Taugeshtu 21.11.2010 20:58

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Мне кажется, тема обречена на вымирание, ибо новички предпочитают b3d (за 3д. Ты чо, это ж круто!), а в bm приходят уже со своими шишками и хоть каким-то пониманием ситуации...

is.SarCasm 21.11.2010 21:26

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Вообще я создал тему потому что у МЕНЯ был вопрос. Но потом я понял что тупанул и заменил текст)

Randomize 21.11.2010 21:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Давай вопрос

is.SarCasm 24.11.2010 23:53

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Кто может дать два кода? В одном с помощью GameNet сервер отправляет рандомное число, а во втором клиент принимает его и выводит на экран.

baton4ik 26.11.2010 23:12

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
ИДЕ - BLIde. Всё скомпилировано. Создаю проект, пишу:

Цитата:

'Framework pub.lua

Rem
LuaState:Byte Ptr
LuaState = luaL_newstate()
luaL_openlibs(LuaState)
End Rem

Framework brl.d3d9max2d
Import brl.pngloader
Graphics(800, 600)


Global back1 = LoadImage("images/bk1.jpg")

Repeat
DrawImage(back1, 0, 0)
Flip
Until(KeyHit(KEY_ESCAPE))
Ошибка - back1=NULL
Картинка, разумеется есть. С png и bmp то же самое.
ЧЯДНТ?

P.S. На Framework pub.lua тоже ругается: Framework does not match commandline framework

Randomize 26.11.2010 23:23

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
У тебя JPG, а значит:
PHP код:

Import brl.JPGLoader 

Дружеские советы по коду:
1) SuperStrict в начале всегда - привыкаем писать правильно
2) d3d9max2ddriver не стабилен. Лучший вариант для Windows - это d3d7max2ddriver
На всех семёрках и вистах работет. Проверено.

SBJoker 27.11.2010 00:22

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
В качестве фреймворка надо выбирать базовый модуль а не производные.

Лучший выбор brl.blitz

baton4ik 27.11.2010 00:38

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Randomize (Сообщение 170012)
У тебя JPG, а значит:
PHP код:

Import brl.JPGLoader 

Дружеские советы по коду:
1) SuperStrict в начале всегда - привыкаем писать правильно
2) d3d9max2ddriver не стабилен. Лучший вариант для Windows - это d3d7max2ddriver
На всех семёрках и вистах работет. Проверено.

Да, действительно. Странно, что pngloader не работал, сейчас заработал (мб нестабильный d3d9?)
1) Да, знаю, это был проверочный семпл
2) Ок, спасибо

А что с pub.lua?

IGR 27.11.2010 01:46

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

1) SuperStrict в начале всегда - привыкаем писать правильно
А что значит это ?? Интересует имеено конкретно зачем это писать !!

baton4ik 27.11.2010 02:58

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от IGR (Сообщение 170018)
А что значит это ?? Интересует имеено конкретно зачем это писать !!

В режиме SuperStrict переменные перед использованием надо обязательно объявлять. Нельзя написать просто age=1, надо local age:int=1

IGR 27.11.2010 03:54

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
о ну тык это тру программинг !! ;)
По дефлоту я так понимаю BidlocodingStrict стоит хД !!
Что приходится это писать !!

Taugeshtu 27.11.2010 17:59

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

По дефлоту я так понимаю BidlocodingStrict стоит хД !!
Что приходится это писать !!
Не совсем верно. По умолчанию код вида:
Цитата:

aa_variable = 10
Print aa_variabl
Выведет 0, потому что компилятор посчитает "aa_variabl" новой переменной, автоматически её объявит и присвоит ей ноль.
При использовании SuperStrict компилятор такой код просто не пропустит. Профит - избавление от опечаток в именах переменных.

baton4ik 27.11.2010 18:36

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Странно, но
Framework pub.lua конфликтует со всеми остальными. Если он подключен, то import brl.blitz или framework brl.d3d7max2d не работают. В чём дело? Как это исправить?

Randomize 27.11.2010 19:00

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Framework brl.d3d7max2d
Import pub.lua

baton4ik 27.11.2010 19:04

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Спасибо! Таугешту только что написал. Только я так и оставил import brl.blitz, не осталось ни одного framework:

SuperStrict

Import brl.blitz
Import brl.pngloader
Import brl.JPGLoader
Import brl.bmpLoader
Import pub.lua

Randomize 27.11.2010 19:06

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
При отсутствии директивы Framework к твоему проекту при компиляции цепляется весь brl.
Вес exe растёт из-за ненужных модулей.

baton4ik 27.11.2010 19:09

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Как фреймворк brl.blitz ставится не хочет. Ок, тогда поставлю brl.d3d7max2d

Randomize 27.11.2010 19:13

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Фреймворком можешь поставть brl.basic

baton4ik 28.11.2010 13:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Randomize (Сообщение 170086)
Фреймворком можешь поставть brl.basic

Нет, не работает: Compile Error: Identifier 'TImage' not found
Оставляю brl.d3d7max2d

Итак, 2 вопроса:
1. fixed
2. Поставил maxgui последней версии, подключил maxgui.drivers
Успешно создал окно и гаджеты в нём. Но на это ругается:
Цитата:

Repeat
WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
End
Case EVENT_GADGETACTION
SetGadgetText(Label1,"You have keyed in:"+TextFieldText(MyInput))
End Select
Forever
Compile Error: Identifier 'WaitEvent' not found

Причём, когда начинаю вводить "Wait..." в подсказке всплывает "WaitEvent" и сама функция выделена синим.

SBJoker 28.11.2010 14:42

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Сейчас в максгуи надо цеплять минимум два модуля, сам гуи и требуемый гуи драйвер для конкретной ОС. За события вроде тоже теперь отдельный модуль отвечает.

Т.е. начало должно быть примерно таким:
Код:

SuperStrict

Framework brl.basic

Import maxgui.maxgui
?Win32
    Import maxgui.win32maxguiex
?MacOSX86
    Import maxgui.cocoamaxgui
?
Import brl.eventqueue


baton4ik 28.11.2010 14:53

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от SBJoker (Сообщение 170164)
Сейчас в максгуи надо цеплять минимум два модуля, сам гуи и требуемый гуи драйвер для конкретной ОС. За события вроде тоже теперь отдельный модуль отвечает.

Т.е. начало должно быть примерно таким:
Код:

SuperStrict

Framework brl.basic

Import maxgui.maxgui
?Win32
    Import maxgui.win32maxguiex
?MacOSX86
    Import maxgui.cocoamaxgui
?
Import brl.eventqueue


Спасибо, заработало.
Framework brl.basic, как я уже писал, не работает как надо: Compile Error: Identifier 'TImageFont' not found

SBJoker 28.11.2010 16:11

Ты тупой, какое отношение имеешь ты к Framework brl.basic?

Ты хоть понял что тебе компилятор сказал? Он сказал что: "Идентификатор TImageFont не найден".

Потому что ты не включил соответствующий модуль в комплект.

import brl.d3d7max2d //TImageFont именно здесь

Вы вообще понимаете что делает кейворд Framework?
Он говорит что "выкинуть из комплекта все модули кроме следующего"
Т.е. Фактически он подключает лишь один модуль, остальное вы подключаете сами.

baton4ik 28.11.2010 16:19

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Чувак, я это всё понимаю. Просто из постов о brl.basic у меня сложилось мнение, что он включает в себя всё, что надо. Поэтому, когда я подключал brl.basic, я отключал brl.d3d7max2d.
P.S. Хотя я действительно не совсем правильно понимал Framework, спасибо.

Randomize 28.11.2010 23:15

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Для большего понимания по открывай сами модули и посмотри какой за что отвечает. Например d3d7max2d сам использует brl.basic, brl.math, brl.linkedlist и другие и как следствие их подключать не нужно.

Данил 01.12.2010 00:32

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
В blitzMax можно объявить динамический массив.
Но максимальный индекс элемента в нем может быть 71801.

Global Base_Image_array:Int[];
Global Base_Image_number:Int;
Base_Image_array[71801]=3;
Base_Image_array[71800]=3;
Base_Image_array[71799]=3;

почему именно 71801 ? 71802 уже не работает! :(

add

а в этот раз до Base_Image_array[71809]=3; дошло, и ничего :(

baton4ik 01.12.2010 01:48

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Загружаю звуки в массив Global msounds:TSound[5]
Далее проверяю, не воспроизводится ли csound:TChannel
Если нет, то csound=PlaySound(msounds[Rand(0,4])
Звука нет. Никаких ошибок, весь остальной код работает как надо. Формат - wav. Другие не пробовал.

Randomize 01.12.2010 11:12

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Данил (Сообщение 170420)
В blitzMax можно объявить динамический массив.
Но максимальный индекс элемента в нем может быть 71801.

Global Base_Image_array:Int[];
Global Base_Image_number:Int;
Base_Image_array[71801]=3;
Base_Image_array[71800]=3;
Base_Image_array[71799]=3;

почему именно 71801 ? 71802 уже не работает! :(

add

а в этот раз до Base_Image_array[71809]=3; дошло, и ничего :(

PHP код:

Local BigArray:Int[100500]
BigArray[3333] = 3333
BigArray
[71799] = 71799
BigArray
[99999] = 99999
BigArray
[100499] = 100500 1

Print BigArray[3333]
Print 
BigArray[71799]
Print 
BigArray[99999]
Print 
BigArray[100499

Насколько я знаю разpмер массива в BM нужно указывать обязательно. Изменение размера = пересоздание массива. Лучшим вариантом будет использование БД для таких объемов, но ежели памяти не жалко, то используй TList или напиши свой аналог. Ежели хранить нужно только int, то можно смело и банки использовать.

Цитата:

Сообщение от baton4ik (Сообщение 170426)
Загружаю звуки в массив Global msounds:TSound[5]
Далее проверяю, не воспроизводится ли csound:TChannel
Если нет, то csound=PlaySound(msounds[Rand(0,4])
Звука нет. Никаких ошибок, весь остальной код работает как надо. Формат - wav. Другие не пробовал.

Раздел фреймворк покажи.

Накидаю ка пример использования звука в бм:
PHP код:

Framework brl.basic
Import brl
.directsoundaudio
Import brl
.oggloader

SetAudioDriver
"DirectSound" )
Local s:TSound LoadSound("C:\BlitzMax\samples\digesteroids\sounds\menu.ogg")

Local c:TChannel s.Cue()
If 
Not c.Playing() Then PlaySound(s)
Delay(1500)
Null GCCollect() 

SUPERSTRICT или UNINSTALL - Выбор за тобой, %ЮЗЕРНЕЙМ%

baton4ik 01.12.2010 12:12

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Randomize (Сообщение 170435)
PHP код:

Local BigArray:Int[100500]
BigArray[3333] = 3333
BigArray
[71799] = 71799
BigArray
[99999] = 99999
BigArray
[100499] = 100500 1

Print BigArray[3333]
Print 
BigArray[71799]
Print 
BigArray[99999]
Print 
BigArray[100499

Насколько я знаю разpмер массива в BM нужно указывать обязательно. Изменение размера = пересоздание массива. Лучшим вариантом будет использование БД для таких объемов, но ежели памяти не жалко, то используй TList или напиши свой аналог. Ежели хранить нужно только int, то можно смело и банки использовать.


Раздел фреймворк покажи.

Накидаю ка пример использования звука в бм:
PHP код:

Framework brl.basic
Import brl
.directsoundaudio
Import brl
.oggloader

SetAudioDriver
"DirectSound" )
Local s:TSound LoadSound("C:\BlitzMax\samples\digesteroids\sounds\menu.ogg")

Local c:TChannel s.Cue()
If 
Not c.Playing() Then PlaySound(s)
Delay(1500)
Null GCCollect() 

SUPERSTRICT или UNINSTALL - Выбор за тобой, %ЮЗЕРНЕЙМ%

О_о Как раз вчера вечером пилу смотрел, решил, что опять кеш оперы глючит.
SuperStrict, конечно, стоит :)
Проблема была в том, что я не установил аудиодрайвер. Спасибо.

Данил 01.12.2010 19:58

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
эй.
мне именно и нужно динамический массив :(

SBJoker 01.12.2010 21:23

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Тогда читать про слайсы бегом.

Черный крыс 28.12.2010 16:19

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Кстати динамически переразмечать массив - крайне медленная операция, если извесно сколько элементов будет в массиве - то лучше создать его заранее, если же создается временный массив, то лучше создать его максимально большим.
Таким недугом грешит коллизия, из за динамических переразметок заметно теряется производительность. Тут я сделал буффер в 64 обьекта, тоесть массив заранее создается в 64 элемента, все остальное отбрасывается. Прирост составил 1 мс против 800 мс в краштесте.

JeanWinters 31.12.2010 21:36

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Где можно почитать про Threads , которые были добавлены в бмакс? В справочнике я уже смотрел. В чем их преимущество и как использовать и вообще стоит ли?

moka 31.12.2010 22:47

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Как я слышал, они официально не поддерживаются. Но может с новой версией, дело обстоит иначе.

ЗЫ, вторая ссылка

JeanWinters 06.01.2011 19:47

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Хотел проверить как используются потоки и решил запустить из "сэмплов" примеры кодов. Программа выдает сообщение, что "Identifier 'TThread' not found" .

Reizel 06.01.2011 20:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Значит твой БМакс слишком стар или у тебя нет модуля Threads.mod.
Советы:
1) Скачать новую версию БМ
2) Поставить Threads.mod

JeanWinters 06.01.2011 22:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Версия самая новая. Как проверить установлен ли модуль?

SBJoker 06.01.2011 23:46

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
грубоговоря бмакс перехреначивался вдоль и поперек несколько раз, старые примеры могут неработать в новом бмаксе и наоборот.
А ещё в IDE надо переключить на Threated build или ка кто так

Reizel 07.01.2011 02:02

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
папка mod/brl.mod/threads.mod
вродь так.

JeanWinters 07.01.2011 20:19

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Джокер, ты был прав - переключение помогло.

baton4ik 08.02.2011 14:20

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Пытаясь установить бм на школьном компьютере я столкнулся с непредвиденными трудностями.
  1. Устанавливаю бм 1.41
  2. Устанавливаю последний minigw, галочка на c++
  3. Устанавливаю blide, прописываю путь до бм и minigw
  4. Нажимаю на "Build all modules"

Код:

Compiling:blitz_app.c

In file included from C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c:2:
C:\BlitzMax\mod\brl.mod\blitz.mod\blitz.h:5: stdio.h: No such file or directory
C:\BlitzMax\mod\brl.mod\blitz.mod\blitz.h:6: stdlib.h: No such file or directory
C:\BlitzMax\mod\brl.mod\blitz.mod\blitz.h:7: string.h: No such file or directory
C:\BlitzMax\mod\brl.mod\blitz.mod\blitz.h:8: ctype.h: No such file or directory
In file included from C:\BlitzMax\mod\brl.mod\blitz.mod\blitz.h:20,
                from C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c:2:
C:\BlitzMax\mod\brl.mod\blitz.mod\blitz_thread.h:7: windows.h: No such file or directory
C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c:4: stdio.h: No such file or directory
C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c:98: direct.h: No such file or directory
C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c:100: windows.h: No such file or directory
Build Error: failed to compile C:/BlitzMax/mod/brl.mod/blitz.mod/blitz_app.c

Я сделал вывод, что некорректно работает компилятор. Как решить?

SBJoker 08.02.2011 15:18

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
емнип надо gcc4 ставить из комплекта с минГВ
Ну и прописать переменные среды надо как написано в начале установки бмакса.

baton4ik 08.02.2011 18:16

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Не вижу в комплекте с minigw никакого gcc4. Да и на своём домашнем компьютере ставил так же.
Переменные среды надо прописывать для MaxIDE, в Blide путь задаётся в опциях.

Reks888 08.02.2011 18:21

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Была такая проблема
Исправил перейдя на BLIde(что ты сделал) и отметив всё подряд галочкой при установке(c++ когда только ставил, тоже не работало)

baton4ik 08.02.2011 18:40

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Reks888 (Сообщение 178327)
Была такая проблема
Исправил перейдя на BLIde(что ты сделал) и отметив всё подряд галочкой при установке(c++ когда только ставил, тоже не работало)

Пробовал, разумеется. Когда не вышло с цпп, пробовал без него (дома работает с одним с++). Пробовал со всеми компонентами, пробовал указывать в блайде путь как до папки с minigw, так и до папки bin.

Greenstyler 08.02.2011 22:17

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Всем здрасьте.
Собственно, всё очень просто - не отображаются русские буквы. Совсем. Делаю вроде всё, как положено (самый простой пример):

Код:

Global Font:TImageFont

Graphics 800, 600

Font = LoadImageFont( "Arial", 30 )
SetImageFont( Font )

Repeat

DrawText( "Текст.", 400, 300 )

Flip
Cls

Until AppTerminate()

В результате получаю лишь точку на экране, все русские буквы отсутствуют. Пробовал прописывать шрифт и как ArialCyr, и как Airal.ttf - без разницы. То же самое и с шрифтами, скачанными из интернета, и с остальными системными.
Прошу помочь. И, если где-то на форуме есть решение, просьба кинуть линк - поиск не помог, проблема обсуждалась не раз, но либо так и не была решена, либо была решена на Blitz3d, а это не то.

SBJoker 08.02.2011 22:31

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Текст надо в Юникод передавать.

baton4ik 08.02.2011 22:33

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Добавь
Import brl.FreeTypeFont
в начале
"Arial" измени на "Arial.ttf" и кинь шрифт в папку с проектом.

Greenstyler 08.02.2011 23:08

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
baton4ik
Спасибо, помогло. Теперь будем экспериментировать на скачанных шрифтах...

Amatsu 19.02.2011 20:47

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Суперстрикт рулит! ^^ Это так, вопль души *убежал дальше копать туториалы по работе с пользовательскими типами*

Amatsu 19.02.2011 20:57

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Вот, вопрос, можете объяснить, в чем разница между методом (Method) и функцией (Function) внутри описания пользовательского типа?

Reks888 19.02.2011 21:44

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Метод работает непосредственно с объектом типа, от которого было обращение
т.к.
Цитата:

...
Method GetSave()
Return Save
End Method
...
map1.GetSave()
map2.GetSave()
Так map1 вернет свой map1.Save, а map2 вернет свой map2.Save.
Функции внутри типов ничем не отличаются от функций снаружи типов, кроме того что эти функции можно вызвать от типа(вроде TMap.MyFunc() или map1.MyFunc())
Она НЕ ДАЕТ доступа к переменным внутри типа, тоесть придется писать что-то вроде
Цитата:

Function Create()
t.TMap=New TMap
t.Save=100500
Return t
End Function
Удобно использовать для функций создания и деструкта элемента типа. Для остального - лучче методы

Amatsu 19.02.2011 21:55

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Спасибо большое :) То что нужно

baton4ik 19.02.2011 22:03

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Грубо говоря, функции - глобальные методы.

Randomize 19.02.2011 23:37

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Функции внутри типа это обычные функции, только они ещё имеют быстрый доступ к внутренним глобальным переменным внутри типа.
PHP код:

Type Foo
  
Global Bar:Int 0
  
Function IncBar()
    
Bar:+1
  End 
Function
EndType

Foo
.Bar 1
Foo
.IncBar()
Foo.IncBar()

Print 
Foo.Bar 'выдаёт 3 

Методы вызываются непосредственно для экземпляра типа.
Псевдокод:
PHP код:

Type Мужык
   Field x
:int 0
   Field y
:int 0

   Method ИдиВверх
()
     
y:-1
   EndMethod
   Method ИдиВниз
()
     
y:+1
   EndMethod

   Method ИдиВЛево
()
     
x:-1
   EndMethod
   Method ИдиВПраво
()
     
x:+1
   EndMethod
EndType


Local SuperHero
:Мужык = New Мужык
SuperHero
.ИдиВниз()
SuperHero.ИдиВниз()
SuperHero.ИдиВниз()
SuperHero.ИдиВЛево()
SuperHero.ИдиВЛево()

Print 
SuperHero." , " SuperHero.' выдаёт -2 , 3 


Amatsu 20.02.2011 00:51

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Кажется разобрался. Всем спасибо. В итоге получается даже удобнее, чем в блитце :)

Amatsu 20.02.2011 09:43

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Пытаюсь писать свой пользовательский тип с функциями и методами. При компиляции, если я обратился к функции CreateBattleCharacter, выдает Attempt to access field or method of Null object на строчке
Код:

bchar_list.AddLast bchar
Если не трудно, подкиньте идею, где может быть косяк. Сам код:
Код:

Global bchar_list:TList = New TList
Global bchar_list_count:Int
Type TBattleCharacter
  Field model:Int, anim_mesh:Int
  Field selected:Byte
  Field name:String
  Field level:Int, life:Int, life_max:Int

 
  ' Создание персонажа
  Function CreateBattleCharacter:TBattleCharacter(variant:String, selected:Byte, level:Int, life:Int)
    Select variant
            Case "player"
        Local bchar:TBattleCharacter = New TBattleCharacter

        ' Определение переменных
        bchar.selected = selected
            bchar.level = level

        ' Определение постоянных
        bchar.name = variant

        ' Определение параметров
        bchar.life_max = 60 + bchar.level * 27
        bchar.life = life
        If bchar.life > bchar.life_max
          bchar.life = bchar.life_max
        ElseIf bchar.life < 1
          bchar.life = 1
        EndIf

        ' Загрузка моделей
        bchar.model = xCreateCube()
        xScaleMesh bchar.model, 5, 14, 5
        xEntityAddBoxShape bchar.model, 10

        bchar_list.AddLast bchar
        bchar_list_count:+1
    End Select
  End Function

  ' Обработка персонажа
  Method Update()
    If selected = 1 Then MouseLook(model)
  End Method

End Type
End


baton4ik 20.02.2011 10:21

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
bchar_list = CreateList()
И лучше сделай не глобальный список, а глобальную переменную типа для него:

Type TBattleCharacter
Global list:TList = CreateList()

'...

TBattleCharacter.list.AddLast bchar

'...

Amatsu 20.02.2011 10:42

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от baton4ik (Сообщение 179705)
bchar_list = CreateList()
И лучше сделай не глобальный список, а глобальную переменную типа для него:

Type TBattleCharacter
Global list:TList = CreateList()

'...

TBattleCharacter.list.AddLast bchar

'...

Спасибо, помог второй вариант :)

JeanWinters 20.02.2011 17:25

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Правда ли, что использование описания переменной в пределах пользовательского типа называется "статичной переменной" , так же как и функция, описанная в этих пределах именуется "статичной функцией"? От куда такая терминология сложилась? Еще вопрос: можно ли использовать статичные константы в типе и другие типы в типе?

baton4ik 20.02.2011 17:30

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от JeanWinters (Сообщение 179750)
Еще вопрос: можно ли использовать статичные константы в типе и другие типы в типе?

Константы использовать можно. Другие типы нельзя.
Как ты себе представляешь статичные константы? Константа сама по себе статична, на то это и константа.

moka 20.02.2011 17:40

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
В C# например нету оператора Method или Function. Объявление функции и её роль зависит от её значений перед, например в классе:
Код:

public string Name () {
Это будет аналогично объявлению метода в бм.
А вот:
Код:

public static string Name () {
Будет аналогично функции, и вызывается не через объект (хотя и так можно), а через сам класс, например:
Код:

public class TUser {
  private string _nameFirst;
        private string _nameLast;
 
        ...
     
        public static string Name {
              get { return MakeName(_nameFirst,_nameLast); }
          }
        public static string MakeName(string first, string last) {
              return first+" "+last;
        }
     
        ...
}

...

TUser _user = new TUser();
...
_user.Name // получает имя юзера.
...
TUser.MakeName("James","Bond") // получает имя "James Bond"

Вот MakeName - это функция класса, она есть статичная функция.
А функция Name, в понятии бм - это метод.

DeeJex 22.02.2011 01:14

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Объясните нубу:
1) Почему переодически отключается возможность копипастирования кода в стандартном IDE?
2)
Код:

Type TMaterial
Field img :TImage
        Method Create:TMaterial(image :TImage)
                Mat :TMaterial = New TMaterial
                        Mat.img = image
                Return Mat
        EndMethod
End Type
...
Mat :TMaterial = TMaterial.Create(LoadImage("dat\banana.png"))

Ошибка на Create. Вроде ж сделал как в хелпе. (Недавно пересел на бимакс, еще плохо его знаю)

baton4ik 22.02.2011 01:26

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Измени "Method Create:TMaterial(image :TImage)" на "Function Create:TMaterial(image :TImage)"
Выше как раз описана разница между методом и функцией типа.

Насчёт копипаста не скажу, сразу установил blide.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot