Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Graafinen vessanseinäsimu

Sivun loppuun

sooda [22.02.2005 17:42:47]

#

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";
?>

thefox [24.02.2005 16:48:32]

#

Viestit voisivat ajan kanssa haalistua :)

Megant92 [24.02.2005 19:18:01]

#

Olen samaa mieltä fawkin kanssa.

sooda [24.02.2005 19:20:49]

#

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

T.M. [24.02.2005 20:47:18]

#

Hmm... tuon saa tyhjennettyä helposti vaikkei olisikaan admin :)
johtuen PHP:n paskasta "W"-kirjoitusmoodista...
Siis siihen viitaten että ei tuo seinä kestä ;)

sooda [25.02.2005 09:08:37]

#

Ai mitenkä?

Puhveli [25.02.2005 12:08:58]

#

Hee! Tätä on kaivattu ;D Värin saisi useri valita ite kun tuo haalea puuro tuntuu olevan vallitsevana tuolla...

T.M. [25.02.2005 14:21:03]

#

sooda kirjoitti:

Ai mitenkä?

Painaa submit nappulaa enteri pohjassa :P

sooda [25.02.2005 18:03:49]

#

Eihän se sitä tyhjennä kun tossa on joka viesti eri filussa?

T.M. [26.02.2005 02:23:45]

#

Kyllä mie sen sain tyhjäksi =)

chiqu [26.02.2005 13:32:02]

#

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.

D.J-Dew [27.02.2005 21:17:54]

#

mulla ei toimi toi http://sooda.afraid.org/vessa/ ;(

sooda [28.02.2005 09:56:33]

#

Ai häh D.J-Dew, miksei o_O Miten se ei toimi?

AnPi [06.05.2005 20:21:13]

#

http://sooda.dy.fi:8080/~sooda/vessa/vessa_add.php?t=Test
Ei toimi, tulee tollane ilmotus, vaikka mitä sanaa laittaa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta