forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Опять проблемы. (http://forum.boolean.name/showthread.php?t=16119)

Nikich 28.12.2011 17:18

Опять проблемы.
 
Код:

If KeyDown(200) Then
a=1
y=y-speed
EndIf
If KeyDown(208) Then
a=1
y=y+speed
EndIf
If KeyDown(205) Then
a=2
x=x+speed
EndIf
If KeyDown(203) Then
a=2
x=x-speed
EndIf

If KeyHit(200) And a=2 Then RotateImage hero,90
If KeyHit(208) And a=2 Then RotateImage hero,90
If KeyHit(205) And a=1 Then RotateImage hero,90
If KeyHit(203) And a=1 Then RotateImage hero,90

Изображение не вращается, хотя, если мониторить переменную "a", то она
меняется.

radiobutton 28.12.2011 17:23

Ответ: Опять проблемы.
 
Цитата:

Сообщение от Nikich (Сообщение 215559)
Код:

If KeyDown(200) Then
a=1
y=y-speed
EndIf
If KeyDown(208) Then
a=1
y=y+speed
EndIf
If KeyDown(205) Then
a=2
x=x+speed
EndIf
If KeyDown(203) Then
a=2
x=x-speed
EndIf

Then RotateImage hero,90
If KeyHit(208) And a=2 Then RotateImage hero,90
If KeyHit(205) And a=1 Then RotateImage hero,90
If KeyHit(203) And a=1 Then RotateImage hero,90

Изображение не вращается, хотя, если мониторить переменную "a", то она
меняется.

If KeyDown(200) Then
a=1

и

If KeyHit(200) And a=2

поэтому не вертица

а вообще код какая то бессмысленица. опиши что у тебя должно происходить при нажатии на кнопки.

Nikich 28.12.2011 17:32

Ответ: Опять проблемы.
 
Переменная "a" отвечает за то, можно ли сейчас вращать картинку. Я делаю TDS и мне надо сделать так, чтобы главный герой поворачивался в ту сторону, в которую идёт. То есть, при нажатии на кнопку вверх, он должен смотреть вверх и тп. Но если просто ставить, что при нажатии на кнопку вверх картинка вращается на 90 градусов, то при повторном нажатии он опять повернётся и будет идти вверх боком)

radiobutton 28.12.2011 17:46

Ответ: Опять проблемы.
 
тогда что-то вроде этого.

Код:

hero1 = loadimage("hero.bmp")
hero2 = copyimage(hero1)
rotateimage hero2, 90
hero3 = copyimage(hero1)
rotateimage hero3, 180
hero4 = copyimage(hero1)
rotateimage hero4, 270

................

If KeyHit(200)
b=1
end if
If KeyHit(208)
b=3
end if
If KeyHit(205)
b=4
end if
If KeyHit(203)
b=2
end if

...................

select b
case 1
drawimage hero1,x,y
case 2
drawimage hero2,x,y
case 3
drawimage hero3,x,y
case 4
drawimage hero4,x,y
end select

потому что
Цитата:

RotateImage image,value#

Эта команда работает не достаточно быстро, чтобы выполнять вращение рисунка в режиме реального времени!

Цель этой команды состоит в том, чтобы повернуть изображение на указанный угол. Так как она работает медленно, Вы должны будете это сделать заранее, до того, как они будут выведены на экран.

у тебя не совсем реальное время, но поворачиваться будит не только герой же?)

Nikich 28.12.2011 18:01

:super:
Еее, большое спасибо!

Crayzi 29.12.2011 00:41

Ответ: Опять проблемы.
 
Еще если собираешся делать игру в 2д то посоветовал бы посмотреть в сторону Draw3d или FastImage.

Nikich 31.12.2011 15:36

Ответ: Опять проблемы.
 
Код:

