forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на BlitzMax (http://forum.boolean.name/forumdisplay.php?f=106)
-   -   Vivo (http://forum.boolean.name/showthread.php?t=16218)

RokWeb 28.02.2012 14:08

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 220858)
Ну-с начнем. Вот что нужно от сайта: возможность регистрации, возможность выкладывания новостей( небольших статей), возможность выкладывания скриншотов и видео(хотя это не так важно), возможность выкладывания самой игры. Это все что важно. И еще, хотелась бы поддержка двух языков( английского и русского, конечно). Вот и все:). Приблизительное оформление: сверху логотип игры, слева выбор раздела сайтов( просто маленькая табличка с названиями разделов), справа - в зависимости от раздела(новости - новости, скриншоты - скриншоты и тд). Что-нибудь еще описать надо?

Для того, что ты написал вполне подойдет любая CMS, например Joomla.

Nikich 28.02.2012 15:27

Ответ: Vivo
 
Мне не то, не другое, не о чем не говорит. Моя фраза:" я в этом не разбираюсь" значит что я в этом не разбираюсь.

Nikich 01.03.2012 00:16

Ответ: Vivo
 
http://rghost.ru/36781753
Вот новая версия с музыкой. Отпишитесь, пожалуйста, мне важно знать ваше мнение.

Жека 01.03.2012 11:09

Ответ: Vivo
 
Я поиграл. Заставка понравилась, правда смазалась из-за масштабирования под 1280х1024. Несколько раз не было "тумана войны" (наверное это был день, или глюк?)
вот откуда такой размер архива (>20мб):
\vivo\music\day1.wav 27,5 мб

[Сдыхаю быстро, но пару крабов завалил]

Nikich 01.03.2012 13:21

Ответ: Vivo
 
скорее всего это был день. Сколько времени было? Тот трек действительно весит много, из-за того что качество очень хорошое. Но меня больше интересует мнение о музыке:)

Nikich 03.03.2012 15:03

Ответ: Vivo
 
Новая версия:
-Новая мелодия( проигрывается днем)
-Молоток(палка+камень+лиана)
-Изменены рецепты крафта каменной и деревянной кирки(теперь нужен молоток)
http://rghost.ru/36821364
P.S. в папке с игрой в "music" новый трек называется day2. Откомментируйте его, пожалуйста:) .

reumep 08.03.2012 02:09

Ответ: Vivo
 
нужен сайт? запили прототип на юкозе

pepel 08.03.2012 10:23

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 221400)
P.S. в папке с игрой в "music" новый трек называется day2. Откомментируйте его, пожалуйста:) .

мне не понравился.

Igor 09.03.2012 01:30

Ответ: Vivo
 
Чёрный экран при запуске. Музыка играет. Win7 64bit, ноут с Nvidia ION

Nikich 09.03.2012 21:05

Ответ: Vivo
 
Возможно что-то из-за винды, я точно сказать не могу:)
Кстати, появился новый вопрос. Дабы улучшить геймплей, было принято решение сделать так, чтобы персонаж был в центре экрана все время. То есть не комнатная система как сейчас, а как в большинстве TDS. Ну, надеюсь вы поняли:) Так вот, как лучше всего это сделать? Я думал сделать так, чтобы не герой ходил, а все вокруг него двигалось. Но я уверен что есть способы получше. В общем, мне интересны ваши соображения на эту тему.

reumep 09.03.2012 21:49

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222269)
Возможно что-то из-за винды, я точно сказать не могу:)
Кстати, появился новый вопрос. Дабы улучшить геймплей, было принято решение сделать так, чтобы персонаж был в центре экрана все время. То есть не комнатная система как сейчас, а как в большинстве TDS. Ну, надеюсь вы поняли:) Так вот, как лучше всего это сделать? Я думал сделать так, чтобы не герой ходил, а все вокруг него двигалось. Но я уверен что есть способы получше. В общем, мне интересны ваши соображения на эту тему.

можно сделать координаты для каждого блока, а при движении плюсовать к ним изменение типа так.
Цитата:

if keydown(W)
For block.block = each block
block\y = block\y + speed#
next

Nikich 09.03.2012 21:52

