Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[c++][Allegrp/algorytm] Obrót


Rekomendowane odpowiedzi

Opublikowano

Mam problem z obrotami, posiadam funkcję służącą do obrotu postaci:

rotate_sprite( bufor, sprajt, srodek_x, srodek_y, itofix(kat) );

gdzie:

bufor - bufor, ekran

sprajt - obracany obrazek

srodek_x - środek obrazka x

srodek_y - środek obrazka y

kat - kąt w skali 0-255 (255 to 360 stopni)

 

I teraz chcę aby obrazek podążał za myszką, czyli żeby "patrzył" sie na myszkę.Innaczej mówiąc chcę obliczyć kąt znając 2 punkty: pozycja kursora i środek obrazka.Help Please.

Opublikowano

#define PI 3.14159265
int ShiftX = mouse_x+kamerax(zależy czy masz)-srodek obrazka x;
int ShiftY = mouse_y+kameray-srodek obrazka y;
float K = atan2(ShiftX,ShiftY);

float xx = sin(K); // to jakbys chcial predkosc wyliczyć
float yy = cos(K);
speedx = maxspeed * xx;
speedy = maxspeed * yy;

float Kat = 360-(K*180/PI+180);
rotate_sprite( bufor, bullet, x, y, ftofix( Kat*255.0/360.0 ) ); // jak w ftofix wpisuje kąt w stopniach to nie wychodzi. tak u mnie działa

lekko przerobiony przykład z mojej gierki.

jest podobna do twojej, więc powinno być podobnie

 

poczytaj o wzorach trygonometrycznych, trochę Ci się rozjaśni, a bez tego ani rusz

Opublikowano

ostatnio musiałem też zrobić takie coś, tylko w innej bibliotece i języku

 

 

Func rotacja($war1, $war2)
Local $pi = 4 * ATan(1) ;equals 3.14159265358979
Local $radToDeg = 180 / $pi
Local $rotacja = ATan($war1 / $war2) * $radToDeg
Return Int($rotacja)
EndFunc

zwraca nam od 0 do 90 stopni obrotu dzieląc wysokosc przez szerokość

int - skraca przecinek

atan - jest taka sama funkcja w c++;p

 

rotate_sprite( bufor, bullet, x, y, ftofix( Kat*255.0/360.0 ) ); // jak w ftofix wpisuje kąt w stopniach to nie wychodzi. tak u mnie działa

spróbuj tak sopel, robiłem to 4h(bez podstaw tego, i kolega mi podpowiedział abym trójkątów szukał i tak udało mi się to zrobić :D)

 

a tu funkcja obracania

 

irrsetnoderotation($handle obiektu,stopnie obrotu,$tutaj_to czego szukasz,0)

$camerapos = pozycja może być myszki(tak w którą strone ma się patrzeć)

$x,$y pozycje obiektu który ma się obracać

If $x < $camerapos[0] And $y > $camerapos[2] Then
$por1 = $camerapos[0] - $x
$por2 = $y - $camerapos[2]
_IrrSetNodeRotation($SceneNode, 0, rotacja($por2, $por1), 0)
$q = rotacja($por2, $por1)
EndIf
If $x < $camerapos[0] And $y < $camerapos[2] Then
$por1 = $camerapos[0] - $x
$por2 = $camerapos[2] - $y
_IrrSetNodeRotation($SceneNode, 0, rotacja($por1, $por2) + 270, 0)
$q = rotacja($por1, $por2) + 270
EndIf
If $x > $camerapos[0] And $y < $camerapos[2] Then
$por1 = $camerapos[0] - $x
$por2 = $camerapos[2] - $y
_IrrSetNodeRotation($SceneNode, 0, rotacja($por1, $por2) + 270, 0)
$q = rotacja($por1, $por2) + 270
EndIf
If $x > $camerapos[0] And $y > $camerapos[2] Then
$por1 = $camerapos[0] - $x
$por2 = $camerapos[2] - $y
_IrrSetNodeRotation($SceneNode, 0, rotacja($por1, $por2) + 90, 0)
$q = rotacja($por1, $por2) + 90
EndIf

 

