forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Глупый вопрос. (http://forum.boolean.name/showthread.php?t=16297)

Nikich 06.02.2012 22:59

Глупый вопрос.
 
Знаю, вопрос глупый, но всё равно пожалуйста ответьте. Я пытаюсь портировать проект из Blitz3D в BlitzMax. Конечно, я подумал что всё будет просто:
1).ctrl+c
2).ctrl+v
3).????
4).PROFIT
А получилось совсем не так. Что-то с типами видимо по-другому. Как я понял, на BlitzMax нету For ...=Each ... .В общем, в этом и есть вопрос: как на BlitzMax писать цикл для перебора всех элементов типа?

SBJoker 06.02.2012 23:08

Ответ: Глупый вопрос.
 
Всё в BMax есть, вот только список для своих типов надо создавать самостоятельно.

Nerd 07.02.2012 00:15

Ответ: Глупый вопрос.
 
Шаблон:
Код:

Type Banana
 Global lst:TList = New TList
 'тут поля
Method New()
 lst.AddLast(Self)
EndMethod

Method Delete() 'Вот эта штука глючна, и если компилятор даёт ошибку, её надо переименовать
 lst.Remove(Self)
EndMethod

EndType



'Пример цикла
For bana:Banana = EachIn Banana.lst

Next


Черный крыс 12.02.2012 20:17

Ответ: Глупый вопрос.
 
Код:

Method Delete() 'Вот эта штука глючна, и если компилятор даёт ошибку, её надо переименовать
lst.Remove(Self)
EndMethod

Оно не глючно. Просто этот кусок кода противоречит логике здравого смысла.

Dzirt 21.02.2012 15:40

Ответ: Глупый вопрос.
 
Nerd96
Цитата:

'Пример цикла
Код:

For bana:Banana = EachIn Banana.lst

Next


эмм....плохой пример, перебирать нужно так :

Код:

For banana : Banana = EachIn lst

next

Вообще рекомендую для выработки нормально почерка к "типу" всегда добавлять приставочку "Type":

Вместо - banana : Banana

Будет читатся лучше - banana : Banana_Type

Так же и с листами....но это конечно личное дело каждого.

Черный крыс 26.03.2012 00:42

Ответ: Глупый вопрос.
 
>> к "типу" всегда добавлять приставочку "Type": Banana_Type

хмм... а вообще то принято именовать так : TBanana

Nikich 27.04.2012 23:16

Ответ: Глупый вопрос.
 
Код:

Function Draw_world()
For i=camera_x/16 To (camera_x+R1)/16
For i1=camera_y/16 To (camera_y+R2)/16
DrawImage(block[map[i,i1]],i*16-camera_x,i1*16-camera_y,0)
Next
Next
DrawImage player_image,R1/2,R2/2
End Function

Решил поиграться с Максом и опять наткнулся на проблему. Гонит на:DrawImage(block[map[i,i1]],i*16-camera_x,i1*16-camera_y,0). Вот как гружу картинки:
Код:

Global block[200]

block[0]=LoadImage("images\sky.png")
block[1]=LoadImage("images\ground.png")


Жека 28.04.2012 05:14

Ответ: Глупый вопрос.
 
Чё говорит хоть? "Attempt to index array element beyond array length"?
Сделай вывод в дебаг индексов и идентификатора картинки
DebugLog i+","+i1+","+map[i,i1]
После цикла рисования поставь DebugStop.

Ещё: напиши в самом начале кода SuperStrict, он тебе добрую службу сослужит. (типы переменных указать попросит, а это очень полезно делать)

Для картинок есть тип TImage, вот как с массивом надо:
Global block:TImage[200]

Nikich 28.04.2012 08:51

Ответ: Глупый вопрос.
 
Ага, то есть если я не укажу тип картинки этому массиву, он автоматически ему не присвоится как в блитц3Д?
Вот что пишет: Unhandled Exception: Attempt to access field or method of Null object.

Жека 28.04.2012 11:06

Ответ: Глупый вопрос.
 
Присвоится, но будет присвоено INT'овое число, и нужно будет память вручную очищать от таких картинок, в хелпе так сказано. А если нормальный тип укажешь TImage, то достаточно написать img = null и сборщик мусора сам удалит из памяти эту картинку.

По ошибке ясно, экземпляр не создан. Выведи дебагом индексы и всё поймёшь.

Nikich 28.04.2012 11:38

Ответ: Глупый вопрос.
 
ничего все равно не понимаю. Картинка есть, это точно.

Жека 28.04.2012 12:25

Ответ: Глупый вопрос.
 
В справке почитай: Help \ Tutorials and articles \ BlitzMax overview, там первая же статья с названием
Код:

BlitzMax Memory management - or, "where did Delete go?!?"

Nikich 28.04.2012 13:13

Ответ: Глупый вопрос.
 
Я про ошибку:)
Теперь вообще обнаружил что не могу картинки рисовать.

Nikich 28.04.2012 17:08

Ответ: Глупый вопрос.
 
