Przenosiny

29 11 2009

Serdecznie zapraszam na kolejną odsłonę mojego bloga na http://blog.tastycode.pl/
Niedługo przeniosę tam wszystkie dotychczasowe wpisy.





Automatyczne dodawanie punktów do WebCron’a.

21 02 2009

Pewnie wiele osób tworzących gry internetowe korzysta z WebCrona, przy wykonywaniu automatycznych “resetów”. Ja też ;)
Pewnego dnia, gdy moja gra dostała 1 dzień w łeb, z powodu mojego zapominalstwa (nie kliknąłem na Dodaj Punkty…) postanowiłem napisać prosty skrypt PHP w oparciu bibliotekę Curl który automatycznie dodawałby punkty do mojego konta na WebCronie.

Kod

<?
 /*
  * Informatic's WebCronDodajPunkty Script
  * Visit http://infdevblog.wordpress.com/ if you like it :)
  */
 $Username = 'nazwaUżytkownika';
 $Password = 'twojeHasło';
 function curl_post(&$c,$url,$data) { //funkcja wysyłająca $data POST'em na dany $url.
  // Nasze pudełko z ciachami :]
  curl_setopt($c, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
  curl_setopt($c, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');

  curl_setopt($c, CURLOPT_URL, $url);
  curl_setopt($c, CURLOPT_POST, 1); //przesyłamy metodą post
  curl_setopt($c, CURLOPT_POSTFIELDS, $data);
  return curl_exec($c);
 }
 $c = curl_init();
 curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
 //logujemy się.
 $login = curl_post($c,'http://webcron.pl/index.html','login_send=true&username='.$Username.'&password='.$Password);
 //dodajemy punkty.
 $dodaj = curl_post($c,'http://webcron.pl/konto.html','add_points=true');
 curl_close($c);
 //i ładne info :)
 echo 'Punkty do WebCrona dodane!';
 //usuwamy plik z ciachami.
 unlink(dirname(__FILE__) . '/cookies.txt');
?>

Kod jest ściśle tworzony pod serwis webcron.pl – na innych serwisach będzie wymagać dostosowania.

Sposób użycia
1. Kopiujesz plik na serwer.
2. W linijkach:

$Username = 'nazwaUżytkownika';  
$Password = 'twojeHasło';

Wpisujesz swoje dane logowania do Webcrona.
3. Wpisujesz w oknie przeglądarki adres do skryptu i cieszysz się 50 punktami ;)

I możesz to jeszcze bardziej sautomatyzować, np. przez dodanie na końcu pliku “admin.php” linijki:

if($_GET['view'] == '') include("webcronDodajPunkty.php");

(skrypt musi nazywać się “webcronDodajPunkty.php”!)

Jak się uprzesz, to też możesz dodawać punkty przy resecie, ale nie wiem czy to zadziała – Webcron może blokować konto podczas wykonywania Twojego żądania ;)

Zabezpieczenia.
Skrypt ten używałem w Vallheru Santic przez automatyczne “includowanie” go w panelu admina.
Dodatkowo dodałem też takie zabezpieczenie na początku naszego skryptu:

$ok_mails = array('mojMeilik@rushh.pl','asdf@corporation.com');
 if(!in_array($_SESSION['email'],$ok_mails)) die('You f*** haxxor!');

^^

A regulamin?
Regulamin webcrona nie zabrania takich skryptów, więc na dzień dzisiejszy możesz z niego korzystać bez żadnych obaw :)

I nowy theme do tego – zomg! :D





Centrowanie tekstu w PHP GD

9 02 2009

Ostatnio pracowałem z PHP GD. Zacząłem się zastanawiać, jak wycentrować tekst względem obrazka. Chciałem Wam dzisiaj przedstawić moje wnioski :)

Plan:
– Dzielimy szerokość obrazka na 2
– Obliczamy szerokość tekstu.
– Również dzielimy go na 2.
– Od podzielonej szerokości obrazka odejmujemy “połówkę” szerokości tekstu.
– Cieszymy się pozycją X tekstu :)
– Z Y podchodzimy podobnie:
– Do połowy wysokości obrazka dodajemy “połówkę” wysokości tekstu. (A dlaczego? Bo Y podawane do imagettftext to “baseline”, czyli dolna linia!)
Kod:
Skorzystamy z funkcji “imagettfbbox” aby obliczyć szerokość tekstu.
Funkcję, która będzie zwracać tablicę z pozycją [XY], w której powinniśmy wyświetlić tekst będzie się roboczo nazywać textCenter.
W parametrach będzie kolejno przyjmować:

$img – uchwyt naszego obrazka (stworzony np. funkcją imagecreate() )
$text – tekst, który chcemy wycentrować.
$size – wielkość czcionki.
$font – ścieżka do pliku z czcionką.

<?
function textCenter($img, $text, $size, $font) {
$t = imagettfbbox($size, 0, $font, $text);
$x = (imagesx($img)/2) - (($t[4] - $t[6])/2);
$y = (imagesy($img)/2) + (($t[1] - $t[7])/2);
return array("x" => round($x), "y" => round($y));
}
?>

Przykład użycia:
<?
/* Ustawiamy katalog czcionek na katalog skryptu.*/
putenv('GDFONTPATH=' . realpath('.'));
$img = imagecreatetruecolor(200,50);

/* Nasz tekst ;] */
$n = "Welcome!";

/* tu możesz podać nazwę jakiejkolwiek czcionki,
   która jest w katalog skryptu*/
$font = "MyUnderwood.ttf";

/* Wielkość czcionki */
$fontsize = 20;

/* Kolorek rushoFFy
 (zerżnięty z php.net:
http://pl.php.net/imagecreatetruecolor) ;] */
$text_color = imagecolorallocate($img, 233, 14, 91);

/* Nasza funkcja */
function textCenter($img, $text, $size, $font) {
$t = imagettfbbox($size, 0, $font, $text);
$x = (imagesx($img)/2) - (($t[4] - $t[6])/2);
$y = (imagesy($img)/2) + (($t[1] - $t[7])/2);
return array("x" => round($x), "y" => round($y));
}

$t = textCenter($img, $n, $fontsize, $font);
imagettftext($img, $fontsize, 0, $t['x'], $t['y'], $text_color, $font, $n);

/* Wyświetlamy obrazek */
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>

Update 1: Dodane round przy zwracaniu wyniku w textCenter ;)
Update 2: Dopiero przed chwilą zauważyłem że oblicanie Y było zwalone ;)





[JavaScript][Idea] Dziedziczenie w JS? (“Extends”)

2 02 2009

Notatka: Można też inaczej: http://kurs.browsehappy.pl/JavaScript/Dziedziczenie :)

Ostatnio mam takie ciekawy pomysły :)

Co by było, jakby tak zrobić dziedziczenie w JS?

Myślałem… Myślałem…
…i wymyślałem. :)
W głowie ułożyłem sobie ot mniej więcej tak:

function object1() {
 this.test1 = "asdf";
}

function object2() {
 this = new object1();
 this.test2 = "asdf2.0";
}

var test = new object2();
console.info(test);

No niby powinno działać, ale nie działa – invalid assignment left-hand side.
No i czemu tu się dziwić, rzeczywiście – this się nie da przypisać. Czyli na pewno nie będziemy korzystać z this, tylko zmienimy sobie na…. th?

Więc dalej zacząłem pisać i wyszło mi coś takiego:

function object1() {
	//Pierwszy obiekt - dziedziczymy po Object..
	//..dlatego można również:
	//th = new Object();
	th = {};
	//jednak tak jest krócej ;]


	//kilka zmiennych testowych
	th.lastObjectName = 'object1'; 
	th.object1 = 'yes';
	return th;
}

function object2() {
	// Tym razem dziedziczymy po object1.
	th = new object1();

	// i znowu testy.
	th.lastObjectName = 'object2';
	th.object2 = 'yes';
	return th;
}

function object3() {
	// Dziedziczymy po object2 (zaraz koniec czytelniku :p)
	th = new object2();

	th.lastObjectName = 'object3';
	th.object3 = 'yes';
	return th;
}

var t = new object3();

alert("lastObjectName: "+t.lastObjectName+
	"\ntypeOf: "+typeof(t)+
	"\nobject1: "+t.object1+
	"\nobject2: "+t.object2+
	"\nobject3: "+t.object3);
//lub, jeżeli masz FireBug'a
//console.info(t);

