Jump to content
  • 0
Meric

pomoc Odčítání hodnoty Float

Dotaz

Ahojte, narazil jsem na menší problém, který řeším už celý den a pořád nemůžu přijít na to, proč se to vlastně děje. Než abych se dlouhosáhle rozepisoval, vysvětlím ve zkratce o co jde.

Chci si udělat vlastní systém paliva a problém se týká jeho ubývání.

Zde jsou nadefinované hodnoty po kterých by palivo mělo ubývat:

 

 

stock Float:VehicleFuelUse(vehicleid)
{
	new Float:usage, Float:s1 = 0.01, Float:s2 = 0.02, Float:s3 = 0.03, Float:s4 = 0.04, Float:s5 = 0.05, Float:s6 = 0.06, Float:s7 = 0.07, Float:s8 = 0.08, Float:s9 = 0.085, Float:s10 = 0.09;
	switch(vehicleid)
	{
	    case 400: usage = (s8 / 3.78541178);
	    case 401: usage = (s1 / 3.78541178);
	    case 402: usage = (s6 / 3.78541178);
	    case 403: usage = (s9 / 3.78541178);
	    case 404: usage = (s3 / 3.78541178);
	    case 405: usage = (s4 / 3.78541178);
	    case 406: usage = (s10 / 3.78541178);
	    case 407: usage = (s9 / 3.78541178);
	    case 408: usage = (s7 / 3.78541178);
	    case 409: usage = (s8 / 3.78541178);
	    case 410: usage = (s1 / 3.78541178);
	    case 411: usage = (s5 / 3.78541178);
	    case 412: usage = (s2 / 3.78541178);
	    case 413: usage = (s5 / 3.78541178);
	    case 414: usage = (s8 / 3.78541178);
	    case 415: usage = (s4 / 3.78541178);
	    case 416: usage = (s9 / 3.78541178);
	    case 417: usage = (s9 / 3.78541178);
	    case 418: usage = (s5 / 3.78541178);
	    case 419: usage = (s2 / 3.78541178);
	    case 420: usage = (s3 / 3.78541178);
	    case 421: usage = (s3 / 3.78541178);
	    case 422: usage = (s4 / 3.78541178);
	    case 423: usage = (s4 / 3.78541178);
	    case 424: usage = (s3 / 3.78541178);
	    case 425: usage = (s9 / 3.78541178);
	    case 426: usage = (s3 / 3.78541178);
	    case 427: usage = (s7 / 3.78541178);
	    case 428: usage = (s5 / 3.78541178);
	    case 429: usage = (s4 / 3.78541178);
	    case 430: usage = (s5 / 3.78541178);
	    case 431: usage = (s5 / 3.78541178);
	    case 432: usage = (s10 / 3.78541178);
	    case 433: usage = (s8 / 3.78541178);
	    case 434: usage = (s5 / 3.78541178);
	    case 435: usage = (s1 / 3.78541178);
	    case 436: usage = (s1 / 3.78541178);
	    case 437: usage = (s5 / 3.78541178);
	    case 438: usage = (s3 / 3.78541178);
	    case 439: usage = (s3 / 3.78541178);
	    case 440: usage = (s6 / 3.78541178);
	    case 441: usage = (s1 / 3.78541178);
	    case 442: usage = (s4 / 3.78541178);
	    case 443: usage = (s9 / 3.78541178);
	    case 444: usage = (s10 / 3.78541178);
	    case 445: usage = (s2 / 3.78541178);
	    case 446: usage = (s8 / 3.78541178);
	    case 447: usage = (s10 / 3.78541178);
	    case 448: usage = (s2 / 3.78541178);
	    case 449: usage = (s1 / 3.78541178);
	    case 450: usage = (s1 / 3.78541178);
	    case 451: usage = (s4 / 3.78541178);
	    case 452: usage = (s8 / 3.78541178);
	    case 453: usage = (s9 / 3.78541178);
	    case 454: usage = (s10 / 3.78541178);
	    case 455: usage = (s8 / 3.78541178);
	    case 456: usage = (s7 / 3.78541178);
	    case 457: usage = (s1 / 3.78541178);
	    case 458: usage = (s2 / 3.78541178);
	    case 459: usage = (s5 / 3.78541178);
	    case 460: usage = (s8 / 3.78541178);
	    case 461: usage = (s3 / 3.78541178);
	    case 462: usage = (s1 / 3.78541178);
	    case 463: usage = (s3 / 3.78541178);
	    case 464: usage = (s1 / 3.78541178);
	    case 465: usage = (s1 / 3.78541178);
	    case 466: usage = (s2 / 3.78541178);
	    case 467: usage = (s3 / 3.78541178);
	    case 468: usage = (s2 / 3.78541178);
	    case 469: usage = (s9 / 3.78541178);
	    case 470: usage = (s7 / 3.78541178);
	    case 471: usage = (s3 / 3.78541178);
	    case 472: usage = (s8 / 3.78541178);
	    case 473: usage = (s7 / 3.78541178);
	    case 474: usage = (s2 / 3.78541178);
	    case 475: usage = (s3 / 3.78541178);
	    case 476: usage = (s8 / 3.78541178);
	    case 477: usage = (s4 / 3.78541178);
	    case 478: usage = (s2 / 3.78541178);
	    case 479: usage = (s3 / 3.78541178);
	    case 480: usage = (s3 / 3.78541178);
	    case 482: usage = (s5 / 3.78541178);
	    case 483: usage = (s7 / 3.78541178);
	    case 484: usage = (s9 / 3.78541178);
	    case 485: usage = (s1 / 3.78541178);
	    case 486: usage = (s8 / 3.78541178);
	    case 487: usage = (s9 / 3.78541178);
	    case 488: usage = (s9 / 3.78541178);
	    case 489: usage = (s6 / 3.78541178);
	    case 490: usage = (s7 / 3.78541178);
	    case 491: usage = (s3 / 3.78541178);
	    case 492: usage = (s2 / 3.78541178);
	    case 493: usage = (s9 / 3.78541178);
	    case 494: usage = (s6 / 3.78541178);
	    case 495: usage = (s6 / 3.78541178);
	    case 496: usage = (s3 / 3.78541178);
	    case 497: usage = (s9 / 3.78541178);
	    case 498: usage = (s7 / 3.78541178);
	    case 499: usage = (s8 / 3.78541178);
	    case 500: usage = (s3 / 3.78541178);
	    case 501: usage = (s1 / 3.78541178);
	    case 502: usage = (s5 / 3.78541178);
	    case 503: usage = (s5 / 3.78541178);
	    case 504: usage = (s4 / 3.78541178);
	    case 505: usage = (s4 / 3.78541178);
	    case 506: usage = (s4 / 3.78541178);
	    case 507: usage = (s3 / 3.78541178);
	    case 508: usage = (s8 / 3.78541178);
	    case 511: usage = (s10 / 3.78541178);
	    case 512: usage = (s10 / 3.78541178);
	    case 513: usage = (s10 / 3.78541178);
	    case 514: usage = (s10 / 3.78541178);
	    case 515: usage = (s10 / 3.78541178);
	    case 516: usage = (s2 / 3.78541178);
	    case 517: usage = (s2 / 3.78541178);
	    case 518: usage = (s2 / 3.78541178);
	    case 519: usage = (s10 / 3.78541178);
	    case 520: usage = (s10 / 3.78541178);
	    case 521: usage = (s3 / 3.78541178);
	    case 522: usage = (s3 / 3.78541178);
	    case 523: usage = (s2 / 3.78541178);
	    case 524: usage = (s5 / 3.78541178);
	    case 525: usage = (s6 / 3.78541178);
	    case 526: usage = (s2 / 3.78541178);
	    case 527: usage = (s2 / 3.78541178);
	    case 528: usage = (s9 / 3.78541178);
	    case 529: usage = (s2 / 3.78541178);
	    case 530: usage = (s2 / 3.78541178);
	    case 531: usage = (s3 / 3.78541178);
	    case 532: usage = (s5 / 3.78541178);
	    case 533: usage = (s3 / 3.78541178);
	    case 534: usage = (s3 / 3.78541178);
	    case 535: usage = (s4 / 3.78541178);
	    case 536: usage = (s3 / 3.78541178);
	    case 537: usage = (s1 / 3.78541178);
	    case 538: usage = (s1 / 3.78541178);
	    case 540: usage = (s2 / 3.78541178);
	    case 541: usage = (s5 / 3.78541178);
	    case 542: usage = (s2 / 3.78541178);
	    case 543: usage = (s3 / 3.78541178);
	    case 544: usage = (s7 / 3.78541178);
	    case 545: usage = (s3 / 3.78541178);
	    case 546: usage = (s2 / 3.78541178);
	    case 547: usage = (s2 / 3.78541178);
	    case 548: usage = (s10 / 3.78541178);
	    case 549: usage = (s3 / 3.78541178);
	    case 550: usage = (s3 / 3.78541178);
	    case 551: usage = (s2 / 3.78541178);
	    case 552: usage = (s5 / 3.78541178);
	    case 553: usage = (s10 / 3.78541178);
	    case 554: usage = (s4 / 3.78541178);
	    case 555: usage = (s4 / 3.78541178);
	    case 556: usage = (s10 / 3.78541178);
	    case 557: usage = (s10 / 3.78541178);
	    case 558: usage = (s2 / 3.78541178);
	    case 559: usage = (s4 / 3.78541178);
	    case 560: usage = (s4 / 3.78541178);
	    case 561: usage = (s3 / 3.78541178);
	    case 562: usage = (s4 / 3.78541178);
	    case 563: usage = (s9 / 3.78541178);
	    case 564: usage = (s1 / 3.78541178);
	    case 565: usage = (s3 / 3.78541178);
	    case 566: usage = (s3 / 3.78541178);
	    case 567: usage = (s3 / 3.78541178);
	    case 568: usage = (s4 / 3.78541178);
		case 571: usage = (s2 / 3.78541178);
		case 572: usage = (s1 / 3.78541178);
		case 573: usage = (s3 / 3.78541178);
		case 574: usage = (s1 / 3.78541178);
		case 575: usage = (s3 / 3.78541178);
		case 576: usage = (s3 / 3.78541178);
		case 577: usage = (s10 / 3.78541178);
		case 578: usage = (s9 / 3.78541178);
		case 579: usage = (s4 / 3.78541178);
		case 580: usage = (s3 / 3.78541178);
		case 581: usage = (s3 / 3.78541178);
		case 582: usage = (s5 / 3.78541178);
		case 583: usage = (s3 / 3.78541178);
		case 585: usage = (s2 / 3.78541178);
		case 586: usage = (s2 / 3.78541178);
		case 587: usage = (s4 / 3.78541178);
		case 588: usage = (s5 / 3.78541178);
		case 589: usage = (s3 / 3.78541178);
		case 592: usage = (s10 / 3.78541178);
		case 593: usage = (s8 / 3.78541178);
		case 594: usage = (s1 / 3.78541178);
		case 595: usage = (s7 / 3.78541178);
		case 596: usage = (s3 / 3.78541178);
		case 597: usage = (s3 / 3.78541178);
		case 598: usage = (s3 / 3.78541178);
		case 599: usage = (s4 / 3.78541178);
		case 600: usage = (s4 / 3.78541178);
		case 601: usage = (s8 / 3.78541178);
		case 602: usage = (s4 / 3.78541178);
		case 603: usage = (s4 / 3.78541178);
		case 609: usage = (s5 / 3.78541178);
	}
	return usage;
}

