Jump to content

Mootooho kruzok mladeho programatora


mootoo
 Share

Recommended Posts

KAPITOLA č.1 :

Mno bol tu už jeden pokus zasvetiť par ludi do programovania PSP v jazyku C, podla mna na to isiel KGSWS trochu rychlo. Preto by som vam chcel pomoct trochu iným pohľadom na vec a prebrať problem od piky.Myslim ze najťažší je vždy ten krok č.1. :) , tu to plati tiež ale snaď to niekto aspon vyskúša.Prevažná časť materialu ktorý budem používat ako vzor sa nachadza na forach psp-programming.com

Tak podme na to :

CYGWIN

Prvý krok je inštalácia vývojarskeho prostredia to bude pre nas CYGWIN ( je to vlastne emulator LINUX-u pre Windows)

stiahnite si SETUP file CYGWINU TU: http://www.cygwin.com/setup.exe

Po spusteni stiahnuteho installera stlacte NEXT .Označte default option v "Install from Internet," a stlačte NEXT.

Nastavte cestu pre instalaciu "C:/cygwin" kde C: je váš lokálny harddisk. Ostatne voľby nechajte nastavené na default a stlacte NEXT.

Teraz nastavte adresár kam installer nahra stiahnute subory potrebne pre inštalaciu (miesto ktore si zapametáte po instalacii ich mozete vymazať)a stlacime NEXT.

Dalšie okno sa vás bude pýtať na vaše net nastavenia ak nepoužívate PROXY (alebo ani neviete čo to PROXY je :D) stlačte NEXT.

Teraz by sa vám mal zobrazit zoznam servrov na ktorych su potrebne subory pre inštaláciu.Nejaký si vyberte a stlačte NEXT.

Teraz sa stiahne zoznam. Naskrolujte na "devel" a kliknite tam kdeje "default" to sa zmení na "install".

Naskrolujte na "web," a kliknite na "+".

Naskrolujte na "wget" a nastavte na "install".

f_wgetm_8c75d10.jpg

Ak to vsetko mate stlacte NEXT a CYGWIN začne sťahovať a inštalovať ,čo chvylu

potrvá (kľudne si nieco kuknite v TV :D). Po dokončeni ste pripravený na inštalaciu TOOLCHAIN-u.

TOOLCHAIN

Tak teraz spustime CYGWIN.Ukaže sa vám okno s príkazovým riadkom a "yourusername@yourcomputername ~" znamena to že CYGWIN je nainštalovaný v poriadku.Zatvorte CYGWIN.

Najnovší TOOLCHAIN sistiahnite tu: http://ps2dev.org/psp/Tools/Toolchain/

Po stiahnuti súboru tento rozpakujte do adresára "C:/cygwin/home/user," kde "user" je vaše uživateľské meno.

Chodte do adresara C:/CYGWIN/ a editnite CYGWIN.BAT , dajte tam toto:

@echo off

C:
chdir C:\cygwin\bin

set path=%path%;C:/cygwin/usr/local/pspdev/bin
set PSPDEV=C:/cygwin/usr/local/pspdev
set PSPSDK=C:/cygwin/usr/local/pspdev

bash --login -i

OK teraz chodte do adresara C:/CYGWIN/HOME/USER(váš nick) a prepíšte subor .bash_profile tým ktory je v prílohe.(rozbalte ho!!!)

OK teraz spustite CYGWIN a napíšte "ls" (je to malym LS) a potvrdime ENTER ,ukáže sa vám adresár PSPTOOLCHAIN a to je to co potrebujeme :) takze napíšeme "cd PSPTOOLCHAIN" a potvrdime ENTER.

Napíšeme "svn update" a potvrdime ENTER.

Keď sa dokončí napíšeme "./toolchain.sh" a potvrdime ENTER. Odporúčam to spraviť na večer a ist spať (trvá to od 3 do 5 hodín!!!)

Po tomto kroku reštartujeme CYGWIN a možeme sa pustit dopísania svojhoprvého programu.

v plane je

-ako citat zapis programu v C

-základne príkazy (ako to funguje+syntax)

-manipulacia s obrazkami+animovanie

-prehravanie MP3 vo vasom programe

-ako napísať jednoduchú hru 8)

Takže podme do toho

AKO CITAT ZDROJOVY TEXT PROGRAMU?

Každy zdrojový kod obsahuje nejake časti ktoré tam jednoducho musia byt.

#include <pspdisplay.h>
#include <pspctrl.h>
#include "graphics.h"

Na zaciatku každeho programu najdeme par riadkov ktore obsahuju príkaz #include ktorý hovorí o tom aké knižnice je treba aby program bežal. #include<> hovori to že ide o knižnicu ktora je nainštalovaná priamo v dev prostredi (PSPTOOLCHAIN) a prikaz #include"" zas to že použijeme knižnicuktora je priamo vložena v adresary od kial budeme kompilovat (premenime zdrojový text na spustiteľný subor EBOOT.PBP),všetko postupne pochopíte.

PSP_MODULE_INFO("PokerbyMooToo", 0, 1, 1);

toto je dalšia časť povinnej jazdy je to v podstate len informatívna zaležitosť ale musí tam byť.Samo sebou že nazov určíte sami a tie dve jednotky možete menit označujú verziu.

#define RGB(r, g, b) ((r)|( (g)<<8 )|((b)<<16)) 

tento riadok obsahuje definíciu makra, ked ovladateboolovualgebru alebo pocty v binarnej sustave tak sa to da vysvetlit konkretne ale inac je to zbytocne da sato zapisat aj v decimalke a je to asi takto( r+(g+2^8)+(b+2^16)). V C si možete definovať svoje vlastne makro funkcie a príkazy to je obrovska výhoda ked pisete program ,ak používate funkciu ktoru mate 20x v zdrojaku tak ju jednoducho zavolate jej názvom .