Ответ: Vivo
 
Я же про это и говорил
Цитата:

чтобы не герой ходил, а все вокруг него двигалось.
:)

Mhyhr 09.03.2012 22:07

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222269)
В общем, мне интересны ваши соображения на эту тему.

Есть ещё вариант. Ты двигаешь игрока на 1-3 корпуса(в прямоугольнике как бы). После чего если ГГ выходит за пределы этого прямоугольника,двигаться начинает карта. Это придало бы ощущение большей динамики. Можно ещё поиграться с плавностью.

Nikich 09.03.2012 22:16

Ответ: Vivo
 
А-а-а понял. Так в crimsonland вроде было.
Но я где-то слышал, что можно как-то с камерой делать, или что-то такое. Ах да, мне говорили что в zombieblast(стандатный пример на BlitzMax) что-то такое сделано.
Просто меня очень сильно смущает что приходится двигать всю карту. Точно должен быть какой-то другой вариант.

Nikich 10.03.2012 12:07

Ответ: Vivo
 
Живой пруф того что это делают по-другому - terraria. Если бы там двигали все блоки, это было бы очень медленно. Значит, какой-то другой способ есть. Такжем, хороший пруф Diablo 2(не играл в первую часть, так что говорить не могу). Вряд ли в то время многие потянули бы передвижение каждого тайла на карте.
Но все же подумав что выбора нет, попробывал двигать все блоки, и появился новый вопрос( но старый еще вполне актуален - можно ли сделать тип, у которого поля были бы другими типами? То есть, как бы материнский тип. И если да, то как?

LLI.T.A.L.K.E.R. 10.03.2012 14:53

Ответ: Vivo
 
Разработку не смотрел..
Но, лучше двигать игрока и смещать камеру.
При обработке блоков (на видимость и т.п.) учитывать позицию игрока. Плюс на "запас", принимать в счёт смещение камеры.

Намного легче ведь когда всё стоит на своих местах и лишь игрок перемещается, чем рассчитывать позиции блоков: их фактическая позиция на карте +/- смещение игрока.
Если ещё будут пули - то это вообще геморрой.

Nikich 10.03.2012 15:30

Ответ: Vivo
 
игра в 2Д ведь, никаких камер нету:)

FireOwl 10.03.2012 16:19

Ответ: Vivo
 
Значит ее надо вообразить. Заведи пременные вроде camx, camy и обрабатывай на экране не те блоки, что вокруг (0, 0) координат, а те, что вокруг (camx, camy).

Nikich 10.03.2012 16:53

Ответ: Vivo
 
Я все же решил сделать по-другому. Переделаю игру в 3D, и вместо картинок будут спрайты, чтобы не изобретать велосипед.

Mhyhr 10.03.2012 17:36

Ответ: Vivo
 
Nikich, всегда в таких случаях двигается камера(точнее - это манипуляции с матрицами). В 2D камерах ортогональная проекция.(в Blitz3D вроде тоже есть ортогональный режим.).Вот и все различия. Как раз и спрайты пригодятся.

Nikich 10.03.2012 18:02

Ответ: Vivo
 
ну не знаю, ничего о камерах в 2Д в блитце я не слышал. Может есть сторонние библиотеки, но я ими не пользуюсь.

Spy4433 10.03.2012 18:30

Ответ: Vivo
 
есть origin x,y или как то так команда попробуй ее

но в этом случае гуи и персонаж надо ценровать отсноительно сдвига )

FireOwl 11.03.2012 16:47

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222399)
ну не знаю, ничего о камерах в 2Д в блитце я не слышал. Может есть сторонние библиотеки, но я ими не пользуюсь.

Ты же не хочешь сказать, что ждешь готовой команды "СоздайтеМнеКамеруВ2Д()"?

Это реализуется двумя-тремя операторами.

Дано:
-блоки, каждый имеет свои координаты относительно точки отсчета (0,0). Эти координаты изменяться НЕ БУДУТ.
-игрок, который тоже имеет координаты, относительно точки отсчета (0,0).
-воображаемая камера которая должна:
--висеть над тем местом, которое задано ее координатами (относительно точки отсчета (0,0))
--показывать соответствующие блоки