Tady mám samotný public, který využívám jako timer v OnGameModeInit

forward ConsumeFuel();
public ConsumeFuel()
{
    for(new v = 0; v < sizeof(Vozidlo); v++)
	{
	    if(Vozidlo[v][c_motor] == 1)
	    {
			stava[v] = Vozidlo[v][palivo];
			if(!IsValidVehicle(v)) continue;
    		if(Vehicle_IsANoFuelVehicle( GetVehicleModel(v) )) continue;

			if(GetVehSpeed(v) > 10.0){
				stava[v] -= (VehicleFuelUse(Vozidlo[v][model]) / 2);
			}else{
			    stava[v] -= VehicleFuelUse(Vozidlo[v][model]);
			}
    		printf("%f", stava[v]);
    		if(stava[v] < 0.1)
			{
				SetVehicleParams(v, VEHICLE_TYPE_ENGINE, 0);
			}
		}
	}
    //}
    return 1;
}

A zde samotný problém:

[01:48:29] 84.994712
[01:48:31] 84.994712
[01:48:33] 84.994712
[01:48:35] 84.994712
[01:48:37] 84.994712
[01:48:39] 84.994712
[01:48:41] 84.994712
[01:48:43] 84.994712
[01:48:45] 84.994712
[01:48:47] 84.994712
[01:48:49] 84.994712
[01:48:52] 84.994712
[01:48:54] 84.989433
[01:48:56] 84.989433
[01:48:58] 84.989433
[01:49:00] 84.989433
[01:49:02] 84.989433
[01:49:04] 84.989433
[01:49:06] 84.989433
[01:49:08] 84.989433
[01:49:10] 84.989433
[01:49:12] 84.989433
[01:49:14] 84.989433
[01:49:16] 84.989433
[01:49:18] 84.989433
[01:49:20] 84.989433
[01:49:23] 84.989433
[01:49:25] 84.989433
[01:49:27] 84.989433
[01:49:29] 84.989433
[01:49:31] 84.989433
[01:49:33] 84.989433
[01:49:35] 84.989433
[01:49:37] 84.989433
[01:49:39] 84.989433
[01:49:41] 84.989433
[01:49:43] 84.989433
[01:49:45] 84.989433
[01:49:47] 84.989433
[01:49:49] 84.989433
[01:49:51] 84.989433
[01:49:54] 84.994712
[01:49:56] 84.994712
[01:49:58] 84.994712
[01:50:00] 84.994712
[01:50:02] 84.994712
[01:50:04] 84.994712
[01:50:06] 84.994712
[01:50:08] 84.994712
[01:50:10] 84.994712
[01:50:12] 84.994712
[01:50:14] 84.994712
[01:50:16] 84.994712
[01:50:18] 84.994712
[01:50:20] 84.994712
[01:50:23] 84.994712
[01:50:25] 84.994712
[01:50:27] 84.994712
[01:50:29] 84.994712
[01:50:31] 84.994712
[01:50:33] 84.994712
[01:50:35] 84.994712
[01:50:37] 84.994712
[01:50:39] 84.994712
[01:50:41] 84.994712
[01:50:43] 84.994712
[01:50:45] 84.994712
[01:50:47] 84.994712
[01:50:49] 84.994712
[01:50:52] 84.989433
[01:50:54] 84.989433
[01:50:56] 84.989433
[01:50:58] 84.989433
[01:51:00] 84.989433
[01:51:02] 84.989433
[01:51:04] 84.989433
[01:51:06] 84.989433
[01:51:08] 84.989433
[01:51:10] 84.989433
[01:51:12] 84.989433
[01:51:14] 84.989433
[01:51:16] 84.989433
[01:51:18] 84.989433
[01:51:20] 84.989433
[01:51:23] 84.989433
[01:51:25] 84.989433
[01:51:27] 84.989433
[01:51:29] 84.989433
[01:51:31] 84.989433
[01:51:33] 84.989433
[01:51:35] 84.989433
[01:51:37] 84.989433
[01:51:39] 84.994712
[01:51:41] 84.994712
[01:51:43] 84.994712
[01:51:45] 84.994712
[01:51:47] 84.994712
[01:51:49] 84.994712
[01:51:52] 84.994712
[01:51:54] 84.994712
[01:51:56] 84.994712
[01:51:58] 84.994712
[01:52:00] 84.994712
[01:52:02] 84.994712
[01:52:04] 84.994712
[01:52:06] 84.994712
[01:52:08] 84.994712
[01:52:10] 84.994712
[01:52:12] 84.994712
[01:52:14] 84.994712
[01:52:16] 84.994712
[01:52:18] 84.994712
[01:52:21] 84.994712
[01:52:23] 84.994712
[01:52:25] 84.994712
[01:52:27] 84.994712
[01:52:29] 84.994712
[01:52:31] 84.994712
[01:52:33] 84.994712
[01:52:35] 84.994712
[01:52:37] 84.994712
[01:52:39] 84.994712
[01:52:41] 84.994712
[01:52:43] 84.994712
[01:52:46] 84.994712
[01:52:48] 84.994712
[01:52:50] 84.994712
[01:52:52] 84.994712
[01:52:54] 84.994712
[01:52:56] 84.994712
[01:52:58] 84.994712
[01:53:00] 84.994712
[01:53:02] 84.994712
[01:53:04] 84.994712
[01:53:06] 84.994712
[01:53:08] 84.994712
[01:53:10] 84.994712
[01:53:12] 84.994712
[01:53:15] 84.994712
[01:53:17] 84.994712
[01:53:19] 84.994712
[01:53:21] 84.994712
[01:53:23] 84.994712
[01:53:25] 84.994712
[01:53:27] 84.994712
[01:53:29] 84.994712
[01:53:31] 84.994712
[01:53:33] 84.994712
[01:53:35] 84.994712
[01:53:37] 84.994712
[01:53:39] 84.994712
[01:53:42] 84.994712
[01:53:44] 84.994712
[01:53:46] 84.994712
[01:53:48] 84.994712