funkcia void

ked si chceme vytvorit vlastný podprogram nie len aritmetickeho charakteru použijeme tento príkaz

priklad:

void APLUSB()
{
X=(A+B);  // jednoducho vlozi do bunky X sucet A+B
}
.
.
.
A=1;B=2;
APLUSB(); // tu vlastne volame funkciu APLUSB
....

No a tu je toho viac na vysvetlenie . Riadok void APLUSB() vlastne hovorí o tom že novo nadefinovaný podprogram sa bude volať APLUSB a v ďalšom slede ho možeme vyvolať jednoduchým APLUSB();

Znak { označuje začiatok tela funkcie a } zase koniec ide o to že označujú vždy nejaku čast kódu ktora sa vykona len za určitej podmienky (príkazy if,dowhile,while,for,switch).Prikazy ktore vetvia program tj if,switch a prikazy ktore cyklia program for,while,dowhile nesmu koncit ; znak ; hovori kompileru ze riadok-prikaz sa tu konci.

exit callback!!!!!

Toto je proste povinna jazda je to vlastne definicia podprogramu ktori hovori o tom ako sa ma program vypnut ked stlacite home a date yes.Je bez predmetne tento blok podrobnejsie rozoberat naozaj to nema vyznam musi to tam byt.

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         sceKernelExitGame();
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;
}

Fajn v C mozete nazvat bunku povedzme BUNKA je uzitocne pisat definovane bunky velkym pismom kedze C je casesensitive tj citlivy na male a velke pismena.Lahsie potom rozlisite pri neskorsom citani kodu co je co.Bunka je vlastne nejaka castpameti ram do ktorej nieco vlozime.A to co tam budeme vkladat to musime najprv zadeklarovat.Ak to bude cislo bez desatinnej ciarky napr 0,1,100,5000,6 tak je to integer a definujeme ho nasledovne:

int BUNKA;

Ked cislo obsahuje desatinnu ciarku tak je to float a definujeme:

float BUNKA;

niekedy potrebujeme aby bunka uchovavala znaky napr.: a,D,q,1,t,9 ano cislo moze byt ako znak ale aj ako cislo toto kazdy jeden pocitac rozlisuje prispracovavani toho udaju ked budete mat dva znaky "1" + "1" vysledok bude "11" vtipne co? ale ked to budu cisla bude to 2.Ked chceme aby BUNKA obsahovala znak tak definujeme:

char BUNKA;

Ak chceme definovat viac znakov tj retazec co je vlastne luc znakov robime to takto:

char BUNKA[100];

znamena to tolko ze BUNKA bude obsahovatmax 100 znakov.

to iste plati aj pri cislach.

No a dalsia povinna cast programu je vlastne telo programu :

.
.
.
.
.
.
.
int main()     
{                    
.                            //
.                            //
.                            // toto je telo programu
.                            //
.                            //
}

Take drobne upozornenie C nepozna prikazy vetviace program ako su GOTO GOSUB tj vsetko sa musi logicky cyklit, ale ziadny strach je to riesitelne.

if...else..

if(A==1){B=1;} else {B=0;}

tento riadok nam hovori toto ak A sa rovna 1 ( v C ked damejedno = tak vkladame ked porovnavame taktreba dat == ) tak B rovna sa 1 (koniec prikazu ; ) inak B rovnasa 0 mozeme dat aj viac prikazov do rady napriklad :

if(A==1){B=1;C=3;F=9;}

a tak isto nemusime pouzit else ale v niektorych pripadoch to naramne ulahci zivot.

Ak chceme pouzit logicky sucet tj alebo napiseme || v tomto pripade :

if ((A==1)||(B==1)) 

zistujeme toto ak A=1 alebo B=1.

Nasobenie je && tj. :

if ((A==1)&&(B==1)) 

ak A=1 a B=1.

Alebo:

if (A != 1) 

ak A nerovna sa 1.

Vzdy pri splneni podmienky sa vykona cast kodu za podmienkou v zlozenej zatvorke.Nieje podmienka dat za if zlozenu zatvorku ale je to prehladnejsie aurcite si na to zvyknete.

for ,while

tieto prikazy cyklia program ,dost dolezite!!!

Takze prikaz for,dufam ze ste si vsetci vsimli ze prikazy su vsetky napisane malim pismom ,nieje to nahodou ony tak musia byt.Ale spat k veci niekedy potrebujeme v programe spravit tzv. loop ide o zacyklenie ukazem vam to priamo na priklade:

.
.
.
for(X=0 ; X<10 ;X++)  // toto je definicia cyklu
{//
.//
.// toto je telo cyklu
.//
}//
.

No co to tam vlastne je napisane??? takze cyklus sa sklada z dvoch casti definicie cyklu a tela cyklu. Definicia cyklu nam hovori o tom za akych podmienok sa vykona telo cyklu ,v nasom pripade : for=>pre X plati X=0 a cyklus plati kym X<10 tj ak X=10 uz neplati podmienka a telo cyklu nebude vykonane!!! no a to X++ znamena ze pokazdom vykonani tela cyklu sa nam X zvacsi o 1 je to to iste ako X=X+1 ak chceme pouzit iny krok mozeme napriklad miesto X=X+3 napisat X+=3 to iste plati aj pre minus (X--).Telo cyklu vlastne obsahuje nejaky kod ktory chcete opakovat , neskor pochopite preco je dolezite vediet spravne postavit cyklus.

while

Tento loop funguje trosicku inac.dajme si priklad :

while(KONIEC==0)   // definicia cyklu
{//
.//
.//
.// telo cyklu
.//
.//
}

A zase dve casti ,definicia cyklu hovory o tom dokedy plati cyklus(loop).V nasom pripade sa telo cyklu vykonava dovtedy kym plati ze KONIEC sa rovna 0 ak dame pred riadok while(......)... riadok KONIEC=1; tak sa loop nevykona vobec, jasne nie?