Function UpdateStones()
For i=0 To 20
 DrawImage stone(i),xs(i),ys(i)
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=3 Then
 speed=0
 x=x-1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=1 Then
 speed=0
 y=y+1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=2 Then
 speed=0
 y=y-1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=4 Then
 speed=0
 x=x+1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=5 Then
 speed=0
 x=x+1
 y=y+1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=6 Then
 speed=0
 x=x-1
 y=y+1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=7 Then
 speed=0
 x=x+1
 y=y-1
 EndIf
 If ImagesCollide(gert,x,y,frames,stone(i),xs(i),ys(i),0) And col=8 Then
 speed=0
 x=x-1
 y=y-1
 EndIf
 If ImagesCollide(cursor,MouseX(),MouseY(),0,stone(i),xs(i),ys(i),0) And MouseHit(1) Then
 shp(i)=shp(i)-10
 EndIf
 If shp(i)=0 Then
 FreeImage stone(i)
 EndIf
 Text MouseX(),MouseY(),shp(1)+"      "+shp(2)+"      "+shp(3)+"      "+shp(4)+"      "+shp(5)+"      "+shp(6)+"      "+shp(7)+"      "+shp(8)+"      "+shp(9)+"      "+shp(10)+"      "+shp(11)+"      "+shp(12)+"      "+shp(13)+"      "+shp(14)+"      "+shp(15)+"      "+shp(16)+"      "+shp(17)+"      "+shp(18)+"      "+shp(19)+"      "+shp(20)+"      "
Next
End Function

И так, у меня опять что-то пошло не так. Эта функция отвечает за прорисовку камней на карте. Они генерируются случайным образом, из-за этого я прибег к переменным. С типами у меня туго, так что мой выбор пал на массивы) В общем, рисуются они хорошо, коллизия конечно не идеально( если подойти к камню и зажать две противоположные клавиши(вверх-вниз, вправо-влево), то главного героя начнёт щемить в камни), но не это главное. Когда я решил сделать так, чтобы при нажатии
мыши на камень десять раз, он разрушался. Как-раз тут и начались проблемы. Если отслеживать переменную "shp" которая отвечает за "жизни" камней, то она будет отниматься, но не должным образом. Она отнимается то ли с каким-то шансом, то ли в какое-то время. В общем мне нужна ваша помощь в двух вещах:
1). Помогите найти ошибку.
2). Допустим, всё-таки я уничтожу этот камень функцией FreeImage. Но когда цикл начнётся заново, то на функции DrawImage он остановится, из-за того, что данного изображения больше не существует:) Так что пожалуйста, помогите и с этой проблемой.

mauNgerS 01.01.2012 09:56

Ответ: Опять проблемы.
 
Типы решат все твои проблемы.
Вечером, время будет, напишу код.

П. С. Может кто-нибудь вперёд ответит.

Nikich 01.01.2012 12:54

Ответ: Опять проблемы.
 
Я и не тороплю с ответом.

mauNgerS 01.01.2012 20:08

Ответ: Опять проблемы.
 
Код:

Global cursor
Global LClick, mx#, my#; задаём переменные для мыши глобально

; объявляем тип
Type Main
        Field stone; камень
        Field x#, y#; координаты камня
        Field life; жизнь камня
End Type

Graphics3D 800, 600,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

cursor=LoadImage("c.bmp")
CreateStone(50); делаем камни

HidePointer
Repeat
Cls
Mouse()

UpdateStones(); обновляем камни
DrawImage cursor, mx, my

Flip 0
Until KeyHit(1)
End

Function CreateStone(imax%=0)
        For i=1 To imax
                m.Main=New Main; создаём новый элемент типа, далее следует то, что храним в этом элементе
                m\stone=LoadImage("h.bmp"); камень
               
                m\x=Rnd(100,700); координата х
                m\y=Rnd(100,500); координата y

                m\life=10; жизнь
        Next
End Function

Function UpdateStones()
        For m.Main=Each Main; перебираем тип
                DrawImage m\stone, m\x, m\y
       
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y, 0) And LClick=2
                        m\life=m\life-1
                EndIf
       
                If m\life=0
                        FreeImage m\stone; удаляем каменнь
                        Delete m; удаляем элемент типа
                EndIf
        Next
End Function

Function Mouse(); функция для срабатывания мыши по отпусканию кнопки
        mx=MouseX()
        my=MouseY()

        If LClick=2 LClick=0
        If LClick=0
                If MouseDown(1) LClick=1
        Else
                If Not MouseDown(1)
                        LClick=2
                EndIf
        EndIf
End Function