Координаты игрока будут совпадать с координатами камеры, в случае жесткой привязки (тогда игрок будет всегда по центру экрана)
Или немного плавать относительно координат камеры, если нужна плавная смена направления (камера "летает" за игроком).

Заводим две переменные: camera_x, camera_y

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

If block.x>0 and block.x<640 then
        if block.y>0 and block.y<480 then
                drawimage img_block, block.x, block.y
        endif
endif

Надо изменить это условие примерно так:
Код:

If block.x>camera_x and block.x<(camera_x+640) then
        if block.y>camera_y and block.y<(camera_y+480) then
                drawimage img_block, block.x-camera_x, block.y-camera_y
        endif
endif

Не так уж и сложно.

Nikich 11.03.2012 17:32

Ответ: Vivo
 
Гм. А какой способ лучше? Через origin короче, но двигать начало системы координат подозрительно.
Хотя команды "БыстроМнеКамеруЗапилил()" явно не хватает.
UPD
И почему координаты ГГ должны совпадать с координатами камеры? Ведь тогда игрок за экран сможет убежать.

reumep 11.03.2012 22:06

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222477)
Гм. А какой способ лучше? Через origin короче, но двигать начало системы координат подозрительно.
Хотя команды "БыстроМнеКамеруЗапилил()" явно не хватает.
UPD
И почему координаты ГГ должны совпадать с координатами камеры? Ведь тогда игрок за экран сможет убежать.

тогда наилучшая команда "СделатьИгруЗаипцаКакЯХочу()"

Nikich 11.03.2012 22:37

Ответ: Vivo
 
Кстати, все еще требуется помощь в создании сайта.

Жека 12.03.2012 05:36

Ответ: Vivo
 
Самое простое делать через Origin. Делаешь для карты Origin(scrollX, scrollY), а для гуи возвращаешь в начало Origin(0,0).

Nikich 12.03.2012 17:27

Ответ: Vivo
 
Вложений: 1
Опять проблемы. Что-то они зачастили. Возможно, вы слышали о такой игре ProjectZomboid, если инет, скачайте и поиграйте она того стоит. Но не в этом дело. Поговорив с геймдизайнером, мы пришли к мнению, что графику стоит сделать изометрическую. И сразу же возник вопрос. Это довольно трудно объяснить тем кто не играл, но я попробую. У нас есть одна стена, через неё пройти мы не можем. Если мы расположим ее на одном тайле, то всё прекрасно и понятно, но тогда она будет уж слишком толстой. Разработчики этой игры думали также, и сделали стены идеально плоскими, разместив их между(!) тайлами. То есть их ширина равна одному пикселю. В этом и есть вопрос: как же тогда делать коллизию, если она не занимает не один тайл? Если я не смог объяснить, поиграйте в эту игру и попробуйте обойти стены домов, тогда станет понятно.

Spy4433 12.03.2012 19:47

Ответ: Vivo
 
ну сделать проверку пересечений линия :) если правильно понял

(про стенки) ?

Nikich 12.03.2012 20:46

Ответ: Vivo
 
Не, это муторно. Тогда придется в основании каждой стенки рисовать еще линии. Должно быть что-то проще.

Жека 13.03.2012 06:57

Ответ: Vivo
 
Мне такой вариант подумался.

Сделать плитки объектами (Type), задать им свойства "наличие стенки на краю плитки" по четерём направлениям. (id тайла тоже сюда, если уместно)
Field walls%[4] ;0 - нет стены, 1 - есть

А потом, когда игрок решит покинуть текущую плитку (curCell), делать проверку стенки в нужном направлении (direction).
if(curCell\walls[direction]<>0) Return ;есть стена, никуда не двигаемся

direction = {0,1,2,3} - заранее заданные константы направления, 0 например вверх и далее по часовой стрелке (как уж условишься сам).

Nikich 13.03.2012 10:01

Ответ: Vivo
 
Так тоже не катит. Этот способ хорош, если ГГ пытается перейти с клетки со стенкой на свободную клетку. А если наоборот то фиг. Тогда придется еще просчитывать какая у него следующая клетка.