OK tak si rozoberme na drobne jeden zdrojak od KGSWS bude to uplne jednoduchy programek ;)

Link to comment
Share on other sites

  • Replies 117
  • Created
  • Last Reply

Top Posters In This Topic

KAPITOLA 2.

Tak a je to tu ideme na prvy program ;) ak niecomu nebudete rozumiet sme na fore takze piste ,ale skuste najprv porozmyslat sami.

Chodte do adresara C:/CYGWIN/HOME/USER(VAS NICK)/ a vytvorte si adresar ZDROJAKY rozkliknite si ho a vytvorte adresar HELLO.

Oki takze potrebujeme nieco v com tie zdrojove texty budeme pisat stiahnite si napriklad ProgramersNotepad ten pouzivam aj ja a je to super programek.

Link:http://puzzle.dl.sourceforge.net/sourceforge/pnotepad/pn2061.exe

No spustite PN a hned sa vam otvory okno NEW, prepnite si hore switch z plain text na C,C++ a mozeme sa dotoho pustit.

Zapiste toto:

// Hello World - Moja prva aplikacia  pre PSP

/*
         Program vytvoril (Tvoje meno) dna (Datum)
         Je to jednoducha "Hello World" Aplikacia.
*/ 

Tak a mame hotove info podla ktoreho ked si niekto otvori vas zdrojak bude vediet o co ide a kto je autor.

Pokracujeme:

#include <pspkernel.h>
#include <pspdebug.h>

V tejto casti programu ako uz iste viete povieme kompileru(TOOLCHAIN) co budeme potrebovat ake kniznice alebo moduly pre spravne skompilovanie programu.

V dalsom kroku napovieme nieco PSPcku nieco o nasom programe.Prvy atribut je meno programu (ale nie to ktore vidite v menu PSP:bash: to zmenime neskor),dalsie atributy nechame tak ako su ale napr tie jednotky oznacuju verziu programu.

Takze piseme:

PSP_MODULE_INFO("Hello World", 0, 1, 1);

V dalsom kroku si nastavime funkciu ktoru budeme pouzivat v programe ,nie je to povinne ale uznajte samy, funkcia pre zapis textu na obrazovku PSP sa vola "pspDebugScreenPrintf".Preto si ju zjednodusime na "printf" a to nasledujucim riadkom:

#define printf pspDebugScreenPrintf 

Takze dufam ze je zatial vsetko jasne ? :) ak nie pokojne si to precitajte este raz je dolezite aby ste pochopili kazdy krok vzdy si radsej precitajte to comu nerozumiete znovu, je to jedina cesta ako pochopit ako to funguje.

Fajn mam pre vas jednu dobru a jednu zlu spravu. :lol: Ta zla je ze nasledujuci blok programu je dost zlozity, ale ta dobra je ze mu vobec nepotrebujete rozumiet:D .Skratka hovori o tom co sa stane ked stlacite tlacitko HOME a potvrdite YES.Je to povinna jazda a musi ho obsahovat kazdy program aby sa vedel korektne ukoncit (nie zaseknut PSP)

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         sceKernelExitGame();
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;
} 

Urcite likvidujete CTRL+C a CTRL+V co? :D:D:D Osobne odporucam prepis rucne aby ste to dostali do prstov ,tu strukturu zapisu ukoncovanie riadkov za pomoci ";" atd..Ak mate CZ alebo SK klavesnicu prepnite si ju na EN.

Fajn teraz to najhlavnejsie. Kazdy program v C musi obsahovat tzv main je to cast programu ktora sa vykonava , vsetko co sme do teraz zapisali sa bude pouzivat az v tejto funkcii ,jednoducho a kratko povedane program zacina bezat tu:

int main() {

Zlozena zatvorka oznacuje zaciatok bloku main.

Kazdy riadok programu sa musi koncit bodkociarkou. Dovod je taky ze kompiler nevidi biele miesta medzi riadkami jednoducho ked nechate 100 volnych riadkov kompiler ich jednoducho preskoci a pokracuje na dalsom riadku kde je text. Je to uzitocne vdaka tomu mozeme formatovat text tak ako nam to vyhovuje aby sme jednoducho vedeli pohladom oddelit jednotlive casti kodu. Mozete spojit vsetky riadky do jedneho len musite prikazy oddelit tymto znakom ";" :bash:. Takze pridajme tieto dva riadky pre nastavenie prostredia programu

pspDebugScreenInit(); // inicializuje textovu obrazovku PSP
SetupCallbacks(); // tu zinicializujeme ten kod ktory ma na starost tl. HOME

No a teraz nam ostava uz len jedno napisat na obrazovku PSP "HELLO WORLD!!!".Pouzijeme na to funkciu ktoru sme si zadefinovali na zaciatku , printf .

 printf ("HALLO WORLD!!!");

Takze teraz uz potrebujem zastavit beh programu ten prebehne tak rychlo ze by ste vase krasne helloworld asi neprecitali :D spravime to tymto prikazom:

sceKernelSleepThread();

Teraz uz potrebujeme iba ukoncit blok main.

 return 0; 

Ide o to ze int main() znamena ze funkcia main nam vracia int tj cele cislo, kedze funkcia main konci a tym aj cely program hodnota 0 sa vrati systemu a povie mu ze program prebehol spravne.(Ak nastane nejaka porucha tak funkcia vrati 1 ale to je teraz pre vas nepodstatne neskor to pochopite a to hned v dalsej casti)

A konecne mozeme uzavret blok main napiseme:

}

HOTOVO!!! a mame napisany zdrojak :D teraz uz len vysvetlit kompileru ako ho ma premenit na EBOOT.PBP tj v PSP spustitelny subor.