Nevím jak vy, ale já i když jsem měl z matiky skoro za 5, tak si myslím, že když odčítáme, mělo by se prostě odčítat a přičíst by se mělo jedině pokud odčítáme zápornou hodnotu. :D Obracím se na vás, protože mě už došly nápady. :D A než to případně zmíníte, ano už jsem zkusil použít i funkce určené k hodnotám float jako například floatsub. Výsledek stejný.  

Sdílet tento příspěvek


Link to post
Share on other sites

8 odpovědí na tuto otázku

Recommended Posts

  • 0

Print mas na miste kdy vozidlo ma motor. Je mozne ze ty ostatni hodnoty patri jinym... Zkus ten print upravit takto:

 

printf("Vozidlo #%d: %f", v, stava[v]);

 

Pripadne nejakym zpusobem rozlisit ten cyklus a volani celeho toho callbacku. Z toho vypisu pak neni jasne jestli se to spravne nebo spatne odecita. 

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

Co máš namysli vlastně tím rozlišením cyklu? Jinak tedy hodnoty patří tomu správnému vozidlu. Koneckonců si dělám testing sám a ubývání paliva je podmíněné zapnutým motorem. Ten callback volám tímto způsobem v OnGameModeInit.

SetTimer("ConsumeFuel", UPDATE_RATE, true);