FireOwl 13.03.2012 13:25

Ответ: Vivo
 
Ну так у клетки на которой стоит человечек тоже можно прописать этот параметр для той же стенки. Только надо еще отдельно хранить где-то массив этих стенок, ведь они могут быть разных типов (камень, кирпич, дерео, дверь, окно и т.д.)

Жека 13.03.2012 14:13

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222630)
Этот способ хорош, если ГГ пытается перейти с клетки со стенкой на свободную клетку. А если наоборот то фиг.

Инфу о наличии стенки хранить можно как в 1 клетке, так и в 2х, которые эта стенка и разделяет.
Цитата:

Сообщение от Nikich (Сообщение 222630)
Тогда придется еще просчитывать какая у него следующая клетка.

Просчитывать особо нечего, т.к. у клетки есть инфа (должна быть) о занимаемой ей позиции по типу индекса массива. Тогда проверка сводится к такому алгоритму (для движения вверх):

Код:

;если инфа о стенках только в 1 клетке хранится, а не в обеих смежных, то две проверки
;x,y - индексы текущей клетки, в которой игрок стоит
;up,down - направления
if(cells[x][y]\walls[up]=true) Return ;стена сверху у текущей клетки
if(cells[x][y-1]\walls[down]=true) Return ;стена снизу у верхней клетки

Плюс добавить проверку выход за границы поля.

рубишь фишку? :)

reumep 13.03.2012 14:52

Ответ: Vivo
 
Изометрическая графика? лолчто? как будут выглядеть блоки и их копание? придется переделывать всю графу и крабов!

Nikich 13.03.2012 16:34

Ответ: Vivo
 
ну да, я начинаю все заново.

Nikich 13.03.2012 16:51

Ответ: Vivo
 
если бы я мог использовать массивы, то твой способ хорош. Но из-за большого мира я не могу массивы двухмерные исользовать - RАМ уйдет слищком много.

FireOwl 13.03.2012 18:25

Ответ: Vivo
 

Цитата:

Сообщение от Nikich (Сообщение 222656)
Но из-за большого мира я не могу массивы двухмерные исользовать - РАМ уйдет слищком много.

Большому миру - много окон? :-)
Лучше пиши RAM, так понятнее.

Nikich 13.03.2012 21:13

Ответ: Vivo
 
Все, проблема со стенками ушла. Но сразу за ней появилась новая. Вот я на радостях создал 9000(это не мем, а настоящее количество) тайлов земли. Рисую я, как образованный человек, лишь те что рядом с игроком. А результат то - 20 fps от силы. Так в чем же дело? Тайлы земельки - элементы типа, то есть создается 9000 элементов. И пожалуйста, мне интересно решение без использование чанков. Мне нужны эти 9000 тайлов сразу вместе. Потребуете код - кину. Но думаю можно и без него справится, доходчиво изъяснился я.

Nikich 14.03.2012 22:21

Ответ: Vivo
 
А вот и код:

Global rc=CountGfxModes()
Global R1=GfxModeWidth(rc)
Global R2=GfxModeHeight(rc)


Graphics R1,R2
Global fnt1=LoadFont("Arial",24)
SetFont fnt1
SetBuffer BackBuffer()
Dim TileImg(50)
TileImg(0)=LoadImage("ground.bmp")
TileImg(1)=LoadImage("grass.bmp")
Global cx#,cy#,plx#,ply#,tdst,tfps,fps
Global lfps=60
Type tl
Field x,y,z,id
End Type
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Global pl=LoadImage("pl.bmp")
MaskImage pl,255,255,255
MidHandle pl

CreateWorld()


Function CreateWorld()
For i=-50 To 50
For j=-50 To 50
t.tl=New tl
t\x=R1/2+(i-j)*32
t\y=R2/2+(i+j)*16
t\id=Rnd(0,1)
Next
Next
End Function

Function UpdateTiles()
For t.tl=Each tl
tdst=Sqr((t\x-plx)^2+(t\y-ply)^2)
If tdst<Sqr((R1/2)^2+(R2/2)^2)+32 Then
DrawImage TileImg(t\id),t\x,t\y
EndIf
Next
End Function