Takze ulozte si zdrojak ako main.c do adresara HALLO ktory sme si na zaciatku vytvorili a vytvorte novy subor.

Do noveho okna vlozte nasledovne:

TARGET = hello
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Hello World

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Jednoducho poviete kompileru aby zobral "main.c" a premenil ho za pomoci PSPSDK na .pbp file ktory PSP dokaze precitat. Co potrebujete zmenit v makefile ak ho chcete pouzit pre ine vase jednoduche projekty je "PSP_EBOOT_TITLE = Hello World." Zmenite tym meno programu ktore vam vyskoci ked na neho v psp nabehnete.

OK teraz novy subor ulozime ako makefile bez pripony do adresara kde mate main.c tj HALLO.

A ideme kompilovat.Spustite si CYGWIN.

Napiste do prikazoveho riadku

 cd zdrojaky

potvrdte enter.

Napiste

 cd hallo 

stlacte enter.

Fajn napiste

ls

a stlacte enter, uvidite vase dva nove subory main.c a makefile.

Napiseme

make

a stlacime enter, ak mate zdrojak spravne napisany bez preklepov a chyb tak vam kompiler vytvori novy fajl v adresary HALLO,ak ste boli uspesny nakopirujte ho do PSP/GAME150/HALLO/ a mozete ho spustit vo vasom PSP.

Vela stastia!!! na buduce kukneme na ovladanie klavesami a trosku grafiku ;).

Link to comment
Share on other sites

Kapitola 3

Takze pre pokracovanie potrebujete stiahnut kniznicu pre pracu z PNG obrazkami.Spustite CYGWIN a do prikazoveho riadku vlozte nasledovne:

svn checkout svn://svn.pspdev.org/psp/trunk/zlib 

potvrdte ENTER.

ked sa vam dostahuje napiste do prikazoveho riadku toto:

cd zlib 

ENTER

make

ENTER

make install

ENTER

Super a mame kniznicu zlib nainstalovanu.

Dalej budeme potrebovat kniznicu libPNG, je to ten isty postup:

cd ..
svn checkout svn://svn.pspdev.org/psp/trunk/libpng
cd libpng
make
make install 

Este je treba stiahnut prilohu PNG a rozbalit ju do adresara s zdrojakom noveho programu.

Tak mozeme zacat.

K tejto casti uz hadam netreba ziadny komentar:

#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <png.h>
#include <stdio.h>
#include "graphics.h"

Ano "" znamena ze budeme pouzivat kniznicu ktora musi byt priamo v adr kde mame main.c .

#define RGB(r, g, b) ((r)|((g)<<8)|((b)<<16))

PSP_MODULE_INFO("kapitola3", 0, 1, 1);

Nadefinujeme si makro RGB a povieme PSP co to vlastne ideme stvarat:)

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         sceKernelExitGame();
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;

To uz pozname ze?

SceCtrlData pad;
int X,Y,POHYBX,POHYBY,NASOBIC,STOP;
char MENOSUBORU[100],RETAZEC[100],PISMENO[10];
Image* OBRAZOK;
Image* POZADIE;

Uff.... takze zadefinujeme pad(treba to pre citanie tlacitiek)

Zadefinujeme vsetky ciselne premenne,

dalej premenne obsahujuce znaky (pismena+cisla+ine znaky),napriklad: PISMENO[10] znamena ze retazec PISMENO moze obsahovat maximalne 9 znakov.(je to tak o jeden menej)

a obrazky.(dalej budeme pouzivat uz len mena premennych a PSP uz bude vediet ci je to obrazok ,cislo ,alebo retazec)

void COSOMSTLACIL()
{
POHYBX=0;POHYBY=0;
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CROSS){STOP=1;} 
if(pad.Buttons & PSP_CTRL_RIGHT){POHYBX=1;}
if(pad.Buttons & PSP_CTRL_LEFT) {POHYBX=-1;}
if(pad.Buttons & PSP_CTRL_UP)   {POHYBY=-1;}
if(pad.Buttons & PSP_CTRL_DOWN) {POHYBY=1;}
}

Teraz si vytvorime podprogram na zistovanie stlacenych tlacitiek.

void NOVEHOPRIKAZU() tu si zadefinujeme ako sa novy prikaz resp podprogram bude volat.

Do buniek POHYBX a POHYBY si vlozime 0 neskor vysvetlim preco.

V dalsom riadku nacitame stlacene tlacitko.

No a teraz urcime co sa stane po stlaceni tlacidiel ,napriklad : ak bol stlaceny krizek do ciselnej premennej STOP vlozime 1.

No a tie zlozene zatvorky {} ukazuju od kial po kial sa vykona podprogram.

void VYKRESLENIESCENY()
{
blitAlphaImageToScreen(0,0,480,272,POZADIE,0,0);
blitAlphaImageToScreen(0,0,12,12,OBRAZOK,X,Y);
sprintf(RETAZEC,"X=%d ,Y=%d",X,Y);
printTextScreen(0, 0, RETAZEC, RGB(255, 255, 255));
flipScreen();
}

No a toto bude trosku komplikovanejsie.Takze prikaz blitAlphaImageScreen(0,0,480,272,POZADIE,0,0); vlozi do videopamate PSP nasledovne : prve 4 cisla 0,0,480,272 su vlastne offsety X,Y zaciatok obrazku X,Y koniec obrazku, kedze ide o pozadie tj cela obrazovka tak obrazok ma velkost 480x272 , dalsi udaj je pointer v pamati kde su ulozene data obrazku, (meno pointera sme zadefinovali na zaciatku programu a neskor ho tam aj vlozime)no a posledne dva udaje su suradnice X,Y od kial sa zacne obrazok vykreslovat tj lavy horny roh obrazku.

Dufam ze tomu rozumiete ak nie napiste vysvetlim.