UPDATE_RATE jsem nadefinoval na každé 2 sekundy. Někde jsem už četl, že samotný Float špatně tedy neodčítá, ale chyba je někde jinde, jenže právě vůbec nevím kde může být.

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

 

No, tak to bylo také bez kloudného výsledku, stejný problém, jiné hodnoty.

 

Při použití pevné hodnoty: "0.6": Tady se odečetlo viditelně v podstatě správně, původní hodnota je 15.85 a nějaké drobné, ale zřejmě se z nějakého důvodu neukládá nová hodnota paliva v proměnné při dalším zavolání callbacku a počítá to stále tu původní. Což je divné vzhledem k tomu, že někdy to odečetlo, někdy zase přičetlo hodnotu.

 
 
 

[18:53:32] Vozidlo #7: 15.250299
[18:53:34] Vozidlo #7: 15.250299
[18:53:36] Vozidlo #7: 15.250299
[18:53:38] Vozidlo #7: 15.250299
[18:53:40] Vozidlo #7: 15.250299
[18:53:42] Vozidlo #7: 15.250299
[18:53:44] Vozidlo #7: 15.250299
[18:53:46] Vozidlo #7: 15.250299
[18:53:48] Vozidlo #7: 15.250299
[18:53:51] Vozidlo #7: 15.250299
[18:53:53] Vozidlo #7: 15.250299

 

