Hę? To skąd ty bierzesz te punkty? Znaczy ile kto ma na danym poziomie?
No ale przyjmijmy, że skądś je tam wczytujesz, to teraz przedstawię ci schemat jak ja bym to zrobił, tak żeby zbytnio nie komplikować sprawy i żeby to działało:
$poziom - to będzie poziom usera,
$punkty - a to będą jego punkty na danym poziomie,
$punkty_max - tu mamy ilość punktów potrzebną do następnego poziomu.
Na początek tworzysz switch'a, który w zależności od wartości zmiennej $poziom będzie obliczał % doświadczenia, trzeba to zrobić z racji tego, że jak powiedziałeś im wyższy poziom, tym więcej punktów trzeba zdobyć do następnego. Ale uwaga, ma to sens, dopóty dopóki poziomów jest niedużo, tak <10. Potem najlepiej jakbyś sobie wypracował jakiś wzór, nie wiem, może $punkty_max = $poziom * 100 i wtedy będziesz mógł mieć tylko jedno działanie. No ale wróćmy do switch'a, przykład(zakładamy, że user ma 40pkt a do następnego poziomu musi mieć 200):
switch($poziom){
case 1:
$punkty_max = 200;
$exp = intval($punkty/$punkty_max*100
); // wychodzi nam 20 break;
}
Intval użyłem, abyśmy nie otrzymywali liczb dziesiętnych, bo nie można ustalić czemuś szerokości np. 0,3 px. Teraz pora na html i CSS. Cała filozofia polega na tym, aby - jak już ktoś napisał - zrobić dwa div'y, jeden w drugim. Nazwijmy je #max i #exp. #max ma ustawioną szerokość 100px i wysokość dowolną, byleby taką samą miał #max, temu drugiemu ustawiamy tylko wysokość i jakieś tło na początek, szerokość będziemy mu ustalać dynamicznie za pomocą wcześniej otrzymanej zmiennej $max. Teraz następny przykład(zawieje trochę gotowcem

, sam HTML, z CSS musisz sobie poradzić sam według moich wskazówek):
<div id="exp" style="width=<?echo $exp;?>;">
I to już koniec, ale się upisałem

Dwa kilo mięsa się należy

Wszystko pisane z głowy także przepraszam za ew. błędy.