Tak zase novy prikaz ;) ,sprintf tento prikaz zapisuje do premennej, je podobny ako printf ,takze ,riadok sa da precitat aj takto do retazca RETAZEC napis X=decimalnecislo1 ,Y=decimalnecislo2 ,kde cislo1=X a cislo2=Y ;) jasne nie?

printTextScreen(0, 0, RETAZEC, RGB(255, 255, 255)); vypise na graficku obrazovku text syntax je jednoduchy (x, y, - suradnice kde zacneme pisat v pixeloch, retazec alebo premenna obsahujuca retazec a nakoniec farba v HEXcisle toto za nas robi to makro RGB ;) tento prikaz nevie vypisovat cisla ,preto som cislo najprv vlozil do RETAZEC a tym padom som ho premenil na char ktory tento prikaz zobrazit vie :D .

No a potom uz len updatneme display to znamena ze ukazeme co sme tam poskladali a to prikazom flipScreen();

Poradie je umyselne poskladane tak ako je najprv nakreslime pozadie to znamena ze vlasne prekreslime predosly obraz tj ho vymazeme!!! dalej vykreslime OBRAZOK 12x12 pixelov ktorym budeme pohybovat a nakoniec napiseme suradnice X a Y kde sa obrazok nachadza, to znamena ze pismo uvidime aj ked sa obrazok bude nachadzat pod nim.

void POZICIAOBRAZKU()
{
X+=(POHYBX*NASOBIC);
Y+=(POHYBY*NASOBIC);
// tu si nastavime kraje display-a
if(X<0){X=0;}
if(X>(480-12)){X=(480-12);}
if(Y<0){Y=0;}
if(Y>(272-12)){Y=(272-12);}
}

Tak a posledny blok void .Ide tu vlastne len o to ze vypocitame kde je nova pozicia obrazku a zabranime tomu aby sa dostal mimo display.

Takze suradnica X=X+(POHYBX krat NASOBIC) NASOBIC nam vlastne urci o kolko pixelov alebo bodov sa suradnica zmeni ak bude NASOBIC=3 a stlacite vpravo POHYBX sa bude rovnat 1 tj k X sa pripocita 3 ak stlacite do lava POHYBX sa bude rovnat -1 a k X sa pripocita -3 teda realne sa odpocita 3 ok? POHYBX ked sa teraz vratite k podprogramu citania tlacitiek tak pochopite tie 1 a -1 ;) ,to iste plati aj pre Y suradnicu.

A teraz nastavime krajne suradnice, kedze obrazok sa vykresluje z laveho horneho rohu a display ma v lavom hornom rohu suradnice 0,0 tak lavy a horny okraj mozu mat minimalne hodnotu 0 tj minimalna suradnica pre X aj Y je 0 ak bude mensia tak do nej vlozime 0.

Pravy dolny roh display-a ma suradnice 480,272 (X,Y) ale ak budeme nas obrazok vykreslovat tu tak ho neuvidime pochopitelne ze? ak to nechapete precitajte si tento odstavec este raz.Takze od maximalneho poctu stlpcov aj riadkov odpocitame pocet pixelov obrazku ,v nasom pripade 12 a 12 a ziskame maximalnu hodnotu X a Y naseho obrazku aby ho bolo vidiet a osetrime aby tieto hodnoty nemohol program prekrocit.

int main()
{
SetupCallbacks();
   initGraphics();

No a tu sa vlasne zacina nas program vykonavat , nastavime "CALLBACKS" a zinicializujeme graficku obrazovku ,nie ako pri HALLO W. textovu(debugscreen).

sprintf(MENOSUBORU,"./MOJEPOZADIE.PNG");	
POZADIE=loadImage(MENOSUBORU);

Toto je miesto kde povieme PSP ze do premennej POZADIE treba nacitat obrazok MOJEPOZADIE.PNG

Umyselne zacinam od konca ,dalo by sa to zapisat aj takto : POZADIE=loadImage("MOJEPOZADIE.PNG"); no dalej pochopite preco to robim takto.

sprintf(PISMENO,"M");	
sprintf(MENOSUBORU,"./ADRESAR/%sOJOBRAZOK.PNG",PISMENO);
OBRAZOK=loadImage(MENOSUBORU);

Predstavte si ze by ste chceli nejakym parametrom v programe zmenit subor ktory sa nacita povedzme nie JABLKO.PNG ale MELON.PNG, uzitocne nie? ale v podstate tiez plati to co predtym.

X=((480/2)-6);
Y=((272/2)-6);
STOP=0;
NASOBIC=3;

Nastavime si pociatocne parametre X a Y tak aby sa nam na zaciatku objavil nas obrazok presne v strede obrazovky, a pohyb sa menil o 3 body naraz.

while(STOP==0)
{
COSOMSTLACIL();
POZICIAOBRAZKU();
VYKRESLENIESCENY();
}

A uz to prislo, vytvorime loop ktory pobezi kym nestlacite X(vtedy STOP=1 a nieje splnena podmienka loopu)

takze krok1 zistime ci bolo stlacene tlacitko a ake .

krok2 podla toho ci bolo alebo nebolo stlacene tl. vypocitame nove suradnice X,Y obrazku,

krok3 nakreslime novu obrazovku a vratime sa na bod 1 az do vtedy kym bude platit STOP=0 alebo neukoncime program tlacidlom HOME (to zabezpeci CALLBACK).

sceKernelExitGame();
return 0;
}

No a pekne program ukoncime a vyskocime do XMB.

Pre kratkost casu vam makefile popisem neskor je pribaleny v prilohe.

Nabuduce nejake tie zvucky. ;)

Link to comment
Share on other sites

KAPITOLA c.4.1

Takze kukneme sa na zvuky ukazeme si dve metody zacneme MP3 potom kukneme na WAV a nakoniec ako sa daju tieto dve metody pouzivat naraz a na co je to dobre ;) .