I, o dziwo, działa :)
Jestem ciekawy co wy o tym myślicie?
Wypowiedzcie się :)





[jQuery UI] Zamykanie okienka przy dialog(“destroy”)

2 02 2009

Ostatnio bawiąc się jQuery UI korzystałem duużo z ui.dialog :)

W moim dorastającym projekcie (może kiedyś więcej opowiem – to nie EL, Glassy Orange Board, ani Celestes ;) ) generuję okienka dynamicznie, czyli np:

$("<div/>").html("Hello world.").dialog({
title: "Hello!"
});

I tak mogę sobie bez nie potrzebnego “appendowania” wyświetlić UI.Dialog :)

Tak stworzone okienka zamykałem brutalnie: remove(), ponieważ dialog(“destroy”), jak i dialog(“close”) zostawiał śmiecie. Chciałem jednak, aby zamykanie okienka było animowane (parametry show i hide w funkcji dialog).

Postanowiłem więc napisać stworzyć prostą modyfikację funkcji destroy. Niestety nie udało mi się tak jej napisać, aby można było z niej korzystać bez podmieniania linijek w ui.dialog.js.

Tak więc oto zmodyfikowane “destroy”, które trzeba zamienić w linijkach ~150 – 165:

/* 
 * jQuery UI Dialog "destroy" function modification.
 * Author: Informatic <infdevblog.wordpress.com>
 * Lines: ~150 - 165
 * ---
 * Now dialog("destroy") animates the "hide effect" 
    of the dialog, and doesn't appends original element to body. 
    Useable while generating dialogs dynamicaly.
 * ---
 * Do with it what you want... But when you use it, 
    tell me about that if you can :]
 */  

destroy: function() {
	var th = this;
	(th.overlay && th.overlay.destroy());
	this.uiDialog.hide(this.options.hide, {}, "slow", function() {
		th.uiDialog.remove();
	});
}

Regards.
Inf.





[jQuery] Nie do końca “onload”

27 01 2009

Przed chwilę zauważyłem rzecz, która może się przydać innym.
Gdy wykonujemy w jQuery kod typu:

$(function() {
[..]
});

Kod “[..]” jest wykonany po załadowaniu DOM’u (nie dziwne ;) ). A obrazki? Obrazki mogą się ładować. DOM jest załadowany i już. Obrazki nie należą do DOM’u, więc event DOMReady jest wykonywany przed załadowaniem obrazków…

…więc jeżeli chcesz wykonać jakiś kod po 100% załadowaniu strony (włącznie z obrazkami, iframe’ami, itp.), skorzystaj z:

$(window).load(function() {
[...]
});

Wtedy kod “[...]” zostaje wykonany po załadowaniu całego dokumentu, nie tylko DOM’u :)

@edit: Tak.. Wiem.. Dopiero niedawno zauważyłem, że to samo jest napisane w dokumentacji jQuery :D





[jQuery] JSON przez POST.

14 01 2009

Oficjalnie oznajmiam – nadal żyję ;) Tak więc witam po przerwie. Była ona spowodowana oczywiście szkołą. Musiałem się zacząć trochę częściej uczyć ;)

Podczas tej przerwy, trochę się działo.. na przykład załóżyłem pierwszą swoją Vallherynkę, na silniku Santic Engine. Już mamy (ja ze znajomym[i] :D ) 34 graczy. Szpaaan xD

Poza tym, zacząłem robić (następną..) graficzną grę MMORPG – od zera oczywiście. Chodzisz ludzikiem, zabijasz potwory, taakie tam :) Z tej okazji napisałem prostą bibliotekę JS (prawdopodobnie ją udostępnię niedługo :D )do animacji sprite’ów (kto nie wie co to jest, odsyłam do Wikipedii) ułożonych w rzędy i kolumny na jednym obrazku.

Przy okazji robienia tej gry, zauważyłem, że jQuery nieposiada funkcji do szybkiego (chodzi mi tu o krótki zapis, tak jak getJSON) wywołania zapytania serwera o dane JSON. Więc napisałem baardzo prosty dodatek do jQuery implementujący funkcję postJSON

/*
 * jQuery postJSON plugin.
 * Do with it what you want.
 */

jQuery.postJSON = function(u,d,callback) {
 return jQuery.post(u, d, callback, "json");
}

Bye.








Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.