Всё, понял. Дело было в "Graphics": теперь нельзя писать Graphics 0,0.
Но вопрос всё равно есть: а как же тогда поставить всё на нынешние настройки? То есть так, чтобы программа была на ширину, высоту экрана.
И попутно ещё вопрос. Как повернуть, увеличить, поставить альфу именно данной картинки? Мне не нужно все вращать, мне б только ГГ повернуть, а тут выясняется что старый добрый RotateImage не пашет:(

Nex 28.04.2012 19:02

Ответ: Глупый вопрос.
 
Цитата:

Сообщение от Nikich (Сообщение 226702)
И попутно ещё вопрос. Как повернуть, увеличить, поставить альфу именно данной картинки? Мне не нужно все вращать, мне б только ГГ повернуть, а тут выясняется что старый добрый RotateImage не пашет:(

Перед рисование картинки делай что надо (SetRotation,SetAlpha,SetScale), а после рисования ставь все это дело в ноль (0) для того чтобы это не влияло на след. картинки.

Код:

While Not KeyHit (KEY_ESCAPE)
    Cls ()
          SetRotation 90.0
              DrawImage ...
          SetRotation 0.0
    Flip
    GCCollect ()
Wend


Nikich 28.04.2012 20:32

Ответ: Глупый вопрос.
 
А не геморрой ли это часом?

Nex 29.04.2012 06:45

Ответ: Глупый вопрос.
 
Это удобно если не говнокодить.

Nikich 29.04.2012 10:46

Ответ: Глупый вопрос.
 
Ну ладно, пока вроде с быстродействием проблем нету. Но вопрос про аналог Graphics 0,0 все еще актуален.

Платон Александрович 29.04.2012 12:14

Ответ: Глупый вопрос.
 
Цитата:

Сообщение от Nikich (Сообщение 226753)
Но вопрос про аналог Graphics 0,0 все еще актуален.

модуль BRL.System
функции DesktopWidth и DesktopHeight

Nikich 29.04.2012 12:40

Ответ: Глупый вопрос.
 
Большое спасибо!

Nikich 29.04.2012 22:43

Ответ: Глупый вопрос.
 
Что-то с математикой в Максе. Почему-то, я не могу сделать вот так:
a=1/x
Приходится делать: a=x^-1.
Вообще деления не очень работают. a/24, пришлось изменить на a*0.04. Проблема не существенная, но интересно с чем это связано.

NitE 29.04.2012 23:04

Ответ: Глупый вопрос.
 
Это связано с тем, что перемнные правильно объявлять надо.
a#
или
a:Float

Вроде уже говорили что тебе нужно использовать SuperStrict.

Nikich 29.04.2012 23:41

Ответ: Глупый вопрос.
 
Не-не-не, не в этом дело. Если бы было в этом, то у меня бы и умножить не работало бы.
З.Ы. флоат у меня указан, не дурак:)

NitE 29.04.2012 23:49

Ответ: Глупый вопрос.
 
Работает, если одно из чисел флоат. a*0.04 - тут есть флоат, а вот a/24 тут нет.

Жека 30.04.2012 08:26

Ответ: Глупый вопрос.
 
NitE имеет ввиду вот что: при работе с дробным числам надо указывать всё как флоат, для чисел это добавление точки в конце (вместо 24 писать 24.0), а для инт'овых переменных делать Float(intValue).
x# = 24
a# = 1.0/x
b% = 99
c# = a*Float(b)

Nikich 30.04.2012 08:38

Ответ: Глупый вопрос.
 
А-а-а, точно. С умножением я догадался что флоат поставить нужно, а вот про 1.0 - нет. Спасибо!

Nikich 21.06.2013 03:09

Ответ: Глупый вопрос.
 
Ребята, объясните, в чем проблема со списками.
Код:

temp:Type=new Type
List.AddLast(temp)
For temp:Type=EachIn List
tmp:Type = new Type
List.AddLast(tmp)
Next

Данный код, по сути, должен бесконечно увеличивать список. На деле же, это не работает.
Однако, если в самом начале, заполнить список двумя объектами, все будет работать.
В чем проблема и как ее исправить?

SBJoker 21.06.2013 12:14

Ответ: Глупый вопрос.
 
Твой код ужасен, ты не понимаешь сути For-Each
Он перебирает все элементы с первого по последний, и используется восновном для выполнения однотипного действия со семи элементами списка. Но не для модифицирования списка.

Кроме того проход по списку будет в границах изначального списка, и не будет учитывать новые элементы.

Таким образом в конце твоего кода в списке будет два элемента.

Nikich 21.06.2013 12:55

Ответ: Глупый вопрос.
 
Он великолепно работает с новыми элементами. Если в самом начале, добавить в список не один элемент, а два - все будет работать, список будет увеличиваться и работать с новыми элементами. Но создавать по два элемента ужасно, поэтому я и прошу помощи.

SBJoker 21.06.2013 13:21

Ответ: Глупый вопрос.
 
Как я уже написал, цикл For...Each неправильно применять для модификации итерируемого списка. Потому что вы не владеете механизмом итерирования он скрыт от вас. Хотите контроля - используйте простой For...Next.

Почему работает с двумя начальными элементами, а не работает с одним?
Вероятно алгоритм итерирования такой:
в строке For...Each берется первый элемент First и выдаётся в переменную, и тут же итератор переходит на следующий элемент. В случае если в списке 1 элемент то итератор указывает на элемент - конец списка. Добавление нового элемента происходит перед концом списка. Если два элемента, то итератор указывает на второй элемент. И новый элемент добавится после него. Что позволит снова перейти на него в следующей итерации.

В строке Next происходит сравнение итератора с концом списка, элементы совпали - цикл завершен.

Nikich 21.06.2013 13:31

Ответ: Глупый вопрос.
 
Огромное спасибо за подробное объяснение!


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

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