Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.4.206] |
|
Сообщ.
#1
,
|
|
|
Насколько я понимаю,для этого в GameCanvas'e нужно переопределить Canvas-метод keyPressed()?Или как-то по-другому? Можно небольшой пример с исходником?
|
Сообщ.
#2
,
|
|
|
Что конкретно имеется ввиду? Какая такая обработка?
|
Сообщ.
#3
,
|
|
|
В GameCanvas'e для обработки нажатых кнопок есть метод getKeyStates().
Вот небольшая функция которая по нажатии левой клавиши управления вызывает функцию left_povorot(), а по нажатии правой - right_povorot(). Ясное дело функции left_povorot(), right_povorot() нужно реализовать в приложении самостоятельно. Конечно же есть константы и для всех других кнопок на клавиатуре телефона. Погугли. private void inputkey() { int keyState = getKeyStates(); if ((keyState & LEFT_PRESSED)!=0){ left_povorot(); } if ((keyState & RIGHT_PRESSED)!=0){ right_povorot(); } } |
Сообщ.
#4
,
|
|
|
Да,я знаю,что в GameCanvas есть метод getKeyStates() и константы LEFT_PRESSED,RIGHT_PRESSED и т.д. Но,допустим,мне нужно обработать,например,клавиши "*" или "#".Для этого в Canvas'e нужно написать такой метод:
public void keyPressed(int keyCode) { int action = getGameAction(keyCode); if (action == KEY_STAR) { //bla bla bla... } Так вот,как мне воспользоваться этим же методом в GameCanvas'e? В поисках ответа облазил несколько форумов и ,вообщем,вырисовывается следующая логика решения: GameCanvas есть наследник Canvas'a,а значит,чтобы воспользоваться методом keyPressed,нужно его переопределить в наследнике. Вопрос №1:как это реализовать на практике? Я делаю так - объявляю public class MyGameCanvas extends GameCanvas implements Runnable,в коем объявляю описанный выше метод keyPressed.Далее вызываю его в теле метода run().С вызовом keyPressed в методе run() тоже непонятки.С каким в данном случае аргументом нужно вызывать? Я вызываю так keyPressed(KEY_STAR).Но таким макаром не работает,хотя компилятор не ругается.Но люди это реализовывают,только почему-то не приводят наглядных примеров. Вопрос №2.Я не знаток ява,но насколько мне известно переопределять возможно только абстрактные методы? Если это так,то как это можно сделать с канвасовскими keyPressed и иже с ним,если они таковыми не являются,то есть не обязательны к реализации? Кого не затруднит - объясните,пожалуйста логику решения данной задачи и выложите демонстрационный исходник. |
Сообщ.
#5
,
|
|
|
Мне не надо гуглить, я эти классы ещё хорошо помню. Собственно, GameCanvas для того и расширяет Canvas, чтобы внести туда несколько методов: даблбуфер (см. flushGraphics) и getKeyStates. Больше по сути там и нет ничего. Какой смысл использовать Canvas, если есть потребность именно в этом функционале? Но зачем переопределять в наследнике неабстрактные методы предка, чтобы ими воспользоваться? Они и так там доступны и работают.
Цитата spaik @ Я не знаток ява,но насколько мне известно переопределять возможно только абстрактные методы? Конечно же, это не так. И ява тут непричём. Это основы ООП. Переопределять можно любые виртуальные методы, которыми в Java являются все (за исключением опционально отдельно указываемых). В данном случае о том и вопрос - зачем для решения этой задачи вообще что-то переопределять? Если в GameCanvas есть всё что есть в Canvas. |
Сообщ.
#6
,
|
|
|
Вы же сами написали:
Цитата GameCanvas есть наследник Canvas'a Это значит что в GameCanvas есть все методы которые доступны в Canvas, в том числе и getGameAction. Цитата В данном случае о том и вопрос - зачем для решения этой задачи вообще что-то переопределять? Поддерживаю. |
Сообщ.
#7
,
|
|
|
Ну хорошо, если вам нужен этот метод попробуем вам помочь. Первое, что бросается в глаза в вашем коде:
public void keyPressed(int keyCode) { int action = getGameAction(keyCode); if (action == KEY_STAR) { //bla bla bla... } это то, что вы используете сравнение action == KEY_STAR action == Canvas.KEY_STAR |
Сообщ.
#8
,
|
|
|
Решил вашу проблему. Для того чтобы использовать метод keyPressed() нужно чтобы конструктор класса начинался с super(false); Если использовать super(true) - метод просто никогда не сработает. Отпишитесь если помогло.
|
Сообщ.
#9
,
|
|
|
Спасибо,studentus.Помогло. Вот только не все канвасовские коды кнопок в гейм канве пашут.В частности не работают "*" & "#".Надо дальше экспериментировать.Чем дальше в лес,тем больше вопросов.Да вот только чё-то эмуль в эклипс уже битый час какзапустить не могу
|
Сообщ.
#10
,
|
|
|
Цитата Вот только не все канвасовские коды кнопок в гейм канве пашут Это точно! Я вместе с keyPressed использую getKeyStates. У каждого свои преимущества и недостатки. Например с помощью getKeyStates можно реализовать нажатие средней кнопки джойстика, но при этом надо самому следить чтобы пользователь успел отпустить кнопку прежде чем метод сработает второй раз. А вот метод keyPressed срабатывает один раз сколько не держать кнопку, но увы - Цитата Вот только не все канвасовские коды кнопок в гейм канве пашут Добавлено Цитата Да вот только чё-то эмуль в эклипс уже битый час какзапустить не могу Проверь файрвол, возможно заблокирован порт который назначен в эмуляторе как Internal RMI registry port. |