Тип это как картотека в библиотеке. Элемент типа это карточка и в ней может хранится что угодно.

Когда мы перебираем тип, это как цикл. Только цикл фиксирован, допустим от 0 до 20. А перебор типа перебирает все элементы. По ходу действия программы можно удалять или добавлять элементы, это не вызовет ошибки.

Как-то так:)

radiobutton 01.01.2012 23:10

Ответ: Опять проблемы.
 
Зачем для каждого камня загружать картинку в память, если все камни одинаковые? Нужна всего 1 картинка.

Nex 02.01.2012 05:32

Ответ: Опять проблемы.
 
Код:

Global stone = LoadImage("h.bmp"); камень

;в функцию CreateStone вторым параметром передаем ссылку на картинку (stone).

Function CreateStone(imax%=0,image)
        For i=1 To imax
                m.Main=New Main; создаём новый элемент типа, далее следует то, что храним в этом элементе
                m\stone=image; используем уже загруженную картинку
               
                m\x=Rnd(100,700); координата х
                m\y=Rnd(100,500); координата y

                m\life=10; жизнь
        Next
End Function


mauNgerS 02.01.2012 07:28

Ответ: Опять проблемы.
 
Цитата:

;в функцию CreateStone вторым параметром передаем ссылку на картинку (stone).
тогда уже Global не нужно

П. С. Так конечно и cursor можно сделать не глобально:)

Nikich 11.01.2012 23:54

Ответ: Опять проблемы.
 
Большое спасибо. А есть способ как-нибудь по другому сделать коллизию?

LLI.T.A.L.K.E.R. 12.01.2012 02:23

Ответ: Опять проблемы.
 
Цитата:

Допустим, всё-таки я уничтожу этот камень функцией FreeImage. Но когда цикл начнётся заново, то на функции DrawImage он остановится, из-за того, что данного изображения больше не существует Так что пожалуйста, помогите и с этой проблемой.
Код:

Function UpdateStones()
        For m.Main=Each Main; перебираем тип
                DrawImage m\stone, m\x, m\y
       
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y, 0) And LClick=2
                        m\life=m\life-1
                EndIf
       
                If m\life=0
                        FreeImage m\stone; удаляем каменнь
                        Delete m; удаляем элемент типа
                EndIf
        Next
End Function

Делай проверку на отсутствие/присутствие:
m<>Null

Код:

For m.Main=Each Main ; перебираем тип
If m<>Null then ; проверка есть ли этот камень в памяти (точнее, если не равен пустоте)

И почему m.Main? Как это связано с камнем (stone)
Почему не так: s.Stones или Stone.StoneType

Код:

Type StoneType
        Field image; рисунок камня
        Field x#, y#; координаты камня
        Field life; жизнь камня
End Type


LLI.T.A.L.K.E.R. 12.01.2012 02:33

Ответ: Опять проблемы.
 
Не связывался в B3D 2D-картинками.. Не знаю про скорости 2D-алгоритмов.

Я в delphi так делал: 1) у камня есть позиция x,y и высота,ширина.
2) потом можно проверить попала точка курсора (при клике) в позицию камня +-высота +-ширина:
если (x_камня+ширина<x_курсора>x_камня-ширина) и (y_камня+высота<y_курсора>y_камня-высота)
Так. Пишу быстро на словах.

Код:

UpdateStones(); обновляем камни
DrawImage cursor, mx, my

И сперва игроку отобрази курсор, потом вычисляй что он (курсор) натворит.

Nikich 12.01.2012 17:38

Ответ: Опять проблемы.
 
Не-не-не. Я не про то. Я про коллизию игрока с камнем:)
Если делать как я, то будет возможность проникновения игрока в камень, если зажать например клавишу вверх и вниз.
А и ещё, на чистом дельфи сложно TDS в одиночку сделать?

LLI.T.A.L.K.E.R. 12.01.2012 23:29

Ответ: Опять проблемы.
 
Цитата:

Сообщение от Nikich (Сообщение 216638)
А и ещё, на чистом дельфи сложно TDS в одиночку сделать?

Намного лучше для 3D - Blitz3D.

Для 2D - попробуй BlitzMAX.

Nikich 13.01.2012 00:15

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

Nikich 13.01.2012 17:22

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