Prve co bude treba spravit je stiahnut libmad z SVN. libmad je MPEG audio decoder vydany pod GPL.

Port na PSP napisal John_K.

Takze, otvorime Cygwin, a piseme :

svn checkout svn://svn.ps2dev.org/psp/trunk/libmad 

Uvidite dlhy list stahovanych suborov ;) .

Teraz sa prepneme do libmad adresara a compilujeme kniznicu:

cd libmad 
make 

No teraz potrebujeme kniznicu nainstalovat postup je nasledovny:

make install

Malo by sa to nainstalovat na spravne miesta. Ale, libmad install script sa tvari ako poskodeny. Netreba sa strachovat, da sa to aj rucne ;) .

cp -Rf ./include /usr/local/pspdev/psp/

cp -Rf ./lib/libmad.a /usr/local/pspdev/psp/lib

Poznamka: Medzera sa vklada "./include" a "/usr..." a medzi "libmad.a" and "/usr..."

Toto nam nakopiruje vsetko kam patri. "-Rf" tag znamena "Recursive" a "final" -- musite to spravit spravne aby nebol ziaden problem (niekomu to nepojde spravne bez tej rucnej instalacie ;) ).

Uf tak a mozme ist na program.Potrebujeme si stiahnut este prilohu ktora obsahuje subor "mp3player.c" a "mp3player.h"(je na konci prispevku).

Takze ideme:

// program na prehratie MP3-ojky musi mat 128kbit/s+pevny tok nie VBR

#include <pspkernel.h>
#include <pspctrl.h>
#include <pspdebug.h>
#include <pspaudio.h>
#include <pspaudiolib.h>
#include <psppower.h>

#include "mp3player.h"

PSP_MODULE_INFO("Mp3 Player ", 0, 1, 1);
#define printf pspDebugScreenPrintf

Tak toto uz vsetci ovladate nie? ak nie tak citajte predosle manualy.

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         sceKernelExitGame();
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;
}

Tak a teraz k funkcii main();. Najprv nastavime takt procesora na plno (333MHz).Funkcia "pspAudioInit()" je podobna ako "pspDebugScreenInit()" ktoru sme uz pouzivali. Tato funkcia zinicializuje zvukove systemy PSP.

int main() {
         scePowerSetClockFrequency(333, 333, 166);

         pspDebugScreenInit();
         SetupCallbacks();

         pspAudioInit();
         SceCtrlData pad;
         int i;

No a teraz novinky ;) !!!

MP3_Init(1);
         MP3_Load("test.mp3");
         MP3_Play();

MP3_Init() zinicializuje libmad a nastavi channel cez ktori sa prehra mp3 (v nasom pripade, Channel 1). MP3_Load() je dost jasne, nahraje do pamate MP3 file (tu zmente nazov vaseho suboru, alebo premenujte vas subor MP3 na "test.mp3"). MP3_Play() spusti prehravanie vaseho MP3 suboru.

 while(1) {
                   sceCtrlReadBufferPositive(&pad, 1);
                   if(pad.Buttons & PSP_CTRL_CROSS) {
                             break;
                   } else if(pad.Buttons & PSP_CTRL_CIRCLE) {
                             MP3_Pause();
                             for(i=0; i<10; i++) {
                                       sceDisplayWaitVblankStart();
                             }
                   }

                   if (MP3_EndOfStream() == 1) {
                             MP3_Stop();
                   }
         } 

Takze vytvorime si nekonecny loop a citame klavesy.Ak stlacime X tak jednoducho loop zlomime a program pokracuje za touto seqenciou.Ak stlacime O pouzijeme dalsiu novu funkciu "MP3_Pause();"snad viete co asi tak moze robit :D ,a vytvorime loop 10x prebehne ide o to aby sa vytvorila mala pauza inac by sa nedalo pauznut lebo by znova prebehol loop a pauza skonci. No a posledna podmienka hlada koniec suboru ,ak nam mp3 skonci tak sa zastavi prehravanie ,inak by sa pustila odzaciatku.No a kedze je loop nekonecny tak musite stlacit X ,alebo pridat za "MP3_Stop();"este"break;"inac sa program neukonci .

 MP3_Stop();
         MP3_FreeTune();

         sceKernelExitGame();

         return 0;
}

No a pre korektne ukoncenie programu zastavime prehravanie vyprazdnime pamet(vykopneme z nej mp3-ojku) a ukoncime program no a posleme systemu 0 ze program prebehol v poriadku.

Fajn tu je makefile:

TARGET = mp3
OBJS = mp3player.o main.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR = 

LIBS = -lmad -lpspaudiolib -lpspaudio -lpsppower
LDFLAGS = 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = MP3 Player Example
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

KAPITOLA c.4.2 WAV

Takze teraz si pozreme MIKMOD, trochu podrobnejsie ;) uvidite aj preco podrobnejsie, budeme pouzivat PNG a WAV v tomto momente este nemam napisany zdrojak pre tento tut a budem ho pisat zarovno s tymto tutom ;)

V podstate mozeme zacat vyjadrovat sa budem uz len k novym veciam ak nieco nepochopite pytajte sa!!!!

#include <pspkernel.h>
#include <pspctrl.h>
#include <pspdebug.h>
#include <pspaudio.h>
#include <pspaudiolib.h>
#include "wavloader.h"
#include <pspgu.h>
#include <png.h>
#include <stdio.h>
#include "graphics.h"

#define RGB(r, g, b) ((r)|((g)<<8)|((b)<<16))
Image* OBRAZOK;
Image* POZADIE;

Takze jasne je to ze budeme potrebovat novu kniznicu "wavloader".

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         //Pridany novy riadok pre cisty vystup s programu
         WAV_End(); //deinicializuje WAV Loader
         sceKernelExitGame();
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;
PSP_MODULE_INFO("WAV tutorial", 0, 1, 1);

