рдкрд┐рдЫрд▓реЗ рдПрдХ
рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ
рдорд╛рд░реНрдорд▓реЗрдб рдЯреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 рдбреА рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЖрдИрдУрдПрд╕ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рд╕рд╣рд┐рдд рдХрдИ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдЖрдЬ рдореИрдВ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдЯрдЪрдкреИрдб рд╣реИ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЯрдЪ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░, рдорд▓реНрдЯреАрдЯрдЪ рддрдХрдиреАрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рд╕рд╛рде рдХрдИ рдЯрдЪ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЧреЗрдорд┐рдВрдЧ рдврд╛рдВрдЪреЗ рдХреЛ рдорд▓реНрдЯреАрдЯрдЪ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдереЛрдбрд╝рд╛ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрд░реЛрдд (рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░) рдХреАрдмреЛрд░реНрдб рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдзреБрдирд┐рдХ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЙрдирд╕реЗ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдмрдЯрди рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреАрдмреЛрд░реНрдб рдИрд╡реЗрдВрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрдо рд╕реЗ рдХрдо рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░)ред рдпрд╣ s3eKeyAbsBSK рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, "рдмреИрдХ" рдмрдЯрди рджрдмрд╛рдХрд░ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдЧреНрд░реАрдореЗрдВрдЯреНрд╕ рдХреЗ рддрд╣рдд, рдЗрд╕ рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдкрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ (рдЬреИрд╕реЗ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдорд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╣рдо рдЯрдЪрдкреИрдб рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдорд╛рд░реНрдорд▓реЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг mkb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
mf.mkb#!/usr/bin/env mkb ... files { [Main] (source/Main) ... TouchPad.cpp TouchPad.h } ...
TouchPad.h #ifndef _TOUCHPAD_H_ #define _TOUCHPAD_H_ #include "IwGeom.h" #include "s3ePointer.h" #define MAX_TOUCHES 11 struct Touch { int x, y; bool isActive, isPressed, isMoved; int id; }; class TouchPad { private: bool IsAvailable; bool IsMultiTouch; Touch Touches[MAX_TOUCHES]; public: static bool isTouchDown(int eventCode); static bool isTouchUp(int eventCode); bool isAvailable() const { return IsAvailable; } bool isMultiTouch() const { return IsMultiTouch; } Touch* getTouchByID(int id); Touch* getTouch(int index) { return &Touches[index]; } Touch* findTouch(int id); int getTouchCount() const; bool init(); void release(); void update(); void clear(); }; extern TouchPad touchPad; #endif
TouchPad.cpp #include "TouchPad.h" #include "Desktop.h" TouchPad touchPad; bool TouchPad::isTouchDown(int eventCode) { return (eventCode & emtTouchMask) == emtTouchDown; } bool TouchPad::isTouchUp(int eventCode) { return (eventCode & emtTouchMask) == emtTouchUp; } void HandleMultiTouchButton(s3ePointerTouchEvent* event) { Touch* touch = touchPad.findTouch(event->m_TouchID); if (touch != NULL) { touch->isPressed = event->m_Pressed != 0; touch->isActive = true; touch->x = event->m_x; touch->y = event->m_y; touch->id = event->m_TouchID; } } void HandleMultiTouchMotion(s3ePointerTouchMotionEvent* event) { Touch* touch = touchPad.findTouch(event->m_TouchID); if (touch != NULL) { if (touch->isActive) { touch->isMoved = true; } touch->isActive = true; touch->x = event->m_x; touch->y = event->m_y; } } void HandleSingleTouchButton(s3ePointerEvent* event) { Touch* touch = touchPad.getTouch(0); touch->isPressed = event->m_Pressed != 0; touch->isActive = true; touch->x = event->m_x; touch->y = event->m_y; touch->id = 0; } void HandleSingleTouchMotion(s3ePointerMotionEvent* event) { Touch* touch = touchPad.getTouch(0); if (touch->isActive) { touch->isMoved = true; } touch->isActive = true; touch->x = event->m_x; touch->y = event->m_y; } Touch* TouchPad::getTouchByID(int id) { for (int i = 0; i < MAX_TOUCHES; i++) { if (Touches[i].isActive && Touches[i].id == id) return &Touches[i]; } return NULL; } Touch* TouchPad::findTouch(int id) { if (!IsAvailable) return NULL; for (int i = 0; i < MAX_TOUCHES; i++) { if (Touches[i].id == id) return &Touches[i]; } for (int i = 0; i < MAX_TOUCHES; i++) { if (!Touches[i].isActive) { Touches[i].id = id; return &Touches[i]; } } return NULL; } int TouchPad::getTouchCount() const { if (!IsAvailable) return 0; int r = 0; for (int i = 0; i < MAX_TOUCHES; i++) { if (Touches[i].isActive) { r++; } } return r; } void TouchPad::update() { for (int i = 0; i < MAX_TOUCHES; i++) { Touches[i].isMoved = false; } if (IsAvailable) { s3ePointerUpdate(); } } void TouchPad::clear() { for (int i = 0; i < MAX_TOUCHES; i++) { if (!Touches[i].isPressed) { Touches[i].isActive = false; } Touches[i].isMoved = false; } } bool TouchPad::init() { IsAvailable = s3ePointerGetInt(S3E_POINTER_AVAILABLE) ? true : false; if (!IsAvailable) return false; for (int i = 0; i < MAX_TOUCHES; i++) { Touches[i].isPressed = false; Touches[i].isActive = false; Touches[i].isMoved = false; Touches[i].id = 0; } IsMultiTouch = s3ePointerGetInt(S3E_POINTER_MULTI_TOUCH_AVAILABLE) ? true : false; if (IsMultiTouch) { s3ePointerRegister(S3E_POINTER_TOUCH_EVENT, (s3eCallback)HandleMultiTouchButton, NULL); s3ePointerRegister(S3E_POINTER_TOUCH_MOTION_EVENT, (s3eCallback)HandleMultiTouchMotion, NULL); } else { s3ePointerRegister(S3E_POINTER_BUTTON_EVENT, (s3eCallback)HandleSingleTouchButton, NULL); s3ePointerRegister(S3E_POINTER_MOTION_EVENT, (s3eCallback)HandleSingleTouchMotion, NULL); } return true; } void TouchPad::release() { if (IsAvailable) { if (IsMultiTouch) { s3ePointerUnRegister(S3E_POINTER_TOUCH_EVENT, (s3eCallback)HandleMultiTouchButton); s3ePointerUnRegister(S3E_POINTER_TOUCH_MOTION_EVENT, (s3eCallback)HandleMultiTouchMotion); } else { s3ePointerUnRegister(S3E_POINTER_BUTTON_EVENT, (s3eCallback)HandleSingleTouchButton); s3ePointerUnRegister(S3E_POINTER_MOTION_EVENT, (s3eCallback)HandleSingleTouchMotion); } } }
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдмрд▓реНрдХрд┐ рдирд┐рдореНрди рд╕реНрддрд░ рд╣реИред рдЯрдЪрдкреИрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mkb-file рдЪрд▓рд╛рдПрдБред рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЯрдЪрдкреИрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрдзрди рдХрд░реЗрдВрдЧреЗред
Desktop.h #ifndef _DESKTOP_H_ #define _DESKTOP_H_ #include <set> #include "s3eKeyboard.h" #include "Scene.h" using namespace std; enum EMessageType { emtNothing = 0x00, emtTouchEvent = 0x10, emtTouchIdMask = 0x07, emtTouchMask = 0x70, emtMultiTouch = 0x14, emtTouchDown = 0x30, emtTouchUp = 0x50, emtTouchMove = 0x70, emtSingleTouchDown = 0x30, emtSingleTouchUp = 0x50, emtSingleTouchMove = 0x70, emtMultiTouchDown = 0x34, emtMultiTouchUp = 0x54, emtMultiTouchMove = 0x74, emtKeyEvent = 0x80, emtKeyAction = 0x82, emtKeyDown = 0x81, emtKeyPressed = 0x83, emtKeyReleased = 0x82 }; class Desktop { private: int width, height; bool isChanged; Scene* currentScene; bool isKeyAvailable; bool IsQuitMessageReceived; bool checkBounce(int id, int msg); void getScreenSizes(); static int32 ScreenSizeChangeCallback(void* systemData, void* userData); public: Desktop(): touches() {} void init(); void release(); void update(uint64 timestamp); void refresh(); int getWidth() const {return width;} int getHeight() const {return height;} Scene* getScene() {return currentScene;} void setScene(Scene* scene); void sendQuitMessage() {IsQuitMessageReceived = true;} bool isQuitMessageReceived(); set<int> touches; typedef set<int>::iterator TIter; }; extern Desktop desktop; #endif // _DESKTOP_H_
Desktop.cpp #include "Desktop.h" #include "Iw2D.h" #include "TouchPad.h" Desktop desktop; void Desktop::init() { IsQuitMessageReceived = false; getScreenSizes(); setScene(NULL); isKeyAvailable = (s3eKeyboardGetInt(S3E_KEYBOARD_HAS_KEYPAD) || s3eKeyboardGetInt(S3E_KEYBOARD_HAS_ALPHA)); s3eSurfaceRegister(S3E_SURFACE_SCREENSIZE, ScreenSizeChangeCallback, NULL); } void Desktop::release() { s3eSurfaceUnRegister(S3E_SURFACE_SCREENSIZE, ScreenSizeChangeCallback); touches.clear(); } int32 Desktop::ScreenSizeChangeCallback(void* systemData, void* userData) { desktop.isChanged = true; return 0; } void Desktop::setScene(Scene* scene) { if (scene != NULL) { scene->init(); } currentScene = scene; } void Desktop::getScreenSizes() { width = Iw2DGetSurfaceWidth(); height = Iw2DGetSurfaceHeight(); isChanged = false; } bool Desktop::checkBounce(int id, int msg) { TIter p = touches.find(id); if (TouchPad::isTouchDown(msg)) { if (p != touches.end()) return true; touches.insert(id); } else { if (p == touches.end()) return true; if (TouchPad::isTouchUp(msg)) { touches.erase(p); } } return false; } void Desktop::update(uint64 timestamp) { if (isChanged) { getScreenSizes(); } int cnt = touchPad.getTouchCount(); if (cnt > 0) { for (int i = 0; i < MAX_TOUCHES; i++) { Touch* t = touchPad.getTouch(i); if (t->isActive) { int msg = (cnt > 1)?emtMultiTouchUp:emtSingleTouchUp; if (t->isMoved) { msg = (cnt > 1)?emtMultiTouchMove:emtSingleTouchMove; } if (t->isPressed) { msg = (cnt > 1)?emtMultiTouchDown:emtSingleTouchDown; } if (!checkBounce(t->id, msg)) { if (currentScene != NULL) { currentScene->sendMessage(msg | (t->id & emtTouchIdMask), t->x, t->y); } } } } } if (isKeyAvailable) { s3eKeyboardUpdate(); } if (currentScene != NULL) { currentScene->update(timestamp); } } void Desktop::refresh() { if (currentScene != NULL) { currentScene->refresh(); } } bool Desktop::isQuitMessageReceived() { if (s3eDeviceCheckQuitRequest()) { return true; } return IsQuitMessageReceived; }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЯрдЪрдкреИрдб рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдЖрдкрдХреЛ рдЪреЗрдХрдмреЛрди рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рдЯрдЪрдкреИрдб рдХреЛ рджрдмрд╛рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╕рд╣реА рдХреНрд░рдо рдмрдирд╛рдХрд░ "рдЙрдЫрд╛рд▓" рдХреЛ рд░реЛрдХрдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк)ред
рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдереЛрдбрд╝рд╛ рдмрджрд▓рддрд╛ рд╣реИред
main.cpp #include "Main.h" #include "s3e.h" #include "Iw2D.h" #include "IwGx.h" #include "TouchPad.h" #include "Desktop.h" #include "Scene.h" #include "Background.h" #include "Sprite.h" void init() {
рд╣рдордиреЗ s3eKeyAbsBSK рдмрдЯрди рдХреЗ рд╕реАрдзреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдХреЙрд▓ рдХреЛ s3eDeviceCheckQuitRequest рдХреЛ рд▓реВрдк рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджрд┐рдпрд╛ :: isQuitMessageReceived рд╡рд┐рдзрд┐ред рдЯрдЪрдкреИрдб рдХреЛ рдХреЙрд▓ :: рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реВрдк рдореЗрдВ рдЕрджреНрдпрддрди рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрдЪрдкреИрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рд╕рдорд╛рдкрди рдХреЙрд▓ рдХреНрд░рдорд╢рдГ рдЗрдирд┐рдЯ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред
рдХреАрдмреЛрд░реНрдб рдИрд╡реЗрдВрдЯ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕реАрди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
Scene.h #ifndef _SCENE_H_ #define _SCENE_H_ #include <map> #include <set> #include "s3eKeyboard.h" #include "AbstractSpriteOwner.h" #include "AbstractScreenObject.h" using namespace std; class Scene: public AbstractSpriteOwner { private: AbstractScreenObject* background; map<s3eKey, int> keys; bool isInitialized; uint64 lastTime; protected: virtual bool doKeyMessage(int msg, s3eKey key) {return false;} virtual void regKey(s3eKey key); public: Scene(); virtual bool init(); int getXSize(int xSize); int getYSize(int ySize); virtual int getXPos(int x) {return x;} virtual int getYPos(int y) {return y;} virtual void refresh(); virtual void update(uint64 timestamp); virtual bool isBuzy() {return false;} virtual bool sendMessage(int id, int x, int y); typedef map<s3eKey, int>::iterator KIter; typedef pair<s3eKey, int> KPair; }; #endif // _SCENE_H_
Scene.cpp #include "Scene.h" #include "Desktop.h" Scene::Scene(): AbstractSpriteOwner() , isInitialized(false) , background(NULL) , keys() , lastTime(0) { regKey(s3eKeyBack); regKey(s3eKeyAbsBSK); } bool Scene::init() { bool r = !isInitialized; isInitialized = true; return r; } int Scene::getXSize(int xSize) { if (background != NULL) { return (getDesktopWidth() * xSize) / background->getWidth(); } return xSize; } int Scene::getYSize(int ySize) { if (background != NULL) { return (getDesktopHeight() * ySize) / background->getHeight(); } return ySize; } void Scene::refresh() { init(); if (background == NULL) { for (ZIter p = zOrder.begin(); p != zOrder.end(); ++p) { if (p->second->isBackground()) { background = p->second; break; } } } AbstractSpriteOwner::refresh(); } void Scene::regKey(s3eKey key) { keys.insert(KPair(key, 0)); } void Scene::update(uint64 timestamp) { for (KIter p = keys.begin(); p != keys.end(); ++p) { int msg = 0; int32 keyState = s3eKeyboardGetState(p->first); if (keyState & (S3E_KEY_STATE_DOWN | S3E_KEY_STATE_PRESSED)) { msg = emtKeyDown; if (p->second == 0) { msg = emtKeyPressed; p->second = 1; } } if (keyState == S3E_KEY_STATE_UP) { if (p->second == 1) { msg = emtKeyReleased; p->second = 0; } } if (msg != 0) { if (doKeyMessage(msg, p->first)) { lastTime = timestamp; } else { if (timestamp - lastTime >= 1000) { lastTime = 0; } if ((lastTime == 0)&&(msg == emtKeyPressed)) { switch (p->first) { case s3eKeyBack: case s3eKeyAbsBSK: desktop.sendQuitMessage(); break; } } } } } AbstractSpriteOwner::update(timestamp); } bool Scene::sendMessage(int id, int x, int y) { if (AbstractSpriteOwner::sendMessage(id, x, y)) { return true; } if (background != NULL) { return background->sendMessage(id, x, y); } return false; }
рд╕реБрдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдХреАрдмреЛрд░реНрдб рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ doKeyMessage рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо s3eKeyBack рдФрд░ s3eKeyAbsBSK рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ Desktop.sendQuitMessage рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд╛рдкреНрддрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдЦ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд┐рддреАрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
Sprite.h #ifndef _SPRITE_H_ #define _SPRITE_H_ #include "AbstractScreenObject.h" #include "ISprite.h" #include "ISpriteOwner.h" #include "Locale.h" class Sprite: public AbstractScreenObject , public ISprite { protected: ISpriteOwner* owner; CIw2DImage* img; int capturedId; public: Sprite(ISpriteOwner* owner, int x, int y , int zOrder = 0); Sprite(ISpriteOwner* owner, const char* res, int x, int y, int zOrder = 0); virtual ~Sprite(); virtual bool sendMessage(int msg, uint64 timestamp = 0, void* data = NULL); virtual bool sendMessage(int msg, int x, int y); virtual void update(uint64 timestamp) {} virtual void refresh(); virtual void addImage(const char*res, int state = 0); virtual CIw2DImage* getImage(int id = 0); virtual int getState() {return 0;} virtual int getWidth(); virtual int getHeight(); }; #endif
Sprite.cpp #include "Sprite.h" #include "Locale.h" #include "Desktop.h" Sprite::Sprite(ISpriteOwner* owner, int x, int y , int zOrder): AbstractScreenObject(x, y) , owner(owner) , capturedId(-1) , img(NULL) { owner->addSprite((AbstractScreenObject*)this, zOrder); } Sprite::Sprite(ISpriteOwner* owner, const char* res, int x, int y, int zOrder): AbstractScreenObject(x, y) , owner(owner) , capturedId(-1) , img(NULL) { addImage(res, 0); owner->addSprite((AbstractScreenObject*)this, zOrder); } Sprite::~Sprite() { if (img != NULL) { delete img; } } bool Sprite::sendMessage(int msg, uint64 timestamp, void* data) { return owner->sendMessage(msg, timestamp, data); } bool Sprite::sendMessage(int msg, int x, int y) { if ((msg & emtTouchEvent) != emtTouchEvent) return false; if (!isVisible) return false; int id = msg & emtTouchIdMask; msg &= emtTouchMask; if (capturedId >= 0) { if (id != capturedId) return false; if (msg == emtTouchDown) { capturedId = -1; } } if (capturedId < 0) { int X = owner->getXSize(owner->getXPos(getXPos())); int Y = owner->getYSize(owner->getYPos(getYPos())); if ((x < X)||(y < Y)) return false; X += owner->getXSize(getWidth()); Y += owner->getYSize(getHeight()); if ((x > X)||(y > Y)) return false; } switch (msg) { case emtTouchDown: capturedId = id; break; case emtTouchUp: capturedId = -1; break; } if (isBuzy()) { return true; } return sendMessage(msg) || owner->sendMessage(msg); } void Sprite::addImage(const char*res, int state) { img = Iw2DCreateImage(res); } CIw2DImage* Sprite::getImage(int id) { return img; } int Sprite::getWidth() { CIw2DImage* img = getImage(getState()); if (img != NULL) { return img->GetWidth(); } else { return 0; } } int Sprite::getHeight() { CIw2DImage* img = getImage(getState()); if (img != NULL) { return img->GetHeight(); } else { return 0; } } void Sprite::refresh() { init(); CIw2DImage* img = getImage(getState()); if (isVisible && (img != NULL)) { CIwMat2D m; m.SetRot(getAngle()); m.ScaleRot(IW_GEOM_ONE); m.SetTrans(CIwSVec2(owner->getXSize(owner->getXPos(getXPos())), owner->getYSize(owner->getYPos(getYPos())))); Iw2DSetTransformMatrix(m); Iw2DSetAlphaMode(alpha); Iw2DDrawImage(img, CIwSVec2(0, 0), CIwSVec2(owner->getXSize(getWidth()), owner->getYSize(getHeight()))); } }
SendMessage рд╕реНрдерд┐рддреАрдп рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдкрд░реНрд╢ рдмрд┐рдВрджреБ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЧреИрд░-рдкреЙрдЬрд┐рдЯрд┐рд╡ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ AbstractSpriteOwner :: рдЕрдкрдбреЗрдЯ рдореЗрдВ рд╣рдо SendMessage рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕рднреА Sprites рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ Z- рдСрд░реНрдбрд░ (рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред
рд╕реНрдкрд░реНрд╢ рд░рд┐рд▓реАрдЬ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред EmtTouchDown рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЖрдИрдбреА-рдЯрдЪ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рдИрд╡реЗрдВрдЯ рдХреЛ рдЙрд╕реА рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЯрдЪ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЬреБрдбрд╝реЗ рдХреБрдЫ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд▓реЗ
рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдзреНрд╡рдирд┐ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб
рдпрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИредрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрд░рдмреНрдмрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