Nikich 14.01.2012 13:40

Ответ: Опять проблемы.
 
Так, я переделал немного перемещение игрока, но всё равно игрок может проникнуть в камни
Код:

If KeyDown(200)  Then
col1=1
speed#=speed#+0.1
a=2
b=1
y=y-speed#
EndIf
If KeyDown(208)  Then
col1=2
speed#=speed#+0.1
a=2
b=1
y=y+speed#
EndIf
If KeyDown(205) Then
col1=3
speed#=speed#+0.1
a=1
b=0
x=x+speed#
EndIf
If KeyDown(203) Then
col1=4
speed#=speed#+0.1
a=1
b=0
x=x-speed
EndIf
If KeyDown(205) And KeyDown(200) Then
col1=5
speed#=speed#+0.1
a=5
b=2
EndIf
If KeyDown(203) And KeyDown(200) Then
col1=6
speed#=speed#+0.1
a=7
b=3
EndIf
If KeyDown(205) And KeyDown(208) Then
col1=7
speed#=speed#+0.1
a=9
b=4
EndIf
If KeyDown(203) And KeyDown(208) Then
col1=8
speed#=speed#+0.1
a=11
b=5
EndIf
If speed#>5 speed#=5
If speed#<0 speed#=0
If KeyDown(203)=0 And KeyDown(208)=0 And KeyDown(205)=0 And KeyDown(200)=0 Then speed#=0
...
If ImagesCollide(gert,x,y,frames,m\stone,m\x,m\y,0) speed=speed-5
...


Nex 14.01.2012 15:19

Ответ: Опять проблемы.
 
Делай в 3д.
Создаешь квад с текстурой камня, добавляешь ему коллизию и все гуд.

FireOwl 14.01.2012 17:09

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

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

Останется проблема "проскакивания" препятствий на слишком большой скорости из-за слишком больших скачков за шаг (на 10-20 пикселов например). Тогда можно не только проверять координаты следующего шага, а еще брать пару точек между старой и новой координатой.

Nikich 14.01.2012 18:00

Ответ: Опять проблемы.
 
Можно ли подробнее о векторном перемещении?
И если делать в 3D как сделать так, чтобы создавалась иллюзия что игра двухмерная?

FireOwl 14.01.2012 18:06

Ответ: Опять проблемы.
 
Имею ввиду, что где-то в программе есть две переменные (или больше, по числу измерений пространства) типа deltax, deltay. В которых хранится сдвиг координат игрока на текущий шаг/кадр. И еще отдельно скорость speed#.

Потом, в момент сдвига координаты игрока суммируются с координатами сдвига:
px# = px + deltax*speed#
py# = py + deltay*speed#
Расчет удобно производить в дробных числах, а для отрисовки графики потом откидывать дробную часть.

Пример:
Влево-вверх: deltax=-1; deltay=-1
Вправо-вверх: deltax=1; deltay=-1
Вниз: deltax=0; deltay=1

Ну и вариации, в зависимости от нужд. Можно тоже дробями сделать.

Nikich 14.01.2012 19:44

Ответ: Опять проблемы.
 
Спасибо! А такое "предсказывание" следующего шага не сильно на производительность влиять будет?

FireOwl 14.01.2012 19:54

Ответ: Опять проблемы.
 
Лишний if? Нет.
Собственно ничего сильно не меняется. Производительность сжирают громоздкие переборы и обработки сложных вычислений или больших объемов данных.

Сильнее всего на производительность влияет необходимость перебирать каждый кадр все камни, для проверки на столкновение с каждым. Но от этого уже никуда не деться. (Да и камней вряд ли будет ОЧЕНЬ много. :))
Все трехмерные функции типа "коллизий" тоже этим занимаются.

Nikich 14.01.2012 20:14

Ответ: Опять проблемы.
 
Хотя да, 20 камней уж точно потянет:)
Еще появился вопрос с редактором уровней. Есть ли какой-нибудь не громоздкий способ? По-моему это делается как-то с двухмерным массивом, но вряд ли это правильно:)

FireOwl 14.01.2012 20:37

Ответ: Опять проблемы.
 
Игры всякие бывают. Где-то удобнее строить по клеточкам. Там к месту массив.

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