wystarczy że podmienisz to na swoją funkcje dasz camera pos i kordy tego obiektu i ci skrypt sam namierzy( jeżeli kąt jest tak samo ustawiony, w zależności od kordów ale gra jest napisana w w bibliotece opierającej się na d9)

te $q zignoruj nie usunąłem po testach tego ;p

http://screenshooter...2977083/yeavnxr

widzisz, zawsze model będzie się na mnie paczył xD(ssy ciemne wychodzą w grze, i brakuje kilka modeli 2d, jak napisy na hudzie celownik)

 

jeszcze tylko kilka systemów respawnów, i strzelanka będzie gotowa :D

 

zobacz u mnie jest camera i srodek obrazka a u ciebie

pozycja kursora i środek obrazka

 

http://www.mediafire...16c58s131ydxs6e

ESC wyłączasz

Opublikowano

@up. troche zagmatwane.

w moim kodzie nie trzeba już nic dodawać. zwraca kat od 0 do 360. chyba troche lepszy ;d

 

ps. tylko dołącz sobie math.h

Opublikowano

a właśnie pisałem ze nie działa xD, dodałem math.h i gra. Tylko jest jeden błąd ...

 

Mój kod(kawałek, wyświetlający mape):

 

for( int x = 0; x < 20; x++ )

{

for( int y = 0; y < 15; y++ )

{

blit( grass, bufor, 0, 0, x*32, y*32, 32, 32 );

 

int ShiftX = mouse_x-x*32-16;

int ShiftY = mouse_y-y*32-16;

float K = atan2(ShiftX,ShiftY);

float Kat = 360-(K*180/PI+180);

rotate_sprite(rotated, cannon1, 0, 0, ftofix( Kat*255.0/360.0 ));

if (map[y][x] == 1) blit(rotated, bufor, 0, 0, x*32, y*32, 32, 32);

}

}

 

Bitmapa fajnie sie obraca tylko że utraciła kolory o.0 http://screenshooter...3347179/jlrktbm (tam gdzie jst ten pusty kwadrat to jest myszka, tylko że screenshoter nie wyświetlił kursora.)(Wieżyczka jest czarna, miała tło 255,0,255 i ono zmieniło się na czarne :P)

 

@jackraymund

Gra 3D w AutoIT ? 0.0 ciekawe ile fps o.O

Opublikowano

if (map[y][x] == 1) blit(rotated, bufor, 0, 0, x*32, y*32, 32, 32);

tu wrzucasz bufor do rotated. ma byc na odwrót.

 

możesz od razu wrzucić rotated sprite do bufora będzie łatwiej i wyrzucisz blita

 

 

@up. dał linka do downloadu tej gierki

@eidt. u mnie ta gra działa zajebiście. nie spodziewałem się takiego wyniku w au3 (szkoda, że src nie ma ;/)

 

 

@down

Serio masz 14 lat ?

nom.

jak coś lubie robić, to lubie się tego (i tego co do tego potrzebne) uczyć. Zresztą trygonometria jest bardzo prosta, można to wziąść na logikę. (nie pamiętam wzorów ,ale wykombinować coś potrafię)

matma się przydaje w programowaniu, a w aplikacjach 3d to bez tego ani rusz

Opublikowano

fpsów wyciągam 500 przy mojej karcie graficznej, lecz muszę zrobić ograniczenie aby model poruszał się tak samo na wszystkich kompach, bo na laptopie mam 60, i prawie automatycznie jest obok mnie ;d

@down

pomyliło mi się, chodzi o kamere

ale już mam sposób na to,

IrrAddFPSCamera($h_ParentNode = 0, $f_RotateSpeed = 100.0, $f_MoveSpeed = 0.5, $i_ID = -1, $h_KeyMapArray = 0, $i_KeyMapSize = 0, $i_NoVerticalMovement = 0, $f_JumpSpeed = 0.0)

wszystko na null __CreatePtrKeyMapArray też na null(ponieważ strzałki same się ustawiały)

i __getKeyEvt($p_KeyEvent, $i_Element = $EVT_KEY_IKEY)

 

bo w modelu już dawno miałem AdlibRegister("bieg",10) ;p

Opublikowano

btw. tak z dupy spytam.

