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)

Nikich 30.04.2012 09:06

Ответ: Vivo
 
Вложений: 1
Благодаря Максу теперь стало возможным сделать градиентный свет!

Randomize 30.04.2012 11:08

Ответ: Vivo
 
Реквестирую конфигу чтоб можно былом сменить разрешение и устанавливать оконный режим.
Comic Sans MS - плохой шрифт.

Nikich 30.04.2012 11:22

Ответ: Vivo
 
Оконный режим сделаю как в Майнкрафте, разрешение пока не знаю. Может тоже на F какой-нибудь. Менюшку делать так долго... И чем Comic Sans плох?
Кстати, можно тему перенести в проекты на Максе?

Randomize 30.04.2012 11:28

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

Сообщение от Nikich (Сообщение 226856)
Оконный режим сделаю как в Майнкрафте,

Повесь на Alt+Enter. В блицмаксе заново грузить ресурсы при смене разрешения не нужно так как там есть TPixmap
Цитата:

Сообщение от Nikich (Сообщение 226856)
И чем Comic Sans плох?

Плохо читается и не лаконичен. Шрифт сугубо декоративный и важную информацию им лучше не писать.



Цитата:

Сообщение от Nikich (Сообщение 226856)
Кстати, можно тему перенести в проекты на Максе?

Done.

Nikich 30.04.2012 11:59

Ответ: Vivo
 
Thanks!
а можно подробнее о пиксмапах?

Randomize 30.04.2012 12:19

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

Сообщение от Nikich (Сообщение 226859)
Thanks!
а можно подробнее о пиксмапах?

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

Дак вот в BlitzMax есть класс Image.
Он содержит в себе Pixmap и ссылку на хранимое в видеокарте изображение.

Pixmap это преобразованный специальным образом для видео карты универсальный набор пикселей. Который позволяет "на лету" менять разрешение экрана и даже сменять в реальном времени GAPI с DirectX на OpenGL например. Он хранится у тебя локально в оперативе компа. И когда стартует 3d девайз или перезапускается (смена разрешения) пиксмапа закачивается в видео память в виде 2D текстуры.

Работа с пиксмапой ничего не требует. Вся работа с ней скрыта за тенью LoadImage LoadAnimImage. И ты просто можешь менять разрешение "на лету" не перезагружая заново все ресурсы как бы это надо было бы делать в Blitz3D.

писал с бодуна, могу хреново выражаться

Nikich 30.04.2012 23:11

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

NitE 30.04.2012 23:36

Ответ: Vivo
 
Погрешность чего?

Nikich 30.04.2012 23:41

Ответ: Vivo
 
Есть расстояние между игроком и блоком под ним. Иногда он немного выше, иногда - в сам блок влазит. Дело косметическое, понимаю, но мелочь довольно не приятная. И вообще, как делаются правильно прыжки? Вот мой черновой вариант:
Код:

dx=KeyDown(KEY_D)-KeyDown(KEY_A)
If map[(camera_x+R1/2)/32,(camera_y-g+R2/2)/32+1]=1; Проверяем блок под игроком, если земля - g=0, если нет - g=g-3
g=0
If KeyDown(KEY_SPACE) g=20
Else
g=g-3
EndIf
If g<-5 g=-5



If map[(camera_x+dx*speed+R1/2)/32,(camera_y+R2/2)/32]=0; Проверяем следующий блок в который хочет пойти игрок
camera_x=camera_x+dx*speed
EndIf

camera_y=camera_y-g


Жека 01.05.2012 07:30

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

Nikich 01.05.2012 23:46

Ответ: Vivo
 
Что-то всё равно не очень гладко выходит. Есть у кого исходники платформеров на максе ил блитц3д? Буду благодарен. Или пожалуйста, просто киньте сюда код отвечающий за передвижение и прыжки.

Жека 02.05.2012 05:42

Ответ: Vivo
 
Вот этот проект посмотри: http://forum.boolean.name/showthread.php?t=5751

Nikich 02.05.2012 14:29

Ответ: Vivo
 
Спасибо. Кстати, можно ли как-то сделать Include "abc.txt"? Мне очень понравилась система в Stranded 2. Там вообще можно новую игру в .txt написать.

Randomize 02.05.2012 14:42

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

Сообщение от Nikich (Сообщение 227066)
Спасибо. Кстати, можно ли как-то сделать Include "abc.txt"? Мне очень понравилась система в Stranded 2. Там вообще можно новую игру в .txt написать.

Нет. Блитзмакс это не скриптовик и он не может после компиляции обрабатывать Include.

