forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Полёт стрелы в 2d (сетке) (http://forum.boolean.name/showthread.php?t=17463)

polopok 01.11.2012 16:00

Полёт стрелы в 2d (сетке)
 
Может кто из вас делал подобное ,отпишитесь .
можно делиться идеями ,предложениями ну и конечно кодами ...
вот мой код:
Код:

Graphics 1024, 768
SetBuffer BackBuffer()
degree2# = 0
degree# = -45
speed# = 8
x#=200
y#=400
x0#=200
y0#=400
x1# = 600 : y1# = 600

While Not KeyHit(1)
    Cls
        mx#=MouseX():my#=MouseY()   

        dx#=(x1#)-(x#-ax#)
        dy#=(y1#+ay#)-(y#-ay#)  ;(my+ay)-(y#-ay)
       
        d# = Sqr(dx#*dx# +dy#*dy#)       
        degree#=ATan2(dy,dx)

        vx# =Sin(degree#)
        vy# =Cos(degree#)

If d>5        Then
                ay# = -(d#/5)
                ax# = -(d#/5)
       
        y# = y# + vx#*speed ; The Sin movement
        x# = x# + vy#*speed ; The Cos movement
       
        Color 200,200,200
        Line x ,y,x-15*Sin(degree+90),y+15*Cos(degree+90)
        Color 200,0,0
        Oval x-2,y-2,4,4,1
EndIf
       
If KeyHit(57) Then
x#=x0#+5
y#=y0#-3
degree# = -45
EndIf
If MouseDown(1) Then
 x1# = mx#
 y1# = my#
x#=x0#+5
y#=y0#-3
degree# = -45
EndIf
        Color 200,0,200
        Rect x0-5,y0-10, 5,20
        Color 20,120,20
        Oval x0-3,y0-3,6,6,1
        Oval x1-3,y1-3,6,6,1

       

        Text 10,10,degree
        Text 10,20,"dy "+d
Flip
Wend
End


moka 01.11.2012 16:03

Ответ: Полёт стрелы в 2d (сетке)
 
Уточни - 2D, Side Scroller или Top-Down или может Изометрия?
Все они очень отличаются..

polopok 01.11.2012 16:12

Ответ: Полёт стрелы в 2d (сетке)
 
Цитата:

Сообщение от MoKa (Сообщение 242107)
Уточни - 2D, Side Scroller или Top-Down или может Изометрия?
Все они очень отличаются..

Уточняю в 2д сетке как в предыдущем посте (наклонённая сетка)

moka 01.11.2012 16:35

Ответ: Полёт стрелы в 2d (сетке)
 
Учитывая что это Top-Down, то тебе нужно симулировать всё как буд-то сетка просто нормальная (без перспективы).
А вот где начинается перспектива - так это только отрисовка.
Для логики перспектива абсолютно не учитывается.

polopok 01.11.2012 17:03

Ответ: Полёт стрелы в 2d (сетке)
 
Уважаемый ,модератор ,если данная ссылка в коё-то мере не согласуется с правилами данного форума ,то оставляю за вами право удалить её
http://youtu.be/PBN4UGkR1tQ
Пытаюсь сделать нечто в этом роде

moka 01.11.2012 17:30

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

Как уже говорил, реализуй математику и логику просчётов без учёта отрисовки, как если бы это был бы просто вид сверху.
Если я правильно понял, у тебя будет конкретная цель для стрелка, но стрела может попасть в кого-то по пути (верно?).
И как стрела у тебя будет лететь, по дуге (стреляется вперёд но под градусом в небо), или напрямую?
Если первый - то тут всегда одна цель в которую стреляешь, и всегда будет в неё лететь.
Если же второе, то тут нужно просчитывать, т.к. нужно учитывать есть стрела не попадёт в кого-то на пути. Таким образом тебе нужно провезти отрезок между целью и стрелком, и вычислить все ячейки через которые эта ячейка проходит. По пути вычисления начинать от стрелка, и двигаться к целе. Если по пути к цели какая-то из ячеек имеет противника на пути - то стрела попадёт в него а не в цель.
Движение простое - вычисляешь вектор между целью и стрелком, он вычисляется разницой в X и Y координат, затем вычисляешь дистанцию между стрелком и целью (теорема Пифагора), и затем полученные раньше разницы делишь на дистанцию. Таким образом ты получишь веткор длиной в 1. Далее тебе нужен параметр скорости (например 3). И чтобы двигать стрелу, нужно каждый цикл пока стрела не будет над ячейкой цели, прибавляй к позиции X, Y стрелы вектор X умноженный на скорость (3) и также для Y.
Стрела будет двигаться в направлении цели.

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

polopok 01.11.2012 17:44

Ответ: Полёт стрелы в 2d (сетке)
 
в принципе ,то как я реализовал меня устраивает , просто думал может кто по другому сделал (краше что ли).
в основном цель для стрелы одна и по пути не в кого попадать не будет.
разве что при массовом обстреле сетки ячеек 3х3 ,для каждой ячейки будет своя стрела .
можете посмотреть код для одной цели в [оффтопе]
Код:

Graphics 1024, 768
SetBuffer BackBuffer()
degree2# = 0
degree# = -45
speed# = 8
x#=200
y#=400
x0#=200
y0#=400
x1# = 600 : y1# = 600

ClsColor 111,111,111
While Not KeyHit(1)
    Cls
        mx#=MouseX():my#=MouseY()   

        dx#=(x1#)-(x#-ax#)
        dy#=(y1#+ay#)-(y#-ay#)  ;(my+ay)-(y#-ay)
       
        d# = Sqr(dx#*dx# +dy#*dy#)       
        degree#=ATan2(dy,dx)

        vx# =Sin(degree#)
        vy# =Cos(degree#)

If d>5        Then
                ay# = -(d#/5)
                ax# = -(d#/5)
       
        y# = y# + vx#*speed ; The Sin movement
        x# = x# + vy#*speed ; The Cos movement
       
        Color 2,2,2
        Line x ,y,x-15*Sin(degree+90),y+15*Cos(degree+90)



        Color 150,150,255
        Oval x-2,y-2,4,4,1
        Color 2,2,2
Else       
                Color 2,2,2
        ;        Line x0 ,y0,x0+15,y0-15
        degree# = -45
                Line x0 ,y0,x0+15*Sin(degree+90),y0-15*Cos(degree+90)
EndIf
       
        Line x0+ 3 ,y0-12 + 0 , x0+ 5,y0-12+ 3
        Line x0+ 5 ,y0-12+ 3 , x0+ 5.5,y0-12+ 6
        Line x0+ 5.5 ,y0-12+ 6 ,x0+ 5.5,y0-12+ 9
        Line x0+ 5.5, y0-12+ 9 ,x0+ 5,y0-12+ 12
        Line x0+ 5 ,y0-12+ 12 , x0+ 3,y0-12+ 15

       
If KeyHit(57) Then
x#=x0#+5
y#=y0#-3
EndIf
If MouseDown(1) Then
 x1# = mx#
 y1# = my#
x#=x0#+5
y#=y0#-3
EndIf
        Color 200,0,200
        Rect x0-5,y0-10, 5,20
        Color 20,120,20
        Oval x0-2,y0-2,4,4,1
        Oval x1-3,y1-3,6,6,1

       

        Text 10,10,degree
        Text 10,20,"dy "+d
Flip
Wend
End


мышью кликайте по экрану для получения новой цели

polopok 01.11.2012 17:48

Ответ: Полёт стрелы в 2d (сетке)
 
желающим присоединиться к проекту ,писать в личку.
платить никому ничего не буду :) , а так пожалуйте.
цель : создать играбельную демо версию.

polopok 06.11.2012 17:26

Ответ: Полёт стрелы в 2d (сетке)
 
начал проект здесь


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

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