Nikich 14.01.2012 21:11

Ответ: Опять проблемы.
 
Спасибо.
И, надеюсь, последний вопрос:) Как расчитывается FPS?

FireOwl 14.01.2012 21:36

Ответ: Опять проблемы.
 
Давно дело было, не помню уже. Но вопрос на форуме популярный был.
Вот, например (измерение):
http://forum.boolean.name/showthread.php?t=5
Еще (дельта-тайминг):
http://forum.boolean.name/showthread.php?t=8549

Ну и еще можно поискать.

dsd 14.01.2012 22:32

Ответ: Опять проблемы.
 
Однако чет я притормаживаю :)
меряешь время в начале цикла, меряешь в конце. второе-первое даст какие-то миллисекунды. делишь 1000 на эти миллисекунды если количество миллисекунд больше 0, это значение и есть фпс. Если миллисекунды 0, то выводишь текстом, что фпс >1000.
Можно выводить усредненное значение. Считать например среднее значение последних 50 кадров и выводить его.

Nikich 14.01.2012 22:44

Ответ: Опять проблемы.
 
Сейчас прочитал те ссылки, и ужаснулся. На счет скорости игры. То есть на более мощном или наоборот слабом компьютере чем у меня, скоросто передвижения игрока везде будет разной?

FireOwl 14.01.2012 22:49

Ответ: Опять проблемы.
 
Именно так. Чтобы фпс не зависел от машины, надо собственноручно отмерять каждый кадр (суть есть дельта-тайминг). :)

Nikich 14.01.2012 22:56

Ответ: Опять проблемы.
 
Как это?:) Я уже планировал как-нибудь ограничивать максимальный фпс:)

FireOwl 14.01.2012 23:04

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

Nikich 14.01.2012 23:40

Ответ: Опять проблемы.
 
Да, тут много всего. Хотя и стандартный таймер тоже работает:)

Nikich 15.01.2012 15:07

Ответ: Опять проблемы.
 
Код:

If KeyDown(200)  Then
deltay#=-1
deltax#=0
a=2
b=1
EndIf
If KeyDown(208)  Then
deltay#=1
deltax#=0
a=2
b=1
EndIf
If KeyDown(205) Then
deltax#=1
deltay#=0
a=1
b=0
EndIf
If KeyDown(203) Then
deltax#=-1
deltay#=0
a=1
b=0
EndIf
If KeyDown(205) And KeyDown(200) Then
deltay#=-1
deltax#=1
a=5
b=2
EndIf
If KeyDown(203) And KeyDown(200) Then
deltay#=-1
deltax#=-1
a=7
b=3
EndIf
If KeyDown(205) And KeyDown(208) Then
deltay#=1
deltax#=1
a=9
b=4
EndIf
If KeyDown(203) And KeyDown(208) Then
deltay#=1
deltax#=-1
a=11
b=5
EndIf

If KeyDown(203)=0 And KeyDown(208)=0 And KeyDown(205)=0 And KeyDown(200)=0 Then
speed#=0
deltax#=0
deltay#=0
EndIf

If x#<0 Then x#=1280
If x#>1280 Then x#=0
If y#<0 Then y#=1024
If y#>1024 Then y#=0



speed#=5
x#=px#+deltax#*speed#
px#=x#
y#=py#+deltay#*speed#
py#=y#

Сделал векторное перемещение игрока, но теперь игрок может выйти за пределы экрана, то есть
Код:

If x#<0 Then x#=1280
If x#>1280 Then x#=0
If y#<0 Then y#=1024
If y#>1024 Then y#=0