Při použití pevné hodnoty hodnoty "2": Nějaký nesmyslný číslo.

 
 
 

[18:56:48] Vozidlo #7: 1096653568.000000
[18:56:51] Vozidlo #7: 1096653568.000000
[18:56:53] Vozidlo #7: 1096653568.000000
[18:56:55] Vozidlo #7: 1096653568.000000
[18:56:57] Vozidlo #7: 1096653568.000000
[18:56:59] Vozidlo #7: 1096653568.000000
[18:57:01] Vozidlo #7: 1096653568.000000
[18:57:03] Vozidlo #7: 1096653568.000000
[18:57:09] Vozidlo #7: 1096653568.000000
[18:57:11] Vozidlo #7: 1096653568.000000
[18:57:13] Vozidlo #7: 1096653568.000000
[18:57:15] Vozidlo #7: 1096653568.000000

Jak jsem tak sledoval tak dokonce se ani neupdatuje hodnota na tachometru, ale to nevím jestli je jen důsledek toho problému nebo problém samotný. Zobrazí se těch 15,8, což je v pořádku jen se to taktéž neaktualizuje.

 
 
 
format(str2, sizeof(str2), "%.1f", Vozidlo[GetPlayerVehicleID(playerid)][palivo]);
		PlayerTextDrawSetString(playerid, Tachofuel[playerid], str2);
 
 
 