Function UpdatePlayer()
If KeyDown(17) Then
cy=cy+2.5/lfps*60
EndIf
If KeyDown(31) Then
cy=cy-2.5/lfps*60
EndIf
If KeyDown(30) Then
cx=cx+5/lfps*60
EndIf
If KeyDown(32) Then
cx=cx-5/lfps*60
EndIf
Origin cx,cy
plx=640-cx
ply=512-cy
DrawImage pl,plx,ply
End Function

Function UpdateFPS()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
Color 0,0,0
Text -cx,-cy,lfps
End Function

While Not KeyHit(1)


UpdateTiles()
UpdateFPS()
UpdatePlayer()


Flip
Cls
Wend

Напомню, проблема в том, что при создании больше 9000 тайлов начинаются лаги, хотя они даже не рисуются, так что непонятно и почему так происходит.

LLI.T.A.L.K.E.R. 15.03.2012 02:01

Ответ: Vivo
 
For перебор, степени и корни в цикле.
Игрок может и не видит, но эвм о них всех думает с заботой.

Я сделал dll и через ячейки проверяю текущие объекты в них по списку
http://www.youtube.com/watch?v=K0_ehAhhkHQ

Жека 15.03.2012 07:05

Ответ: Vivo
 
1. Переходи на блитцмакс:)
2. Сам цикл с большим числом проходов напрягающ для слабых тачек.

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

На счёт занимания массивом слишком большого объёма памяти: где у тебя хранятся экземпляры тайлов? в списке. а что такое список? это хрень, состоящая из узлов, каждый из которых хранит указатель на данные и на следующие за ними данные.
А в массиве что хранится? те же самые указатели.
Так что жрать памяти должно примерно одинаково (поправьте знающие люди, если не прав), но работать с массивами в разы удобнее. :)

3. R1 R2 для размеров экрана не информативно (для меня)

4. Для поля 1000х1000 твоя прога заняла 42 мб оперативки.

Nikich 15.03.2012 09:15

Ответ: Vivo
 
а на сколько макс сильнее в плане перебора For each? Я и сам об этом думал, он как ни как и на ОП язык тянет, но классы меня сильно пугают:)
Но точно как-то делают без чанков. В Террарии чанков нету вроде, а там значительно больше чем 9000 блоков(в 50 раз как минимум). Также старушка Diablo 2 скорее всего без чанков была, тоже с огромными картами. Видимо у них есть тайные знания...

Жека 15.03.2012 13:40

Ответ: Vivo
 
Возможно, большие поля делят на сектора, и далёкие сектора отсекают. И подгружают их по мере надобности. Это мои догадки лишь.

Про блитцмакс: как только ты поймёшь что такое класс, уже не захочешь без них программить.:)

Вот ссылка на мануал по максу на русском, почитай на досуге, проведи аналогии с блитц3д: Wave’s~ BlitzMax Tutorial ~ 2004 - 7 Jan ~ Version 5

Nikich 15.03.2012 17:36

Ответ: Vivo
 
А и почему R1 и R2 не информативны? Вторая и третья строчка описывают что это за переменные. Я решил не делать меню с выбором разрешений, потому что всегда найдутся люди разрешения которых в списке нету, так что пусть пока играют с максимальным разрешением монитора.
Кстати, чанк и значит сектор:)

Жека 16.03.2012 06:35

Ответ: Vivo
 
> А и почему R1 и R2 не информативны?

х их з. не бери в голову.

а что если делать поля 100х100, но не склеивать их на лету, а делать переход "на новый экран", как у тебя было изначально?

Nikich 16.03.2012 09:24

Ответ: Vivo
 
Да, наверное это единственный выход. Но пример Diablo 2 меня насторожил. Карты там большие, особенно на те времена, а ведь игра шла и не лагала. Может блитц3Д безнадежен?

Жека 16.03.2012 13:34

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222842)
Может блитц3Д безнадежен?

Каждой задаче своё средство реализации.
Для 2д блитцмакс лучше, это всё что я могу сказать про средство.
Почитай в инете на счёт больших карт, и выбери решение подходящее; ну или сам придумай.

