|
2D-программирование Вопросы, касающиеся двумерного программирования |
28.12.2011, 17:18
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Опять проблемы.
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", то она
меняется.
|
(Offline)
|
|
28.12.2011, 17:23
|
#2
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Опять проблемы.
Сообщение от Nikich
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
поэтому не вертица
а вообще код какая то бессмысленица. опиши что у тебя должно происходить при нажатии на кнопки.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо radiobutton за это полезное сообщение:
|
|
28.12.2011, 17:32
|
#3
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Опять проблемы.
Переменная "a" отвечает за то, можно ли сейчас вращать картинку. Я делаю TDS и мне надо сделать так, чтобы главный герой поворачивался в ту сторону, в которую идёт. То есть, при нажатии на кнопку вверх, он должен смотреть вверх и тп. Но если просто ставить, что при нажатии на кнопку вверх картинка вращается на 90 градусов, то при повторном нажатии он опять повернётся и будет идти вверх боком)
|
(Offline)
|
|
28.12.2011, 17:46
|
#4
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Опять проблемы.
тогда что-то вроде этого.
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#
Эта команда работает не достаточно быстро, чтобы выполнять вращение рисунка в режиме реального времени!
Цель этой команды состоит в том, чтобы повернуть изображение на указанный угол. Так как она работает медленно, Вы должны будете это сделать заранее, до того, как они будут выведены на экран.
|
у тебя не совсем реальное время, но поворачиваться будит не только герой же?)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.12.2011, 18:01
|
#5
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Еее, большое спасибо!
|
(Offline)
|
|
29.12.2011, 00:41
|
#6
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Опять проблемы.
Еще если собираешся делать игру в 2д то посоветовал бы посмотреть в сторону Draw3d или FastImage.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.12.2011, 15:36
|
#7
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Опять проблемы.
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 он остановится, из-за того, что данного изображения больше не существует Так что пожалуйста, помогите и с этой проблемой.
|
(Offline)
|
|
01.01.2012, 09:56
|
#8
|
Разработчик
Регистрация: 10.10.2008
Сообщений: 501
Написано 258 полезных сообщений (для 670 пользователей)
|
Ответ: Опять проблемы.
Типы решат все твои проблемы.
Вечером, время будет, напишу код.
П. С. Может кто-нибудь вперёд ответит.
__________________
|
(Offline)
|
|
01.01.2012, 12:54
|
#9
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Опять проблемы.
Я и не тороплю с ответом.
|
(Offline)
|
|
01.01.2012, 20:08
|
#10
|
Разработчик
Регистрация: 10.10.2008
Сообщений: 501
Написано 258 полезных сообщений (для 670 пользователей)
|
Ответ: Опять проблемы.
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. А перебор типа перебирает все элементы. По ходу действия программы можно удалять или добавлять элементы, это не вызовет ошибки.
Как-то так
__________________
Последний раз редактировалось mauNgerS, 01.01.2012 в 22:14.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.01.2012, 23:10
|
#11
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Опять проблемы.
Зачем для каждого камня загружать картинку в память, если все камни одинаковые? Нужна всего 1 картинка.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо radiobutton за это полезное сообщение:
|
|
02.01.2012, 05:32
|
#12
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Опять проблемы.
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.01.2012, 07:28
|
#13
|
Разработчик
Регистрация: 10.10.2008
Сообщений: 501
Написано 258 полезных сообщений (для 670 пользователей)
|
Ответ: Опять проблемы.
;в функцию CreateStone вторым параметром передаем ссылку на картинку (stone).
|
тогда уже Global не нужно
П. С. Так конечно и cursor можно сделать не глобально
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.01.2012, 23:54
|
#14
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Опять проблемы.
Большое спасибо. А есть способ как-нибудь по другому сделать коллизию?
|
(Offline)
|
|
12.01.2012, 02:23
|
#15
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Опять проблемы.
Допустим, всё-таки я уничтожу этот камень функцией 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
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:42.
|