EDIT: Je to vyřešené, byla to jen hloupá chyba vůbec vytvářet tu proměnnou stava[v] a využít jí pro převod proměnlivé hodnoty, odečte se totiž ta nová hodnota, ale ne ta původní. Tudíž stačilo jen použít původní proměnnou Vozidlo[v][palivo]. Každopádně děkuji za navedení na tuto stupidní chybu, zkusit pevný hodnoty pro test mě opravdu nenapadlo. xD 
Edited by Meric

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

Mňa by aj tak zaujímalo čo si tam porobil :D Nie je jednoduchšie si spraviť to, že ak hráč nastúpi do auta, spustí timer s reloadom tachometra, kde budeš odčítavať benzín ? Mne osobne by to viac vyhovovalo :) Ak som správne pochopil, ty odčítavaš každému vozidlu, nie ?

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
před 25 minutami, LukyiiN said:

Mňa by aj tak zaujímalo čo si tam porobil :D Nie je jednoduchšie si spraviť to, že ak hráč nastúpi do auta, spustí timer s reloadom tachometra, kde budeš odčítavať benzín ? Mne osobne by to viac vyhovovalo :) Ak som správne pochopil, ty odčítavaš každému vozidlu, nie ?

Ono je celkem jedno jestli timer spustíš při nastupování do auta nebo v OnGameModeInit, je tam podmínka pro zapnutý motor. takže ke každému vozidlu, které má zapnutý motor. Jediný rozdíl co by v tom byl je doba, kdy by timer začal s odpočtem. A co se týče reloadu tachometru, na to využívám OnPlayerUpdate. Což si myslím dovolit můžu vzhledem k tomu, že PlayerTextDrawSetString nemá závratný pakety. Totiž tento callback s úbytkem paliva vyvolávám každý 2 sekundy (aby úbytek paliva nebyl takový overkill) zatímco pro tachometr potřebuji aktualizaci co nejrychlejší a tam mi přišlo zbytečné dělat další opakující se timer. 

Edited by Meric

Sdílet tento příspěvek


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Odpovědět na dotaz...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Obnovili jsme váš původní obsah (obsah napsaný před zavřením).   Smazat obnovený obsah

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...