Jak to jest, że w wielu grach niezależnie od fpsów wszystko porusza się z taką samą prędkością?

rendorowanie, a tick są w różnych wątkach?

 

żeby spam == false

fpsów wyciągam 500 przy mojej karcie graficznej, lecz muszę zrobić ograniczenie aby model poruszał się tak samo na wszystkich kompach, bo na laptopie mam 60, i prawie automatycznie jest obok mnie ;d

wrzuć timera ;d

Opublikowano

@Jackraymund

Nie działa mi (instant exit, no error) ;( Wyślesz source na priv?

 

@2UP

Może być nawet w jednym wątku. Ważne, żeby obliczanie pozycji modeli/actorów zależało tylko... cóż, od właściwości tych modeli, od silnika... Nie, nie znam się na tym :P

A i tak niektórzy profesjonaliści potrafią to spieprzyć. Może nie do rozmiaru speedhack'a, ale ostatnio (2008) EA Games wypuściła spieprzony port z konsoli Dead Space'a, który był absolutnie niegrywalny bez VSync'a (który gwarantuje 60 fpsów ). Gdzieś, głęboko, w kodzie, prędkość obrotu była zależna od fps'ów. Znaczy, prędkość to złe słowo. To jest droga/czas. Musieli stworzyć, spryciarze, własny wzorek na drogę/frame'a.

Ta sygnatura jest pusta.

Opublikowano

nawet taki słaby cs ma szybkosć zależną od fpsów, można to sprawdzić poprzez robienia bh na 500fpsów(nieda rady)

modela miałem cały czas tak

AdlibRegister("bieg",10)

Func bieg()
If Int($x) < Int($camerapos[0]) + 40 Then
$x += 1
EndIf
If Int($x) > Int($camerapos[0]) + 40 Then
$x -= 1
EndIf
If Int($y) < Int($camerapos[2]) + 40 Then
$y += 1
EndIf
If Int($y) > Int($camerapos[2]) + 40 Then
$y -= 1
EndIf
EndFunc

a ustawienie i narysowanie w głównej pętli

co do kamery to znalazłem gotowy kod, od razu na obrót bo zrobić ruch dla mnie to nie problem czyli przód prawo lewo i doł, a rorate to nie bd znowu wracał do tych sinów i kosinów

 

$Camera = _IrrAddCamera( 0,0,0, 0,0,0 )

$MX = 0.5
$MY = 0.5
	_IrrSetMousePosition( $MX, $MY )
	$POS = _IrrGetNodePosition( $CameraNode)
	while _IrrKeyEventAvailable()
		$pKeyEvent = _IrrReadKeyEvent()
$keyCode = __getKeyEvt($pKeyEvent, $EVT_KEY_IKEY)
		select
		case $keyCode = $KEY_KEY_D	 ; Left Arrow
			; if the key is going down
			if __getKeyEvt($pKeyEvent, $EVT_KEY_IDIRECTION) = $IRR_KEY_DOWN then
				$XStrafe = 5
			else
				if $XStrafe = 5 then
					$XStrafe = 0
				endif
			endif

		case $keyCode = $KEY_KEY_W	 ; Up Arrow
			; if the key is going down
			if __getKeyEvt($pKeyEvent, $EVT_KEY_IDIRECTION) = $IRR_KEY_DOWN then
				$ZStrafe = 5
			else
				if $ZStrafe = 5 then
					$ZStrafe = 0
				endif
			endif

		case $keyCode = $KEY_KEY_A	 ; Right Arrow
			; if the key is going down
			if __getKeyEvt($pKeyEvent, $EVT_KEY_IDIRECTION) = $IRR_KEY_DOWN then
				$XStrafe = -5
			else
				if $XStrafe = -5 then
					$XStrafe = 0
				endif
			endif

		case $keyCode = $KEY_KEY_S	 ; Down Arrow
			; if the key is going down
			if __getKeyEvt($pKeyEvent, $EVT_KEY_IDIRECTION) = $IRR_KEY_DOWN then
				$ZStrafe = -5
			else
				if $ZStrafe = -5 then
					$ZStrafe = 0
				endif
			endif

		endselect
	wend
_IrrGetCameraOrientation( $Camera, $vX,$vY,$vZ)
	$POS[0] += $vY[0] * $ZStrafe + $vY[2] * $XStrafe
	$POS[2] -= $vY[0] * $XStrafe - $vY[2] * $ZStrafe
	_IrrSetNodePosition($CameraNode, $POS[0], $POS[1], $POS[2])
	while _IrrMouseEventAvailable()
		$pMouseEvent = _IrrReadMouseEvent()
		if __getMouseEvt($pMouseEvent, $EVT_MOUSE_IACTION) = $IRR_EMIE_MOUSE_MOVED then
; create a wide string with a list of the positions in
$metrics = "POSITION " & __getMouseEvt($pMouseEvent, $EVT_MOUSE_IX) & " " & __getMouseEvt($pMouseEvent, $EVT_MOUSE_IY)
		endif
	wend
	$SPIN += ( $MX - 0.5 ) * 2.0
	$TILT += ( $MY - 0.5 ) * 2.0
	if $TILT > 1.5 then $TILT = 1.5
	if $TILT < -1.5 then $TILT = -1.5
	_IrrSetCameraTarget( _
		$Camera, $POS[0] + sin ( $SPIN ) * 1000, _
		-$TILT * 1500, _
		$POS[2] + cos ( $SPIN ) * 1000 )

 

 

 

noi, oczywiście w timera to, jak modela

a funkcje ustawienia do pętli

 

_IrrSetNodePosition($CameraNode, $POS[0], $POS[1], $POS[2]) ; tutaj ruch prawo lewo,

_IrrSetCameraTarget( _
		$Camera, $POS[0] + sin ( $SPIN ) * 1000, _
		-$TILT * 1500, _
		$POS[2] + cos ( $SPIN ) * 1000 ) ; obrót

 

 

 

@up

aggr to pewnie wina fullscreena jeszcze nie ogarnąłem tego

funkcja _IrrStop() w swojej ddlce wysyła exit(zwraca jedynie error), więc nie moge dać consoleread aby wyczytać konsole bo w niej ładnie wysypuje błędy itd.

 

 


Irrlicht Engine version 1.7.1
Microsoft Windows XP Professional Dodatek Service Pack 3 (Build 2600)
Using renderer: Direct3D 9.0
NVIDIA GeForce GT 220 nv4_disp.dll 6.14.12.8026
Generated terrain data (256x256) in 0.0710 seconds
Loaded texture: C:/Documents and Settings/all/Pulpit/a/Nowy folder/media/terrain-texture.jpg
Loaded texture: C:/Documents and Settings/all/Pulpit/a/Nowy folder/media/detailmap3.jpg
Loaded texture: C:/Documents and Settings/all/Pulpit/a/Nowy folder/media/cross.tga
Loaded mesh: media/zumlin.md2
Loaded texture: C:/Documents and Settings/all/Pulpit/a/Nowy folder/media/zumlin.pcx
Loaded texture: C:/Documents and Settings/all/Pulpit/a/Nowy folder/media/beam.png
Resizing window (800 600)
Resetting D3D9 device.

 

zaraz skompiluje bez fullssa, tylko wrzuce to do kodu

dziwne że na fullss 500fpsów jest a na window 60

@edit

aff ten kodzik na obracanie był chujowy, myszka się sama ruszała jak się schodziło z górki itd.

http://www.mediafire...miom02b100wrcn8

gdyby nie trybiło może jako admin uruchom(może wczytać modeli nie może)

podaj przy okazji system itd. aby mi łatwiej było znaleźć błąd

btw. tak z dupy spytam.

Jak to jest, że w wielu grach niezależnie od fpsów wszystko porusza się z taką samą prędkością?

rendorowanie, a tick są w różnych wątkach?

ja bym wszystkie funkcje obliczeniowe wrzucał w inne wątki

 

 

 

puki co, gre pisze od nowa, dodając więcej kolizji np. bieganie potwora, bo teraz można zauważyć że zawsze do jednej pozycji idzie

+ spawn mobów z pliku i kolizje moba na moba, aby nie wchodziły na siebie

więc myszke bd robił na wykończenie

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...