« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
    Популярное
Доход члена семьи за конкретный период времени

Создание консольного приложения

Люди, используйте PHP! Часть первая

Настройка телефонов Siemens S45 и МЕ45 в сети МТС

Функция RegisterWindowMessage

Заключение

Функция WinHlp

Структура модуля

Сверхдинамичные веб-интерфейсы

Интеграция журнала LiveJournal в персональный сайт




    Архив файлов



    Сообщества



    Документация

Статьи:: Программируем для PSP :: Программируем для PSP: Часть II. Тотальный контроль


отправить ссылку другу версия для печати  Обсудить на форуме

Программируем для PSP: Часть II. Тотальный контроль



В прошлом туториале мы разобрались с "хелловорлдом", теперь пришло время к следующей, не менее важной вещи: вводе информации. Умея выводить что-то на экран и узнавать, что нажал пользователь, уже можно сделать полезную программу. Фактически, после этого урока уже можно будет начинать что-то свое, однако я бы посоветовал дождаться, хотя бы, спрайтов.



Создадим проект по шаблону, описанному в первой части. Найдем в фаиле функцию main() -- основную функцию программы, а в ней главный цикл ( while(1) { ... } ). Кстати, насчет while(1): в программировании для psp не считается дурным тоном делать бесконечные циклы внутри программы, т.к. выход все равно осуществляется по кнопке HOME, и только так.

Сделаем стандартный цикл обработки сообщений: получение и переваривание. Первое, что нужно сделать -- определить переменную, в которой будет хранится состояние клавиатуры:

SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).

Структура SceCtrlData хранит в себе TimeStamp - количество фреймов, похоже, от запуска программы (надо уточнить!), Buttons -- битовую маску состояния кнопок (учитываются кнопки Select, Start, крестик, треугольник, квадрат, шифты, стрелки, состояние Hold и Home. Все остальное учитывается только в Kernel Mode, за подробностями смотрите фаил devkitPSPpspsdkincludepspctrl.h) и координаты стика Lx и Ly. Поскольку она определена только в pspctrl.h, придется добавить в начало фаила

#include <pspctrl .h>

Итак, стираем все внутренности while'ла, и пишем

sceCtrlReadBufferPositive(&pad, 1); // читаем содержимое буфера э-э клавиатуры

Эта функция заполняет структуру pad текущими значениями состояния кнопок и стика. Кстати, чтобы получить координаты стика удавалось, надо перед while'ом впихнуть 2 строки:

sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика

Иначе джойстик так и застынет на положении (128:128) (это -- середина, сами координаты меняются от 0 до 255).

Итак, мы считали информацию, теперь нужно ее вывести. Вот что получилось у меня:

pspDebugScreenPrintf("TimeStamp %i | Pressed: ", pad.TimeStamp); // выводим TimeStamp
if (pad.Buttons == 0) // ничего не нажато
{
    pspDebugScreenPrintf("NONE ");
} else {
    if (pad.Buttons & PSP_CTRL_TRIANGLE) pspDebugScreenPrintf("TRIANGLE ");
    if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE ");
    if (pad.Buttons & PSP_CTRL_CROSS) pspDebugScreenPrintf("CROSS ");
    if (pad.Buttons & PSP_CTRL_SQUARE) pspDebugScreenPrintf("SQUARE ");
    // какие кнопки нажаты?
}
pspDebugScreenPrintf("(%i) | Stick: %i:%in", pad.Buttons, pad.Lx, pad.Ly);
// выводим координаты стика

Как видите, я учитываю только состояние кнопок с картинками (ну, треугольника, круга, квадрата и крестика), дописать поддержку остальных легко, за константами обращайтесь к devkitPSPpspsdkincludepspctrl.h. Код в цикле будет выводить нечто такое:

TimeStamp 68832112 | Pressed NONE (0) | Stick: 126:150
TimeStamp 72317982 | Pressed TRIANGLE CIRCLE (12288) | Stick: 119:167

Итак, компилируйте весь полученный код:

/*
    © va1en0k, 2008
    enjoy ;)
*/
#include <pspkernel .h>

#include <pspdebug .h>

#include <pspctrl .h>


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

int ExitCallback(int Arg1, int Arg2, void *Common)
{
    sceKernelExitGame();
    return 0;
}

int CallbackThread(SceSize Args, void *Argp)
{
    int CallbackId;

    CallbackId = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL);
    sceKernelRegisterExitCallback(CallbackId);

    sceKernelSleepThreadCB();

    return 0;
}

int SetupCallbacks(void)
{
    int ThreadId = 0;

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

    return ThreadId;
}

SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).

int main(int argc, char ** argv)
{
    pspDebugScreenInit();
    SetupCallbacks();

    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика

    while(1) // главный цикл программы
    {
         sceCtrlReadBufferPositive(&pad, 1); // читаем содержимое буфера э-э клавиатуры
         pspDebugScreenPrintf("TimeStamp %i | Pressed: ", pad.TimeStamp); // выводим TimeStamp
         if (pad.Buttons == 0) // ничего не нажато
         {
            pspDebugScreenPrintf("NONE ");
         } else {
            if (pad.Buttons & PSP_CTRL_TRIANGLE) pspDebugScreenPrintf("TRIANGLE ");
            if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE ");
            if (pad.Buttons & PSP_CTRL_CROSS) pspDebugScreenPrintf("CROSS ");
            if (pad.Buttons & PSP_CTRL_SQUARE) pspDebugScreenPrintf("SQUARE ");
            // какие кнопки нажаты?
         }
         pspDebugScreenPrintf("(%i) | Stick: %i:%in", pad.Buttons, pad.Lx, pad.Ly);
         // выводим координаты стика
    }

    sceKernelSleepThread();

    return 0;
}

Теперь преобразовывайте в EBOOT, закидывайте на приставку и наслаждайтесь. Как домашнее задание можно попробовать сделать бродилку, или еще какую-нибудь невероятно полезную штуку; я думаю, что посвящу третюю часть всяким прочим фичам text mode, а потом перейду к графике. Удачи!

Источник: http://psp.va1en0k.net/








9 правил для начинающего Ajax-разработчика.

AJAX

Эти девять правил несложны, никаких кусков кода — только общие советы начинающим Ajax-разработчикам. Крайне вольный перевод 9 AJAX Tips & Tricks.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения.

AJAX

Приветствуем наших читателей. Что-то в последнее время много новостей и я даже не успеваю все отобрать и написать о самых интересных технологиях и продуктах. А ведь ещё и работать иногда надо. Но мимо этой новости мы просто не могли пройти - ведь AJAX и ExtJS как его наглядное воплощения это наша основная технологическая платформа. А буквально вчера вышла следующая версия в текущей ветке 2.х - 2.2 Что же там нового, полезного и интересного мы сейчас и рассмотрим.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

Windows 7: под покровом тайны.

Windows 7

О преемнице Windows Vista, носящей кодовое имя Windows 7, известно очень мало. Корпорация Microsoft, наученная горьким опытом, с крайней неохотой делится с журналистами информацией о разрабатываемой системе, дабы у пользователей и разработчиков программного обеспечения не сложилось искаженное представление о продукте, которое бы повлияло на продажи новой операционки, как это случилось с "Вистой". Тем не менее, некоторые скупые сведения хоть и изредка, но просачиваются из стен редмондского гиганта.


Подробнее... | Рубрика: Windows 7 | Добавлено: 25.08.2008

Остальные статьи:

Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google
Описание VivaVisualCode
JQuery: Пара сотен плагинов в одной заметке
Касание сетки
Разработка элементов управления ASP.NET на примере навигационной панели
Сохранения параметров приложения в .Net
Custom cursors в .Net
Бегун убегает от хозяина
"Битрикс" выпустил седьмую версию CMS
Выбираем систему управления сайтом
Рынок CMS в Европе или впечатления с CeBIT 2008


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 91
Пользователей: 0