EDIT:Hodne casu teraz travim pri pokry ale pokusim sa to do vikendu nejako dorobit.

Link to comment
Share on other sites

super mootoo pokracuj ;) ... teraz su prazky tak do toho vhupsnem :)

edit. 05.08.2007

PSP I/O File Manager

Príklad použitia

Author: myschoo

Predtím než začnete čítať si ešte prezrite tento súbor:

C:\cygwin\usr\local\pspdev\psp\sdk\include\pspiofilemgr.h

main.c:

/*
* 
*  File I/O Príklad
*  Autor: myschoo
*  Datum: 03.08.2007
*
*/

#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspiofilemgr.h> // potrebny pre sceIo funkcie
#include <stdio.h>
#include <pspcallbacks.h> // Callbacky mam oddelene v header súbore

PSP_MODULE_INFO("File I/O", 0, 1, 1);

#define printf pspDebugScreenPrintf

int fd;                                                  // integer pre sceIoOpen, tzv. File Descryptor - file remove - zmazanie
int fr;                                                  // integer pre sceIoOpen - file read - citanie
int fw;                                                  // integer pre sceIoOpen - file write - zapis
int dls;                                                 // integer pre sceIoRead - dls ako dlzka suboru v bytoch
int dls2;                                                // integer pre sceIoWrite - dls ako dlzka suboru v bytoch
char pamat[128];                                         // vyčlenená pamäť pre čítanie zo súboru, maximalne 127 znakov
char retazec[128] = "Tato veta bude zapisana do suboru"; // retazec znakov ktory sa zapise do suboru, maximalne 127 znakov

/* ===== Začiatok INT MAIN ===== */

int main() { 

SetupCallbacks();     // Nastavíme Callbacky
pspDebugScreenInit(); // Zinicializujeme obrazovku

pspDebugScreenSetBackColor(0xFF0000);
printf("Manipulacia zo subormi\nAutor prikladu: myschoo\n\n\n"); // Info

sceKernelDelayThread(2*1000*1000); // Male medzizastavky pre "cool efekt" :D

pspDebugScreenSetBackColor(0x000000);
printf("Najprv zmazeme \"subor_na_zmazanie.txt\"\n\n"); // Najprv zmazeme subor

sceKernelDelayThread(3*1000*1000);

/*
* const char *file - cesta k súboru
* int flags - vlajky :D PSP_O_RDONLY, PSP_O_WRONLY, PSP_O_CREAT atď. - určujú ako sa má súbor otvariť, prípadne či sa má vytvoriť
* SceMode mode - prístupový mód
* 
* funkcia vráti negatívny integer, ak nastala chyba a pozitívny alebo 0 ak prebehla úspešne
*
* SceUID sceIoOpen(const char *file, int flags, SceMode mode);
*/

fd = sceIoOpen("subor_na_zmazanie.txt", PSP_O_RDONLY, 0777);

if(fd<0) {                                                  // ak vráti menej ako 0
sceIoClose(fd);                                             // súbor zavrieme
printf("Subor \"subor_na_zmazanie.txt\" neexistuje!\n\n");  // vypíšeme chybovú hlášku
} else {                                                    // inak
sceIoClose(fd);                                             // súbor zavrieme
sceIoRemove("subor_na_zmazanie.txt");                       // súbor zmažeme
printf("Subor bol uspesne zmazany!\n\n");                   // vypíšeme potvrdzujúcu hlášku o úspechu
}

sceKernelDelayThread(4*1000*1000);

printf("Teraz precitame \"subor_na_citanie.txt\"\n\n");     // Teraz čítanie

sceKernelDelayThread(3*1000*1000);

fr = sceIoOpen("subor_na_citanie.txt", PSP_O_RDONLY, 0777); // otvoríme súbor ako minule

if(fr<0) {
sceIoClose(fr);                                             // tu platí všetko rovnako
printf("Subor \"subor_na_citanie.txt\" neexistuje!\n\n");
} else {

/*
* SceUID fd - file descryptor otvoreneho suboru
* void *data - pointer k buffer (u nas je to char pamat[128];)
* SceSize size - velkosť citaných dát v bytoch
* 
* funkcia vrati pocet precitanych bytov
*
* int sceIoRead(SceUID fd, void *data, SceSize size);
*/

dls = sceIoRead(fr, pamat, 127);
sceIoClose(fr);                  // zavrieme súbor
printf("Obsah suboru:\n");
printf("%s\n\n",pamat);          // vypiseme obsah suboru
}

sceKernelDelayThread(4*1000*1000);

printf("Teraz vytvorime \"subor_na_zapis.txt\"\n"); // teraz vytvorime subor a zapiseme do neho predom definovany retazec
printf("a zapiseme do neho: %s\n\n",retazec);

sceKernelDelayThread(3*1000*1000);

fw = sceIoOpen("subor_na_pisanie.txt", PSP_O_WRONLY|PSP_O_APPEND|PSP_O_CREAT, 0777);
//             otvori subor na:           ZAPIS na  KONIEC SUBORU. Ak subor neexistuje tak ho vytovri

if(fw<0) {
sceIoClose(fw);
printf("Nemozem vytvorit \"subor_na_zapis.txt\"!\n\n");
} else {

/*
* SceUID fd - file descryptor otvoreneho suboru
* void *data - pointer k buffer (u nas je to char retazec[128];)
* SceSize size - velkosť citaných dát v bytoch
*
* funkcia vrati pocet zapisanych bytov
*
* int sceIoWrite(SceUID fd, const void *data, SceSize size);
*/

dls2 = sceIoWrite(fw, retazec, 128);
sceIoClose(fw);
printf("Data boli zapisane!\n\n");
}

sceKernelDelayThread(3*1000*1000);

printf("Koniec prikladu. Stlac [HOME] pre navrat do XMB.");

sceKernelSleepThread();
return 0;
}