не работает:( Хотелось бы узнать почему?

Nikich 15.01.2012 15:27

Ответ: Опять проблемы.
 
Также создал систему коллизий, которая тоже не работает:(
Код:

For m.Main=Each Main
nx#=px#+deltax#*speed#
ny#=py#+deltay#*speed#
If x#>m\x+65 And y#>m\y+65 Then
 If nx#>m\x+65 And ny#>m\y+65 Then
 px#=x#
 py#=y#
 x#=nx#
 y#=ny#
 EndIf
EndIf
If x#<m\x-1 And y#<m\y-1 Then
 If nx#<m\x-1 And ny#<m\y-1 Then
 px#=x#
 py#=y#
 x#=nx#
 y#=ny#
 EndIf
EndIf
If x#>m\x+65 And y#<m\y-1 Then
  If nx#>m\x+65 And ny#<m\y-1 Then
  px#=x#
  py#=y#
  x#=nx#
  y#=ny#
  EndIf
EndIf
If x#<m\x-1 And y#>m\y+65 Then
  If nx#<m\x-1 And ny#>m\y+65 Then
  px#=x#
  py#=y#
  x#=nx#
  y#=ny#
  EndIf
EndIf
Next

Хотя логически, по-моему, всё верно.
P.S. О "m.main" можно прочитать на первой странице темы, где описывались функции создания и обновления камней.

FireOwl 15.01.2012 17:02

Ответ: Опять проблемы.
 
Код:

deltax#=0
deltay#=0
speed#=0

If KeyDown(200)  Then deltay#=-1
If KeyDown(208)  Then deltay#=1
If KeyDown(205) Then deltax#=1
If KeyDown(203) Then deltax#=-1

(громоздко конечно)
If KeyDown(203) Or KeyDown(208) Or KeyDown(205) Or KeyDown(200) Then
speed#=5.0
EndIf

(пусть px - временные, а x - окончательные координаты)
px=x+deltax*speed
py=y+deltay*speed

If px<0 Then px=1280
If px>1280 Then px=0
If py<0 Then py=1024
If py>1024 Then py=0

***отдельно где-то, где все функции***
Function CollideStones(px,py)
        For s.stone=Each stone
                (коллизия или проверка координат, все равно вроде)
                If ImagesCollide(player,px,py,0,stoneimage,s\x, s\y, 0)
                        Return True
                EndIf
        Next
        Return False
End Function
***

If Not CollideStones(px,py) then
        x=px
        y=py
Endif

Вот, я бы так переделал.

Nikich 15.01.2012 18:19

Ответ: Опять проблемы.
 
Мда оптимизация у меня сильно хромает:) У меня 98 строчек и всё не работает, у тебя 28 строчек и всё работает:)
Но я не совсем понимаю работу с типами функцией
Код:

For s.stone=Each stone
Когда работаешь с массивами, то делаешь так:
Код:

For i=0 to imax
...
array(i)=...
...

То есть у массива есть свой идентификатор. А в типах как это работает?

FireOwl 15.01.2012 18:41

Ответ: Опять проблемы.
 
Цикл For Each...Next перебирает последовательно все существующие экземпляры данного типа (у меня Main переименован в stone, для понятности)
То есть каждый шаг переменная s получает значение очередного экземпляра (вернее даже будет "ссылается", а не "получает").

Nikich 15.01.2012 18:46

Ответ: Опять проблемы.
 
Тогда как взаимодействовать не со всеми, а например с 3?
Код:

...
s.stone=3
...

Так?

FireOwl 15.01.2012 18:53

Ответ: Опять проблемы.
 
Нет.
Вот тут подробно: http://help.boolean.name/commands/2d_commands/Type.htm

Nikich 15.01.2012 19:09

Ответ: Опять проблемы.
 
То есть единственный способ это использовать after,before,first и last?

FireOwl 15.01.2012 19:11

Ответ: Опять проблемы.
 
Выходит, что так.

Nikich 15.01.2012 20:01

Ответ: Опять проблемы.
 
Код:

Function UpdateStones()
        For m.Main=Each Main
                DrawImage m\stone, m\x, m\y
            distance=Sqr((m\x-x)*(m\x-x)+(m\y-y)*(m\y-y)) 
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y,0) And LClick=2
                        m\life=m\life-1
                        lol=1
                EndIf
       
                If m\life=0
                        FreeImage m\stone
                        Delete m
                EndIf
        Next
                If KeyDown(2) Then
                m.Main= New Main
                m\x=MouseX()
                m\y=MouseY()
                m\stone=LoadImage("stone.bmp")
                EndIf               
End Function