ПС: на компе с 4х ядерным процессором с 8гб оперативы и с современной видюхой сделанное на блитц3д летает; когда среднестатистический комп станет таким...

Nikich 16.03.2012 16:57

Ответ: Vivo
 
Кажется понял почему есть проблемы. Оказывается я до сих пор ничего не знал о банках, а они как оказалось полезны.

Nikich 17.03.2012 01:43

Ответ: Vivo
 
Код:

Global rc=CountGfxModes()
Global R1=GfxModeWidth(rc)
Global R2=GfxModeHeight(rc)

Graphics R1,R2
Global fnt1=LoadFont("Arial",24)
SetFont fnt1
SetBuffer BackBuffer()
Dim TileImg(50)
TileImg(0)=LoadImage("ground.bmp")
TileImg(1)=LoadImage("grass.bmp")
Global cx#,cy#,plx#,ply#,tdst,tfps,fps
Global lfps=60
Type tl
 Field x,y,z,id
End Type
Dim tld(10000,10000)
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim ObjImg(50)
For i=0 To 2
ObjImg(i)=LoadImage("rock"+(i+1)+".bmp")
MaskImage ObjImg(i),255,255,255
HandleImage ObjImg(i),48,32
Next

Type obj
 Field x,y,z,id,life
End Type
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim pl(2,2)
For i=-1 To 1
For i1=-1 To 1
pl(i+1,i1+1)=LoadImage("pl"+i+","+i1+".bmp")
MaskImage pl(i+1,i1+1),255,255,255
MidHandle pl(i+1,i1+1)
Next
Next

Global dx,dy
CreateWorld()


Function CreateWorld()
For i=0 To 100
 For j=0 To 100
 tld(i,j)=Rnd(0,1)
 DebugLog i
 Next
Next
End Function


Function UpdateTiles()

For i=Int((R1/2-cx-R1/2-32)/32) To Int((R1/2-cx+R1/2+32)/32)
For j=Int((R2/2-cy-R2/2-16)/16) To Int((R2/2-cy+R2/2+16)/16)


DrawImage TileImg(tld(i*32,j*16)),i*32,j*16


Next
Next
End Function

Function UpdatePlayer()
If KeyDown(17) Then
cy=cy+2.5
dy=1
dx=0
EndIf
If KeyDown(31) Then
cy=cy-2.5
dy=-1
dx=0
EndIf
If KeyDown(30) Then
cx=cx+5
dx=-1
If KeyDown(31)=0 And KeyDown(17)=0 Then 
dy=0
EndIf
EndIf
If KeyDown(32) Then
cx=cx-5
dx=1
If KeyDown(31)=0 And KeyDown(17)=0 Then
dy=0
EndIf
EndIf

Origin cx,cy

plx=R1/2-cx
ply=R2/2-cy
DrawImage pl(dx+1,dy+1),plx,ply
End Function

Function ClObj(x,y)
For o.obj=Each obj
If Int(o\x/64)=x And Int(o\y/32)=y Then
Return True
EndIf
Next
Return False

End Function

Function UpdateFPS()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
Color 0,0,0
Text -cx,-cy,lfps
End Function

While Not KeyHit(1)


UpdateTiles()

UpdateFPS()
UpdatePlayer()



Flip
Cls
Wend

Тайлы 64(ширина) на 32. Помогите найти ошибку. Ругается на UpdateTiles( ничего удивительного, скорее всего я как-то не так написал формулу для вычисления x и y).

Markova 17.03.2012 07:33

Ответ: Vivo
 
Вы это, бросайте там перемножать =) зачем эти коды выкладывать, у тебя массив в минуса уходит =))

Код:

For i=0 To Int((R1/2-cx+R1/2+32)/32)
For j=0 To Int((R2/2-cy+R2/2+16)/16)


For i=Int((R1/2-cx-R1/2-32)/32) To Int((R1/2-cx+R1/2+32)/32)
For j=Int((R2/2-cy-R2/2-16)/16) To Int((R2/2-cy+R2/2+16)/16)

If KeyDown( 2 )=True Then x#=x#-0.1
If KeyDown( 3 )=True Then x#=x#+0.1