makefile:

TARGET = fileio
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = File I/O

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Link to comment
Share on other sites

Čaute urobil som PONG :D

Download je v prilohe.

Zdrojak:

/*
PONG by myschoo
09.07.2007
*/

#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspdisplay.h>
#include <stdio.h>

PSP_MODULE_INFO("Pong", 0, 1, 1);

#define printf pspDebugScreenPrintf
#define color pspDebugScreenSetTextColor
#define bgcolor pspDebugScreenSetBackColor
#define gotoXY pspDebugScreenSetXY

SceCtrlData pad;

/* ===================== PREMENNE =========================== */
int Xos, Yos;                                                    // Lopticka :D
int smerX, smerY;                                                // Pohyb v smeroch X a Y osi
int Xos1, Yos1, Xos2, Yos2, Xos3, Yos3, Xos4, Yos4;              // Raketa vlavo
int Xos5, Yos5, Xos6, Yos6, Xos7, Yos7, Xos8, Yos8;              // Raketa vpravo
int scrL, scrP;                                                  // skore laveho a praveho hraca
int koniec;                                                      // cyklus



/* ================ FUNKCIE ====================== */

void pozicie() {     //                             SCHEMA:
Xos2 =  Xos1;        //                              1     5
Yos2 = (Yos1 + 1);   //                              2     6
Xos3 =  Xos1;        //                              3     7
Yos3 = (Yos1 + 2);   //                              4     8
Xos4 =  Xos1;
Yos4 = (Yos1 + 3);

Xos6 =  Xos5;
Yos6 = (Yos5 + 1);
Xos7 =  Xos5;
Yos7 = (Yos5 + 2);
Xos8 =  Xos5;
Yos8 = (Yos5 + 3);
}

void kresliRakety() {
gotoXY(Xos1,Yos1);
printf("#");
gotoXY(Xos2,Yos2);
printf("#");
gotoXY(Xos3,Yos3);
printf("#");
gotoXY(Xos4,Yos4);
printf("#");
gotoXY(Xos5,Yos5);
printf("#");
gotoXY(Xos6,Yos6);
printf("#");
gotoXY(Xos7,Yos7);
printf("#");
gotoXY(Xos8,Yos8);
printf("#");
}

void lopticka() {
Xos = Xos + smerX;
Yos = Yos + smerY;

if(Yos == 2) {
smerY = 1;
}
else
if(Yos == 29) {
smerY = (-1);
}

if(Xos == 3 && Yos > Yos1-1 && Yos < Yos1+4) {
 smerX = 1;
}

if(Xos == 65 && Yos > Yos5-1 && Yos < Yos5+4) {
 smerX = (-1);
}

if(Xos == 67) {
 scrL++;
 Xos = 33;
 Yos = 15;
 smerX = (-1);
 smerY = 1;
}

if (Xos == 1) {
 scrP++;
 Xos = 33;
 Yos = 15;
 smerX = 1;
 smerY = 1;
}
}

/* ================ CALLBACKS ================*/

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
         koniec=1;
         return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
         int cbid;

         cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
         sceKernelRegisterExitCallback(cbid);

         sceKernelSleepThreadCB();

         return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
         int thid = 0;

         thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
         if(thid >= 0) {
                   sceKernelStartThread(thid, 0, 0);
         }

         return thid;
}

/* ==================== INT MAIN ======================== */

int main() {

Xos = 33;            // loptička
Yos = 15;

Xos1 = 2;            // lava palka
Yos1 = 13;
Xos5 = 66;
Yos5 = 13;

smerX = 1;
smerY = 1;

SetupCallbacks();
pspDebugScreenInit();

/* ========================= CYKLUS ===================== */

while (koniec==0) {

pspDebugScreenClear();

pozicie();

bgcolor(0xFFFFFF);
color(0x000000);
printf("Pong by myschoo - Skore:       %d : %d",scrL,scrP);    // nejake info :) + skore

bgcolor(0x000000);
color(0xFFFFFF);

kresliRakety();

color(0x00FF00);
gotoXY(Xos,Yos);
printf("O");

lopticka();

sceCtrlReadBufferPositive(&pad, 1);                 // tu zacina ovladanie rakiet

if(pad.Buttons & PSP_CTRL_UP) {
Yos1--;
}
else
if(pad.Buttons & PSP_CTRL_DOWN) {
Yos1++;
}

if(pad.Buttons & PSP_CTRL_TRIANGLE) {
Yos5--;
}
else
if(pad.Buttons & PSP_CTRL_CROSS) {
Yos5++;
}

if(Yos1 == 2) {                     // tu aby sa nedostali mimo obrazovku
Yos1 = 3;
}
else
if(Yos1 == 29) {
Yos1 = 28;
}

if(Yos5 == 2) {
Yos5 = 3;
}
else
if(Yos5 == 29) {
Yos5 = 28;
}

sceKernelDelayThread(100*1000);
}
sceKernelExitGame();
return 0;
}

http://rafb.net/p/s14Bhf91.html

Link to comment
Share on other sites

wow super praca !!! myschoo skus ale pouzivat na premenne a void prikazy velke pismo lahsie potom uvidis co je co :void LOPTICKA() alebo void BALL() lebo v C je standard male pismo . Jo asi ta potesim dnes v noci ,mozno uz vecer bude ten tut o grafike tak to budes moct hodit do grafiky.

LOL ja som to nevydrzal a urobil som uz aj ponga v grafike :D podla psp-programming :cheesygrin:

edit.

pongv2.jpg

hore je este riadok textu, ktory sa zahadne neodfotil o_O

Download + zdrojak: http://myschoo.php5.sk

Link to comment
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
Reply to this topic...

×   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

×   Your previous content has been restored.   Clear editor

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

 Share


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. Privacy Policy