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



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

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