Text 10,10*i+(x#),"i:"+i*32
Text 50,10*j+(x#),"j:"+j*16

Next
Next

Проверь Text 10,10,TileImg(-1)


Блин ни как кодек подобрать не могу =))

Nikich 17.03.2012 14:19

Ответ: Vivo
 
Код:

Global rc=CountGfxModes()
Global R1=GfxModeWidth(rc)
Global R2=GfxModeHeight(rc)

Graphics R1,R2
Global fnt1=LoadFont("Arial",24)
SetFont fnt1
SetBuffer BackBuffer()
Dim TileImg(50)
TileImg(0)=LoadImage("ground.bmp")
TileImg(1)=LoadImage("grass.bmp")
Global cx#,cy#,plx#,ply#,tdst,tfps,fps
Global lfps=60
Type tl
 Field x,y,z,id
End Type
Dim tld(10000,10000)
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim ObjImg(50)
For i=0 To 2
ObjImg(i)=LoadImage("rock"+(i+1)+".bmp")
MaskImage ObjImg(i),255,255,255
HandleImage ObjImg(i),48,32
Next

Type obj
 Field x,y,z,id,life
End Type
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim pl(2,2)
For i=-1 To 1
For i1=-1 To 1
pl(i+1,i1+1)=LoadImage("pl"+i+","+i1+".bmp")
MaskImage pl(i+1,i1+1),255,255,255
MidHandle pl(i+1,i1+1)
Next
Next

Global dx,dy
CreateWorld()


Function CreateWorld()
For i=0 To 500
 For j=0 To 500
 tld(i,j)=Rnd(0,1)
 Next
Next
End Function


Function UpdateTiles()

For i=0 To 500
For j=0 To 500

If (i-j)*32+32>-cx And (i-j)*32-32<R1-cx And (i+j)*16+32>-cy And (i+j)*16-32<-cy+R2
DrawImage TileImg(tld(i,j)),(i-j)*32,(i+j)*16
EndIf

Next
Next
End Function

Function UpdatePlayer()
If KeyDown(17) Then
cy=cy+2.5
dy=1
dx=0
EndIf
If KeyDown(31) Then
cy=cy-2.5
dy=-1
dx=0
EndIf
If KeyDown(30) Then
cx=cx+5
dx=-1
If KeyDown(31)=0 And KeyDown(17)=0 Then 
dy=0
EndIf
EndIf
If KeyDown(32) Then
cx=cx-5
dx=1
If KeyDown(31)=0 And KeyDown(17)=0 Then
dy=0
EndIf
EndIf

Origin cx,cy

plx=R1/2-cx
ply=R2/2-cy
DrawImage pl(dx+1,dy+1),plx,ply
End Function

Function ClObj(x,y)
For o.obj=Each obj
If Int(o\x/64)=x And Int(o\y/32)=y Then
Return True
EndIf
Next
Return False

End Function

Function UpdateFPS()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
Color 255,0,255
Text -cx,-cy,lfps
End Function

While Not KeyHit(1)


UpdateTiles()

UpdateFPS()
UpdatePlayer()



Flip
Cls
Wend

В предыдущем коде вам вряд ли многое понятно, так что выкладываю нормальную версию. В общем, нужна помощь в определении i,j ячейки массива зная его координаты.

Жека 18.03.2012 05:16

Ответ: Vivo
 
В тайловой карте вычислять индексы по координатам нет надобности; вот если наоборот то можно.
Всем объектам карты задай индексы cellX, cellX. Игроку конечно тоже.
При перемещении игрока изменяй индексы, пошел вверх - сделал cellY = cellY-1 и т.д.

Сейчас ты проходишь по всему массиву, как делал в for each, но можно только ближние к игроку клетки брать

Local startX% = player\cellX-viewCountX
If(startX < 0) startX = 0
Local endX% = player\cellX+viewCountX
If(endX >= fieldDimX) endX = fieldDimX-1
Local startY% = player\cellY-viewCountY
If(startY < 0) startY = 0
Local endY% = player\cellY+viewCountY
If(endY >= fieldDimY) endY = fieldDimY-1
Local xx%, yy%
For xx=startX to endX
For yy=startY to endY
; здесь только ближние к игроку
Next
Next

