2016-06-02 5 views
2

У меня есть следующий класс в небольшом разговоресобытие мыши на изображении в Smalltalk

Object subclass: #SnookerBall 
    instanceVariableNames: 'image type position' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'mmn16' 

initialize 
    self initialize. 
    image := ImageMorph new image: (Form fromFileNamed: 'ball_1.gif'). 
    image position:[email protected] 

теперь я хочу, чтобы реализовать события мышей на изображении. В основном мне нужно симулировать шар снукера. Так что мне нужны события мыши (нажата, перетащена и т. Д.) И сделайте ее анимированной.

Пожалуйста, помогите Спасибо расширенного

Ok У меня есть класс SnookerBall отредактировал

ImageMorph subclass: #SnookerBall 
    instanceVariableNames: '' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'Snooker' 

и инициализацию методы

initialize 
    self image: (Form fromFileNamed: 'ball_1.gif'); 
    extent:[email protected]; 
    position:[email protected] 

Я пытаюсь выполнить:

b:=SnookerBall new. 
b openInWorld. 

и у меня есть сообщение об ошибке: MessageNotUnderstood: UndefinedObject >> hasPositiveExtent

пожалуйста, помогите

+0

В зависимости от ваших требований вы также можете сделать SnookerBall собственностью Morph (например, путем подкласса из ImageMorph) и переопределить 'handlesMouseDown:', 'mouseDown:' и friends. Для этого см. Протокол «обработка событий» (категория метода) в Morph. Кроме того, у Squeak по книге примеров есть хорошее введение в Morphs и обработку событий, если ваши классы Morphs. – JayK

+0

Обратите внимание, что ваш метод инициализации имеет бесконечную рекурсию, потому что 'self initialize' снова вызывает тот же метод. Возможно, вам захотелось написать 'super initialize' вместо этого (но поскольку Object ничего не делает в инициализации, вы также можете полностью опустить эту строку). – JayK

+0

если я наследую от ImageMorph, как бы выглядел метод drawOn? И запустите само инициализацию, это моя ошибка :) – user3132295

ответ

2

Вы можете попробовать Morph>>on:send:to::

SnookerBall>> 
initialize 
    "..." 
    image on: #click send: #ballClicked to: self 

ballClicked 
    "pop up a modal dialog" 
    self inform: 'Ball was clicked' 

... для вызова ballClicked на объекте SnookerBall, когда ImageMorph является щелкнул.

Посмотрите на EventHandler>>on:send:to:, чтобы увидеть возможные аргументы на: #mouseDown, #mouseMove, #click ...

Если вам нужен аргумент для полученного сообщения, рассмотрим Morph>>on:send:to:withValue:.

+0

Спасибо, и если я хочу отправить событие в другой класс? означает не для себя, а для другого класса, который представляет таблицу снукера? – user3132295

+0

Правильно, вам пришлось бы изменить аргумент для:. Вам нужно каким-то образом сделать эту таблицу «известной» для SnookerBall, чтобы она могла правильно установить обработчик событий на изображении.Поскольку initialize не принимает никаких аргументов, вам нужно будет добавить еще один метод в SnookerBall, такой как 'table: aSnookerTable' с' image on: #click send: #ballClicked to: aSnookerTable' в своем коде. Вероятно, вы захотите, чтобы стол знал о том, какой конкретный шар был нажат, поэтому, возможно, сделайте так: image:: #click send: #ballClicked: to: aSnookerTable withValue: self' (обратите внимание на двоеточие после ballClicked). – JayK

 Смежные вопросы

  • Нет связанных вопросов^_^