Aito graafinen vessanseinäsimulaattori.
Helppokäyttöinen adminpaneeli mukana. Systeemi logittaa tekstifiluihin mihin kohtiin tekstit heitettiin ja minkä värisinä ym, joten kuvien näyttäminen on nopeaa koska valmis kuva varastoidaan .png:hen eikä tekstejä piirretä joka latauskerta uusiksi kuvaan, ja sopimattomien viestien kumittaminen on helppoa.
Muutenhan tämmönen olisi ihan liian helppo tehä, joten lisäsin lisukkeena viritelmän joka yrittää pitää tekstit kuvan sisällä niin ettei ne mene yli. Liian pitkät tekstit jotka eivät muutenkaan mahtuis kuvaan menee tietenki vähän yli :) Homma ei oikein toimi monirivisillä teksteillä. Tuskailin kauan ton kanssa mutten onnistunut :D Joku osaava voi vaikka auttaa, jooko?
Tarvii luonnollisesti servulta GD-tuen jotta kuva toimisi, ja koska tekstiä tussataan kuvaan random-kulmassa enkä jaksanut tehdä omaa rotaatiota niin systeemi tarvitsee FreeType-kirjaston (käytetään imagettftext-funktiota jolla saadaan kuvaan kivasti tietyssä kulmassa teksti enempää ihmettelemättä.)
Kannattaa ensin luoda ite manuaalisesti tietofilut tai laittaa hakemistoon joka on chmodattu sopivasti, muuten saattaa tulla ongelmia. (tee oma hakemisto tolle jonne teet sitte logihakemiston kanssa)
Tästä on kanssa kivempi uudempi versio: https://www.ohjelmointiputka.net/koodivinkit/24698-php-graafinen-vessanseinäsimu-kakkone
vessa_add.php
<?php // Koko systeemin ydin. Lisää kuvaan tekstin $teksti = stripsplashes(trim($_GET["t"])); // yleensä se magic_quotes_mikälie on päällä, jos ei niin nappaa stripslashes kuuseen if ($teksti == "") { // tyhjiä tekstejä on turha lisätä header("Location: vessa.php"); // mennään siis takasi die(); } include "vessa_tiadot.php"; // asetukset menoon mukaan // arvotaan kamoja $tekstin_koko = rand($tekstikoko[0], $tekstikoko[1]); $kulma = rand(0, 360); $väri_r = rand($tekstivärirajat[0][0], $tekstivärirajat[0][1]); $väri_g = rand($tekstivärirajat[1][0], $tekstivärirajat[1][1]); $väri_b = rand($tekstivärirajat[2][0], $tekstivärirajat[2][1]); /* lasketaan tekstipalikan viemä tila. ** Kelaillaan eka tekstin leveys */ $rivitettyteksti = explode("\r\n", $teksti); foreach ($rivitettyteksti as $rivi) if (strlen($rivi) > $tekstin_leveys) $tekstin_leveys = strlen($rivi); /* leikitään trigonometrialla. Monirivisillä ei toimi kunnolla, ** mutta eihän niitä tueta :P ** Yrittää siis laskea kuinka paljo suunnilleen vie tilaa x- ja y-suunnassa */ $xpituus = abs(cos(deg2rad($kulma))) * $tekstin_leveys * $tekstin_koko; $ypituus = abs(sin(deg2rad($kulma))) * $tekstin_leveys * $tekstin_koko; // katotaan kumpaan suuntaan teksti on menossa $xsuunta = ($kulma >= 0 && $kulma < 90) || ($kulma > 270) ? 1 : 0; // 1 == oikeelle $ysuunta = ($kulma > 180) ? 1 : 0; // 1 == alas /* Arvotaan koordinaatit mistä teksti lähtee menemään. ** Esim x-suunnassa: Jos teksti menee oikealle, niin se saa alkaa nollasta ja ** loppukohdaksi viritetään semmonen että se suunnilleen mahtuu kuvaan. ** Ei seinän yli kirjoittaminen ole kilttiä. Jos taas teksti menee vasemmalle ** päin, niin sen alkukohta pitää arpoa niin että loppupää (vasemmalle kun ** mennään) ei mene kuvan yli. */ $x = rand($xsuunta ? 0 : $xpituus, $leveys - $xsuunta * $xpituus); $y = rand($ysuunta ? 0 : $ypituus, $korkeus - $ysuunta * $ypituus); // Tehdään kuva mahdollisesti jo olemassa olevasta kuvasta $kuva = @imagecreatefrompng($kuvafilu); if (!$kuva) { // Katos, eka kirjoittaja. Luodaan kuva tyhjästä $kuva = imagecreate($leveys, $korkeus); $tausta = imagecolorallocate($kuva, $tausta[0], $tausta[1], $tausta[2]); } // Ja teksti mukaan kuvaan. imagettftextissä on kätevästi piirtokulma mukana imagettftext($kuva, $tekstin_koko, $kulma, $x, $y, imagecolorallocate($kuva, $väri_r, $väri_g, $väri_b), $fontti, $teksti); imagepng($kuva, $kuvafilu); // heitetään kuva selaimen sijasta filuun imagedestroy($kuva); /* tämmönen systeemi helpottaa adminin työtä. Logitetaan filuihin tekstit, ** ja poistaminen käy helposti kun ei tartte kuvakäsitellä sopimatonta ** tekstiä irti käsin kuvasta :) ** Tein tän oikeastaan ihan vaan muita varten, viritän omille sivuilleni ** varmaan jonkunnäköisen myslillä toimivan, jota useimmilla ei kuitenkaa ole */ /* koska tekstit voivat olla monirivisiä, heitetään ne jokainen eri filuun ** niin on helpompaa. ** Katotaan eka onko hakemisto olemassa, jos ei ole niin luodaan se ** Kannattaa tehdä toi hakemisto ite koska itelläni tuli ongelma: jostain ** syystä mkdir tekee luodulle hakemistolle apache:apache -omistajuudet ** ja safe_modessa ei sitten pääse heittämään sinne mitään. */ if (!is_dir($logihakemisto)) if (!mkdir($logihakemisto)) die("Oho, logittaminen ei onnistunut!"); // tehdään kiva aika uniikki filu ja heitetään sinne tiedot $filu = fopen("$logihakemisto/" . md5(uniqid(rand(), true)), "w"); flock($filu, LOCK_EX); fwrite($filu, "$tekstin_koko|$kulma|$x|$y|$väri_r|$väri_g|$väri_b|$teksti"); flock($filu, LOCK_UN); fclose($filu); header("Location: vessa.php"); // pääsivulle pois ?>
vessa_admin.php
<html><head><title>Vessa-adminaattori</title></head><body><form action="vessa_admin.php" method="post">Valitse poistettavat<br><?php /* adminosio, tällä poistellaan tekstejä kuvasta. Huomaa etten vaivautunut ** tekemään tähän salasanasuojausta, eli jos tosissaan käytät tätä niin nimeä ** tämä filu vaikka niin ettei kukaan arvaa nimeä. Loistosuojaus :) */ include "vessa_tiadot.php"; $poistettavat = $_POST["ne"]; // haetaan tiedot taulukkoon. Eroorhandlerikin jopa mukana $filut = glob("$logihakemisto/*"); if (!$filut) die("Oho, eroori! Onkohan niitä yhtään? Onkoha oikeuksia?"); if (isset($_POST["ok"])) { // jos adminoitu niin katellaan mitä tehdään // tehdään täysin uus kuva ja heitetään siihen ei-poistettavat tekstit $kuva = imagecreate($leveys, $korkeus); $tausta = imagecolorallocate($kuva, $tausta[0], $tausta[1], $tausta[2]); // käydään läpi jokainen filu ja katotaan onko sitä poistettavat-listassa foreach($filut as $filu) { if (in_array($filu, $poistettavat)) { unlink($filu); // poistetaan } else { // ei poistettavat-listassa, joten piirretään se kuvaan // mitä printataan? $sisältö = explode("|", trim(file_get_contents($filu)), 8); // oho onpa pitkä rivi imagettftext($kuva, $sisältö[0], $sisältö[1], $sisältö[2], $sisältö[3], imagecolorallocate($kuva, $sisältö[4], $sisältö[5], $sisältö[6]), $fontti, $sisältö[7]); } } imagepng($kuva, $kuvafilu); // päivitetään kuvafilu imagedestroy($kuva); // tiedot muuttuneet, joten haetaan uusiks ne $filut = glob("$logihakemisto/*"); if (!$filut) die("Oho, eroori! Onkohan niitä yhtään? Onkoha oikeuksia?"); } foreach($filut as $filu) { // printataan simppeli (!) hallintapaneeli $sisältö = explode("|", trim(file_get_contents($filu)), 8); echo "<input type=\"checkbox\" name=\"ne[]\" value=\"$filu\">" . htmlspecialchars($sisältö[7]) . "<br>"; } echo "<input type=\"submit\" value=\"okkatirallaa\"><input type=\"hidden\" name=\"ok\"></form>"; ?></body></html>
vessa.php
<html><head><title>Vessanseinäsimu</title></head><body> <!-- Vähän yksinkertainen käyttöliittymä tälle, esimerkki miten tän voi upottaa minne vain --> <form method="get" action="vessa_add.php"><textarea name="t" rows="4" cols="20"></textarea><input type="submit" value="sano"></form> <?php if (file_exists("vessa.png")) echo "<img src=\"vessa.png\" alt=\"Vessan seinä\">"; ?></body></html>
vessa_tiadot.php
<?php // tein systeemin helpoksi ja säädin asetustiedostosysteemin <3 // olennainen kuvan koon säätö $leveys = 640; $korkeus = 480; /* ite löysin servuni /usr/share/fonts/ttf -hakemistosta. Kiva fontti, mutta jos ** haluat vaihtaa niin tutki jostain. Joo vois laittaa mun fontit tähän servukone TTF # ls *.ttf Vera.ttf VeraMoBI.ttf VeraSe.ttf luximr.ttf luxirr.ttf luxisr.ttf VeraBI.ttf VeraMoBd.ttf VeraSeBd.ttf luximri.ttf luxirri.ttf luxisri.ttf VeraBd.ttf VeraMoIt.ttf luximb.ttf luxirb.ttf luxisb.ttf VeraIt.ttf VeraMono.ttf luximbi.ttf luxirbi.ttf luxisbi.ttf */ $fontti = "VeraMono.ttf"; // kiva niistä $tausta = array(255, 255, 255); // kuvan taustaväri // tekstien värien rajat, eka r, sitte g ja lopuks b:n min- ja max-arvot $tekstivärirajat = array(array(0, 192), array(0, 192), array(0, 192)); $tekstikoko = array(8, 30); // tekstin koon rajat // filut joihin varastoidaan kuvatiedot $kuvafilu = "vessa.png"; $logihakemisto = "tekstit"; ?>
Viestit voisivat ajan kanssa haalistua :)
Olen samaa mieltä fawkin kanssa.
Pah, mun seinä ja tussit on kestäviä ja tota seinää ei pahemmin tökitä niin että ne tekstit kuluisi :) Voisi tohon joskus semmoisen tehdä mut ei sitä nyt jaksa :P
Hmm... tuon saa tyhjennettyä helposti vaikkei olisikaan admin :)
johtuen PHP:n paskasta "W"-kirjoitusmoodista...
Siis siihen viitaten että ei tuo seinä kestä ;)
Ai mitenkä?
Hee! Tätä on kaivattu ;D Värin saisi useri valita ite kun tuo haalea puuro tuntuu olevan vallitsevana tuolla...
sooda kirjoitti:
Ai mitenkä?
Painaa submit nappulaa enteri pohjassa :P
Eihän se sitä tyhjennä kun tossa on joka viesti eri filussa?
Kyllä mie sen sain tyhjäksi =)
Hienohan tämä on, mutta jos joku onnistuu tekemään tollasen niin, että viestit eivät voi mennä päällekkäin (eli tarpeeksi pienellä fontilla, jottei seinä täyty / enemmän seiniä linkkien takana) ja, että ne voivat taipua korkeintaan sen 180 astetta, jotta lukeminen on kohtuu helppoa niin sitten on hatunnosto paikallaan.
mulla ei toimi toi http://sooda.afraid.org/vessa/ ;(
Ai häh D.J-Dew, miksei o_O Miten se ei toimi?
http://sooda.dy.fi:8080/~sooda/vessa/vessa_add.
Ei toimi, tulee tollane ilmotus, vaikka mitä sanaa laittaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.