Nikich 18.03.2012 12:58

Ответ: Vivo
 
только viewcount_x и viewcount_y еще на два поделить нужно. Большое спасибо!

Nikich 21.03.2012 23:49

Ответ: Vivo
 
Вложений: 1
Сейчас со мной произошла довольно странная вещь. Решив ещё потренироваться в работе с камерой, решил сделать 2D платформер с скроллингом. Возникли трудности, но когда я написал код, я ВНЕЗАПНО задумался, а почему он работает?:) Это повергло меня в шок: я не понял как работает мой же код. Когда я его писал, всё выходило машинально и я даже не думал что я делаю, просто делал и всё.
Код:

Function UpdWorld()
Color 50,100,255
Rect cx,cy,R1,R2,1
DrawImage road(1),cx,R2-100+cy
End Function

Function UpdPl()
cx=R1/2-px
cy=R2/2-py
a=KeyDown(57)
b=KeyDown(32)-KeyDown(30)


If a>0 And air=0 Then
acv#=5
Else
acv#=acv#-0.3
EndIf
If acv#<-6 Then acv#=-6
If acv#>3 Then acv#=3
If b=0 ach=0




speedh#=ach#*5

speedv#=acv#*2.5


pny#=py#-speedv#
px#=pnx#

If pny<R2-100 Then

py#=pny#

Else
acv=0

EndIf

If b<>0 And air=0 And ach=0 Then
ach#=1
ElseIf b<>0 And air=1 And ach=0
ach#=0.5
EndIf
If air=0 And b<>0 ach=1

If b>0 Then
pnx=px+speedh
ElseIf b<0
pnx=px-speedh
EndIf




DrawImage player_image,R1/2,R2/2

Color 0,0,0
Text 0,0,px
Text 0,25,py
Text 0,50,acv
Text 0,75,ach
Text 0,100,air

If acv<>0 Then
air=1
Else
air=0
EndIf
Color 255,255,255
Rect px-5,py-5,10,10,1
End Function

Решив проверить все переменные я вообще запутался. Оказывается, переменные px,py двигаются быстрее игрока, что ли. То есть, они двигаются в каком-то масштабе относительно игрока: когда квадратик с px;py находится в начале экрана, то и игрок находится в начале карты, когда в конце - игрок в конце и тд. , но визуально кажется что игрок медленнее квадратика. Это оптическая иллюзия, или вообще что это за такое и как это происходит?

Hurrit 22.03.2012 02:46

Ответ: Vivo
 
Используй TAB, Люк!

Жека 22.03.2012 11:44

Ответ: Vivo
 
Игрок рисуется в центре экрана; пол рисуется в cx,cy; нижний кубик в px,py.

Названия переменных "человеческие" сделай, и яснее станет что и как у тебя.

Nikich 23.03.2012 09:49

Ответ: Vivo
 
я знаю где что рисуется и что эти переменные значат( cx - camera_x, px - player_x), но я не знаю почему так происходит, что квадрат в рх ру быстрее игрока:(

Markova 23.03.2012 18:41

Ответ: Vivo
 
Rect R1/2-(200),R2/2+(200),10,10,1 ne? =)) вот а так Rect px/5,py/2,10,10,1=) ) медленнее :ok: а что нужно получить:dontknow:

Nikich 23.03.2012 19:15

Ответ: Vivo
 
ничего получать не нужно, все хорошо работает, но я не понимаю как:)

Markova 23.03.2012 19:51

Ответ: Vivo
 
Ну так дело не в квадрате, а в плеере, который привязан к курсору то есть стоящему в середине экрана DrawImage player_image,R1/2,R2/2 =) ) DrawImage player_image,R1/2+px,R2/2+py/3

Nikich 23.03.2012 21:29

Ответ: Vivo
 
Я не понимаю почему px,py двигается быстрее чем игрок( если можно так выразится).

Nikich 22.04.2012 14:07

Ответ: Vivo
 
Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны:)
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).

Halk-DS 22.04.2012 14:14

Ответ: Vivo
 
Где ссылка на скачку демки? (в первом посту искал не нашел)


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

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