То, что Include это не директива - странно, но этому есть применение.
Include может возвращать результат, Include можно вызывать по условию и тд.

По сути весь твой код внутри Include оборачивается как бы в функцию (на самом деле GOTO) и его можно вызывать сколь угодно раз, однако не советую так делать. Для этого есть функции/методы.

А при компиляции все твои Include компилируются в exe вместе с главным файлом вне зависимости от того как ты эти include используешь.

То, что ты хочешь сделать именуется скриптовым языком. В Stranded используется LUA. В BlitzMax уже есть модуль работы с LUA и даже несколько сторонних модулей упрощающих работу с ним.

Немного на русском
http://blitzetc.blitzmax.ru/index.php/BlitzMax_и_LUA

Wiki по встроенному в BlitzMax модулю LUA
http://en.wikibooks.org/wiki/BlitzMa...Other/Lua_Core


AXE LUA модуль
http://en.wikibooks.org/wiki/BlitzMax/Modules/Axe/Lua
http://lua-users.org/wiki/BlitzMax

Мануал по синтаксису LUA (можно особо не зачитываться так как луа простейший)
http://www.lua.org/manual/5.1/

Nikich 02.05.2012 17:16

Ответ: Vivo
 

Код:

Graphics DesktopWidth(),DesktopHeight()
Global R1=GraphicsWidth()
Global R2=GraphicsHeight()
SeedRnd MilliSecs()
Global player_image=LoadImage("images\player.png")
SetImageHandle player_image,15,32
Global dx,dy,camera_x,camera_y,g#,mouse_block_x,mouse_block_y
Global speed=5
camera_x=4000
camera_y=200
Global map_width,map_height
map_width=500
map_height=500
Global block[100]
block[0]=LoadImage("images\blocks\sky.png")
block[1]=LoadImage("images\blocks\ground.png")
Global map[map_width+1,map_height+1]
Global key_hit_1,key_hit_2
Global fps,lfps,tfps
Function Create_world()
For i=0 To 500
For i1=0 To 500
If i1>50
map[i,i1]=1
Else
map[i,i1]=0
EndIf
Next
Next
End Function

Create_world()

Function Update_camera()
dx=KeyDown(KEY_D)-KeyDown(KEY_A)




If map[(camera_x+R1/2)/16,(camera_y+R2/2)/16+1]=1
g=0

 If KeyDown(KEY_SPACE) g=5

camera_y=Int(camera_y/16+1)*16-6-g

Else
g=g-0.4
 If g<-3 g=-3

 If g>0
  If Not collision()
  camera_y=camera_y-g
  EndIf
 Else
  If map[(camera_x+R1/2)/16,(camera_y+R2/2)/16+1]=0
  camera_y=camera_y-g
  EndIf
 EndIf
EndIf



If Not collision()
camera_x=camera_x+dx*speed
EndIf


End Function

Function collision()

For i=(camera_x+dx*5*speed+R1/2)/16-2 To (camera_x+dx*5*speed+R1/2)/16+2
For i1=(camera_y+R2/2)/16-2 To (camera_y+R2/2)/16
If map[i,i1]=1
If ImagesCollide(player_image,R1/2,R2/2,0,block[map[i,i1]],i*16-camera_x,i1*16-camera_y,0)
Return True
EndIf
EndIf
Next
Next

End Function

Function Draw_world()
mouse_block_x=(camera_x+MouseX())/16
mouse_block_y=(camera_y+MouseY())/16

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

If key_hit_1
If mouse_block_x=i And mouse_block_y=i1 map[i,i1]=1
EndIf
If key_hit_2
If mouse_block_x=i And mouse_block_y=i1 map[i,i1]=0
EndIf
Next
Next
DrawImage player_image,R1/2,R2/2

End Function


Function Update_HUD()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
SetColor 255,255,255
SetAlpha 1

DrawText "FPS: "+lfps,0,0
DrawText "mouse_block_x: "+mouse_block_x+"  mouse_block_y: "+mouse_block_y+" g: "+g,0,24
End Function

While Not KeyHit(KEY_ESCAPE)
key_hit_1=MouseHit(1)
key_hit_2=MouseHit(2)
Update_camera()
Draw_world()
Update_HUD()
Flip(1)
Cls
Wend


Блин, что-то вконец ничего не получается. С осью y разобрался, а вот с x вообще лажа:( Помогите найти ошибку, пожалуйста. Проблема в том, что игрок всё равно может проникнуть через блок. Хотя я думаю что у меня подход неверный, коллизии в тайловой игре как-то не очень.
З.Ы. код jimon'a посмотреть не смог, файл удалили.


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

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