Опять что-то не так. Камень всё время двигается за мышкой:(

FireOwl 15.01.2012 20:18

Ответ: Опять проблемы.
 
А ты уверен, что это происходит здесь? Вряд ли KeyDown(2) все время возвращает истину. Поищи по коду, "закоментируй" подозрительные инструкции и т.д.

Nikich 15.01.2012 20:28

Ответ: Опять проблемы.
 
Да, это здесь, я только здесь писал. На счёт KeyDown(2) да, не всегда истинна но это легко исправляется. Например:
Код:

Function UpdateStones()
        For m.Main=Each Main
                DrawImage m\stone, m\x, m\y
            distance=Sqr((m\x-x)*(m\x-x)+(m\y-y)*(m\y-y)) 
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y,0) And LClick=2
                        m\life=m\life-1
                        lol=1
                EndIf
       
                If m\life=0
                        FreeImage m\stone
                        Delete m
                EndIf
        Next
                If KeyDown(2) Then
                a=1
                endif
                if a=1 then
                m.Main= New Main
                m\x=MouseX()
                m\y=MouseY()
                m\stone=LoadImage("stone.bmp")
                EndIf               
End Function

Ну как-то так. Но тогда нажмёшь на "1", то камень появится на х и у мышки и будет за ней двигаться. Хотя он должен 1 раз взять и присвоить себе координаты мышки:(

FireOwl 15.01.2012 20:42

Ответ: Опять проблемы.
 
Зачем надо, чтобы всегда была истинна? Я просто предполагал причину появления камней.
Необходимо ведь, чтобы камень появился однократно?

А если при создании камня, сделать m\life, например, 100?

А KeyDown надо переделать на KeyHit.

Nikich 15.01.2012 21:07

Ответ: Опять проблемы.
 
Да, как раз в этом и была проблема. Он то создавался, но сразу рушился т.к. m\life был равен нулю:) Тогда такой способ, видимо, очень хорош в создании редакторов уровней. И клеточек нету, и сохранять удобно.

LLI.T.A.L.K.E.R. 15.01.2012 21:25

Ответ: Опять проблемы.
 
Цитата:

Сообщение от Nikich (Сообщение 216877)
То есть единственный способ это использовать after,before,first и last?

Обождите товарищи!
Делал я dll-ку - внесение списка типов в массив. В проверки выводил список обратно: были цифры 1,2,3 и т.д.
Значит брал я Entity из массива так
Terrain.WorldMap=Object.WorldMap(GetHandle(Obj))

Получается:
ТвойОбъект.ТвойТип=Object.ТвойТип(GetHandle(3))
выдаст объект под номером 3

Проверил:
Код:

Terrain.WorldMap=Object.WorldMap(GetHandle(2))
PositionEntity Terrain\mesh,-5,-1,-5

да он переместился!

Так, стоп!
GetHandle() это моя личная функция (которой нет в B3D), для вывода из номера ячейки..

Ну если очень нужно, то выход будет - делать массив с Handle на объекты.

LLI.T.A.L.K.E.R. 15.01.2012 21:48

Ответ: Опять проблемы.
 
Цитата:

Сообщение от Nikich (Сообщение 216896)
Да, как раз в этом и была проблема. Он то создавался, но сразу рушился т.к. m\life был равен нулю:) Тогда такой способ, видимо, очень хорош в создании редакторов уровней. И клеточек нету, и сохранять удобно.

Напиши подробно что ты хочешь сделать (какую игру).. Для чего камни, что с ними делать. Какой игрок и управление и т.п.
Дай исходник, чтобы попробовать сделать по-своему..
Потом посмотрим на решения (но чтобы не брать готовое, а посмотреть как нужно было делать).

Nikich 15.01.2012 22:31

Ответ: Опять проблемы.
 
Жанр - tds. Игра будет как Stranded 2, только вид сверху. Но строительство будет ближе к Minecraft'y, то есть квадратиками. Сейчас самое важное добавить в игру инвентарь. Исходники смогу дать только завтра. Ну, а камни для строительства или создания вещей.

Nikich 15.01.2012 23:30

Ответ: Опять проблемы.
 
Исходник и все файлы.

Crayzi 16.01.2012 08:57

Ответ: Опять проблемы.
 
Код:

Function UpdateStones()
        For m.Main=Each Main
                DrawImage m\stone, m\x, m\y
            distance=Sqr((m\x-x)*(m\x-x)+(m\y-y)*(m\y-y)) 
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y,0) And LClick=2
                        m\life=m\life-1
                        lol=1
                EndIf
       
                If m\life=0
                        FreeImage m\stone
                        Delete m
                EndIf
        Next
                If KeyDown(2) Then
                a=1
                else
                a=0

                endif
                if a=1 then
                m.Main= New Main
                m\x=MouseX()
                m\y=MouseY()
                m\stone=LoadImage("stone.bmp")
                EndIf               
End Function

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

Global Images%[10];прозапас чуть больше чем надо...
Images[0]=LoadImage("stone.bmp")

Function UpdateStones()
        For m.Main=Each Main
                DrawImage Images[0], m\x, m\y
            distance=Sqr((m\x-x)*(m\x-x)+(m\y-y)*(m\y-y)) 
                If ImagesCollide (cursor,mx,my,0,m\stone,m\x, m\y,0) And LClick=2
                        m\life=m\life-1
                        lol=1
                EndIf
       
                If m\life=0
                        FreeImage m\stone
                        Delete m
                EndIf
        Next
        If KeyHit(2)
                m.Main= New Main
                m\x=MouseX()
                m\y=MouseY()
                m\life=10;Думаю ты чёто забыл))
        EndIf               
End Function


Crayzi 16.01.2012 09:16

Ответ: Опять проблемы.
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 216899)

Так, стоп!
GetHandle() это моя личная функция (которой нет в B3D), для вывода из номера ячейки..

В B3D все есть (Правда называется она Handle%(Тип%) ):
Код:

Global ClientsHandles[10]
Type Client
        Field Login$
End Type

For Clients%=0 to 10;Создадим 10 игроков и присвоим им имена Player #0...Player #10.
        CrP.Client=New Client
        CrP\Login$="Player #"+Clients%
        ClientsHandles[Clients]=Handle(CrP)
next

For Clients%=0 to 10;Напечатаем имена всех игроков на экране.
        Test.Client=Object.Client(ClientsHandles[Clients%])
        If Test<>Null;Если не уверен что объект существует то проверяй его наличие, иначе будет Mav...
          Print Test\Login$
        EndIf
Next
Test.Client=Object.Client(ClientsHandles[5]);Напечатаем имя игрока хэндл какого находится в ClientsHandles[5]
If Test<>Null
  Print Test\Login$
EndIf

waitkey()


FireOwl 16.01.2012 09:32

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

Проще для рисования каждого камня обращаться к одной картинке,
в виде глобальной переменной или параметра передаваемого в функцию обновления камней.

Nex 16.01.2012 09:42

Ответ: Опять проблемы.
 
Цитата:

For Clients%=0 to 10
Создаст 11.
Надо так
Цитата:

For Clients%=1 to 10

Crayzi 16.01.2012 09:46

Ответ: Опять проблемы.
 
Цитата:

Сообщение от Nex (Сообщение 216931)
Создаст 11.
Надо так

Я просто не стал заморачиватся)))

Crayzi 16.01.2012 09:47

Ответ: Опять проблемы.
 
Цитата:

Сообщение от FireOwl (Сообщение 216930)
Про картинку. Как я понял, она вообще одна.
А в таком случае копировать ее в каждый экземпляр, да еще и загружать каждый раз из файла, абсолютно бессмысленно.

Проще для рисования каждого камня обращаться к одной картинке,
в виде глобальной переменной или параметра передаваемого в функцию обновления камней.

Вобщемто да, неподумал))
П.с. Переделал ф-цию.

LLI.T.A.L.K.E.R. 16.01.2012 14:43

Ответ: Опять проблемы.
 
Цитата:

GetHandle() это моя личная функция (которой нет в B3D), для вывода из номера ячейки..
В B3D все есть (Правда называется она Handle%(Тип%) )
Про Handle я то знаю (им я и вносил в массив)

GetHandle() функция из моей длл у других точно не будет в Блитзе

reumep 16.01.2012 15:50

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

Nikich 16.01.2012 17:10

Ответ: Опять проблемы.
 
На ютьюбе глянь, там есть цикл видео о создании Minecraft'a на блице. И вопрос не совсем соответствует теме.


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

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